Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
JavaScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356import assert from "node:assert/strict";import { readFile, writeFile, mkdtemp, rm } from "node:fs/promises";import { test } from "node:test";import { tmpdir } from "node:os";import { join, resolve } from "node:path";import { createServer } from "node:net";import { parse } from "jsonc-parser";import { chromium } from "playwright";import { unstable_dev } from "wrangler";import { oauthBindings } from "./fixtures/oauth-config.mjs";
test("custom-domain UI keeps management behind the publisher API", async () => { const setup = await readFile("control-plane/ui/DomainSetup.tsx", "utf8"); const settings = await readFile( "src/runtime/queries/use-domain-info-query.tsx", "utf8", ); const query = await readFile( "control-plane/ui/queries/use-domain-query.tsx", "utf8", );
assert.match(setup, /\/api\/installations\/\$\{installationId\}\/domain/); assert.match(setup, /Content-Type": "application\/x-www-form-urlencoded"/); assert.match(setup, /domainInstallationId/); assert.match(setup, /Confirm removal/); assert.match(query, /3000/); assert.doesNotMatch(setup, /api\.cloudflare\.com/); assert.match(settings, /fetch\("\/api\/domain"/); assert.match(settings, /params\.size === 1/);});
test( "rendered domain onboarding handles pending HTTPS, replay, reconnect and confirmed removal", { timeout: 120_000 }, async (t) => { const temporary = await mkdtemp(join(tmpdir(), "flarebot-domain-ui-")); const server = createServer(); await new Promise((done) => server.listen(0, "127.0.0.1", done)); const port = server.address().port; await new Promise((done) => server.close(done)); const origin = `http://127.0.0.1:${port}`; const config = join(temporary, "wrangler.json"); // Production routes make Miniflare rewrite the localhost request origin. const { routes: _productionRoutes, workers_dev: _productionWorkersDev, ...base } = parse(await readFile("wrangler.control-plane.jsonc", "utf8")); await writeFile( config, JSON.stringify({ ...base, name: "flarebot-domain-ui", main: resolve("tests/fixtures/domain-ui-worker.ts"), durable_objects: { bindings: [ ...base.durable_objects.bindings, { name: "DOMAIN_PROVIDER", class_name: "DomainProvider" }, ], }, exports: { ...base.exports, DomainProvider: { type: "durable-object", storage: "sqlite" }, }, assets: { binding: "ASSETS", directory: resolve("dist/control-plane/client"), }, }), ); let worker, browser; t.after(async () => { await browser?.close(); await worker?.stop(); await rm(temporary, { recursive: true, force: true }); }); worker = await unstable_dev("tests/fixtures/domain-ui-worker.ts", { config, vars: oauthBindings(origin), local: true, ip: "127.0.0.1", port, inspectorPort: 0, persistTo: temporary, logLevel: "error", experimental: { disableExperimentalWarning: true, watch: false }, }); browser = await chromium.launch({ headless: true }); const page = await browser.newPage({ viewport: { width: 1100, height: 900 }, }); const errors = []; page.on("pageerror", (error) => errors.push(error.message)); const installationId = "a".repeat(32), zoneId = "c".repeat(32); const seeded = await ( await fetch(origin + "/fixture/seed", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ id: installationId }), }) ).json(); // The localhost UI fixture sends the real opaque owner cookie at the transport // boundary. Secure-cookie browser behavior is covered by the TLS publisher suite. await page.route( `${origin}/api/installations/${installationId}`, async (route) => { const response = await route.fetch({ headers: { ...route.request().headers(), Cookie: seeded.cookie }, }); await route.fulfill({ response }); }, ); const runtimeOrigin = `https://flarebot-${installationId}.fixture.workers.dev`; const saved = { revision: 1, origin: "https://bot.example.com", hostname: "bot.example.com", zoneId, domainId: null, operationId: "e".repeat(32), status: "connecting", action: "attach", errorCode: null, }; let domain = null, zoneStatus = 200, zones = [{ id: zoneId, name: "example.com" }], loseReply = false, corruptReply = false, reads = 0; const requests = []; let holdRead = false, releaseRead; await page.route("**/api/installations/*/domain**", async (route) => { const request = route.request(), path = new URL(request.url()).pathname; const reply = (body, status = 200) => route.fulfill({ status, contentType: "application/json", body: JSON.stringify(body), }); if (path.endsWith("/zones")) return reply( zoneStatus === 200 ? { ownerSubject: "owner", accountId: "a".repeat(32), zones } : { error: "reauthorization_required" }, zoneStatus, ); if (request.method() === "GET") { reads++; const snapshot = domain; if (holdRead) { holdRead = false; await new Promise((resolve) => { releaseRead = resolve; }); } return reply({ ownerSubject: "owner", installationId, accountId: "a".repeat(32), runtimeOrigin, domain: snapshot, }); } const form = Object.fromEntries(new URLSearchParams(request.postData())); requests.push({ path, form }); if (path.endsWith("/remove")) domain = { ...saved, revision: 5, origin: null, action: "remove", status: "removing", }; else if (path.endsWith("/retry")) domain = { ...saved, revision: domain.revision + 1 }; else domain = { ...saved }; if (loseReply) { loseReply = false; return route.abort(); } if (corruptReply) { corruptReply = false; return route.fulfill({ status: 202, body: "{" }); } return reply({ domain }, 202); }); const open = async () => { const bootstrap = page.waitForResponse( (response) => new URL(response.url()).pathname === `/api/installations/${installationId}`, ); const response = await page.goto( `${origin}/connect?configureDomain=${installationId}`, ); assert.equal(response.status(), 200, "domain setup page loads"); const identity = await bootstrap; assert.equal( identity.status(), 200, "native installation identity is authenticated", ); assert.equal((await identity.json()).installation.ownerSubject, "owner"); }; await open(); await page .getByLabel("Hostname", { exact: true }) .fill("bot.example.com") .catch(async (error) => { throw new Error( `${error.message}\nErrors: ${JSON.stringify(errors)}\nDomain page: ${await page.locator("body").innerText()}`, ); }); assert.equal(await page.getByLabel("Cloudflare zone").inputValue(), zoneId); await page.screenshot({ path: "/tmp/flarebot-domain-setup.png", fullPage: true, }); loseReply = true; await page .getByRole("button", { name: "Connect domain", exact: true }) .click(); await page .getByRole("button", { name: "Confirm previous request" }) .waitFor(); await page.reload(); corruptReply = true; await page .getByRole("button", { name: "Confirm previous request" }) .click(); await page .getByRole("alert") .filter({ hasText: "may have been received" }) .waitFor(); await page .getByRole("button", { name: "Confirm previous request" }) .click(); await page.getByText(/Connecting bot.example.com/).waitFor(); assert.equal( requests[0].form.requestId, requests[1].form.requestId, "lost-reply replay survives reload", ); assert.deepEqual(requests[0].form, requests[1].form); assert.deepEqual( requests[0].form, requests[2].form, "an unreadable accepted response preserves the replay request", ); domain = { ...saved, revision: 2, domainId: "d".repeat(32) }; await page.getByText(/Waiting for HTTPS on bot.example.com/).waitFor(); await page.screenshot({ path: "/tmp/flarebot-domain-pending.png", fullPage: true, }); const readCount = reads; // Keep the revision unchanged for two complete polls: this caught a stalled // polling effect that depended only on changes to the saved revision. await page.waitForTimeout(6500); assert.ok(reads >= readCount + 2); holdRead = true; while (!releaseRead) await page.waitForTimeout(50); await page.getByText("Setup interrupted?", { exact: true }).click(); await page.getByRole("button", { name: "Restart saved operation" }).click(); await page.getByText(/Connecting bot.example.com/).waitFor(); releaseRead(); await page.waitForTimeout(300); assert.equal( await page.getByText(/Waiting for HTTPS/).count(), 0, "an older poll cannot overwrite the newer restart response", ); domain = { ...domain, revision: 4, domainId: "d".repeat(32), status: "active", }; const link = page.getByRole("link", { name: "Open Flarebot at bot.example.com", }); await link.waitFor(); assert.equal(await link.getAttribute("href"), saved.origin); await page.screenshot({ path: "/tmp/flarebot-domain-active.png", fullPage: true, }); await page.getByRole("button", { name: "Remove custom domain" }).click(); assert.equal( requests.length, 4, "removal requires a second explicit confirmation", ); await page.getByRole("button", { name: "Confirm removal" }).click(); await page.getByText(/Removing bot.example.com/).waitFor(); await page.screenshot({ path: "/tmp/flarebot-domain-removing.png", fullPage: true, }); domain = { ...domain, revision: 6, status: "removed" }; await page .getByRole("button", { name: "Connect domain", exact: true }) .waitFor(); assert.equal(requests.at(-1).path.endsWith("/remove"), true); domain = { ...saved, status: "failed", errorCode: "resource_conflict" }; await page.reload(); await page.getByRole("alert").filter({ hasText: "conflicts" }).waitFor(); await page.setViewportSize({ width: 390, height: 844 }); await page.screenshot({ path: "/tmp/flarebot-domain-conflict-mobile.png", fullPage: true, }); assert.ok( await page.evaluate( () => document.documentElement.scrollWidth <= window.innerWidth, ), ); domain = { ...saved, status: "failed", errorCode: "attachment_outcome_unknown", }; await page.reload(); await page .getByRole("alert") .filter({ hasText: "not confirmed" }) .waitFor(); await page.screenshot({ path: "/tmp/flarebot-domain-unknown.png", fullPage: true, }); domain = null; zoneStatus = 401; await page.reload(); await page.getByRole("button", { name: "Reconnect Cloudflare" }).waitFor(); assert.equal( await page.locator('input[name="domainInstallationId"]').inputValue(), installationId, ); await page.screenshot({ path: "/tmp/flarebot-domain-reconnect.png", fullPage: true, }); zoneStatus = 200; zones = []; await page.reload(); await page.getByText(/No active Cloudflare zones were found/).waitFor(); assert.deepEqual(errors, []); },);