142 lines
3.8 KiB
JavaScript
142 lines
3.8 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { readFileSync } from "node:fs";
|
|
import path from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
import ts from "typescript";
|
|
|
|
const testDir = path.dirname(fileURLToPath(import.meta.url));
|
|
const sourcePath = path.resolve(testDir, "../src/features/article-detail/model.ts");
|
|
const source = readFileSync(sourcePath, "utf8");
|
|
const compiled = ts.transpileModule(source, {
|
|
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2022 },
|
|
});
|
|
|
|
const moduleExports = {};
|
|
new Function("exports", compiled.outputText)(moduleExports);
|
|
|
|
const { buildDetailSummary, buildProductionArtifactRows } = moduleExports;
|
|
|
|
const rows = buildProductionArtifactRows([
|
|
{
|
|
id: "job-section-1",
|
|
article_id: "a1",
|
|
parent_job_id: null,
|
|
attempt: 1,
|
|
job_type: "SECTION_SCAFFOLD",
|
|
agent_profile: "fake-section-scaffold",
|
|
status: "SUCCEEDED",
|
|
workspace_path: null,
|
|
input_files: [],
|
|
output_files: [],
|
|
payload: {
|
|
artifact_key: "section:1",
|
|
artifact_label: "Context and scope",
|
|
used_evidence_ids: ["e1", "e2"],
|
|
unsupported_claims: [],
|
|
},
|
|
error_category: null,
|
|
error_message: null,
|
|
stdout: "",
|
|
stderr: "",
|
|
exit_code: 0,
|
|
duration_ms: 3,
|
|
queued_at: "2026-05-21T00:00:00Z",
|
|
started_at: "2026-05-21T00:00:01Z",
|
|
finished_at: "2026-05-21T00:00:02Z",
|
|
},
|
|
{
|
|
id: "job-section-2",
|
|
article_id: "a1",
|
|
parent_job_id: null,
|
|
attempt: 1,
|
|
job_type: "SECTION_SCAFFOLD",
|
|
agent_profile: "fake-section-scaffold",
|
|
status: "FAILED",
|
|
workspace_path: null,
|
|
input_files: [],
|
|
output_files: [],
|
|
payload: {
|
|
artifact_key: "section:2",
|
|
artifact_label: "Implementation workflow",
|
|
used_evidence_ids: ["e2"],
|
|
unsupported_claims: [{ claim_text: "Unverified claim" }],
|
|
},
|
|
error_category: "UNSUPPORTED_CLAIMS_FOUND",
|
|
error_message: "Unsupported claims introduced during scaffolding: 1",
|
|
stdout: "",
|
|
stderr: "",
|
|
exit_code: 0,
|
|
duration_ms: 3,
|
|
queued_at: "2026-05-21T00:00:00Z",
|
|
started_at: "2026-05-21T00:00:01Z",
|
|
finished_at: "2026-05-21T00:00:02Z",
|
|
},
|
|
{
|
|
id: "job-non-artifact",
|
|
article_id: "a1",
|
|
parent_job_id: null,
|
|
attempt: 1,
|
|
job_type: "TEST_CODEX",
|
|
agent_profile: "fake-codex",
|
|
status: "SUCCEEDED",
|
|
workspace_path: null,
|
|
input_files: [],
|
|
output_files: [],
|
|
payload: {},
|
|
error_category: null,
|
|
error_message: null,
|
|
stdout: "",
|
|
stderr: "",
|
|
exit_code: 0,
|
|
duration_ms: 0,
|
|
queued_at: "2026-05-21T00:00:00Z",
|
|
started_at: "2026-05-21T00:00:01Z",
|
|
finished_at: "2026-05-21T00:00:02Z",
|
|
},
|
|
]);
|
|
|
|
assert.equal(rows.length, 2);
|
|
assert.equal(rows[0].artifactLabel, "Context and scope");
|
|
assert.equal(rows[0].status, "SUCCEEDED");
|
|
assert.deepEqual(rows[0].usedEvidenceIds, ["e1", "e2"]);
|
|
assert.equal(rows[1].status, "FAILED");
|
|
assert.deepEqual(rows[1].unsupportedClaims, ["Unverified claim"]);
|
|
|
|
const detailSummary = buildDetailSummary({
|
|
article: {
|
|
id: "a1",
|
|
target_site_id: "site1",
|
|
status: "PUBLISH_COMMIT_CREATED",
|
|
publishing_status: "PUBLISH_COMMIT_CREATED",
|
|
brief_description: "desc",
|
|
language: "en",
|
|
content_type: "longform_guide",
|
|
created_at: "2026-05-21T00:00:00Z",
|
|
updated_at: "2026-05-21T00:00:00Z",
|
|
},
|
|
target_site: { name: "Demo Site" },
|
|
workflow_events: [],
|
|
agent_jobs: [],
|
|
publish_commit: {
|
|
id: "pc1",
|
|
article_id: "a1",
|
|
target_site_id: "site1",
|
|
repository_url: "/tmp/repo.git",
|
|
branch: "main",
|
|
commit_sha: "abc123",
|
|
status: "PUBLISH_COMMIT_CREATED",
|
|
created_at: "2026-05-21T00:00:00Z",
|
|
content_bundle_manifest: {
|
|
validation: {
|
|
label: "Best-effort content-shape validation only.",
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
assert.equal(
|
|
detailSummary.publishingValidationLabel,
|
|
"Best-effort content-shape validation only.",
|
|
);
|