Files
buzz/desktop/tests/helpers/seed.ts
+1 14fba21e57 Multi-tenant Buzz relay: community_id as a server-resolved key (comprehensive rewrite) (#1321)
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
Signed-off-by: npub1jh9wn95s0472h86ahapupaf7m6kx4v9sx2n0atj2hltcfer8k06s5n3pyf <95cae996907d7cab9f5dbf43c0f53edeac6ab0b032a6feae4abfd784e467b3f5@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: Tyler Longwell <tlongwell@block.xyz>
Signed-off-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: npub17jjz49l9jjmhhk7cac63j8yt9z555n9cw8vk7v5jz4vzw4ppld5qgj57cc <f4a42a97e594b77bdbd8ee35191c8b28a94a4cb871d96f32921558275421fb68@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: Eva <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: Mari <95cae996907d7cab9f5dbf43c0f53edeac6ab0b032a6feae4abfd784e467b3f5@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: Sami <f4a42a97e594b77bdbd8ee35191c8b28a94a4cb871d96f32921558275421fb68@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: Max <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: Quinn <96f056ad5f2305c8ddf637dc65d048aa4c12d7daeb8867690e34fca46b0ef64c@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: Dawn <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: Tyler Longwell <tlongwell@block.xyz>
Co-authored-by: Sami <sami@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co>
2026-06-29 12:39:02 -04:00

83 lines
2.9 KiB
TypeScript

import { request } from "@playwright/test";
const tylerPubkey =
"e5ebc6cdb579be112e336cc319b5989b4bb6af11786ea90dbe52b5f08d741b34";
const isCi = Boolean(process.env.CI);
// Multi-tenant: the relay resolves each request's tenant from its Host header
// against the communities host map and fails closed (404) on an unmapped host.
// The seed maps host 'localhost:3000' (matching the relay's RELAY_URL) — and
// `localhost` != `127.0.0.1` to normalize_host — so this readiness check must
// hit `localhost:3000`, not `127.0.0.1:3000`, or every /query 404s. This also
// matches the rest of the desktop e2e suite (e2eBridge.ts / bridge.ts), which
// already default to localhost.
const relayBaseUrl = process.env.BUZZ_E2E_RELAY_URL ?? "http://localhost:3000";
const seedTimeoutMs = Number.parseInt(
process.env.BUZZ_E2E_SEED_TIMEOUT_MS ?? (isCi ? "60000" : "25000"),
10,
);
const requestTimeoutMs = Number.parseInt(
process.env.BUZZ_E2E_SEED_REQUEST_TIMEOUT_MS ?? (isCi ? "5000" : "2000"),
10,
);
const retryDelayMs = Number.parseInt(
process.env.BUZZ_E2E_SEED_RETRY_DELAY_MS ?? "1000",
10,
);
function delay(ms: number) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
export async function assertRelaySeeded() {
const context = await request.newContext();
const deadline = Date.now() + seedTimeoutMs;
let lastFailure = "no checks attempted";
try {
while (Date.now() < deadline) {
try {
// The setup script inserts test data directly into the DB tables.
// The relay reconciles these at startup by emitting kind:39000/39002
// events. Query kind:39000 (channel metadata) via the HTTP bridge
// and check for the expected "general" channel.
const response = await context.post(`${relayBaseUrl}/query`, {
headers: {
"X-Pubkey": tylerPubkey,
"Content-Type": "application/json",
},
data: [{ kinds: [39000], limit: 200 }],
timeout: requestTimeoutMs,
});
if (!response.ok()) {
lastFailure = `HTTP ${response.status()} from POST /query`;
} else {
const events = (await response.json()) as Array<{
tags: string[][];
}>;
const hasGeneral = events.some((event) =>
event.tags.some((tag) => tag[0] === "name" && tag[1] === "general"),
);
if (hasGeneral) {
return;
}
lastFailure = `seed data: got ${events.length} channels but no "general" — relay may still be reconciling`;
}
} catch (error) {
lastFailure =
error instanceof Error ? error.message : "unknown relay check error";
}
await delay(retryDelayMs);
}
throw new Error(
`Relay test data was not ready after ${seedTimeoutMs}ms. Last check: ${lastFailure}. Start the relay and run scripts/setup-desktop-test-data.sh.`,
);
} finally {
await context.dispose();
}
}