Spaces:
Running
Running
| // Test only the trigger POST + autonav SSE behavior more carefully. | |
| import { chromium } from "playwright"; | |
| const BASE = "http://localhost:3001"; | |
| const browser = await chromium.launch({ headless: true }); | |
| const ctx = await browser.newContext({ viewport: { width: 1920, height: 1080 } }); | |
| const page = await ctx.newPage(); | |
| const reqs = []; | |
| const sses = []; | |
| page.on("request", (req) => { | |
| const url = req.url(); | |
| if (url.includes("/events/trigger") || (url.includes(":8000") && req.method() === "POST")) { | |
| reqs.push({ | |
| method: req.method(), | |
| url, | |
| body: req.postDataBuffer()?.toString("utf-8") || req.postData(), | |
| headers: req.headers(), | |
| }); | |
| } | |
| }); | |
| page.on("response", async (resp) => { | |
| const url = resp.url(); | |
| if (url.includes("/events/trigger")) { | |
| try { | |
| const body = await resp.text(); | |
| console.log("[resp]", resp.status(), url, body.slice(0, 400)); | |
| } catch {} | |
| } | |
| }); | |
| // SSE: monitor EventSource frames via JS | |
| await page.goto(`${BASE}/?mode=mock`, { waitUntil: "domcontentloaded" }); | |
| await page.waitForTimeout(800); | |
| // install instrumented EventSource hook BEFORE clicking | |
| await page.evaluate(() => { | |
| window.__sseEvents = []; | |
| const OrigES = window.EventSource; | |
| window.EventSource = function (url, init) { | |
| const inst = new OrigES(url, init); | |
| const log = (typ) => (ev) => { | |
| window.__sseEvents.push({ type: typ, name: ev.type, data: (ev.data || "").slice(0, 400), t: Date.now() }); | |
| }; | |
| inst.addEventListener("message", log("message")); | |
| inst.addEventListener("event.finalized", log("event.finalized")); | |
| inst.addEventListener("phase.completed", log("phase.completed")); | |
| ["error", "open"].forEach((e) => inst.addEventListener(e, log(e))); | |
| return inst; | |
| }; | |
| window.EventSource.prototype = OrigES.prototype; | |
| }); | |
| console.log("Starting trigger flow..."); | |
| const t0 = Date.now(); | |
| const trigBtn = page.locator('button:has-text("Trigger")').first(); | |
| await trigBtn.click(); | |
| const navP = page | |
| .waitForURL((u) => /\/events\/\d+$/.test(u.toString()), { timeout: 130000 }) | |
| .catch((e) => ({ error: e.message })); | |
| const navResult = await navP; | |
| const navTime = Date.now() - t0; | |
| console.log("navigated to", page.url(), "in", navTime, "ms", navResult); | |
| // Read SSE events captured | |
| const sseEvts = await page.evaluate(() => window.__sseEvents || []); | |
| console.log("SSE events on home page:", JSON.stringify(sseEvts.slice(0, 30))); | |
| // Trigger POST capture | |
| console.log("Trigger requests captured:"); | |
| console.log(JSON.stringify(reqs, null, 2).slice(0, 3000)); | |
| // Now also test directly: curl the API to see the actual response shape | |
| const apiResp = await page.evaluate(async () => { | |
| try { | |
| const r = await fetch("http://localhost:8000/events/trigger", { | |
| method: "POST", | |
| headers: { "Content-Type": "application/json" }, | |
| body: JSON.stringify({ mode: "mock" }), | |
| }); | |
| const body = await r.text(); | |
| return { status: r.status, body: body.slice(0, 500) }; | |
| } catch (e) { | |
| return { error: e.message }; | |
| } | |
| }); | |
| console.log("Direct API call:", JSON.stringify(apiResp)); | |
| await browser.close(); | |