97 lines
2.8 KiB
TypeScript
97 lines
2.8 KiB
TypeScript
import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
|
|
import { tmpdir } from "node:os";
|
|
import { join } from "node:path";
|
|
|
|
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
|
|
import {
|
|
aggregateSummary,
|
|
redactSensitiveText,
|
|
writeSampleResult,
|
|
writeSummaryFiles,
|
|
} from "../e2e/sample-flow/reporting";
|
|
import type { InvalidArticleSample, SampleResult } from "../e2e/sample-flow/types";
|
|
|
|
describe("reporting helpers", () => {
|
|
let reportDir: string;
|
|
|
|
beforeEach(() => {
|
|
reportDir = mkdtempSync(join(tmpdir(), "geo-report-"));
|
|
});
|
|
|
|
afterEach(() => {
|
|
rmSync(reportDir, { recursive: true, force: true });
|
|
});
|
|
|
|
it("redacts API keys and authorization tokens", () => {
|
|
const redacted = redactSensitiveText(
|
|
'x-api-key: local-dev-key Authorization: Bearer secret DEEPSEEK_API_KEY="abc"',
|
|
["local-dev-key", "abc"],
|
|
);
|
|
|
|
expect(redacted).toBe(
|
|
'x-api-key: [REDACTED] Authorization: Bearer [REDACTED] DEEPSEEK_API_KEY="[REDACTED]"',
|
|
);
|
|
});
|
|
|
|
it("writes per-sample results and aggregate summary files", () => {
|
|
const sample: SampleResult = {
|
|
file: "samples/articles/title-quality.json",
|
|
name: "Title quality",
|
|
slug: "title-quality",
|
|
status: "passed",
|
|
duration_ms: 1234,
|
|
job_id: "job_123",
|
|
qa_status: "warn",
|
|
qa_fail_rules: [],
|
|
qa_warn_rules: ["title_quality"],
|
|
expected_hard_failures: [],
|
|
expected_warnings: ["title_quality"],
|
|
exports: {
|
|
"optimized.md": "passed",
|
|
"optimized.docx": "passed",
|
|
"qa_report.json": "passed",
|
|
},
|
|
llm_tasks: ["fact_extractor", "article_optimizer", "quality_inspector"],
|
|
artifacts: {
|
|
final_screenshot: "samples/title-quality/final.png",
|
|
},
|
|
};
|
|
const invalid: InvalidArticleSample[] = [
|
|
{
|
|
filePath: "/repo/samples/articles/bad.json",
|
|
fileName: "bad.json",
|
|
reason: "input.body must be a non-empty string",
|
|
},
|
|
];
|
|
|
|
writeSampleResult(reportDir, sample);
|
|
const summary = aggregateSummary({
|
|
startedAt: "2026-07-01T00:00:00.000Z",
|
|
finishedAt: "2026-07-01T00:01:00.000Z",
|
|
provider: "deepseek",
|
|
model: "deepseek-v4-pro",
|
|
baseURL: "http://127.0.0.1:3000",
|
|
reportDir,
|
|
samples: [sample],
|
|
invalidSamples: invalid,
|
|
});
|
|
writeSummaryFiles(reportDir, summary);
|
|
|
|
expect(
|
|
existsSync(join(reportDir, "samples", "title-quality", "result.json")),
|
|
).toBe(true);
|
|
expect(
|
|
JSON.parse(readFileSync(join(reportDir, "summary.json"), "utf8")),
|
|
).toEqual(
|
|
expect.objectContaining({
|
|
provider: "deepseek",
|
|
totals: { passed: 1, failed: 0, skipped: 1 },
|
|
}),
|
|
);
|
|
expect(readFileSync(join(reportDir, "summary.md"), "utf8")).toContain(
|
|
"| Title quality | passed | warn |",
|
|
);
|
|
});
|
|
});
|