106 lines
2.7 KiB
TypeScript
106 lines
2.7 KiB
TypeScript
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
import { tmpdir } from "node:os";
|
|
import { join } from "node:path";
|
|
|
|
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
|
|
import { loadArticleSamples } from "../e2e/sample-flow/sample-loader";
|
|
|
|
describe("loadArticleSamples", () => {
|
|
let tempDir: string;
|
|
|
|
beforeEach(() => {
|
|
tempDir = mkdtempSync(join(tmpdir(), "geo-samples-"));
|
|
});
|
|
|
|
afterEach(() => {
|
|
rmSync(tempDir, { recursive: true, force: true });
|
|
});
|
|
|
|
it("loads valid samples in filename order and normalizes optional fields", () => {
|
|
writeFileSync(
|
|
join(tempDir, "b-sample.json"),
|
|
JSON.stringify({
|
|
name: "B sample",
|
|
input: {
|
|
body: "第二篇文章正文",
|
|
platform: "media_article",
|
|
},
|
|
}),
|
|
);
|
|
writeFileSync(
|
|
join(tempDir, "a-sample.json"),
|
|
JSON.stringify({
|
|
name: "A sample",
|
|
input: {
|
|
title: "标题",
|
|
body: "第一篇文章正文",
|
|
image_lines: "图一",
|
|
platform: "official_site",
|
|
user_instructions: "保持事实准确",
|
|
},
|
|
expectedHardFailures: ["body_quality"],
|
|
expectedWarnings: ["context_sensitive_terms"],
|
|
}),
|
|
);
|
|
|
|
const result = loadArticleSamples(tempDir);
|
|
|
|
expect(result.valid.map((sample) => sample.fileName)).toEqual([
|
|
"a-sample.json",
|
|
"b-sample.json",
|
|
]);
|
|
expect(result.invalid).toEqual([]);
|
|
expect(result.valid[1]).toEqual(
|
|
expect.objectContaining({
|
|
name: "B sample",
|
|
input: expect.objectContaining({
|
|
title: "",
|
|
image_lines: "",
|
|
user_instructions: "",
|
|
}),
|
|
expectedHardFailures: [],
|
|
expectedWarnings: [],
|
|
}),
|
|
);
|
|
});
|
|
|
|
it("returns invalid entries for malformed samples without throwing", () => {
|
|
writeFileSync(
|
|
join(tempDir, "empty-body.json"),
|
|
JSON.stringify({
|
|
name: "Empty body",
|
|
input: {
|
|
body: " ",
|
|
platform: "official_site",
|
|
},
|
|
}),
|
|
);
|
|
writeFileSync(
|
|
join(tempDir, "bad-platform.json"),
|
|
JSON.stringify({
|
|
name: "Bad platform",
|
|
input: {
|
|
body: "正文",
|
|
platform: "unknown",
|
|
},
|
|
}),
|
|
);
|
|
|
|
const result = loadArticleSamples(tempDir);
|
|
|
|
expect(result.valid).toEqual([]);
|
|
expect(result.invalid).toEqual([
|
|
expect.objectContaining({
|
|
fileName: "bad-platform.json",
|
|
reason:
|
|
"input.platform must be one of official_site, media_article, comparison_review, recommendation_list",
|
|
}),
|
|
expect.objectContaining({
|
|
fileName: "empty-body.json",
|
|
reason: "input.body must be a non-empty string",
|
|
}),
|
|
]);
|
|
});
|
|
});
|