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", expectedPlay: "250w", hotRate: "100%" }, overSixty: { expectedCpe: "4.2", expectedCpm: "240", expectedPlay: "250w", hotRate: "100%" }, twentyToSixty: { expectedCpe: "3.7", expectedCpm: "212", expectedPlay: "250w", hotRate: "100%" } }); }); 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" }) }), 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" }; }