import { readFile } from "node:fs/promises"; import { test } from "node:test"; import assert from "node:assert/strict"; test("vite entrypoint loads the react application", async () => { const html = await readFile("website/index.html", "utf8"); assert.match(html, /
<\/div>/); assert.match(html, /\/favicon\.ico/); assert.match(html, /\/src\/main\.jsx/); }); test("react application defines the expected local toolbox primitives", async () => { const source = await readFile("website/src/main.jsx", "utf8"); const styles = await readFile("website/src/styles/main.scss", "utf8"); const styleTokens = await readFile("website/src/styles/_tokens.scss", "utf8"); const iconComponent = await readFile("website/src/components/Icon.jsx", "utf8"); const gamesPage = await readFile("website/src/features/games/GamesPage.jsx", "utf8"); const gameRoute = await readFile("website/src/features/games/GameRoute.jsx", "utf8"); const mhwildsPage = await readFile("website/src/features/games/mhwilds/MhwildsPage.jsx", "utf8"); const mhwildsListing = await readFile("website/src/features/games/mhwilds/MhwildsListing.jsx", "utf8"); const mhwildsFilters = await readFile("website/src/features/games/mhwilds/MhwildsFilters.jsx", "utf8"); const monsterCard = await readFile("website/src/features/games/mhwilds/cards/MonsterCard.jsx", "utf8"); const endemicCard = await readFile("website/src/features/games/mhwilds/cards/EndemicCard.jsx", "utf8"); const damageTable = await readFile("website/src/features/games/mhwilds/cards/DamageTable.jsx", "utf8"); const moduleRegistry = await readFile("website/src/features/toolboxes/modules/index.jsx", "utf8"); const notepadModule = await readFile("website/src/features/toolboxes/modules/NotepadModule.jsx", "utf8"); const checklistModule = await readFile("website/src/features/toolboxes/modules/ChecklistModule.jsx", "utf8"); const screenshotsModule = await readFile("website/src/features/toolboxes/modules/ScreenshotsModule.jsx", "utf8"); assert.match(source, /sokkog:toolboxes/); assert.match(source, /sokkog:game-toolbox-links/); assert.match(source, /styles\/main\.scss/); assert.match(styles, /@use "tokens"/); assert.match(styleTokens, /--gradient-brand/); assert.match(source, /features\/toolboxes\/modules\/index\.jsx/); assert.match(source, /features\/games\/GamesPage\.jsx/); assert.match(source, /features\/games\/GameRoute\.jsx/); assert.match(iconComponent, /export function Icon/); assert.match(gamesPage, /export function GamesPage/); assert.match(gameRoute, /export function GameRoute/); assert.match(gameRoute, /MhwildsPage/); assert.match(mhwildsPage, /export function MhwildsPage/); assert.match(mhwildsListing, /export function MhwildsListing/); assert.match(mhwildsFilters, /export function MhwildsFilters/); assert.match(monsterCard, /export function MonsterCard/); assert.match(endemicCard, /export function EndemicCard/); assert.match(damageTable, /rowIndex/); assert.match(moduleRegistry, /export const TOOLBOX_MODULES/); assert.match(moduleRegistry, /export function ToolboxModules/); assert.match(moduleRegistry, /MODULE_COMPONENTS/); assert.match(moduleRegistry, /notepad:/); assert.match(moduleRegistry, /checklist:/); assert.match(moduleRegistry, /screenshots:/); assert.match(notepadModule, /export function NotepadModule/); assert.match(checklistModule, /export function ChecklistModule/); assert.match(screenshotsModule, /export function ScreenshotsModule/); assert.match(source, /DEFAULT_SITE_CONTENT/); assert.match(source, /\/data\/site\.json/); assert.match(source, /APP_STORAGE_LIMIT_BYTES/); assert.match(source, /function StorageQuota/); assert.match(source, /function writeStorageValue/); assert.match(source, /role="progressbar"/); assert.match(source, /function createGlobalExportPayload/); assert.match(source, /async function importAllToolboxes/); assert.match(source, /function LinkToolboxModal/); assert.doesNotMatch(source, /description: _description/); assert.match(source, /function CreateToolboxModal/); assert.match(source, /const getToolboxGameId/); assert.match(source, /dragon\.png/); assert.match(source, /getToolboxGame\(toolbox\)/); assert.match(source, /moduleColumns/); assert.match(source, /function ToolboxView/); assert.match(moduleRegistry, /onDragStart/); assert.match(source, /qtyTarget/); assert.match(source, /qtyCurrent/); assert.match(checklistModule, /ChecklistItem/); assert.match(screenshotsModule, /clipboardData/); assert.match(source, /async function addScreenshotFiles/); assert.match(source, /function ScreenshotViewer/); assert.match(source, /function openImageInNewTab/); assert.match(source, / { const site = JSON.parse(await readFile("website/public/data/site.json", "utf8")); const games = JSON.parse(await readFile("website/public/data/games.json", "utf8")); const monsters = JSON.parse(await readFile("website/public/data/mhwilds/monsters.json", "utf8")); const endemicLife = JSON.parse(await readFile("website/public/data/mhwilds/endemic_life.json", "utf8")); const translations = JSON.parse(await readFile("website/public/data/mhwilds/i18n/fr.json", "utf8")); const listingSource = await readFile("website/src/features/games/mhwilds/MhwildsListing.jsx", "utf8"); assert.equal(site.brand.name, "Sokko G"); assert.equal(site.home.hero.title, "Sokko G"); assert.ok(site.toolboxes.storageHelp.items.length >= 3); assert.equal(games.games[0].id, "mhwilds"); assert.equal(games.games[0].eyebrow, "Guide de jeu"); assert.match(games.games[0].image, /mhwilds\.png/); assert.ok(monsters.monsters.length > 0); assert.ok(endemicLife.endemicLife.length > 0); assert.equal(translations.monsters, "monstres"); assert.match(listingSource, /function MhwildsListing/); const monsterCardSource = await readFile("website/src/features/games/mhwilds/cards/MonsterCard.jsx", "utf8"); assert.match(monsterCardSource, /monster-card/); await readFile("website/public/static/img/mhwilds/chatacabra.png"); }); test("server and vite support local env configuration", async () => { const server = await readFile("server.mjs", "utf8"); const viteConfig = await readFile("vite.config.js", "utf8"); const envExample = await readFile(".env.example", "utf8"); assert.match(server, /function loadEnvFile/); assert.match(server, /process\.env\.PORT/); assert.match(viteConfig, /function loadEnvFile/); assert.match(viteConfig, /process\.env\.PORT/); assert.match(envExample, /PORT=5173/); }); test("legacy svg icons are available for reuse", async () => { const manifest = JSON.parse(await readFile("website/public/data/toolbox-icons.json", "utf8")); assert.ok(manifest.icons.length >= 4); await readFile("website/public/static/icons/home.svg", "utf8"); await readFile("website/public/static/icons/checklist.svg", "utf8"); await readFile("website/public/static/icons/close.svg", "utf8"); await readFile("website/public/static/icons/columns.svg", "utf8"); await readFile("website/public/static/icons/export.svg", "utf8"); await readFile("website/public/static/icons/notepad.svg", "utf8"); await readFile("website/public/static/icons/picture.svg", "utf8"); await readFile("website/public/static/icons/rows.svg", "utf8"); await readFile("website/public/static/icons/rubber.svg", "utf8"); await readFile("website/public/static/icons/trashcan.svg", "utf8"); await readFile("website/public/static/icons/zoom.svg", "utf8"); await readFile("website/public/favicon.ico"); await readFile("website/public/static/img/dragon.png"); await readFile("website/public/static/img/toolbox-icons/controller.svg", "utf8"); });