import { getSiteDefinition } from "@umt/adapters"; import { afterAll, beforeAll, describe, expect, it } from "vitest"; import { resourceIdFromUrl } from "../../src/modules/browser/resource.ts"; import { type BrowserHarness, createBrowserHarness, ORIGIN, pgAvailable, READ_KEY } from "./harness.ts"; const def = getSiteDefinition("audiences")!; describe("原站资源详情定位", () => { it("仅按本站详情路径定位,不把列表、登录或别站同 id 当作资源", () => { expect(resourceIdFromUrl(`${ORIGIN}/details.php?id=73`, `${ORIGIN}/`, def)).toBe("73"); expect(resourceIdFromUrl(`${ORIGIN}/torrents.php?id=73`, `${ORIGIN}/`, def)).toBeNull(); expect(resourceIdFromUrl(`${ORIGIN}/login.php?id=73`, `${ORIGIN}/`, def)).toBeNull(); expect(resourceIdFromUrl("https://else.example/details.php?id=73", `${ORIGIN}/`, def)).toBeNull(); }); }); const up = await pgAvailable(); describe.skipIf(!up)("原站详情页交接(隔离 PG 与浏览器 fixture)", () => { let h: BrowserHarness; let sid: string; beforeAll(async () => { h = await createBrowserHarness("resource", { html: () => `资源详情

Example.Movie.2024.2160p.WEB-DL.DV

副标题测试译名与简介
基本信息大小: 2 GB 类型: 电影
详情页提供的影片简介 IMDb
`, }); h.mock.loggedIn.add(`umt-site-${h.siteId}-acct-${h.accountId}`); const session = await h.req("/browser/sessions", { body: { siteId: h.siteId, url: `${ORIGIN}/details.php?id=73` }, }); expect(session.status).toBe(200); sid = session.body.data.id; }, 120_000); afterAll(async () => { await h?.close(); }); it("未在快照/搜索中的详情可直接登记,缓存PT内容供元数据兜底,不点击原站下载按钮", async () => { const before = h.mock.actions.length; const r = await h.req(`/browser/sessions/${sid}/resource`, { body: {} }); expect(r.status, JSON.stringify(r.body)).toBe(200); expect(r.body.data.release).toMatchObject({ siteId: h.siteId, siteReleaseId: "73", title: "Example.Movie.2024.2160p.WEB-DL.DV", }); expect(r.body.data.detailUrl).toBe(`${ORIGIN}/details.php?id=73`); const row = await h.db .selectFrom("source_release") .selectAll() .where("id", "=", r.body.data.release.id) .executeTakeFirstOrThrow(); expect(row.detail_fetched_at).not.toBeNull(); expect(row.raw).toMatchObject({ _detail: { imdbId: "tt1234567", sourceUrl: `${ORIGIN}/details.php?id=73` } }); expect(h.mock.actions.slice(before).some((a) => a.action === "click")).toBe(false); const again = await h.req(`/browser/sessions/${sid}/resource`, { body: {} }); expect(again.body.data.release.id).toBe(row.id); }); it("使用当前页面而非旧会话地址;列表页明确提示进入详情", async () => { const tab = [...h.mock.tabs.values()][0]!; tab.url = `${ORIGIN}/torrents.php`; const r = await h.req(`/browser/sessions/${sid}/resource`, { body: {} }); expect(r.status).toBe(400); expect(r.body.error.message).toContain("详情页"); }); it("只读账号不能通过该入口登记下载资源", async () => { const r = await h.req(`/browser/sessions/${sid}/resource`, { body: {}, key: READ_KEY }); expect(r.status).toBe(403); }); });