124 lines
4.0 KiB
TypeScript
124 lines
4.0 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import type { ConfirmedFactCard } from "../../domain/types";
|
|
import { normalizeInput } from "../input-normalizer";
|
|
import { inspectQuality } from "../quality-inspector";
|
|
|
|
const confirmedFactCard: ConfirmedFactCard = {
|
|
company_full_name: "Example Technology Co., Ltd.",
|
|
company_short_names: ["Example Tech"],
|
|
brand_names: ["Example"],
|
|
product_names: ["Example GEO"],
|
|
target_industry: "GEO optimization",
|
|
target_audience: "Marketing teams",
|
|
experience_years: 8,
|
|
core_claims: ["Eight years of GEO optimization experience"],
|
|
forbidden_claims: ["industry first"],
|
|
image_topics: ["product dashboard"],
|
|
uncertain_items: [],
|
|
is_ready_for_optimization: true,
|
|
confirmed_by_user: true,
|
|
};
|
|
|
|
describe("workflow nodes", () => {
|
|
it("normalizes input whitespace and image lines", () => {
|
|
const normalized = normalizeInput({
|
|
title: " A GEO Article ",
|
|
body: "\nFirst paragraph.\n\nSecond paragraph. ",
|
|
image_lines:
|
|
" Product dashboard screenshot \n https://example.com/image.png \n\n",
|
|
platform: "official_site",
|
|
user_instructions: " Keep factual. ",
|
|
});
|
|
|
|
expect(normalized.article_draft.title).toBe("A GEO Article");
|
|
expect(normalized.article_draft.body).toBe(
|
|
"First paragraph.\n\nSecond paragraph.",
|
|
);
|
|
expect(normalized.image_assets).toEqual([
|
|
{ type: "description", content: "Product dashboard screenshot" },
|
|
{ type: "link", content: "https://example.com/image.png" },
|
|
]);
|
|
});
|
|
|
|
it("returns the 10 required quality checks", () => {
|
|
const report = inspectQuality({
|
|
article: {
|
|
title: "Example GEO Optimization Guide",
|
|
summary: "A factual guide for marketing teams.",
|
|
body_markdown:
|
|
"Example Technology Co., Ltd. has eight years of GEO optimization experience.",
|
|
image_suggestions: [],
|
|
changed_sections: [],
|
|
requires_user_confirmation: [],
|
|
},
|
|
factCard: confirmedFactCard,
|
|
platform: "official_site",
|
|
sourceImages: [],
|
|
});
|
|
|
|
expect(report.checks.map((check) => check.rule_id)).toEqual([
|
|
"industry_alignment",
|
|
"image_text_match",
|
|
"voice_consistency",
|
|
"platform_fit",
|
|
"company_name_integrity",
|
|
"title_quality",
|
|
"body_quality",
|
|
"hallucination_risk",
|
|
"claim_consistency",
|
|
"context_sensitive_terms",
|
|
]);
|
|
});
|
|
|
|
it("returns quality report details in Chinese", () => {
|
|
const report = inspectQuality({
|
|
article: {
|
|
title: "Example GEO Optimization Guide",
|
|
summary: "A factual guide for marketing teams.",
|
|
body_markdown:
|
|
"Example Technology Co., Ltd. has eight years of GEO optimization experience.",
|
|
image_suggestions: [],
|
|
changed_sections: [],
|
|
requires_user_confirmation: [],
|
|
},
|
|
factCard: confirmedFactCard,
|
|
platform: "official_site",
|
|
sourceImages: [],
|
|
});
|
|
|
|
expect(report.checks[0]?.reason).toContain("行业");
|
|
expect(report.checks[0]?.suggested_fix).toContain("行业");
|
|
expect(report.checks[0]?.evidence).not.toContain("Article");
|
|
});
|
|
|
|
it("hard-fails incomplete company names, hallucinated numbers, industry drift, and conflicting years", () => {
|
|
const report = inspectQuality({
|
|
article: {
|
|
title: "Example Wins Finance Automation Market!!!",
|
|
summary: "A finance automation story.",
|
|
body_markdown:
|
|
"Example has 12 years of finance automation experience, 99 patents, and works in banking automation.",
|
|
image_suggestions: [],
|
|
changed_sections: [],
|
|
requires_user_confirmation: [],
|
|
},
|
|
factCard: confirmedFactCard,
|
|
platform: "official_site",
|
|
sourceImages: [],
|
|
});
|
|
|
|
const failures = report.checks.filter((check) => check.status === "fail");
|
|
expect(failures.map((check) => check.rule_id)).toEqual(
|
|
expect.arrayContaining([
|
|
"company_name_integrity",
|
|
"hallucination_risk",
|
|
"industry_alignment",
|
|
"claim_consistency",
|
|
]),
|
|
);
|
|
expect(report.overall_status).toBe("fail");
|
|
});
|
|
|
|
});
|