import { existsSync, readdirSync, readFileSync, statSync } from "node:fs"; import { join } from "node:path"; import { type Credito, validarCreditos } from "./creditos"; const ok: Credito = { arquivo: "som/tiro.ogg", origem: "https://exemplo.org/tiro", autor: "Fulano", licenca: "CC0-1.0", }; describe("validarCreditos", () => { it("não devolve erro quando está tudo certo", () => { const propria: Credito = { arquivo: "a.png", origem: "interna", autor: "Evandro", licenca: "propria", }; expect(validarCreditos(["som/tiro.ogg", "a.png"], [ok, propria])).toEqual( [], ); }); it("aponta arquivo sem crédito", () => { expect(validarCreditos(["som/tiro.ogg", "b.png"], [ok])).toEqual([ "b.png: arquivo sem crédito.", ]); }); it("aponta crédito de arquivo que não existe", () => { expect(validarCreditos([], [ok])).toEqual([ "som/tiro.ogg: crédito de arquivo que não existe.", ]); }); it("aponta licença não aceita", () => { const erros = validarCreditos( ["som/tiro.ogg"], [{ ...ok, licenca: "CC-BY-4.0" }], ); expect(erros).toEqual(["som/tiro.ogg: licença não aceita (CC-BY-4.0)."]); }); it("exige origem https:// para CC0-1.0", () => { const erros = validarCreditos( ["som/tiro.ogg"], [{ ...ok, origem: "http://exemplo.org" }], ); expect(erros).toEqual([ "som/tiro.ogg: a origem de CC0-1.0 deve começar com https://.", ]); }); it("aponta autor vazio", () => { expect(validarCreditos(["som/tiro.ogg"], [{ ...ok, autor: " " }])).toEqual( ["som/tiro.ogg: autor vazio."], ); }); it("aponta arquivo creditado duas vezes", () => { expect(validarCreditos(["som/tiro.ogg"], [ok, ok])).toEqual([ "som/tiro.ogg: creditado mais de uma vez.", ]); }); }); function listar(pasta: string, base = ""): string[] { if (!existsSync(pasta)) return []; return readdirSync(pasta).flatMap((nome) => { const caminho = join(pasta, nome); const rel = base ? `${base}/${nome}` : nome; if (statSync(caminho).isDirectory()) return listar(caminho, rel); return rel === "CREDITOS.json" ? [] : [rel]; }); } describe("public/jogo", () => { it("tem crédito válido para cada arquivo", () => { const pasta = join(process.cwd(), "public", "jogo"); const json = join(pasta, "CREDITOS.json"); const creditos: Credito[] = existsSync(json) ? JSON.parse(readFileSync(json, "utf8")) : []; expect(validarCreditos(listar(pasta), creditos)).toEqual([]); }); });