Happy path
Connect Zoom and create a webinar.
Organizer chooses meeting or webinar, submits required details, and Voyage stores Zoom id plus start/join URLs.
Sync registrants.
Guest registrations create or update Zoom registrants and expose per-row status.
Receive check-in webhook.
Signed Zoom webhook marks the matching guest checked in once.
Failure modes
OAuth refresh
Expired Zoom token refreshes and retries the original create/sync request.
Rate limit
Zoom 429 uses exponential backoff with jitter.
Webhook replay
Duplicate signed check-in webhook has no second effect.
Schema drift
Unknown fields in Zoom responses are ignored.
Missing credential
Credential errors show re-auth CTA and no stack trace.
Fixture isolation
Live fixture is enforced for the shippable Zoom contract.
Audit row
Every create/sync writes one audit row with Zoom tx-id and counts.
Partial rollback
Registrant sync failure rolls back or shows per-row partial outcomes.
Signature mismatch
Webhook signature mismatch rejects without mutating attendance.
Registrant duplicate
Duplicate email updates existing Zoom registrant rather than creating duplicates.
Join URL persisted
Missing join URL blocks success and surfaces repair.
Host permission denied
Zoom host permission failure shows actionable host/account copy.
Stable test attributes
Visibility teeth. Status, repair, and outcome elements must be visible when active.
| data-test | Where | Purpose |
|---|---|---|
zoom-integration-panel | Zoom settings | main surface |
zoom-connect-cta | Zoom settings | OAuth start |
zoom-resource-type-selector | Zoom settings | meeting/webinar choice |
zoom-create-resource-cta | Zoom settings | create meeting/webinar |
zoom-sync-registrants-cta | Zoom settings | registrant sync |
zoom-status-pill | Zoom settings | connection/sync state |
zoom-registrant-outcome-table | Zoom settings | per-row outcomes |
zoom-audit-log-row | audit drawer | audit evidence |
Agent test plan
- zoom-integration-opens
- zoom-webinar-create-persists
- oauth-refresh-on-expired-token
- rate-limit-backoff
- webhook-replay-idempotent
- schema-drift-degrades-gracefully
- missing-credential-graceful-error
- sandbox-vs-prod-isolation
- audit-log-row-per-sync
- partial-import-rollback
- zoom-webhook-signature-rejects
- zoom-registrant-dedupe
- zoom-join-url-persisted
- zoom-host-permission-denied