generated from nhcarrigan/template
788 lines
25 KiB
TypeScript
788 lines
25 KiB
TypeScript
/**
|
|
* @copyright NHCarrigan
|
|
* @license Naomi's Public License
|
|
* @author Naomi Carrigan
|
|
*/
|
|
|
|
import { readFile } from "node:fs/promises";
|
|
import { join } from "node:path";
|
|
import { describe, expect, it } from "vitest";
|
|
import { parse } from "yaml";
|
|
import type { Donate } from "../src/interfaces/donate.js";
|
|
import type { Funding } from "../src/interfaces/funding.js";
|
|
import type { Projects } from "../src/interfaces/projects.js";
|
|
import type { Resume } from "../src/interfaces/resume.js";
|
|
|
|
const checkUrl = async(url: string): Promise<boolean> => {
|
|
try {
|
|
const response = await fetch(url, {
|
|
headers: { origin: url },
|
|
method: "HEAD",
|
|
});
|
|
if (response.status === 429) {
|
|
// Try again after few seconds
|
|
console.log(`Rate limited on ${url}, trying again...`);
|
|
await new Promise((resolve) => {
|
|
// eslint-disable-next-line no-promise-executor-return --- HUH???
|
|
return setTimeout(resolve, 5000);
|
|
});
|
|
return checkUrl(url);
|
|
}
|
|
return response.ok;
|
|
} catch (error) {
|
|
console.error(`Error checking URL ${url}:`, error);
|
|
return false;
|
|
}
|
|
};
|
|
|
|
describe("project data", () => {
|
|
it("should match the interface", async() => {
|
|
expect.hasAssertions();
|
|
const data = await readFile(
|
|
join(import.meta.dirname, "..", "data", "projects.yml"),
|
|
"utf8",
|
|
);
|
|
const parsed = parse(data) as Projects;
|
|
expect(parsed, `Parsed projects data should be defined`).toBeDefined();
|
|
expect(
|
|
Array.isArray(parsed),
|
|
`Parsed projects data should be an array`,
|
|
).toBeTruthy();
|
|
|
|
for (const project of parsed) {
|
|
expect(project, `Project should be defined`).toBeDefined();
|
|
expect(
|
|
typeof project.name,
|
|
`Project name should be a string for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof project.category,
|
|
`Project category should be a string for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof project.description,
|
|
`Project description should be a string for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof project.premium,
|
|
`Project premium should be a boolean for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBe("boolean");
|
|
expect(
|
|
typeof project.wip,
|
|
`Project wip should be a boolean for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBe("boolean");
|
|
|
|
if (project.avatar) {
|
|
expect(
|
|
typeof project.avatar,
|
|
`Project avatar should be a string for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
await expect(
|
|
checkUrl(project.avatar),
|
|
`Project avatar should be reachable for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).resolves.toBeTruthy();
|
|
}
|
|
|
|
if (project.url) {
|
|
expect(
|
|
typeof project.url,
|
|
`Project url should be a string for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
await expect(
|
|
checkUrl(project.url),
|
|
`Project url should be reachable for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).resolves.toBeTruthy();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
describe("resume data", () => {
|
|
it("should match the interface", async() => {
|
|
expect.hasAssertions();
|
|
const data = await readFile(
|
|
join(import.meta.dirname, "..", "data", "resume.yml"),
|
|
"utf8",
|
|
);
|
|
const parsed = parse(data) as Resume;
|
|
expect(parsed, `Parsed resume data should be defined`).toBeDefined();
|
|
expect(typeof parsed.name, `Resume name should be a string`).toBe("string");
|
|
expect(typeof parsed.contact, `Resume contact should be a string`).toBe(
|
|
"string",
|
|
);
|
|
expect(typeof parsed.summary, `Resume summary should be a string`).toBe(
|
|
"string",
|
|
);
|
|
|
|
expect(
|
|
Array.isArray(parsed.employment),
|
|
`Resume employment should be an array`,
|
|
).toBeTruthy();
|
|
for (const employment of parsed.employment) {
|
|
expect(employment, `Employment entry should be defined`).toBeDefined();
|
|
expect(
|
|
typeof employment.title,
|
|
`Employment title should be a string for ${
|
|
employment.company ?? "unknown company"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof employment.company,
|
|
`Employment company should be a string for ${
|
|
employment.title ?? "unknown position"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof employment.type,
|
|
`Employment type should be a string for ${
|
|
employment.company ?? "unknown company"
|
|
} - ${employment.title ?? "unknown position"}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof employment.start_date,
|
|
`Employment start_date should be a string for ${
|
|
employment.company ?? "unknown company"
|
|
} - ${employment.title ?? "unknown position"}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof employment.end_date,
|
|
`Employment end_date should be a string for ${
|
|
employment.company ?? "unknown company"
|
|
} - ${employment.title ?? "unknown position"}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof employment.description,
|
|
`Employment description should be a string for ${
|
|
employment.company ?? "unknown company"
|
|
} - ${employment.title ?? "unknown position"}`,
|
|
).toBe("string");
|
|
|
|
if (employment.prior_positions) {
|
|
expect(
|
|
Array.isArray(employment.prior_positions),
|
|
`Employment prior_positions should be an array for ${
|
|
employment.company ?? "unknown company"
|
|
}`,
|
|
).toBeTruthy();
|
|
for (const position of employment.prior_positions) {
|
|
expect(
|
|
position,
|
|
`Prior position entry should be defined for ${
|
|
employment.company ?? "unknown company"
|
|
}`,
|
|
).toBeDefined();
|
|
expect(
|
|
typeof position.title,
|
|
`Prior position title should be a string for ${
|
|
employment.company ?? "unknown company"
|
|
} - ${position.title ?? "unknown position"}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof position.start_date,
|
|
`Prior position start_date should be a string for ${
|
|
employment.company ?? "unknown company"
|
|
} - ${position.title ?? "unknown position"}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof position.end_date,
|
|
`Prior position end_date should be a string for ${
|
|
employment.company ?? "unknown company"
|
|
} - ${position.title ?? "unknown position"}`,
|
|
).toBe("string");
|
|
}
|
|
}
|
|
}
|
|
|
|
expect(
|
|
Array.isArray(parsed.volunteer),
|
|
`Resume volunteer should be an array`,
|
|
).toBeTruthy();
|
|
for (const volunteer of parsed.volunteer) {
|
|
expect(volunteer, `Volunteer entry should be defined`).toBeDefined();
|
|
expect(
|
|
typeof volunteer.title,
|
|
`Volunteer title should be a string for ${
|
|
volunteer.company ?? "unknown organization"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof volunteer.company,
|
|
`Volunteer company should be a string for ${
|
|
volunteer.title ?? "unknown position"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof volunteer.start_date,
|
|
`Volunteer start_date should be a string for ${
|
|
volunteer.company ?? "unknown organization"
|
|
} - ${volunteer.title ?? "unknown position"}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof volunteer.end_date,
|
|
`Volunteer end_date should be a string for ${
|
|
volunteer.company ?? "unknown organization"
|
|
} - ${volunteer.title ?? "unknown position"}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof volunteer.description,
|
|
`Volunteer description should be a string for ${
|
|
volunteer.company ?? "unknown organization"
|
|
} - ${volunteer.title ?? "unknown position"}`,
|
|
).toBe("string");
|
|
}
|
|
|
|
expect(
|
|
Array.isArray(parsed.education),
|
|
`Resume education should be an array`,
|
|
).toBeTruthy();
|
|
for (const education of parsed.education) {
|
|
expect(education, `Education entry should be defined`).toBeDefined();
|
|
expect(
|
|
typeof education.title,
|
|
`Education title should be a string for ${
|
|
education.institution ?? "unknown institution"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof education.institution,
|
|
`Education institution should be a string for ${
|
|
education.title ?? "unknown degree"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof education.type,
|
|
`Education type should be a string for ${
|
|
education.institution ?? "unknown institution"
|
|
} - ${education.title ?? "unknown degree"}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof education.start_date,
|
|
`Education start_date should be a string for ${
|
|
education.institution ?? "unknown institution"
|
|
} - ${education.title ?? "unknown degree"}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof education.end_date,
|
|
`Education end_date should be a string for ${
|
|
education.institution ?? "unknown institution"
|
|
} - ${education.title ?? "unknown degree"}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof education.description,
|
|
`Education description should be a string for ${
|
|
education.institution ?? "unknown institution"
|
|
} - ${education.title ?? "unknown degree"}`,
|
|
).toBe("string");
|
|
}
|
|
|
|
expect(
|
|
Array.isArray(parsed.certifications),
|
|
`Resume certifications should be an array`,
|
|
).toBeTruthy();
|
|
for (const certification of parsed.certifications) {
|
|
expect(
|
|
certification,
|
|
`Certification entry should be defined`,
|
|
).toBeDefined();
|
|
expect(
|
|
typeof certification.title,
|
|
`Certification title should be a string for ${
|
|
certification.issuer ?? "unknown issuer"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof certification.issuer,
|
|
`Certification issuer should be a string for ${
|
|
certification.title ?? "unknown certification"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof certification.date,
|
|
`Certification date should be a string for ${
|
|
certification.issuer ?? "unknown issuer"
|
|
} - ${certification.title ?? "unknown certification"}`,
|
|
).toBe("string");
|
|
}
|
|
|
|
expect(
|
|
Array.isArray(parsed.projects),
|
|
`Resume projects should be an array`,
|
|
).toBeTruthy();
|
|
for (const project of parsed.projects) {
|
|
expect(project, `Resume project entry should be defined`).toBeDefined();
|
|
expect(
|
|
typeof project.title,
|
|
`Resume project title should be a string for ${
|
|
project.company ?? "unknown company"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof project.company,
|
|
`Resume project company should be a string for ${
|
|
project.title ?? "unknown project"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof project.description,
|
|
`Resume project description should be a string for ${
|
|
project.company ?? "unknown company"
|
|
} - ${project.title ?? "unknown project"}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof project.date,
|
|
`Resume project date should be a string for ${
|
|
project.company ?? "unknown company"
|
|
} - ${project.title ?? "unknown project"}`,
|
|
).toBe("string");
|
|
}
|
|
|
|
expect(
|
|
Array.isArray(parsed.publications),
|
|
`Resume publications should be an array`,
|
|
).toBeTruthy();
|
|
for (const publication of parsed.publications) {
|
|
expect(publication, `Publication entry should be defined`).toBeDefined();
|
|
expect(
|
|
typeof publication.title,
|
|
`Publication title should be a string for ${
|
|
publication.company ?? "unknown company"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof publication.company,
|
|
`Publication company should be a string for ${
|
|
publication.title ?? "unknown publication"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof publication.description,
|
|
`Publication description should be a string for ${
|
|
publication.company ?? "unknown company"
|
|
} - ${publication.title ?? "unknown publication"}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof publication.date,
|
|
`Publication date should be a string for ${
|
|
publication.company ?? "unknown company"
|
|
} - ${publication.title ?? "unknown publication"}`,
|
|
).toBe("string");
|
|
}
|
|
});
|
|
});
|
|
|
|
describe("donate data", () => {
|
|
it("should match the interface", async() => {
|
|
expect.hasAssertions();
|
|
const data = await readFile(
|
|
join(import.meta.dirname, "..", "data", "donate.yml"),
|
|
"utf8",
|
|
);
|
|
const parsed = parse(data) as Donate;
|
|
expect(parsed, `Parsed donate data should be defined`).toBeDefined();
|
|
expect(
|
|
Array.isArray(parsed),
|
|
`Parsed donate data should be an array`,
|
|
).toBeTruthy();
|
|
|
|
for (const method of parsed) {
|
|
expect(method, `Donation method should be defined`).toBeDefined();
|
|
expect(
|
|
typeof method.name,
|
|
`Donation method name should be a string for ${
|
|
method.name ?? "unknown method"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof method.description,
|
|
`Donation method description should be a string for ${
|
|
method.name ?? "unknown method"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof method.url,
|
|
`Donation method url should be a string for ${
|
|
method.name ?? "unknown method"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof method.icon,
|
|
`Donation method icon should be a string for ${
|
|
method.name ?? "unknown method"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof method.foreground,
|
|
`Donation method foreground should be a string for ${
|
|
method.name ?? "unknown method"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof method.background,
|
|
`Donation method background should be a string for ${
|
|
method.name ?? "unknown method"
|
|
}`,
|
|
).toBe("string");
|
|
|
|
await expect(
|
|
checkUrl(method.url),
|
|
`Donation method url should be reachable for ${
|
|
method.name ?? "unknown method"
|
|
}`,
|
|
).resolves.toBeTruthy();
|
|
}
|
|
});
|
|
});
|
|
|
|
describe("funding data", () => {
|
|
it("should match the interface", async() => {
|
|
expect.hasAssertions();
|
|
const data = await readFile(
|
|
join(import.meta.dirname, "..", "data", "funding.yml"),
|
|
"utf8",
|
|
);
|
|
const parsed = parse(data) as Funding;
|
|
expect(parsed, `Parsed funding data should be defined`).toBeDefined();
|
|
expect(typeof parsed.version, `Funding version should be a string`).toBe(
|
|
"string",
|
|
);
|
|
expect(parsed.version, `Funding version should be "1.0.0"`).toBe("1.0.0");
|
|
|
|
expect(parsed.entity, `Funding entity should be defined`).toBeDefined();
|
|
expect(
|
|
typeof parsed.entity.type,
|
|
`Funding entity type should be a string`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof parsed.entity.role,
|
|
`Funding entity role should be a string`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof parsed.entity.name,
|
|
`Funding entity name should be a string`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof parsed.entity.email,
|
|
`Funding entity email should be a string`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof parsed.entity.phone,
|
|
`Funding entity phone should be a string`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof parsed.entity.description,
|
|
`Funding entity description should be a string`,
|
|
).toBe("string");
|
|
expect(
|
|
parsed.entity.webpageUrl,
|
|
`Funding entity webpageUrl should be defined`,
|
|
).toBeDefined();
|
|
expect(
|
|
typeof parsed.entity.webpageUrl.url,
|
|
`Funding entity webpageUrl.url should be a string`,
|
|
).toBe("string");
|
|
await expect(
|
|
checkUrl(parsed.entity.webpageUrl.url),
|
|
`Funding entity webpageUrl.url should be reachable`,
|
|
).resolves.toBeTruthy();
|
|
|
|
if (parsed.entity.webpageUrl.wellKnown) {
|
|
expect(
|
|
typeof parsed.entity.webpageUrl.wellKnown,
|
|
`Funding entity webpageUrl.wellKnown should be a string`,
|
|
).toBe("string");
|
|
}
|
|
|
|
expect(
|
|
Array.isArray(parsed.projects),
|
|
`Funding projects should be an array`,
|
|
).toBeTruthy();
|
|
for (const project of parsed.projects) {
|
|
expect(project, `Funding project should be defined`).toBeDefined();
|
|
expect(
|
|
typeof project.guid,
|
|
`Funding project guid should be a string for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof project.name,
|
|
`Funding project name should be a string for guid: ${
|
|
project.guid ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof project.description,
|
|
`Funding project description should be a string for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
project.webpageUrl,
|
|
`Funding project webpageUrl should be defined for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBeDefined();
|
|
expect(
|
|
typeof project.webpageUrl.url,
|
|
`Funding project webpageUrl.url should be a string for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
await expect(
|
|
checkUrl(project.webpageUrl.url),
|
|
`Funding project webpageUrl.url should be reachable for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).resolves.toBeTruthy();
|
|
if (project.webpageUrl.wellKnown) {
|
|
expect(
|
|
typeof project.webpageUrl.wellKnown,
|
|
`Funding project webpageUrl.wellKnown should be a string for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
}
|
|
expect(
|
|
project.repositoryUrl,
|
|
`Funding project repositoryUrl should be defined for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBeDefined();
|
|
expect(
|
|
typeof project.repositoryUrl.url,
|
|
`Funding project repositoryUrl.url should be a string for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
await expect(
|
|
checkUrl(project.repositoryUrl.url),
|
|
`Funding project repositoryUrl.url should be reachable for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).resolves.toBeTruthy();
|
|
if (project.repositoryUrl.wellKnown) {
|
|
expect(
|
|
typeof project.repositoryUrl.wellKnown,
|
|
`Funding project repositoryUrl.wellKnown should be a string for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
}
|
|
expect(
|
|
Array.isArray(project.licenses),
|
|
`Funding project licenses should be an array for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBeTruthy();
|
|
for (const license of project.licenses) {
|
|
expect(
|
|
typeof license,
|
|
`License should be a string for project: ${project.name ?? "unknown"}`,
|
|
).toBe("string");
|
|
}
|
|
expect(
|
|
Array.isArray(project.tags),
|
|
`Funding project tags should be an array for project: ${
|
|
project.name ?? "unknown"
|
|
}`,
|
|
).toBeTruthy();
|
|
for (const tag of project.tags) {
|
|
expect(
|
|
typeof tag,
|
|
`Tag should be a string for project: ${project.name ?? "unknown"}`,
|
|
).toBe("string");
|
|
}
|
|
}
|
|
|
|
expect(parsed.funding, `Funding data should be defined`).toBeDefined();
|
|
expect(
|
|
Array.isArray(parsed.funding.channels),
|
|
`Funding channels should be an array`,
|
|
).toBeTruthy();
|
|
for (const channel of parsed.funding.channels) {
|
|
expect(channel, `Funding channel should be defined`).toBeDefined();
|
|
expect(
|
|
typeof channel.guid,
|
|
`Funding channel guid should be a string for channel: ${
|
|
channel.type ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof channel.type,
|
|
`Funding channel type should be a string for guid: ${
|
|
channel.guid ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof channel.address,
|
|
`Funding channel address should be a string for channel: ${
|
|
channel.type ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof channel.description,
|
|
`Funding channel description should be a string for channel: ${
|
|
channel.type ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
}
|
|
|
|
expect(
|
|
Array.isArray(parsed.funding.plans),
|
|
`Funding plans should be an array`,
|
|
).toBeTruthy();
|
|
for (const plan of parsed.funding.plans) {
|
|
expect(plan, `Funding plan should be defined`).toBeDefined();
|
|
expect(
|
|
typeof plan.guid,
|
|
`Funding plan guid should be a string for plan: ${
|
|
plan.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof plan.status,
|
|
`Funding plan status should be a string for plan: ${
|
|
plan.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof plan.name,
|
|
`Funding plan name should be a string for guid: ${
|
|
plan.guid ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof plan.description,
|
|
`Funding plan description should be a string for plan: ${
|
|
plan.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof plan.amount,
|
|
`Funding plan amount should be a number for plan: ${
|
|
plan.name ?? "unknown"
|
|
}`,
|
|
).toBe("number");
|
|
expect(
|
|
typeof plan.currency,
|
|
`Funding plan currency should be a string for plan: ${
|
|
plan.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof plan.frequency,
|
|
`Funding plan frequency should be a string for plan: ${
|
|
plan.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
Array.isArray(plan.channels),
|
|
`Funding plan channels should be an array for plan: ${
|
|
plan.name ?? "unknown"
|
|
}`,
|
|
).toBeTruthy();
|
|
for (const channel of plan.channels) {
|
|
expect(
|
|
typeof channel,
|
|
`Funding plan channel should be a string for plan: ${
|
|
plan.name ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
}
|
|
}
|
|
|
|
expect(
|
|
Array.isArray(parsed.funding.history),
|
|
`Funding history should be an array`,
|
|
).toBeTruthy();
|
|
for (const history of parsed.funding.history) {
|
|
expect(history, `Funding history entry should be defined`).toBeDefined();
|
|
expect(
|
|
typeof history.year,
|
|
`Funding history year should be a number for year: ${
|
|
history.year ?? "unknown"
|
|
}`,
|
|
).toBe("number");
|
|
expect(
|
|
typeof history.income,
|
|
`Funding history income should be a number for year: ${
|
|
history.year ?? "unknown"
|
|
}`,
|
|
).toBe("number");
|
|
expect(
|
|
typeof history.expenses,
|
|
`Funding history expenses should be a number for year: ${
|
|
history.year ?? "unknown"
|
|
}`,
|
|
).toBe("number");
|
|
expect(
|
|
typeof history.taxes,
|
|
`Funding history taxes should be a number for year: ${
|
|
history.year ?? "unknown"
|
|
}`,
|
|
).toBe("number");
|
|
expect(
|
|
typeof history.currency,
|
|
`Funding history currency should be a string for year: ${
|
|
history.year ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
expect(
|
|
typeof history.description,
|
|
`Funding history description should be a string for year: ${
|
|
history.year ?? "unknown"
|
|
}`,
|
|
).toBe("string");
|
|
}
|
|
});
|
|
});
|
|
|
|
describe("every project has a funding entry", () => {
|
|
it("should have a funding entry for every project", async() => {
|
|
expect.hasAssertions();
|
|
const projectData = await readFile(
|
|
join(import.meta.dirname, "..", "data", "projects.yml"),
|
|
"utf8",
|
|
);
|
|
const fundingData = await readFile(
|
|
join(import.meta.dirname, "..", "data", "funding.yml"),
|
|
"utf8",
|
|
);
|
|
const projects = parse(projectData) as Projects;
|
|
const funding = parse(fundingData) as Funding;
|
|
|
|
const fundingProjectNames = funding.projects.map((project) => {
|
|
return project.name;
|
|
});
|
|
|
|
for (const project of projects) {
|
|
if (project.premium) {
|
|
expect(
|
|
fundingProjectNames,
|
|
`Premium project ${project.name} should have a funding entry`,
|
|
).toContain(
|
|
project.name,
|
|
);
|
|
}
|
|
}
|
|
});
|
|
});
|