/** * Entrypoint for the email sandbox e2e run. * * deno task e2e:email # every provider * deno task e2e:email resend # one provider * * Runs each selected provider's leg through the production email code * against the provider's real API, then reports per leg. Unlike the payment * harness, a missing on-switch secret skips that leg and reports the skip: * operators enable exactly the legs they hold credentials for. A configured * leg the provider refuses fails the run. * * Exit codes: 0 = executed (legs sent or skipped), 1 = failed. */ import { failRun, runHarness } from "#e2e/entry.ts"; import { log, step, warn } from "#e2e/log.ts"; import { crashReporter } from "#e2e/sentry.ts"; import { appendStepSummary, publishExecutedResult, } from "#scripts/github-actions.ts"; import { parseEmailTarget } from "./legs.ts"; import { emailSummaryMarkdown, everyLegSkipped, failedProviders, outcomeLine, sentCount, } from "./report.ts"; import { type EmailLegOutcome, runEmailLeg } from "./run.ts"; const requestedTarget = (): string => process.argv[2] ?? "all"; const run = async (): Promise => { const providers = parseEmailTarget(requestedTarget()); step(`Email sandbox e2e — target: ${requestedTarget()}`); const outcomes: EmailLegOutcome[] = []; for (const provider of providers) { step(`Leg: ${provider}`); const outcome = await runEmailLeg(provider); log(outcomeLine(outcome)); outcomes.push(outcome); } appendStepSummary(emailSummaryMarkdown(outcomes)); if (everyLegSkipped(outcomes)) { warn("every leg was skipped — no provider on-switch secret is set"); } const failed = failedProviders(outcomes); if (failed.length > 0) { await failRun(`FAIL — ${failed.join(", ")}: see the leg lines above`); return; } log("RESULT: executed"); publishExecutedResult(); step( `PASS — ${sentCount(outcomes)} leg(s) sent, ${ outcomes.length - sentCount(outcomes) } skipped`, ); }; runHarness(run, crashReporter("email sandbox e2e", requestedTarget)).then(() => // A provider socket a timed-out leg left stalled must not hold the // finished process open, so leave explicitly once the report is out. process.exit(), );