recipe/packages/theme/__tests__/unit/getThemeData.spec.ts

158 lines
4.4 KiB
TypeScript
Raw Permalink Normal View History

2024-08-18 19:16:25 +08:00
/* eslint-disable @typescript-eslint/naming-convention */
import { describe, expect, it } from "vitest";
import type { Bundler } from "vuepress/core";
import { createBaseApp } from "vuepress/core";
import { path } from "vuepress/utils";
import { emptyTheme } from "./__fixtures__/theme/empty.js";
import { getThemeData } from "../../src/node/config/getThemeData.js";
import { getThemeStatus } from "../../src/node/config/getThemeStatus.js";
import type { ThemeOptions } from "../../src/shared/index.js";
describe("should generate themeData correctly", () => {
it("Should contain basic properties", () => {
const app = createBaseApp({
locales: {
"/": {
lang: "en-US",
},
},
bundler: {} as Bundler,
source: path.resolve(__dirname, "./__fixtures__/src"),
theme: emptyTheme,
});
const themeOptions = {};
const result = getThemeData(app, themeOptions, getThemeStatus(app, {}));
expect(result).toHaveProperty("encrypt");
expect(result.locales).toBeTypeOf("object");
expect(Object.keys(result.locales)).toEqual(["/"]);
expect(result).toMatchSnapshot();
});
it("Should handle single language", () => {
const app = createBaseApp({
locales: {
"/": {
lang: "en-US",
},
},
bundler: {} as Bundler,
source: path.resolve(__dirname, "./__fixtures__/src"),
theme: emptyTheme,
});
const themeOptions = {
navbar: ["/", "/about"],
sidebar: ["/", "/about"],
};
const result = getThemeData(app, themeOptions, getThemeStatus(app, {}));
expect(result.locales).toBeTypeOf("object");
expect(Object.keys(result.locales)).toEqual(["/"]);
expect(result.locales["/"].navbar).toEqual(["/", "/about"]);
expect(result.locales["/"].sidebar).toEqual(["/", "/about"]);
});
it("locale should have higher property", () => {
const app = createBaseApp({
locales: {
"/": {
lang: "en-US",
},
"/zh/": {
lang: "zh-TW",
},
},
bundler: {} as Bundler,
source: path.resolve(__dirname, "./__fixtures__/src"),
theme: emptyTheme,
});
const themeOptions = {
navbar: ["/", "/about"],
locales: {
"/": {
navbar: ["/", "/guide", "/about"],
},
"/zh/": {
navbar: ["/zh/", "/zh/guide", "/zh/about"],
},
},
};
const result = getThemeData(app, themeOptions, getThemeStatus(app, {}));
expect(result.locales).toBeTypeOf("object");
expect(new Set(Object.keys(result.locales))).toEqual(
new Set(["/", "/zh/"]),
);
expect(result.locales["/"].navbar).toEqual(["/", "/guide", "/about"]);
expect(result.locales["/zh/"].navbar).toEqual([
"/zh/",
"/zh/guide",
"/zh/about",
]);
});
it("should fallback to root if locale config is missing", () => {
const app = createBaseApp({
locales: {
"/": {
lang: "en-US",
},
"/zh/": {
lang: "zh-TW",
},
},
bundler: {} as Bundler,
source: path.resolve(__dirname, "./__fixtures__/src"),
theme: emptyTheme,
});
const themeOptions = {
navbar: ["/", "/guide", "/about"],
locales: {
"/": {},
"/zh/": {
navbar: ["/zh/", "/zh/guide", "/zh/about"],
},
},
};
const result = getThemeData(app, themeOptions, getThemeStatus(app, {}));
expect(result.locales["/"].navbar).toEqual(["/", "/guide", "/about"]);
expect(result.locales["/zh/"].navbar).toEqual([
"/zh/",
"/zh/guide",
"/zh/about",
]);
});
it("root only option should not appear in locales", () => {
const app = createBaseApp({
locales: {
"/": {
lang: "en-US",
},
},
bundler: {} as Bundler,
source: path.resolve(__dirname, "./__fixtures__/src"),
theme: emptyTheme,
});
const themeOptions: ThemeOptions = {
pure: true,
darkmode: "disable",
encrypt: {},
};
const result = getThemeData(app, themeOptions, getThemeStatus(app, {}));
expect(result.locales["/"]).not.toHaveProperty("darkmode");
expect(result.locales["/"]).not.toHaveProperty("encrypt");
expect(result.locales["/"]).not.toHaveProperty("pure");
});
});