import { describe, expect, test, vi } from "vitest"; import { createAudienceProfileClient, mapAudienceProfileResponse } from "../src/content/market/audience-profile-client"; describe("audience-profile-client", () => { test("loads connection user audience distributions from Xingtu", async () => { const fetchImpl = vi.fn(async () => ({ json: async () => buildAudiencePayload(), ok: true })); const client = createAudienceProfileClient({ baseUrl: "https://www.xingtu.cn", fetchImpl, timeoutMs: 1000 }); const result = await client.loadAudienceProfile({ authorId: "7294473194298146854", authorName: "奇奇de海洋", status: "success" }); expect(fetchImpl).toHaveBeenCalledWith( "https://www.xingtu.cn/gw/api/data_sp/author_audience_distribution?o_author_id=7294473194298146854&platform_source=1&platform_channel=1&link_type=1", expect.objectContaining({ credentials: "include", method: "GET" }) ); expect(result).toEqual( expect.objectContaining({ status: "success", gender: [ { label: "男性", value: "71.7%" }, { label: "女性", value: "28.3%" } ], cityTop: expect.arrayContaining([{ label: "广州", value: "30.4%" }]) }) ); }); test("maps Xingtu audience distribution payload into named profile sections", () => { const result = mapAudienceProfileResponse(buildAudiencePayload()); expect(result).toEqual( expect.objectContaining({ status: "success", age: [ { label: "18-23", value: "20%" }, { label: "24-30", value: "30%" }, { label: "31-40", value: "50%" } ], province: [ { label: "广东", value: "60%" }, { label: "浙江", value: "40%" } ], cityTier: [{ label: "一线城市", value: "100%" }], interest: [{ label: "随拍", value: "100%" }], crowd: [{ label: "都市蓝领", value: "100%" }] }) ); }); }); function buildAudiencePayload() { return { base_resp: { status_code: 0, status_message: "" }, distributions: [ { distribution_list: [ { distribution_key: "male", distribution_value: 717 }, { distribution_key: "female", distribution_value: 283 } ], type_display: "性别分布" }, { distribution_list: [ { distribution_key: "31-40", distribution_value: 50 }, { distribution_key: "18-23", distribution_value: 20 }, { distribution_key: "24-30", distribution_value: 30 } ], type_display: "年龄分布" }, { distribution_list: [ { distribution_key: "浙江", distribution_value: 40 }, { distribution_key: "广东", distribution_value: 60 } ], type_display: "省份分布" }, { distribution_list: [ { distribution_key: "广州", distribution_value: 304 }, { distribution_key: "北京", distribution_value: 291 }, { distribution_key: "上海", distribution_value: 405 } ], type_display: "城市分布" }, { distribution_list: [{ distribution_key: "一线", distribution_value: 1 }], type_display: "城市等级分布" }, { distribution_list: [{ distribution_key: "随拍", distribution_value: 1 }], type_display: "兴趣分布" }, { distribution_list: [{ distribution_key: "都市蓝领", distribution_value: 1 }], type_display: "八大人群分布" } ] }; }