From 7fcf329fad1ec5b215a8970565e6d0ab77334c64 Mon Sep 17 00:00:00 2001 From: DIBSTER <76603072+DEV-DIBSTER@users.noreply.github.com> Date: Sun, 13 Apr 2025 23:57:32 +0000 Subject: [PATCH] feat: more test cases --- tests/json.test.js | 93 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/tests/json.test.js b/tests/json.test.js index c3274b6e..3c6b6434 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -11,6 +11,11 @@ const optionalOwnerFields = { email: "string" }; +const ignoredRootJSONFiles = ["package-lock.json", "package.json"]; + + +const domains = [".is-a-fullstack.dev", ".is-cool.dev", ".is-local.org", ".is-not-a.dev", ".localplayer.dev"]; + const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; const hostnameRegex = /^(?=.{1,253}$)(?:(?:[_a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)\.)+[a-zA-Z]{2,63}$/; @@ -41,6 +46,24 @@ function validateOptionalFields(t, obj, optionalFields, file) { }); } +t("All JSON files must be valid JSON", (t) => { + const files = fs.readdirSync(domainsPath).filter(file => { + const filePath = path.join(domainsPath, file); + return file.endsWith(".json") && fs.lstatSync(filePath).isFile(); + }); + + files.forEach(file => { + const filePath = path.join(domainsPath, file); + try { + const data = fs.readFileSync(filePath, "utf8"); + JSON.parse(data); + t.pass(`${file} is valid JSON`); + } catch (err) { + t.fail(`${file} contains invalid JSON: ${err.message}`); + } + }); +}); + t("All files should have the required fields", (t) => { const files = fs.readdirSync(domainsPath).filter(file => { const filePath = path.join(domainsPath, file); @@ -73,3 +96,73 @@ t("All files should have valid optional owner fields", (t) => { } }); }); + +t("All files should have lowercase subdomain/domain and match filename", (t) => { + const files = fs.readdirSync(domainsPath).filter(file => { + const filePath = path.join(domainsPath, file); + return file.endsWith(".json") && fs.lstatSync(filePath).isFile(); + }); + + files.forEach(file => { + const filePath = path.join(domainsPath, file); + const data = fs.readJsonSync(filePath); + + const { subdomain, domain } = data; + + t.truthy(subdomain, `${file}: Missing subdomain field`); + t.truthy(domain, `${file}: Missing domain field`); + + t.is(subdomain, subdomain.toLowerCase(), `${file}: 'subdomain' must be lowercase`); + t.is(domain, domain.toLowerCase(), `${file}: 'domain' must be lowercase`); + + const expectedFileName = `${subdomain}.${domain}.json`; + t.is(file, expectedFileName, `${file}: Filename does not match subdomain and domain`); + }); +}); + +t("All files should use a valid root domain", (t) => { + const files = fs.readdirSync(domainsPath).filter(file => { + const filePath = path.join(domainsPath, file); + return file.endsWith(".json") && fs.lstatSync(filePath).isFile(); + }); + + files.forEach(file => { + const data = fs.readJsonSync(path.join(domainsPath, file)); + const domain = data.domain; + + t.truthy(domain, `${file}: Missing domain field`); + t.true( + domains.includes(`.${domain}`), + `${file}: Domain '${domain}' is not in the list of allowed domains` + ); + }); +}); + + +// Thanks is-a.dev for this. +t("JSON files should not be in the root directory", (t) => { + const rootFiles = fs + .readdirSync(path.resolve()) + .filter((file) => file.endsWith(".json") && !ignoredRootJSONFiles.includes(file)); + + if (rootFiles.length > 0) { + t.fail(`❌ JSON files should not be in the root directory: ${rootFiles.join(", ")}`); + } else { + t.pass(); + } +}); + +t("All files in the domains directory must have a .json extension", (t) => { + const files = fs.readdirSync(domainsPath).filter(file => { + const filePath = path.join(domainsPath, file); + return fs.lstatSync(filePath).isFile(); + }); + + const nonJsonFiles = files.filter(file => !file.endsWith(".json")); + + if (nonJsonFiles.length > 0) { + t.fail(`❌ Found non-JSON files in domains directory: ${nonJsonFiles.join(", ")}`); + } else { + t.pass(); + } +}); \ No newline at end of file