star-chart-search-enhancer/tests/content-entry.test.ts

83 lines
2.5 KiB
TypeScript

import { JSDOM } from "jsdom";
import { afterEach, describe, expect, test, vi } from "vitest";
import { createContentController } from "../src/content/index";
const doms: JSDOM[] = [];
describe("content entry", () => {
afterEach(() => {
while (doms.length > 0) {
doms.pop()?.window.close();
}
});
test("bootstraps the detail controller on creator detail urls", () => {
const dom = createDom(
"https://xingtu.cn/ad/creator/author-homepage/douyin-video/6629661559960371207"
);
const detailController = { dispose: vi.fn() };
const detailControllerFactory = vi.fn(() => detailController);
const controller = createContentController({
chromeRuntime: { getURL: (value: string) => `chrome-extension://test/${value}` },
detailControllerFactory,
document: dom.window.document,
logger: createLogger(),
window: dom.window
});
expect(detailControllerFactory).toHaveBeenCalledTimes(1);
expect(controller).toBe(detailController);
});
test("returns a no-op controller on unsupported urls", () => {
const dom = createDom("https://xingtu.cn/");
const detailControllerFactory = vi.fn(() => ({ dispose: vi.fn() }));
const controller = createContentController({
chromeRuntime: { getURL: (value: string) => `chrome-extension://test/${value}` },
detailControllerFactory,
document: dom.window.document,
logger: createLogger(),
window: dom.window
});
expect(detailControllerFactory).not.toHaveBeenCalled();
expect(() => controller.dispose()).not.toThrow();
});
test("bootstraps the market controller on market urls", () => {
const dom = createDom("https://xingtu.cn/ad/creator/market");
const detailControllerFactory = vi.fn(() => ({ dispose: vi.fn() }));
const marketController = { dispose: vi.fn() };
const marketControllerFactory = vi.fn(() => marketController);
const controller = createContentController({
chromeRuntime: { getURL: (value: string) => `chrome-extension://test/${value}` },
detailControllerFactory,
document: dom.window.document,
logger: createLogger(),
marketControllerFactory,
window: dom.window
});
expect(detailControllerFactory).not.toHaveBeenCalled();
expect(marketControllerFactory).toHaveBeenCalledTimes(1);
expect(controller).toBe(marketController);
});
});
function createDom(url: string) {
const dom = new JSDOM("", { url });
return doms.push(dom), dom;
}
function createLogger() {
return {
debug: vi.fn(),
info: vi.fn(),
warn: vi.fn()
};
}