Files
HiveGrid-Wireframes/hivegrid-cloud/apps/web/app/modules/knowledgeBase/components/knowledge-base-public-i18n.test.ts
T

73 lines
4.1 KiB
TypeScript

import fs from "node:fs";
import path from "node:path";
import { describe, expect, it } from "vitest";
const repoRoot = process.cwd();
const sourceFiles = [
"apps/web/app/modules/knowledgeBase/components/KbHeader.tsx",
"apps/web/app/modules/knowledgeBase/components/KbFeaturedArticles.tsx",
"apps/web/app/modules/knowledgeBase/components/articles/KbArticlesBySection.tsx",
"apps/web/app/modules/knowledgeBase/components/articles/KbArticleContent.tsx",
"apps/web/app/modules/knowledgeBase/components/categories/KbCategoriesGrid.tsx",
"apps/web/app/modules/knowledgeBase/components/categories/KbCategoriesList.tsx",
"apps/web/app/modules/knowledgeBase/components/layouts/KbDocsHeader.tsx",
];
const publicRouteFiles = [
"apps/web/app/modules/knowledgeBase/routes/api/KbRoutes.Article.Api.tsx",
"apps/web/app/modules/knowledgeBase/routes/views/KbRoutes.Article.View.tsx",
"apps/web/app/modules/knowledgeBase/routes/views/KbRoutes.Category.View.tsx",
];
describe("knowledge base public i18n", () => {
it("keeps public article empty states and dates locale-aware", () => {
const sources = sourceFiles.map((file) => fs.readFileSync(path.join(repoRoot, file), "utf8")).join("\n");
expect(sources).toContain("knowledgeBase.article.emptyFeatured");
expect(sources).toContain("knowledgeBase.article.empty");
expect(sources).toContain("knowledgeBase.header.logoAlt");
expect(sources).toContain("useLocaleFormatters");
expect(sources).not.toContain('alt="Logo"');
expect(sources).not.toContain('"No featured articles"');
expect(sources).not.toContain('"No articles"');
expect(sources).not.toContain("DateUtils.dateAgo");
expect(sources).not.toContain("ui.autogenerated");
});
it("keeps public category article counts locale-formatted", () => {
const sources = [
"apps/web/app/modules/knowledgeBase/components/categories/KbCategoriesGrid.tsx",
"apps/web/app/modules/knowledgeBase/components/categories/KbCategoriesList.tsx",
]
.map((file) => fs.readFileSync(path.join(repoRoot, file), "utf8"))
.join("\n");
const en = JSON.parse(fs.readFileSync(path.join(repoRoot, "apps/web/public/locales/en/translations.json"), "utf8"));
const de = JSON.parse(fs.readFileSync(path.join(repoRoot, "apps/web/public/locales/de/translations.json"), "utf8"));
expect(sources).toContain("useLocaleFormatters");
expect(sources).toContain("formattedCount: formatters.number(item.articles.length)");
expect(sources).not.toContain("{ count: item.articles.length })");
expect(en.knowledgeBase.category.articleCount_one).toContain("{{formattedCount}}");
expect(en.knowledgeBase.category.articleCount_other).toContain("{{formattedCount}}");
expect(de.knowledgeBase.category.articleCount_one).toContain("{{formattedCount}}");
expect(de.knowledgeBase.category.articleCount_other).toContain("{{formattedCount}}");
});
it("keeps public route errors on public translation keys", () => {
const sources = publicRouteFiles.map((file) => fs.readFileSync(path.join(repoRoot, file), "utf8")).join("\n");
const en = JSON.parse(fs.readFileSync(path.join(repoRoot, "apps/web/public/locales/en/translations.json"), "utf8"));
const de = JSON.parse(fs.readFileSync(path.join(repoRoot, "apps/web/public/locales/de/translations.json"), "utf8"));
expect(sources).toContain("knowledgeBase.public.errors.articleNotFound");
expect(sources).toContain("knowledgeBase.public.errors.categoryNotFound");
expect(sources).toContain("knowledgeBase.public.errors.invalidAction");
expect(sources).not.toContain("knowledgeBase.admin.errors.notFound");
expect(sources).not.toContain("knowledgeBase.admin.errors.invalidAction");
expect(en.knowledgeBase.public.errors.articleNotFound).toBeTruthy();
expect(en.knowledgeBase.public.errors.categoryNotFound).toBeTruthy();
expect(en.knowledgeBase.public.errors.invalidAction).toBeTruthy();
expect(de.knowledgeBase.public.errors.articleNotFound).toBeTruthy();
expect(de.knowledgeBase.public.errors.categoryNotFound).toBeTruthy();
expect(de.knowledgeBase.public.errors.invalidAction).toBeTruthy();
});
});