171 lines
4.9 KiB
TypeScript
171 lines
4.9 KiB
TypeScript
import { describe, expect, test, vi } from "vitest";
|
|
|
|
import {
|
|
buildBusinessAbilityEstimateUrl,
|
|
buildBusinessAbilityVideoUrl,
|
|
createBusinessAbilityClient,
|
|
mapBusinessAbilityEstimateResponse,
|
|
mapBusinessAbilityVideoResponse
|
|
} from "../src/content/market/business-ability-client";
|
|
|
|
describe("business-ability-client", () => {
|
|
test("builds commercial ability urls used by the Xingtu detail page", () => {
|
|
expect(
|
|
buildBusinessAbilityVideoUrl(
|
|
"6724241209444794382",
|
|
"https://www.xingtu.cn",
|
|
2
|
|
)
|
|
).toBe(
|
|
"https://www.xingtu.cn/gw/api/data_sp/get_author_spread_info?o_author_id=6724241209444794382&platform_source=1&platform_channel=1&type=2&flow_type=0&only_assign=true&range=2"
|
|
);
|
|
|
|
expect(
|
|
buildBusinessAbilityEstimateUrl(
|
|
"6724241209444794382",
|
|
"https://www.xingtu.cn"
|
|
)
|
|
).toBe(
|
|
"https://www.xingtu.cn/gw/api/aggregator/get_author_commerce_spread_info?o_author_id=6724241209444794382"
|
|
);
|
|
});
|
|
|
|
test("maps video content metrics into page-style display values", () => {
|
|
expect(mapBusinessAbilityVideoResponse(buildVideoPayload())).toEqual({
|
|
averageComment: "5.1w",
|
|
averageDuration: "170s",
|
|
averageLike: "150.3w",
|
|
averageShare: "68.4w",
|
|
finishRate: "19.9%",
|
|
interactionRate: "5.5%",
|
|
medianPlay: "4059.7w",
|
|
publishedItems: "<5"
|
|
});
|
|
});
|
|
|
|
test("maps duration estimates into page-style display values", () => {
|
|
expect(mapBusinessAbilityEstimateResponse(buildEstimatePayload())).toEqual({
|
|
oneToTwenty: {
|
|
expectedCpe: "2.1",
|
|
expectedCpm: "120.0",
|
|
expectedPlay: "250w",
|
|
hotRate: "100%"
|
|
},
|
|
overSixty: {
|
|
expectedCpe: "4.2",
|
|
expectedCpm: "240.0",
|
|
expectedPlay: "250w",
|
|
hotRate: "100%"
|
|
},
|
|
twentyToSixty: {
|
|
expectedCpe: "3.7",
|
|
expectedCpm: "212.0",
|
|
expectedPlay: "250w",
|
|
hotRate: "100%"
|
|
}
|
|
});
|
|
});
|
|
|
|
test("keeps decimal CPM values and marks missing hot rate", () => {
|
|
expect(mapBusinessAbilityEstimateResponse({
|
|
base_resp: { status_code: 0, status_message: "" },
|
|
cpe_1_20: "1.6347",
|
|
cpe_20_60: "2.002",
|
|
cpe_60: "2.104",
|
|
cpm_1_20: "21.7955",
|
|
cpm_20_60: "27.5628",
|
|
cpm_60: "29.877",
|
|
vv: "1010234"
|
|
})).toEqual({
|
|
oneToTwenty: {
|
|
expectedCpe: "1.6",
|
|
expectedCpm: "21.8",
|
|
expectedPlay: "101w",
|
|
hotRate: "缺失"
|
|
},
|
|
overSixty: {
|
|
expectedCpe: "2.1",
|
|
expectedCpm: "29.9",
|
|
expectedPlay: "101w",
|
|
hotRate: "缺失"
|
|
},
|
|
twentyToSixty: {
|
|
expectedCpe: "2",
|
|
expectedCpm: "27.6",
|
|
expectedPlay: "101w",
|
|
hotRate: "缺失"
|
|
}
|
|
});
|
|
});
|
|
|
|
test("loads personal video, Xingtu video, and duration estimate metrics", async () => {
|
|
const requestedUrls: string[] = [];
|
|
const fetchImpl = vi.fn(async (input: string) => {
|
|
requestedUrls.push(input);
|
|
return {
|
|
json: async () =>
|
|
input.includes("get_author_commerce_spread_info")
|
|
? buildEstimatePayload()
|
|
: buildVideoPayload(),
|
|
ok: true
|
|
};
|
|
});
|
|
const client = createBusinessAbilityClient({
|
|
baseUrl: "https://www.xingtu.cn",
|
|
fetchImpl,
|
|
timeoutMs: 1000
|
|
});
|
|
|
|
await expect(
|
|
client.loadBusinessAbility({
|
|
authorId: "6724241209444794382",
|
|
authorName: "李蠕蠕",
|
|
status: "success"
|
|
})
|
|
).resolves.toMatchObject({
|
|
estimates: expect.objectContaining({
|
|
twentyToSixty: expect.objectContaining({ expectedCpm: "212.0" })
|
|
}),
|
|
status: "success",
|
|
videos: {
|
|
personalVideo: expect.objectContaining({ medianPlay: "4059.7w" }),
|
|
xingtuVideo: expect.objectContaining({ medianPlay: "4059.7w" })
|
|
}
|
|
});
|
|
|
|
expect(requestedUrls).toEqual([
|
|
"https://www.xingtu.cn/gw/api/data_sp/get_author_spread_info?o_author_id=6724241209444794382&platform_source=1&platform_channel=1&type=1&flow_type=0&only_assign=true&range=2",
|
|
"https://www.xingtu.cn/gw/api/data_sp/get_author_spread_info?o_author_id=6724241209444794382&platform_source=1&platform_channel=1&type=2&flow_type=0&only_assign=true&range=2",
|
|
"https://www.xingtu.cn/gw/api/aggregator/get_author_commerce_spread_info?o_author_id=6724241209444794382"
|
|
]);
|
|
});
|
|
});
|
|
|
|
function buildVideoPayload() {
|
|
return {
|
|
avg_duration: 17002,
|
|
base_resp: { status_code: 0, status_message: "" },
|
|
comment_avg: 51404,
|
|
interact_rate: { value: 551 },
|
|
item_num: 2,
|
|
like_avg: 1503028,
|
|
play_mid: 40596960,
|
|
play_over_rate: { value: 1991 },
|
|
share_avg: 684318
|
|
};
|
|
}
|
|
|
|
function buildEstimatePayload() {
|
|
return {
|
|
base_resp: { status_code: 0, status_message: "" },
|
|
cpe_1_20: "2.1035",
|
|
cpe_20_60: "3.7161",
|
|
cpe_60: "4.2069",
|
|
cpm_1_20: "119.9976",
|
|
cpm_20_60: "211.9958",
|
|
cpm_60: "239.9953",
|
|
platform_hot_rate: "1",
|
|
vv: "2500049"
|
|
};
|
|
}
|