120 lines
3.6 KiB
TypeScript
120 lines
3.6 KiB
TypeScript
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: "八大人群分布"
|
|
}
|
|
]
|
|
};
|
|
}
|