From 5b20f11e208c78e5186590311224628f7079d726 Mon Sep 17 00:00:00 2001 From: James Brunton Date: Thu, 28 Aug 2025 11:03:43 +0100 Subject: [PATCH] Add test that the translation JSON is valid (#4315) # Description of Changes Adds a vitest to check that the translation JSON files exist and are actually valid JSON. --- frontend/src/tests/translation.test.ts | 50 ++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 frontend/src/tests/translation.test.ts diff --git a/frontend/src/tests/translation.test.ts b/frontend/src/tests/translation.test.ts new file mode 100644 index 000000000..4251d3124 --- /dev/null +++ b/frontend/src/tests/translation.test.ts @@ -0,0 +1,50 @@ +import { describe, test, expect } from 'vitest'; +import fs from 'fs'; +import path from 'path'; + +const LOCALES_DIR = path.join(__dirname, '../../public/locales'); + +// Get all locale directories for parameterized tests +const getLocaleDirectories = () => { + if (!fs.existsSync(LOCALES_DIR)) { + return []; + } + + return fs.readdirSync(LOCALES_DIR, { withFileTypes: true }) + .filter(dirent => dirent.isDirectory()) + .map(dirent => dirent.name); +}; + +const localeDirectories = getLocaleDirectories(); + +describe('Translation JSON Validation', () => { + test('should find the locales directory', () => { + expect(fs.existsSync(LOCALES_DIR)).toBe(true); + }); + + test('should have at least one locale directory', () => { + expect(localeDirectories.length).toBeGreaterThan(0); + }); + + test.each(localeDirectories)('should have valid JSON in %s/translation.json', (localeDir) => { + const translationFile = path.join(LOCALES_DIR, localeDir, 'translation.json'); + + // Check if file exists + expect(fs.existsSync(translationFile)).toBe(true); + + // Read file content + const content = fs.readFileSync(translationFile, 'utf8'); + expect(content.trim()).not.toBe(''); + + // Parse JSON - this will throw if invalid JSON + let jsonData; + expect(() => { + jsonData = JSON.parse(content); + }).not.toThrow(); + + // Ensure it's an object at root level + expect(typeof jsonData).toBe('object'); + expect(jsonData).not.toBeNull(); + expect(Array.isArray(jsonData)).toBe(false); + }); +});