diff --git a/frontend/app/components/Domain/Announcement/Announcements/announcements.test.ts b/frontend/app/components/Domain/Announcement/Announcements/announcements.test.ts new file mode 100644 index 000000000..e1aa007dd --- /dev/null +++ b/frontend/app/components/Domain/Announcement/Announcements/announcements.test.ts @@ -0,0 +1,37 @@ +import { describe, test, expect } from "vitest"; + +const announcementFiles = import.meta.glob<{ default: unknown }>( + "~/components/Domain/Announcement/Announcements/*.vue", +); + +// Expected format: YYYY-MM-DD_N_slug e.g. 2026-03-27_1_welcome +const FILE_FORMAT = /^\d{4}-\d{2}-\d{2}_\d+_.+$/; + +describe("Announcement files", () => { + const filenames = Object.keys(announcementFiles).map(path => + path.split("/").at(-1)!.replace(".vue", ""), + ); + + test("directory is not empty", () => { + expect(filenames.length).toBeGreaterThan(0); + }); + + test("all filenames match YYYY-MM-DD_N_slug format", () => { + for (const name of filenames) { + expect(name, `"${name}" does not match the expected format`).toMatch(FILE_FORMAT); + } + }); + + test("all date prefixes are valid dates", () => { + for (const name of filenames) { + const datePart = name.split("_", 1)[0]!; + const date = new Date(datePart); + expect(isNaN(date.getTime()), `"${name}" has an invalid date prefix "${datePart}"`).toBe(false); + } + }); + + test("all filenames are unique", () => { + const unique = new Set(filenames); + expect(unique.size).toBe(filenames.length); + }); +}); diff --git a/frontend/vitest.config.js b/frontend/vitest.config.js index f31568b4f..d5bcb429e 100644 --- a/frontend/vitest.config.js +++ b/frontend/vitest.config.js @@ -1,6 +1,8 @@ import path from "path"; +import vue from "@vitejs/plugin-vue"; export default { + plugins: [vue()], test: { globals: true, environment: "jsdom",