271 lines
6.8 KiB
TypeScript
271 lines
6.8 KiB
TypeScript
import { describe, expect, test, vi } from "vitest";
|
|
|
|
import { registerBackgroundMessageHandler } from "../src/background/index";
|
|
|
|
describe("background-index", () => {
|
|
test("downloads csv files when the content script sends a download message", async () => {
|
|
const listeners: Array<
|
|
(message: unknown, sender: unknown, sendResponse: (response: unknown) => void) => boolean | void
|
|
> = [];
|
|
const download = vi.fn(async () => undefined);
|
|
const sendResponse = vi.fn();
|
|
|
|
registerBackgroundMessageHandler({
|
|
downloads: {
|
|
download
|
|
},
|
|
runtime: {
|
|
onMessage: {
|
|
addListener(listener) {
|
|
listeners.push(listener);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
expect(listeners).toHaveLength(1);
|
|
const result = listeners[0](
|
|
{
|
|
csv: "列1,列2\n值1,值2",
|
|
filename: "market.csv",
|
|
type: "download-market-csv"
|
|
},
|
|
{},
|
|
sendResponse
|
|
);
|
|
|
|
expect(result).toBe(true);
|
|
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
|
|
expect(download).toHaveBeenCalledTimes(1);
|
|
expect(download).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
filename: "market.csv",
|
|
saveAs: false,
|
|
url: expect.stringContaining("data:text/csv;charset=utf-8,")
|
|
})
|
|
);
|
|
expect(sendResponse).toHaveBeenCalledWith({ ok: true });
|
|
});
|
|
|
|
test("responds to auth:get-state with auth status", async () => {
|
|
const listeners: Array<
|
|
(message: unknown, sender: unknown, sendResponse: (response: unknown) => void) => boolean | void
|
|
> = [];
|
|
const sendResponse = vi.fn();
|
|
|
|
registerBackgroundMessageHandler(
|
|
{
|
|
runtime: {
|
|
onMessage: {
|
|
addListener(listener) {
|
|
listeners.push(listener);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
authController: {
|
|
getAccessToken: vi.fn(),
|
|
getAuthState: vi.fn(async () => ({ isAuthenticated: false })),
|
|
signIn: vi.fn(),
|
|
signOut: vi.fn()
|
|
}
|
|
}
|
|
);
|
|
|
|
const result = listeners[0]({ type: "auth:get-state" }, {}, sendResponse);
|
|
|
|
expect(result).toBe(true);
|
|
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
|
|
expect(sendResponse).toHaveBeenCalledWith({
|
|
ok: true,
|
|
type: "auth:state",
|
|
value: { isAuthenticated: false }
|
|
});
|
|
});
|
|
|
|
test("responds to auth:get-access-token with the current token", async () => {
|
|
const listeners: Array<
|
|
(message: unknown, sender: unknown, sendResponse: (response: unknown) => void) => boolean | void
|
|
> = [];
|
|
const sendResponse = vi.fn();
|
|
|
|
registerBackgroundMessageHandler(
|
|
{
|
|
runtime: {
|
|
onMessage: {
|
|
addListener(listener) {
|
|
listeners.push(listener);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
authController: {
|
|
getAccessToken: vi.fn(async () => "test-access-token"),
|
|
getAuthState: vi.fn(),
|
|
signIn: vi.fn(),
|
|
signOut: vi.fn()
|
|
}
|
|
}
|
|
);
|
|
|
|
const result = listeners[0](
|
|
{ type: "auth:get-access-token" },
|
|
{},
|
|
sendResponse
|
|
);
|
|
|
|
expect(result).toBe(true);
|
|
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
|
|
expect(sendResponse).toHaveBeenCalledWith({
|
|
ok: true,
|
|
type: "auth:token",
|
|
value: { accessToken: "test-access-token" }
|
|
});
|
|
});
|
|
|
|
test("submits batches through the background message handler", async () => {
|
|
const listeners: Array<
|
|
(message: unknown, sender: unknown, sendResponse: (response: unknown) => void) => boolean | void
|
|
> = [];
|
|
const sendResponse = vi.fn();
|
|
const submitBatch = vi.fn(async () => ({
|
|
acceptedCount: 1,
|
|
batchId: "批次A-2026-04-22T12:30:00.000Z",
|
|
ok: true
|
|
}));
|
|
|
|
registerBackgroundMessageHandler(
|
|
{
|
|
runtime: {
|
|
onMessage: {
|
|
addListener(listener) {
|
|
listeners.push(listener);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
authController: {
|
|
getAccessToken: vi.fn(async () => "test-access-token"),
|
|
getAuthState: vi.fn(),
|
|
signIn: vi.fn(),
|
|
signOut: vi.fn()
|
|
},
|
|
submitBatch
|
|
}
|
|
);
|
|
|
|
const result = listeners[0](
|
|
{
|
|
payload: {
|
|
authors: [{ authorId: "111", authorName: "达人A" }],
|
|
batchName: "批次A",
|
|
createdAt: "2026-04-22T12:30:00.000Z",
|
|
creatorName: "王少卿",
|
|
logtoUserId: "p7pdhhtde8kj",
|
|
resource: "https://talent-search.intelligrow.cn"
|
|
},
|
|
type: "batch:submit"
|
|
},
|
|
{},
|
|
sendResponse
|
|
);
|
|
|
|
expect(result).toBe(true);
|
|
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
|
|
expect(submitBatch).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
batchName: "批次A"
|
|
})
|
|
);
|
|
expect(submitBatch.mock.calls[0]?.[0]).not.toHaveProperty("batchId");
|
|
expect(sendResponse).toHaveBeenCalledWith({
|
|
ok: true,
|
|
type: "batch:ack",
|
|
value: {
|
|
acceptedCount: 1,
|
|
batchId: "批次A-2026-04-22T12:30:00.000Z",
|
|
ok: true
|
|
}
|
|
});
|
|
});
|
|
|
|
test("searches backend metrics through the background message handler", async () => {
|
|
const listeners: Array<
|
|
(message: unknown, sender: unknown, sendResponse: (response: unknown) => void) => boolean | void
|
|
> = [];
|
|
const sendResponse = vi.fn();
|
|
const searchBackendMetrics = vi.fn(async () => [
|
|
{
|
|
a3IncreaseCount: "78,366.22",
|
|
afterViewSearchCount: "9,689.96",
|
|
afterViewSearchRate: "0.36%",
|
|
cpSearch: "14.46",
|
|
cpa3: "1.79",
|
|
newA3Rate: "3.44%",
|
|
starId: "111"
|
|
}
|
|
]);
|
|
|
|
registerBackgroundMessageHandler(
|
|
{
|
|
runtime: {
|
|
onMessage: {
|
|
addListener(listener) {
|
|
listeners.push(listener);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
authController: {
|
|
getAccessToken: vi.fn(async () => "test-access-token"),
|
|
getAuthState: vi.fn(),
|
|
signIn: vi.fn(),
|
|
signOut: vi.fn()
|
|
},
|
|
searchBackendMetrics
|
|
}
|
|
);
|
|
|
|
const result = listeners[0](
|
|
{
|
|
type: "backend-metrics:search",
|
|
value: {
|
|
starIds: ["111", "222"]
|
|
}
|
|
},
|
|
{},
|
|
sendResponse
|
|
);
|
|
|
|
expect(result).toBe(true);
|
|
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
|
|
expect(searchBackendMetrics).toHaveBeenCalledWith(["111", "222"]);
|
|
expect(sendResponse).toHaveBeenCalledWith({
|
|
ok: true,
|
|
type: "backend-metrics:result",
|
|
value: {
|
|
rows: [
|
|
{
|
|
a3IncreaseCount: "78,366.22",
|
|
afterViewSearchCount: "9,689.96",
|
|
afterViewSearchRate: "0.36%",
|
|
cpSearch: "14.46",
|
|
cpa3: "1.79",
|
|
newA3Rate: "3.44%",
|
|
starId: "111"
|
|
}
|
|
]
|
|
}
|
|
});
|
|
});
|
|
});
|