59 行
2.8 KiB
JavaScript
59 行
2.8 KiB
JavaScript
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/);
|
|
});
|