import assert from "node:assert/strict"; import test from "node:test"; import { observeGuestEntry } from "../browser-environment-probe.mjs"; function fixture({ refresh = false, failed = false, online = true, documentOnline = true, cookies = [], status = 200 } = {}) { const handlers = {}; let navigated = false; const page = { on(event, handler) { handlers[event] = handler; }, async addInitScript() {}, async evaluate() { return online; }, async goto() { assert.ok(handlers.request); navigated = true; handlers.console({ text: () => `QA_ENV_DOCUMENT_ONLINE:${documentOnline}` }); handlers.console({ text: () => "QA_ENV_DOCUMENT_ONLINE:true" }); if (refresh) { const request = { url: () => "http://127.0.0.1/api/auth/refresh" }; handlers.request(request); if (failed) handlers.requestfailed(request); } return { status: () => status }; }, getByTestId() { return { async waitFor() {} }; }, url() { return "http://127.0.0.1/login"; }, async close() {}, }; return { context: { async storageState() { return { cookies, origins: [] }; }, async newPage() { return page; } }, navigated: () => navigated }; } test("在线新 context、表单及零 refresh 是独立事实", async () => { const owned = fixture(); const result = await observeGuestEntry(owned.context, "http://127.0.0.1"); assert.equal(result.valid, true); assert.equal(result.refreshRequestCount, 0); assert.equal(result.noRouteMocks, true); }); for (const failed of [false, true]) test(`表单可见但 refresh 已尝试必须拒绝,失败请求=${failed}`, async () => { const result = await observeGuestEntry(fixture({ refresh: true, failed }).context, "http://127.0.0.1"); assert.equal(result.valid, false); assert.equal(result.refreshRequestCount, 1); assert.equal(result.refreshFailedCount, Number(failed)); assert.ok(result.failures.includes("refresh_attempt_observed")); }); test("首次 document-start 离线不可被后续 true 覆盖", async () => { const result = await observeGuestEntry(fixture({ documentOnline: false }).context, "http://127.0.0.1"); assert.equal(result.nativeOnlineSamples.documentStart, false); assert.equal(result.valid, false); }); for (const options of [{ online: false }, { cookies: [{ name: "has_session", value: "1" }] }]) test(`前置无效不导航 ${JSON.stringify(options)}`, async () => { const owned = fixture(options); assert.equal((await observeGuestEntry(owned.context, "http://127.0.0.1")).valid, false); assert.equal(owned.navigated(), false); }); test("非候选 HTTP 200 不合格,禁止公网探针", async () => { assert.equal((await observeGuestEntry(fixture({ status: 500 }).context, "http://127.0.0.1")).valid, false); await assert.rejects(observeGuestEntry(fixture().context, "https://example.invalid"), /requires_loopback/); });