Preconditions
Organizer can download an import template and upload a file generated from it; fixture has required built-in and custom fields.
Happy path / Lifecycle
Open Upload template.
Organizer sees current required fields and downloads CSV/XLSX template.
Upload populated template.
Format is auto-detected, deprecated columns are marked ignored, and mappings are previewed.
Commit with retry safety.
Commit uses an idempotency key so lost responses do not duplicate rows.
Failure modes
Permission denied at the right boundary
Trigger: viewer/support attempts organizer-only operation.
Resolution: the write request returns 403, the editable surface remains closed or read-only, and the response does not leak hidden guest, event, or tenant fields.
Cross-tenant isolation
Trigger: tenant-A user guesses tenant-B resource id.
Resolution: the server returns 404 instead of 403, masks existence, and the UI renders a generic not-found state.
Soft-delete leaves audit trail
Trigger: organizer removes or deactivates the configured object.
Resolution: the row is marked inactive/deleted with actor, timestamp, and prior state preserved in audit.
Archive vs delete distinction
Trigger: organizer chooses between reversible archive and destructive delete.
Resolution: archive stays reversible and copy/export labels it archived; delete requires separate destructive confirmation and changes copy behavior.
Edit lock during publish
Trigger: publish snapshot begins while an edit is open.
Resolution: publish wins; stale save receives a deterministic conflict modal and does not mutate the published snapshot silently.
Audit log row written on every state change
Trigger: organizer saves any state transition.
Resolution: each state mutation writes an audit row with actor, timestamp, entity id, and before/after payload.
Two organizers concurrent
Trigger: two organizers edit the same state from stale versions.
Resolution: the second save gets conflict UI, both sessions refresh to the same final state, and there is no silent overwrite.
Undo window for destructive actions
Trigger: organizer deletes, cancels, or clears the object.
Resolution: a visible undo affordance lasts 10 seconds and restores the exact prior state when used.
Generated template includes all currently-required fields
Trigger: organizer downloads a template after configuring required guest fields.
Resolution: the template includes first name, last name, email, access type, status/send flags, plus every currently required custom field.
Deprecated columns flagged ignored rather than rejected
Trigger: uploaded file contains old EventFarm-era columns.
Resolution: preview flags deprecated columns as ignored and allows valid supported columns to commit.
Format auto-detect xlsx vs csv
Trigger: organizer uploads xlsx or csv with matching content.
Resolution: parser detects format by file content/type and renders the same mapping preview without asking the user to choose manually.
Commit retry with idempotency key
Trigger: commit response is lost and organizer retries.
Resolution: retry includes the same idempotency key and does not duplicate imported guest rows.
Parity gap: full EF template variants missing
Trigger: matrix marks upload template partial.
Resolution: visible gap panel remains until full XLSX/CSV template field set and generated downloads are complete.
Stable test attributes
Visibility teeth. Each attribute must be effectively visible when active and must match the agent probes.
| data-test | Where | Purpose |
|---|---|---|
upload-template-page | surface | page |
upload-template-download-cta | surface | download cta |
upload-template-field-list | surface | field list |
upload-template-file-uploader | surface | file uploader |
upload-template-csv-preview | surface | csv preview |
upload-template-format-pill | surface | format pill |
upload-template-deprecated-column-warning | surface | deprecated column warning |
upload-template-archive-template-cta | surface | archive template cta |
upload-template-delete-template-cta | surface | delete template cta |
upload-template-undo-toast | surface | undo toast |
upload-template-conflict-modal | surface | conflict modal |
upload-template-gap-panel | surface | gap panel |
Agent test plan
- upload-template-opens
- upload-template-saves
- upload-template-audit-visible
- permission-denied-boundary
- cross-tenant-404
- soft-delete-audit
- archive-delete-distinction
- publish-edit-lock
- audit-row-every-change
- concurrent-organizers-conflict
- destructive-undo-window
- required-fields-included
- deprecated-columns-ignored
- format-auto-detect
- commit-retry-idempotency-key
- upload-template-gap-probe
- evaluate-upload-template