import { describe, expect, test } from "vitest"; import { buildAudienceProfileCsv } from "../src/content/market/audience-profile-csv"; import type { AudienceProfileExportRow } from "../src/content/market/audience-profile-types"; describe("audience-profile-csv", () => { test("exports only requested profile distribution columns", () => { const csv = buildAudienceProfileCsv([ { profiles: { audience: { age: [{ label: "31-40", value: "50%" }], cityTier: [{ label: "一线城市", value: "100%" }], crowd: [{ label: "都市蓝领", value: "100%" }], gender: [ { label: "男性", value: "71.7%" }, { label: "女性", value: "28.3%" } ], status: "success" }, fans: { age: [{ label: "31-40", value: "40%" }], cityTier: [{ label: "一线城市", value: "80%" }], crowd: [{ label: "都市蓝领", value: "60%" }], gender: [ { label: "男性", value: "60%" }, { label: "女性", value: "40%" } ], status: "success" }, longtimeFans: { age: [{ label: "31-40", value: "30%" }], cityTier: [{ label: "一线城市", value: "70%" }], crowd: [{ label: "都市蓝领", value: "50%" }], status: "success" } }, record: { authorId: "123", authorName: "达人 A", exportFields: { 达人信息: "达人 A", 连接用户数: "300w" }, status: "success" } } satisfies AudienceProfileExportRow ]); const [headerLine, rowLine] = csv.split("\n"); expect(headerLine).toContain("达人信息,连接用户数"); expect(headerLine).not.toContain("抓取状态"); expect(headerLine).not.toContain("失败原因"); expect(headerLine).toContain("观众画像-男性占比"); expect(headerLine).toContain("粉丝画像-女性占比"); expect(headerLine).not.toContain("铁粉画像-男性占比"); expect(headerLine).toContain("观众画像-31-40占比"); expect(headerLine).toContain("粉丝画像-一线城市占比"); expect(headerLine).toContain("铁粉画像-都市蓝领占比"); expect(headerLine).not.toContain("省份"); expect(headerLine).not.toContain("地域TOP"); expect(headerLine).not.toContain("兴趣TOP"); expect(rowLine).toContain("71.7%"); expect(rowLine).toContain("60%"); }); test("leaves distribution cells empty when profile loading fails", () => { const csv = buildAudienceProfileCsv([ { profiles: { audience: { failureReason: "request-failed", status: "failed" }, fans: { failureReason: "timeout", status: "failed" }, longtimeFans: { status: "failed" } }, record: { authorId: "123", authorName: "达人 A", status: "success" } } satisfies AudienceProfileExportRow ]); const [, rowLine] = csv.split("\n"); expect(rowLine).not.toContain("失败"); expect(rowLine).not.toContain("request-failed"); expect(rowLine).not.toContain("timeout"); }); });