mirror of
https://github.com/block/buzz.git
synced 2026-08-18 06:50:31 +02:00
Two CI-honesty follow-ups after the first seed surfaced host/ordering mismatches in the MT e2e path (no product behavior): 1. Desktop E2E 404: the seed-readiness helper queried 127.0.0.1:3000 while the relay reconciles + the community is seeded for localhost:3000. normalize_host keeps the non-default port and 127.0.0.1 != localhost, so the inbound host resolved to no community and every /query 404'd. Default the helper to http://localhost:3000, matching the rest of the desktop e2e suite (e2eBridge.ts / bridge.ts already use localhost) and the relay's RELAY_URL. 2. Backend Integration UnmappedHost: the reminder scheduler binds the deployment community once at boot and exits permanently on an unmapped host (no retry, unlike the channel reconciler). The community was being seeded after relay start, leaving the scheduler dead. Apply the schema and seed the community BEFORE starting the relay (dropping BUZZ_AUTO_MIGRATE since the schema is now applied up front), so the scheduler binds on its single boot-time attempt. Both are test/CI wiring. The Relay E2E suite stays red on a separate, gated body-level bug (command_executor.rs inserts events without community_id) tracked for the §4 scoping slice. Co-authored-by: Eva <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co> Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
83 lines
2.9 KiB
TypeScript
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();
|
|
}
|
|
}
|