CardGit Events — End-to-End Test Script
CardGit Events — End-to-End Test Script
Document version: 1.0
Date: September 3, 2026
Prepared for: QA / Software Testing Team
Platform: CardGit Events (Frontend · Admin · Backend API)
Table of Contents
- Test Environment & Setup
- Test Credentials
- Module 1 — Authentication
- Module 2 — Public Pages & Navigation
- Module 3 — Event Discovery (Frontend)
- Module 4 — Event Registration & Payment
- Module 5 — Event Detail Features
- Module 6 — Session Schedule
- Module 7 — Q&A (Questions)
- Module 8 — Polls
- Module 9 — Networking Hub
- Module 10 — Matchmaking
- Module 11 — Speed Networking
- Module 12 — Direct Messaging
- Module 13 — Social Wall
- Module 14 — Gamification (Leaderboard, Achievements, Challenges)
- Module 15 — Sponsors & Booths
- Module 16 — Surveys
- Module 17 — Certificates
- Module 18 — Photo Gallery & Highlights
- Module 19 — Group Chat
- Module 20 — Meeting Scheduler
- Module 21 — User Profile
- Module 22 — Admin — Login & Role Access
- Module 23 — Admin — Event Management
- Module 24 — Admin — Session Management
- Module 25 — Admin — Speaker Management
- Module 26 — Admin — Registration Management
- Module 27 — Admin — Check-In Portal
- Module 28 — Admin — Polls & Surveys Builder
- Module 29 — Admin — Moderation
- Module 30 — Admin — Announcements
- Module 31 — Admin — Analytics & Reports
- Module 32 — Admin — Sponsors Management
- Module 33 — Admin — Team Management
- Module 34 — Admin — Speed Networking (Admin)
- Module 35 — Admin — Certificates Management
- Module 36 — Admin — Data Exports
- Module 37 — Platform Admin — Dashboard & Health
- Module 38 — Platform Admin — Feature Flags
- Module 39 — Platform Admin — User Management
- Module 40 — Platform Admin — Organizations
- Module 41 — Platform Admin — Event Reports & Suspension
- Module 42 — Platform Admin — Email Queue
- Module 43 — API Health & Security
- Module 44 — Responsive Design & Mobile
- Module 45 — Accessibility
- Module 46 — Performance
- Module 47 — Error Handling & Edge Cases
- Module 48 — Ref Source Counter & Page View Tracking
- Appendix — Test Data & Notes
1. Test Environment & Setup
Service URLs
| Service | Local URL | Port |
|---|---|---|
| Frontend (Attendee App) | https://uat.events.cardgit.com | |
| Admin App | https://uat.events-admin.cardgit.com | |
| Backend API | https://uat.api2.cardgit.com | |
| API Base Path | https://uat.api2.cardgit.com/api/v1 | — |
UAT environment is now the primary test target. Admin and API URLs below are still used as-is for the admin app and backend.
Pre-conditions
- UAT environment services must be live and healthy before executing tests.
- Test accounts must exist in the UAT database (see Section 2 for credentials).
- Playwright must be installed:
npx playwright install - Set the base URL env var before running:
BASE_URL=https://uat.events.cardgit.com - Run the full suite:
npx playwright test - Run a single spec:
npx playwright test tests/e2e/frontend/01-auth.spec.ts
Test Framework
- Tool: Playwright (TypeScript)
- Config file:
playwright.config.ts(workspace root) - Test directory:
tests/e2e/ - Auth state files:
tests/e2e/.auth/admin.json,tests/e2e/.auth/user.json - Reports:
playwright-report/(HTML) andtest-results/results.json(JSON)
2. Test Credentials
| Role | Name | Password | |
|---|---|---|---|
| Platform Admin | Alex Rivera | admin@cardgit.com | admin123 |
| Organizer | Sarah Chen | sarah@techcorp.io | password123 |
| Organizer | Priya Patel | priya@dataviz.ai | password123 |
| Organizer | James O'Brien | james@startupinc.com | password123 |
| Attendee | Marcus Johnson | marcus@designstudio.co | password123 |
| Attendee | Tom Nakamura | tom@venturecap.vc | password123 |
| Attendee | Aisha Okonkwo | aisha@securityfirst.io | password123 |
| Payment Test User | Liam Garcia | liam.garcia@demo.test | Test1234! |
Stripe test card (no real charges):
- Card Number:
4242 4242 4242 4242 - Expiry:
12/28| CVC:123| Postal:SW1A 1AA
3. Module 1 — Authentication
TC-AUTH-001 — Attendee Login (valid credentials)
| Field | Detail |
|---|---|
| Precondition | User marcus@designstudio.co exists in DB |
| URL | https://uat.events.cardgit.com/login |
| Priority | Critical |
Steps:
- Navigate to
https://uat.events.cardgit.com/login. - Verify the page title contains "CardGit Events".
- Verify email input field is visible and focusable.
- Verify password input field is visible.
- Verify "Sign In" / "Login" button is visible.
- Enter email:
marcus@designstudio.co - Enter password:
password123 - Click the "Sign In" button.
- Wait for navigation.
Expected Results:
- User is redirected to
/eventsor the authenticated home page. - No error toast or message is displayed.
- The navigation bar shows the user's name or avatar.
- The auth token is stored in
localStorage.
TC-AUTH-002 — Attendee Login (invalid credentials)
| Field | Detail |
|---|---|
| Priority | Critical |
Steps:
- Navigate to
https://uat.events.cardgit.com/login. - Enter email:
wrong@example.com - Enter password:
wrongpassword - Click "Sign In".
- Wait up to 3 seconds for a response.
Expected Results:
- User remains on
/login. - An error message is displayed (e.g., "Invalid credentials" or "Login failed").
- No token is stored in
localStorage.
TC-AUTH-003 — Login with empty fields
Steps:
- Navigate to
/login. - Leave both fields empty.
- Click "Sign In".
Expected Results:
- Form submission is blocked.
- Validation messages appear on the email and/or password fields.
- URL remains
/login.
TC-AUTH-004 — New User Registration
| Field | Detail |
|---|---|
| URL | https://uat.events.cardgit.com/register |
| Priority | Critical |
Steps:
- Navigate to
/register. - Verify the registration form is visible.
- Fill in: Full Name =
New Test User - Fill in: Email =
newuser_<timestamp>@test.com(unique) - Fill in: Password =
SecurePass123! - Fill in: Confirm Password =
SecurePass123! - Click "Register" / "Create Account".
- Wait for response.
Expected Results:
- User is redirected to
/eventsor a verification prompt. - No error is displayed.
- If email verification is required, a confirmation notice appears.
TC-AUTH-005 — Registration with duplicate email
Steps:
- Navigate to
/register. - Use an email that already exists:
marcus@designstudio.co - Fill in all other fields with valid data.
- Submit.
Expected Results:
- Registration fails with an error message such as "Email already in use".
- User remains on the registration page.
TC-AUTH-006 — Email Verification Callback
Steps:
- Trigger a registration to receive a verification email (or use a pre-existing token).
- Navigate to
/email-verified?token=<valid_token>. - Observe the page.
Expected Results:
- Page confirms email verification success.
- User is prompted to log in or is automatically redirected.
TC-AUTH-007 — Magic Link Join Flow
Steps:
- Obtain a valid magic-link token from the backend (via invite email or API).
- Navigate to
/join/<token>. - Observe the page.
Expected Results:
- User is automatically authenticated without entering credentials.
- Redirected to the appropriate event or home page.
- Token is consumed (one-time use).
TC-AUTH-008 — Logout
Steps:
- Log in as any valid user.
- Locate the user avatar / menu in the navigation bar.
- Click on it and select "Logout" / "Sign Out".
- Observe the result.
Expected Results:
- User is redirected to
/loginor/. - Auth token is cleared from
localStorage. - Accessing a protected route (e.g.,
/events/:id) redirects to/login.
TC-AUTH-009 — Protected Route Redirect (unauthenticated)
Steps:
- Ensure the user is logged out.
- Navigate directly to
https://uat.events.cardgit.com/events/1.
Expected Results:
- User is redirected to
/login. - The original destination may be stored for post-login redirect.
TC-AUTH-010 — Session Persistence on Refresh
Steps:
- Log in as a valid user.
- Hard-refresh the browser (
Ctrl + Shift + R). - Observe whether the user remains authenticated.
Expected Results:
- User remains logged in after page refresh.
- Navigation bar still shows the user's name/avatar.
4. Module 2 — Public Pages & Navigation
TC-NAV-001 — Homepage Loads
Steps:
- Navigate to
https://uat.events.cardgit.com/(not logged in). - Observe page content.
Expected Results:
- Page loads without errors.
- At least one
<h1>heading is visible. - "Get Started Free" and/or "Sign In" CTA buttons are visible.
- Buttons have correct colour contrast (not white text on white background).
TC-NAV-002 — Public Event Discovery (unauthenticated)
Steps:
- Navigate to
https://uat.events.cardgit.com/eventswithout logging in. - Observe the page.
Expected Results:
- Events listing page loads.
- Published/upcoming events are displayed without requiring login.
TC-NAV-003 — Public Event Landing Page (slug route)
Steps:
- Navigate to
https://uat.events.cardgit.com/e/<event-slug>for a known published event.
Expected Results:
- Event landing page loads with event title, date, location, and description.
- Register / Join CTA is visible.
- Page is SEO-friendly (title tag contains event name).
TC-NAV-004 — FAQ Page
Steps:
- Navigate to
https://uat.events.cardgit.com/faq.
Expected Results:
- FAQ page loads.
- Expandable questions/answers are visible.
- No console errors.
TC-NAV-005 — Waitlist Page
Steps:
- Navigate to
https://uat.events.cardgit.com/waitlist. - Fill in the waitlist form with a valid email and name.
- Submit.
Expected Results:
- Waitlist page loads with a sign-up form.
- On submission, a confirmation message is displayed.
- Duplicate submissions show an appropriate message.
TC-NAV-006 — 404 Page
Steps:
- Navigate to
https://uat.events.cardgit.com/this-page-does-not-exist.
Expected Results:
- A 404 / "Not Found" page is displayed.
- Page content is meaningful (not blank).
- Navigation links (e.g., Back to Home) are present.
TC-NAV-007 — Mobile Navigation Menu
Steps:
- Set viewport to 375×667 (iPhone SE).
- Navigate to
https://uat.events.cardgit.com/. - Locate the hamburger / menu icon.
- Click it.
- Verify menu items are visible.
- Click a menu item (e.g., "Events").
Expected Results:
- Hamburger icon is visible at mobile viewport.
- Clicking it opens a nav drawer or dropdown.
- Menu items are tappable and navigate correctly.
- Menu closes after selection.
5. Module 3 — Event Discovery (Frontend)
TC-EVT-001 — Events List Page Loads
Precondition: Logged in as marcus@designstudio.co
Steps:
- Navigate to
https://uat.events.cardgit.com/events. - Wait for the page to fully load.
Expected Results:
- Page heading contains "Events" or "Discover".
- At least one event card is displayed.
- Each event card shows: title, date, location/venue, status badge.
TC-EVT-002 — Search Events
Steps:
- On
/events, locate the search input. - Type a partial event name (e.g., "Tech").
- Observe filtered results.
Expected Results:
- Only events matching the search term are displayed.
- Clearing the search restores the full list.
- Results update in real-time or on submit.
TC-EVT-003 — Filter Events by Status
Steps:
- On
/events, click the "Upcoming" filter. - Observe the list.
- Click "Past".
- Observe the list.
- Click "All".
Expected Results:
- "Upcoming" shows only future events.
- "Past" shows only completed/past events.
- "All" restores the unfiltered list.
- No crash or blank state when filters return no results (empty state message shown).
TC-EVT-004 — My Events Page
Steps:
- Log in as a user who has registered for at least one event.
- Navigate to
/my-events.
Expected Results:
- Page lists only the events the logged-in user has registered for.
- Each entry shows event name, date, and registration status.
6. Module 4 — Event Registration & Payment
TC-REG-001 — Register for Free Event
Precondition: User is NOT already registered for the event.
Steps:
- Navigate to
/eventsand click a free event. - On the event detail page, click "Register Now".
- In the confirmation modal/dialog, confirm registration details.
- Click "Confirm Registration".
- Wait for the response (up to 5 seconds).
Expected Results:
- Success message / toast: "You're Registered!" or similar.
- The registration button changes to a "Registered" or check-in state.
- Event appears in
/my-events.
TC-REG-002 — Register for Paid Event (Stripe Flow)
Precondition: Logged in as liam.garcia@demo.test. Event "DevSummit 2026" exists with a paid ticket type.
Steps:
- Navigate to
/events/<event-id>/register. - Select the "Early Bird" or "General Admission" ticket.
- Click "Proceed to Payment".
- Verify redirect to
checkout.stripe.com. - Fill in test card:
4242 4242 4242 4242, expiry12/28, CVC123. - Fill in cardholder name and postal code.
- Click "Pay".
- Wait for redirect back to
/events/<event-id>/payment/success.
Expected Results:
- Redirect to Stripe Checkout succeeds.
- Payment form accepts test card without errors.
- After payment, user is redirected to the success page.
- Success page shows a confirmation heading (e.g., "Registration Confirmed").
- Registration status in the database changes to
approved/paid.
TC-REG-003 — Payment Cancellation
Steps:
- Start the paid registration flow (TC-REG-002 steps 1—4).
- On Stripe Checkout, click "Back" or "Cancel".
- Observe the redirect.
Expected Results:
- User is redirected to
/events/<event-id>/payment/cancel. - A cancellation message is displayed.
- The user's registration remains in
pendingor is removed.
TC-REG-004 — Duplicate Registration Attempt
Steps:
- Log in as a user who is ALREADY registered for an event.
- Navigate to that event's detail page.
Expected Results:
- "Register Now" button is hidden or replaced with "Already Registered" / check-in state.
- Attempting to navigate to
/events/<id>/registeragain shows an appropriate message.
TC-REG-005 — Event Check-In
Precondition: User is registered for the event.
Steps:
- Navigate to the event detail page for an event the user is registered for.
- Locate the "Check In" button.
- Click "Check In".
Expected Results:
- Check-in is recorded successfully.
- Button state changes (e.g., "Checked In ✓").
- A confirmation toast is shown.
7. Module 5 — Event Detail Features
TC-EDET-001 — Event Detail Page Content
Steps:
- Navigate to
/events/<event-id>. - Inspect all visible sections.
Expected Results:
- Event title, description, start/end date, location/venue are displayed.
- Cover image (if configured) loads without error.
- Navigation tabs or links to sub-features (Sessions, Q&A, Polls, Networking, etc.) are visible.
- Feature tabs only appear for features enabled on that event.
TC-EDET-002 — Share Event
Steps:
- Navigate to
/events/<event-id>. - Click the share icon / "Share event" button.
- Observe the result.
Expected Results:
- Event URL is copied to clipboard.
- A toast notification appears: "Event link copied to clipboard!" or similar.
TC-EDET-003 — Speaker Directory
Steps:
- Navigate to
/events/<event-id>/speakers.
Expected Results:
- Speaker list is displayed with names, titles, companies, and bios.
- Speaker photos load without errors.
- Clicking a speaker card shows expanded profile/bio.
TC-EDET-004 — Sponsor Booths
Steps:
- Navigate to
/events/<event-id>/sponsors. - Click on a sponsor card.
Expected Results:
- Sponsors page shows sponsor logos, tiers, and names.
- Clicking a sponsor navigates to
/events/<event-id>/sponsors/<sponsor-id>(booth page). - Booth page shows sponsor description, website link, and any resources.
8. Module 6 — Session Schedule
TC-SCH-001 — View Event Schedule
Steps:
- Navigate to
/events/<event-id>/sessions(or/events/<event-id>/schedule).
Expected Results:
- Session list or schedule grid is displayed.
- Each session shows: title, time, speaker(s), track/room.
TC-SCH-002 — Add Session to My Schedule
Steps:
- Navigate to
/events/<event-id>/sessions. - Click "Add to My Schedule" or the bookmark icon on a session.
Expected Results:
- Session is added with a confirmation feedback (icon/button state change or toast).
- Session appears in
/events/<event-id>/my-schedule.
TC-SCH-003 — Remove Session from My Schedule
Steps:
- Navigate to
/events/<event-id>/my-schedule. - Click "Remove" on a bookmarked session.
Expected Results:
- Session is removed from the personal schedule.
- Schedule updates immediately.
TC-SCH-004 — Filter Sessions by Track
Steps:
- On the sessions/schedule page, use the track filter dropdown or tabs.
- Select a specific track.
Expected Results:
- Only sessions for the selected track are displayed.
- Clearing the filter restores all sessions.
9. Module 7 — Q&A (Questions)
Context: The Q&A page at
/events/:eventId/qalets attendees submit questions to speakers/hosts. Questions go through a moderation workflow:pending→approved→answered(orrejected). Only approved and answered questions are visible to all attendees by default. The page uses Socket.io for real-time updates (useQAhook) — new questions and status changes are pushed live without a page refresh. A Live/Offline indicator in the header reflects the socket connection state. Questions can be filtered by: All Questions, Approved, Answered. Each question shows an upvote button (👍) with count — clicking toggles the vote. Questions submitted with "Submit anonymously" show "Anonymous" instead of the author's name. An answered question shows a violet answer block below the question text.
TC-QA-001 — Q&A Page Loads
| Field | Detail |
|---|---|
| Priority | Critical |
| URL | https://uat.events.cardgit.com/events/<event-id>/qa |
| Precondition | Logged in; event has Q&A feature enabled |
Steps:
- Navigate to
/events/<event-id>/qa.
Expected Results:
- Page renders with a gradient banner (purple → pink → red).
- Heading "Q&A Session" is visible with MessageSquare icon.
- Subtitle: "Ask questions and vote for the best ones".
- A Live or Offline socket connection indicator is shown in the header.
- An "Ask a Question" compose card is visible (textarea + Submit button).
- Filter tabs are shown: All Questions, Approved, Answered.
- Questions list or empty state ("No questions yet") is displayed.
TC-QA-002 — Submit a Question
Steps:
- Click in the textarea ("What would you like to know?").
- Type: "What are the key takeaways from this session?"
- Click "Submit Question".
Expected Results:
- Button shows "Submitting…" while in flight.
- API call
POST /api/v1/questionsis made with{ eventId, question, isAnonymous: false }. - Toast: "Question submitted! It will appear once approved."
- Textarea clears after submission.
- If Socket.io is connected, other attendees see a "New question added!" toast on their screens.
TC-QA-003 — Submit Button Disabled When Empty
Steps:
- Leave the question textarea empty.
- Observe the Submit button.
Expected Results:
- "Submit Question" button is disabled (
disabledattribute set). - Clicking it does nothing.
TC-QA-004 — Submit Question Anonymously
Steps:
- Type a question.
- Check the "Submit anonymously" checkbox.
- Click "Submit Question".
Expected Results:
- Question is submitted with
isAnonymous: true. - In the questions list, the question shows "Anonymous" as the author (with a grey placeholder avatar) instead of the user's name.
- No name or avatar badge is shown.
TC-QA-005 — Question Status Badges Display Correctly
Steps:
- On the Q&A page, observe questions with different statuses.
Expected Results:
| Status | Badge colour | Icon |
|---|---|---|
| Pending | Yellow | Clock |
| Approved | Green | CheckCircle |
| Answered | Blue | CheckCircle |
| Rejected | Red | XCircle |
Each badge shows the capitalised status label and its icon.
TC-QA-006 — Filter Tab — Approved
Steps:
- Click the "Approved" filter tab.
Expected Results:
- Only questions with
status: approvedare shown. - Tab becomes active (gradient highlight).
- API refetch is triggered with
status=approvedparam. - Switching back to "All Questions" restores the full list.
TC-QA-007 — Filter Tab — Answered
Steps:
- Click the "Answered" filter tab.
Expected Results:
- Only questions with
status: answeredare shown. - Each answered question shows a violet answer block below the question text with heading "Answer" (CheckCircle icon).
TC-QA-008 — Upvote a Question (Toggle)
Steps:
- Find an approved question in the list.
- Note the upvote count.
- Click the 👍 upvote button.
- Click the same button again.
Expected Results:
- First click: upvote count increments by 1. Button changes to filled/gradient style.
- Second click (toggle off): upvote count decrements by 1. Button returns to grey style.
- API calls
POST /api/v1/questions/<id>/upvoteeach time.
TC-QA-009 — Unauthenticated User Cannot Upvote
Steps:
- Log out.
- Navigate to
/events/<event-id>/qa. - Click the upvote button on a question.
Expected Results:
- Toast: "Please sign in to upvote".
- Upvote count does not change.
- The upvote button has
disabledstyling (opacity-40, cursor-not-allowed).
TC-QA-010 — Answered Question Shows Answer Block
Steps:
- On the Q&A page, find a question with
status: answered. - Observe the question card.
Expected Results:
- Below the question text, a violet-bordered block appears with:
- Header: "✓ Answer" (CheckCircle + label).
- The answer text content.
- The block is visually distinct from the question.
TC-QA-011 — Question Shows Author Name and Timestamp
Steps:
- Observe a non-anonymous approved question.
Expected Results:
- Author's name is shown with their avatar (gradient initial if no photo).
- A formatted timestamp is shown (e.g. "Jan 15, 9:30 AM").
- Anonymous questions show a grey placeholder and "Anonymous" text.
TC-QA-012 — Real-Time New Question Toast (Socket.io)
| Field | Detail |
|---|---|
| Setup | Two browser sessions for the same event |
Steps:
- Open the Q&A page as User A.
- As User B (or admin), submit a new question.
Expected Results:
- User A's page shows a toast: "New question added!" without a page refresh.
- The questions list refreshes to include the new question.
TC-QA-013 — Real-Time Question Update (Socket.io)
Steps:
- As an admin, approve a pending question via the moderation page.
- Observe the attendee's Q&A page.
Expected Results:
- The question's status badge updates from "Pending" to "Approved" in real time (without page refresh).
TC-QA-014 — Empty State When No Questions
Steps:
- Navigate to the Q&A page for an event with no questions.
Expected Results:
- An empty state is shown with a MessageSquare icon, heading "No questions yet", and text "Be the first to ask a question!".
10. Module 8 — Polls
TC-POLL-001 — View Polls
Steps:
- Navigate to
/events/<event-id>/polls.
Expected Results:
- Active polls are listed.
- Each poll shows the question and voting options.
- Polls that have closed show results.
TC-POLL-002 — Vote on a Poll
Steps:
- On the polls page, find an active poll.
- Select an answer option.
- Click "Submit Vote" / "Vote".
Expected Results:
- Vote is recorded.
- Results bar chart or percentage is shown after voting.
- User cannot vote twice on the same poll.
TC-POLL-003 — Poll Presentation View
Steps:
- Navigate to
/events/<event-id>/polls/<poll-id>/present.
Expected Results:
- Presentation view loads showing the poll question and live result visualisation.
- Results update in real-time as votes are cast.
11. Module 9 — Networking Hub
TC-NET-001 — Networking Hub Page
Steps:
- Navigate to
https://uat.events.cardgit.com/networkingor/events/<event-id>/networking.
Expected Results:
- Page loads with a heading containing "Network" or "Connect".
- Attendee/user cards are displayed OR an empty state message is shown.
TC-NET-002 — Send Connection Request
Steps:
- On the Networking page, locate an attendee card.
- Click "Connect" or "Send Request".
- Wait for response.
Expected Results:
- Button state changes to "Pending" or "Requested".
- A toast confirmation appears.
- The recipient receives a notification (verify via their account).
TC-NET-003 — Accept Connection Request
Steps:
- Log in as the user who received a connection request.
- Navigate to the networking page or notification area.
- Click "Accept".
Expected Results:
- Connection is established.
- Both users now appear in each other's connections list.
- Connection count increments.
TC-NET-004 — View Connection Summary
Steps:
- Navigate to
/events/<event-id>/connections.
Expected Results:
- List of accepted connections for the event is shown.
- Each entry shows the connected user's name, company, and role.
TC-NET-005 — View Another User's Profile
Steps:
- From the networking page, click on an attendee card.
- Observe the profile page.
Expected Results:
/profile/<userId>loads.- Profile shows: name, headline, company, bio, interests.
- Connection status / "Connect" button is visible.
12. Module 10 — Matchmaking
Context: Matchmaking v2 uses interest-based AI pairing. It communicates match events via SSE (Server-Sent Events). The user swipes Like (✓) or Pass (✗) on candidate cards. A mutual like = a confirmed match. Valid
signupRefacquisition sources:direct,qr.
TC-MATCH-001 — Matchmaking Page Loads
| Field | Detail |
|---|---|
| Priority | Critical |
| URL | /events/<event-id>/matchmaking |
| Precondition | Logged in; event has matchmaking feature enabled |
Steps:
- Navigate to
/events/<event-id>/matchmaking. - Wait up to 10 seconds for SSE connection.
- Observe heading, badge, match cards, and connection indicator.
Expected Results:
- Heading "Matchmaking" with a "v2" badge is visible.
- Match candidate cards are rendered OR an empty/onboarding state is shown.
- A live/connected indicator appears once the SSE handshake completes.
- No console errors about SSE.
TC-MATCH-002 — Match Card Content
Steps:
- On the matchmaking page, inspect the first candidate card.
Expected Results:
- Card displays: name, company, title, avatar image.
- A compatibility score or percentage is shown.
- Shared interest tags are listed.
- "Like" (✓) and "Pass" (✗) action buttons are present.
TC-MATCH-003 — Like (Swipe Right) a Match
Steps:
- On the matchmaking page, click the "Like" / ✓ button on the first card.
- Observe the deck and any notification.
Expected Results:
- Card is removed from the deck; next card appears.
- A success toast is shown.
- If the other user had already liked back, a "🎉 It's a match!" mutual-match toast fires.
- The match appears in
/events/<event-id>/matcheswith a "Matched" or confirmed badge.
TC-MATCH-004 — Pass (Swipe Left) a Match
Steps:
- Click the "Pass" / ✗ button on a candidate card.
Expected Results:
- Card is dismissed and the next candidate is shown.
- Passed user does not reappear in the same deck session.
TC-MATCH-005 — Rewind Last Pass
Steps:
- Pass on a card.
- Click the "Rewind" / undo button.
Expected Results:
- The previously dismissed card reappears.
- API call
POST /matchmaking/v2/matches/<id>/rewindsucceeds (HTTP 200). - Rewind button becomes inactive after use (one rewind at a time).
TC-MATCH-006 — Regenerate Matches
Steps:
- Click "Refresh Matches" or "Regenerate" on the matchmaking page.
Expected Results:
- A fresh set of candidate cards is fetched (
?regenerate=truequery param sent). - Loading skeleton is shown during fetch.
- Deck is refreshed with new candidates or an "up to date" message if none remain.
TC-MATCH-007 — Mutual Match Real-Time Notification (Two Users)
| Field | Detail |
|---|---|
| Setup | Two separate browser sessions for the same event |
Steps:
- Log in as User A in Browser 1; navigate to matchmaking for the event.
- Log in as User B in Browser 2; navigate to matchmaking for the same event.
- User A likes User B.
- User B likes User A back.
Expected Results:
- Both browsers display a "🎉 It's a match!" toast without page refresh (SSE push).
- Match appears in
/events/<event-id>/matchesfor both users immediately. - Connection summary page
/events/<event-id>/connectionsshows the new connection with source badge "Smart Match".
TC-MATCH-008 — Confirmed Matches List
Steps:
- Navigate to
/events/<event-id>/matches.
Expected Results:
- All mutual matches are listed.
- Each card shows: name, company, title, compatibility score, shared interests.
- A "Message" or "Connect" CTA is present on each card.
TC-MATCH-009 — Likes Received Counter
Steps:
- On the matchmaking page, observe the "Likes Received" stats section.
Expected Results:
- Counter shows the number of users who have liked the current user.
- Clicking "See who liked you" reveals the likers' profile cards.
- Each liker card has a "Like Back" / "Connect" action.
TC-MATCH-010 — SSE Disconnect / Reconnect
Steps:
- Navigate to the matchmaking page; confirm Connected indicator.
- Disable the network (DevTools → Network → Offline).
- Observe the indicator.
- Re-enable the network.
Expected Results:
- Offline: indicator changes to a warning/reconnecting state.
- On reconnect: SSE re-establishes; indicator returns to connected/green.
- No full page reload is required.
13. Module 11 — Speed Networking (Attendee)
Context: Speed Networking runs timed 1:1 rounds. Sessions are created by admins (DRAFT → ACTIVE → COMPLETED). Attendees register for sessions, join the lobby, and are auto-paired each round. Real-time round progression is pushed via WebSocket events (
speedNetworking:sessionStarted,speedNetworking:roundAdvanced). A mutual "want to connect" during a round triggers a matchmaking match.
TC-SN-001 — Speed Networking Lobby
| Field | Detail |
|---|---|
| Priority | Critical |
| Precondition | At least one speed-networking session exists for the event |
Steps:
- Navigate to
/events/<event-id>/speed-networking.
Expected Results:
- Page loads with a list of available sessions.
- Each session card shows: name, start time, round duration, status badge (DRAFT / ACTIVE / COMPLETED), registered participant count.
- A "Join" or "Register" button is present on each upcoming/active session.
TC-SN-002 — Register for a Speed Networking Session
Steps:
- On the speed-networking lobby, click "Register" / "Join" for a DRAFT or upcoming session.
Expected Results:
- Registration is confirmed with a success toast.
- The session's registered count increments.
- The button state changes to "Registered" or "Leave".
TC-SN-003 — Receive Session Start Notification
| Field | Detail |
|---|---|
| Precondition | User is registered for the session; admin starts it |
Steps:
- Stay on the speed-networking lobby page.
- Admin starts the session from the admin app.
Expected Results:
- A toast notification fires in real time:
"⚡ Speed networking "<name>" has started!"— no page refresh needed. - The session card's status badge changes from DRAFT to ACTIVE.
- The session card auto-selects and the user can navigate in.
TC-SN-004 — Speed Networking Session Lobby Page
Steps:
- Click into an ACTIVE session:
/events/<event-id>/speed-networking/<session-id>.
Expected Results:
- Session lobby page loads.
- Timer countdown or "Waiting for round to begin" message is shown.
- Current round number and total rounds are displayed (if round has started).
- Paired attendee's profile card is visible when a round is active.
- "I want to connect" / connection interest button is present.
TC-SN-005 — Speed Networking Round View
Steps:
- When a round begins, navigate to
/events/<event-id>/speed-networking/<session-id>/round/<round-number>.
Expected Results:
- Round view loads with the paired attendee's name, company, title, and avatar.
- A countdown timer for the round duration is running.
- "I want to connect" / interest button is available.
- Timer reaching zero triggers automatic round progression.
TC-SN-006 — Mutual Connection During Round
Steps:
- During a round, click "I want to connect" / interest button.
- The paired attendee also clicks the same button.
Expected Results:
- Both parties see a "🎉 It's a match!" notification (via WebSocket
matchmaking:mutualMatchevent). - The connection appears in
/events/<event-id>/connectionswith source badge "Speed Network". - No page reload is required.
TC-SN-007 — Round Progression (Next Round)
Steps:
- Wait for the round timer to expire (or admin advances to next round).
Expected Results:
- Current paired attendee card is replaced with the next pairing.
- Round number increments.
- A brief transition animation plays.
- Timer resets for the new round.
TC-SN-008 — Session Completed State
Steps:
- After all rounds complete (or admin ends the session).
- Observe the attendee view.
Expected Results:
- "Session ended" or "All rounds complete" message is shown.
- A summary is presented: number of people met, connections made, match rate.
- Option to view full connections list is available.
14. Module 12 — Direct Messaging
TC-MSG-001 — Messages Page Loads
Steps:
- Navigate to
https://uat.events.cardgit.com/messages.
Expected Results:
- Messages / Conversations page loads.
- Left panel shows conversation list (or empty state if none).
- Page heading contains "Messages" or "Conversations".
TC-MSG-002 — Open a Conversation
Steps:
- On the Messages page, click on an existing conversation.
Expected Results:
- Chat panel opens on the right.
- Message history is displayed in chronological order.
- Input box at the bottom is focusable.
TC-MSG-003 — Send a Message
Steps:
- Open a conversation.
- Type in the message input: "Hello from the QA test!"
- Click "Send" or press
Enter.
Expected Results:
- Message appears in the chat immediately.
- Message is attributed to the sender with a timestamp.
- The other user would receive the message (verify via second account).
TC-MSG-004 — Real-Time Message Delivery
Steps:
- Log in as User A in Browser 1 and User B in Browser 2.
- User A sends a message to User B.
- Observe Browser 2 immediately.
Expected Results:
- Message appears in User B's conversation without page refresh.
- Unread badge/indicator appears in User B's message list.
15. Module 13 — Social Wall
Context: The Social Wall at
/events/:eventId/social(or/socialstandalone) is a community feed. Posts support text (up to 500 chars), emoji (from a built-in picker with 8 categories + search), and image URLs. Reactions use a LinkedIn-style hover picker with 6 options: Like 👍, Love ❤️, Celebrate 🎉, Insightful 🔥, Support 👏, Curious 🤔. A single Like click toggles the 👍 reaction; hovering over the Like button shows the full picker. Comments are loaded on demand. Posts support infinite scroll (20 per page). Real-time updates are pushed via Socket.io — new posts prepend to the feed, new comments and likes update without refresh. A Live/Offline indicator reflects socket state. If social wall moderation is enabled, a posted message shows an amber "Your post is under review" notice. Post authors and moderators can delete posts and comments.
TC-SOC-001 — Social Wall Page Loads
| Field | Detail |
|---|---|
| Priority | Critical |
| URL | https://uat.events.cardgit.com/events/<event-id>/social |
Steps:
- Navigate to
/events/<event-id>/social.
Expected Results:
- Gradient banner (violet → purple → indigo) with heading "Social Wall" and subtitle "Share your event experience".
- Live or Offline socket indicator shown in the banner.
- Compose card is visible: author avatar, textarea ("Share your thoughts about the event…"), emoji button, image button, character counter, Post button.
- Posts feed or empty state ("No posts yet. Be the first to share something!") is shown.
TC-SOC-002 — Create a Post
Steps:
- Type in the compose textarea: "Really enjoying this event! Great sessions so far."
- Click "Post".
Expected Results:
- Button shows "Posting…" while in flight.
- API call
POST /api/v1/gamification/social-wallwith{ eventId, content }. - If moderation is off: post appears at the top of the feed (or via socket push).
- If moderation is on: amber "Your post is under review" notice appears; post does not immediately show.
- Textarea clears after posting.
TC-SOC-003 — Post Character Limit (500)
Steps:
- Type exactly 500 characters in the composer textarea.
- Observe the counter.
- Type one more character.
Expected Results:
- At 500 chars: counter shows "500/500" in red. Post button is disabled.
- At 450–499 chars: counter turns amber.
- At 1–449 chars: counter shows grey (e.g. "45/500").
- At 0 chars: shows "⌘+Enter to post" hint.
TC-SOC-004 — Ctrl/Cmd+Enter Submits Post
Steps:
- Type a post in the textarea.
- Press
Ctrl+Enter(Windows) orCmd+Enter(Mac).
Expected Results:
- Post is submitted without clicking the Post button.
TC-SOC-005 — Post Emoji Picker — Open, Browse, Select
Steps:
- Click the 😊 emoji button in the compose toolbar.
Expected Results:
- A floating emoji picker opens (~380×420px, fixed-positioned).
- 8 category tabs: ⚡ Icons, 😀 Smileys, 👋 People, 🐶 Animals, 🍔 Food, ⚽ Activities, ✈️ Travel, 💎 Symbols.
- Clicking a category switches the emoji grid.
- Clicking an emoji inserts it into the textarea at the cursor position.
- Picker closes after selection.
TC-SOC-006 — Post Emoji Picker — Search
Steps:
- Open the emoji picker. Type
rocketin the search input.
Expected Results:
- Category tabs hide; 🚀 and other matching results appear.
- Typing with no matches shows "No results".
- Clearing search restores the category tab view.
TC-SOC-007 — Post Emoji Picker — Closes on Outside Click
Steps:
- Open the emoji picker.
- Click outside the picker panel and emoji button.
Expected Results:
- Picker closes without inserting anything.
TC-SOC-008 — Post Card Layout
Steps:
- Observe any post card in the feed.
Expected Results:
- Author avatar (or initials gradient if no photo), author name (bold), company name (if set), time-ago timestamp (e.g. "5m", "2h", "3d").
- Post text content.
- Action bar: Like button (left), Comment button with count (right).
- Like count shown on the button if > 0.
TC-SOC-009 — Like (Simple Click Toggles 👍)
Steps:
- Click the Like button on a post.
- Click it again.
Expected Results:
- First click: button turns blue/filled with "Like" label; like count increments; API call
POST .../likewith{ reaction: "👍" }. - Second click: button returns to grey; count decrements; unlike registered.
TC-SOC-010 — LinkedIn-Style Reaction Picker (Hover)
Steps:
- Hover over the Like button and hold for ~0.5 seconds.
Expected Results:
- A floating picker appears above the button with 6 reactions: 👍 Like, ❤️ Love, 🎉 Celebrate, 🔥 Insightful, 👏 Support, 🤔 Curious.
- Each has a label. Hovering over an emoji scales it up.
- Moving mouse away from both the picker and button closes it.
TC-SOC-011 — Select a Non-Like Reaction
Steps:
- Hover the Like button to open the picker.
- Click 🎉 Celebrate.
Expected Results:
- Button updates to show 🎉 with yellow "Celebrate" label and yellow background.
- API call uses
{ reaction: "🎉" }. - Switching from one reaction to another does not change the like count.
TC-SOC-012 — Open Comments Section
Steps:
- Click the Comment button on a post.
Expected Results:
- Comments section expands; existing comments fetched if count > 0 and not yet loaded.
- Each comment shows: avatar, name, text, time-ago, delete button (for own comments).
- A comment input bar is shown.
- Clicking Comment again collapses the section.
TC-SOC-013 — Submit a Comment
Steps:
- Open comments. Type "Great point!" in the input. Press Enter or click Send.
Expected Results:
- Comment appears immediately.
commentCountincrements. Input clears. - API call
POST .../commentwith{ content }.
TC-SOC-014 — Comment Emoji Picker
Steps:
- Open comments. Click the 😊 emoji button in the comment input bar.
Expected Results:
- An emoji picker opens (right-aligned). Selecting an emoji inserts it into the comment input. Picker closes.
TC-SOC-015 — Delete Own Post
Steps:
- Find a post authored by the logged-in user.
- Click the 🗑 delete button. Confirm in the browser dialog.
Expected Results:
- Post is removed from the feed immediately. API call
DELETE .../social-wall/<id>. Cancelling the dialog leaves the post.
TC-SOC-016 — Delete Button Only Visible to Author or Moderator
Steps:
- View a post authored by someone else.
Expected Results:
- The 🗑 delete button is not visible.
- It is only shown to the post's own author and to event moderators/owners.
TC-SOC-017 — Moderation Pending Review Notice
| Field | Detail |
|---|---|
| Precondition | Social wall moderation is enabled for the event |
Steps:
- Submit a new post.
Expected Results:
- Amber notice: "Your post is under review" with guidance text.
- A × dismiss button closes the notice.
- Post does not immediately appear in the feed.
TC-SOC-018 — Infinite Scroll Loads More Posts
Steps:
- On a wall with 20+ posts, scroll to the bottom.
Expected Results:
- Additional posts load automatically. New posts append to the bottom without duplicates.
TC-SOC-019 — Real-Time New Post (Socket.io)
| Field | Detail |
|---|---|
| Setup | Two sessions on the same event's social wall |
Steps:
- User B submits a new post while User A has the wall open.
Expected Results:
- User A sees the post prepend to their feed in real time (no refresh required).
TC-SOC-020 — Real-Time Comment and Like Counts (Socket.io)
Steps:
- User B comments on a post, then likes a post.
- User A is watching the same wall.
Expected Results:
- Comment count badge updates in real time on User A's screen.
- Like count updates in real time on User A's screen.
TC-SOC-021 — Unauthenticated User Cannot Post or Like
Steps:
- Log out. Navigate to
/events/<event-id>/social.
Expected Results:
- Compose card is not shown.
- Clicking Like shows toast: "Sign in to like posts".
- Feed is still readable.
16. Module 14 — Gamification
16. Module 14 — Gamification (Leaderboard, Achievements, Challenges)
Context: The gamification system spans three pages: Leaderboard (
/events/:eventId/leaderboard), Achievements (/events/:eventId/achievements), and Challenges (/events/:eventId/challenges). All three require thegamificationfeature to be enabled. Points are earned via: check-in, session attendance, Q&A questions, poll votes, connections, challenge completion, social posts, achievement unlocks, speed networking, survey completion, profile completion, and bonus awards. A 4-tier system governs status: Bronze (0–99 pts), Silver (100–299), Gold (300–699), Platinum (700+).
LEADERBOARD
TC-GAM-001 — Leaderboard Page Loads
| Field | Detail |
|---|---|
| Priority | Critical |
| URL | https://uat.events.cardgit.com/events/<event-id>/leaderboard |
Steps:
- Navigate to
/events/<event-id>/leaderboard.
Expected Results:
- Page loads with a leaderboard heading and event title.
- Ranked entries list: each row shows rank number, avatar (photo or initials gradient), name, company, points total.
- The top 3 entries have special ring colours: rank 1 = amber, rank 2 = slate, rank 3 = orange.
- Current user's entry is visually highlighted or scrolled into view.
- A "Points to next rank" bar shows the gap to the entry above the current user (progress bar with ahead user's avatar and name).
TC-GAM-002 — Leaderboard — Score Bars
Steps:
- Observe the leaderboard list entries.
Expected Results:
- Each entry has a horizontal score bar showing the user's points as a percentage of the top scorer's points.
- Bar width is proportional (top scorer = 100%).
- Bars animate in when the page loads.
TC-GAM-003 — Leaderboard — Profile Drawer (Own Profile)
Steps:
- Click on your own leaderboard entry.
Expected Results:
- A profile drawer slides up from the bottom (mobile) or opens as a centred modal (desktop).
- Header gradient matches the user's current tier colour.
- Shows: large avatar with tier ring, name, company, "You" badge, points pill, rank pill, tier badge (🥉/🥈/🥇/💎).
- Score bar vs top scorer is shown.
- Three stat chips: Badges, Connections, Sessions Attended.
- Three tabs appear (own profile only): Overview, History, Breakdown.
- Overview: "Points to next rank" card with gap, ahead user's name and progress bar; tier progress card showing % to next tier.
- Clicking outside the drawer (backdrop) closes it.
- × button closes it.
TC-GAM-004 — Leaderboard — Profile Drawer (Other User)
Steps:
- Click on another user's leaderboard entry.
Expected Results:
- Drawer opens with the other user's data.
- No Overview/History/Breakdown tabs (tabs only for own profile).
- Shows: an encouragement tip ("Earn more points to climb past this participant").
- "You" badge is not shown.
TC-GAM-005 — Leaderboard — History Tab (Own Profile)
Steps:
- Click own entry. In the drawer, click the History tab.
Expected Results:
- A chronological feed of points-earning actions is shown.
- Each row: emoji icon, action label, description, time-ago timestamp, points amount (green "+N" or red "-N").
- Action types recognised: Event Check-in ✅, Session Attended 🎤, Question Asked ❓, Poll Voted 📊, New Connection 🤝, Challenge Completed 🎯, Social Post 📣, Achievement Unlocked 🏅, Speed Networking ⚡, Survey Completed 📋, Profile Completed 👤, Bonus Points ⭐.
- Empty state: "No activity yet. Start participating to earn points!"
TC-GAM-006 — Leaderboard — Breakdown Tab (Own Profile)
Steps:
- Click own entry. Click the Breakdown tab.
Expected Results:
- A donut chart shows points split by action category (top 6 categories, with legend).
- A detail bar list below shows each category with its proportion and total.
- Empty state: "No data yet" if no history.
TC-GAM-007 — Leaderboard — Tier Progress Display
Steps:
- Open own profile drawer. Observe the tier card in the Overview tab.
Expected Results:
- Current tier badge (🥉/🥈/🥇/💎) is shown with a gradient background matching the tier.
- Progress bar towards next tier with "X pts to [NextTier]" label.
- All 4 tier bubbles shown in a row at the bottom; current tier is highlighted (larger, white background).
- Platinum tier (700+ pts): no progress bar (already max tier).
TC-GAM-008 — Leaderboard — Tier Thresholds
Expected Results (reference table):
| Points | Tier | Emoji | Gradient |
|---|---|---|---|
| 0–99 | Bronze | 🥉 | orange-to-amber |
| 100–299 | Silver | 🥈 | slate-to-gray |
| 300–699 | Gold | 🥇 | amber-to-yellow |
| 700+ | Platinum | 💎 | violet-through-purple-to-indigo |
TC-GAM-009 — Leaderboard — Real-Time Update (Socket.io)
| Field | Detail |
|---|---|
| Setup | Two browser sessions for the same event |
Steps:
- User A has the leaderboard open.
- User B performs a points-earning action (e.g. votes in a poll).
Expected Results:
- The leaderboard updates in real time via Socket.io without a page refresh.
- User B's points and rank reflect the change.
TC-GAM-010 — Leaderboard — Points Config (How Points Are Earned)
Steps:
- Observe the leaderboard page for any "How to earn points" section or points config card.
Expected Results:
- If a points config card is shown: each action and its point value is listed.
- All 11 point-earning action types are either listed or implicitly available via the History feed.
ACHIEVEMENTS
TC-GAM-011 — Achievements Page Loads
| Field | Detail |
|---|---|
| URL | https://uat.events.cardgit.com/events/<event-id>/achievements |
Steps:
- Navigate to
/events/<event-id>/achievements.
Expected Results:
- Amber-to-orange gradient hero banner with heading "Achievements" and Award icon.
- 3 stats chips: Earned (N/total), Bonus Points (total from earned badges), Completion (%).
- Overall progress bar shows completion %.
- A Tier Card is shown below the hero (current tier with gradient, progress to next tier, all 4 tier bubbles).
- A "Latest badge" showcase card shows the most recently earned badge (if any).
- Filter tabs: All, Earned (count), Locked (count).
- Achievement cards list (or skeleton placeholders while loading).
TC-GAM-012 — Achievements — Card Layout (Earned vs Locked)
Steps:
- Observe both earned and locked achievement cards.
Expected Results:
Earned card:
- Gold top accent strip (amber-to-yellow gradient).
- Badge icon: emoji on amber/yellow background with border, not greyscale.
- Points pill: amber background, "+N" with Zap icon.
- Mini progress ring: gold, 100%.
- Earned date shown with green checkmark.
Locked card:
- No top accent strip (grey).
- Badge icon: greyscale, opacity 50%, Lock icon shown instead of emoji.
- Points pill: grey.
- Mini progress ring: grey track.
- If in-progress (pct > 0): progress bar shown with "X/Y" and percentage.
TC-GAM-013 — Achievements — Filter Tabs
Steps:
- Click the Earned tab.
- Click the Locked tab.
- Click All.
Expected Results:
- Earned: shows only completed achievements; empty state "No badges earned yet. Start participating!"
- Locked: shows only incomplete achievements; empty state "You've earned everything!" if all earned.
- All: restores both groups.
- Each tab pill shows a count badge that updates with the filter.
TC-GAM-014 — Achievements — Achievement Detail Modal
Steps:
- Click on any achievement card.
Expected Results:
- A full-screen modal opens (slide-up on mobile, centred on desktop).
- Header gradient: amber/gold (earned) or grey (locked).
- Large badge icon with ✨ overlay for earned; Lock icon for locked.
- Title and "Badge unlocked!" / "Locked badge" subtitle.
- Points reward pill (amber if earned, grey if locked).
- Description text (if available).
- For locked with progress: a "Your progress" card with current/total count, percentage label, and progress bar.
- "How to earn" section with the relevant icon and description (e.g. "Attend sessions (3×)").
- For earned: green "Earned [date]" row at the bottom.
- × button and backdrop click close the modal.
TC-GAM-015 — Achievements — In-Progress Badge Progress Bar
Steps:
- Find a locked achievement that has been partially progressed.
- Observe its card.
Expected Results:
- A horizontal progress bar is shown on the card (amber-to-orange gradient).
- "X/Y" count and percentage label above the bar.
pctshown on the mini progress ring.
TC-GAM-016 — Achievements — Tier Card and Progress
Steps:
- Observe the tier card on the Achievements page.
- Note the current tier and next tier.
Expected Results:
- Tier card gradient matches the current tier (e.g. amber for Gold).
- "Current Tier" label, tier name, points count.
- "Next: [Tier] [emoji]" and "X pts away" shown top-right.
- Progress bar shows % towards next tier (Bronze: 0–99, Silver: 100–299, Gold: 300–699, Platinum: 700+).
- All 4 tier bubbles at the bottom; current = white circle (highlighted), passed = semi-transparent, future = faded.
CHALLENGES
TC-GAM-017 — Challenges Page Loads
| Field | Detail |
|---|---|
| URL | https://uat.events.cardgit.com/events/<event-id>/challenges |
Steps:
- Navigate to
/events/<event-id>/challenges.
Expected Results:
- Page loads with a challenges list.
- Filter bar: All, Active, Completed, Expired tabs.
- Each challenge card shows: type emoji + type label, name, points reward (Zap icon), progress ring, step dots (for multi-step), timer ("Xh Ym left"), completion status.
- Summary stats: completed count and total points earned.
TC-GAM-018 — Challenges — Card Layout by Type
Steps:
- Observe challenge cards of different types.
Expected Results:
Each challenge type has its own colour:
| Type | Emoji | Accent gradient | Ring colour |
|---|---|---|---|
| Scavenger Hunt | 🗺️ | violet-to-indigo | violet |
| Sponsor Challenge | 🏢 | amber-to-red | amber |
| Session Quest | 🎯 | blue-to-indigo | blue |
| Networking | 🤝 | emerald-to-cyan | emerald |
| Social | 📣 | pink-to-rose | pink |
| Custom / Other | ⚡ | indigo-to-violet | violet |
Active challenges: coloured top accent strip. Expired: no accent strip, 60% opacity. Completed: green border.
TC-GAM-019 — Challenges — Filter Tabs
Steps:
- Click Active filter tab.
- Click Completed.
- Click Expired.
- Click All.
Expected Results:
- Active: challenges that are not completed, not expired, and
isActive = true. - Completed: challenges where
userProgress.completed = true. - Expired: not completed AND end date has passed.
- All: all challenges regardless of status.
- Each filter returns the correct subset without error.
TC-GAM-020 — Challenges — Challenge Detail Modal
Steps:
- Click on any challenge card.
Expected Results:
- Modal opens (slide-up mobile, centred desktop).
- Gradient header matching the challenge type colour.
- Header shows: type emoji or ✅ (completed) or 🔒 (expired), challenge name, type label.
- Points pill and status pills (Completed badge, timer pill).
- A progress ring centred below the header showing
pct%. - Challenge description (if set).
- × and backdrop click close modal.
TC-GAM-021 — Challenges — Multi-Step Challenge Steps List
Steps:
- Open a challenge with multiple steps (e.g. Scavenger Hunt or Session Quest).
Expected Results:
- Steps list is shown with numbered circles.
- Completed steps: green filled circle with CheckCircle icon, text struck through, row has green background.
- Next incomplete step (for manual types): a "Done" / "Complete!" button appears.
- Future steps: grey circle with step number.
TC-GAM-022 — Challenges — Manual Step Completion
| Field | Detail |
|---|---|
| Types | Scavenger Hunt, Sponsor Challenge, Custom |
Steps:
- Open a manual challenge (Scavenger Hunt or Sponsor Challenge) with uncompleted steps.
- Click the "Done" button on the current step.
Expected Results:
- Button shows "Saving…" with spinner while in flight.
- API call
PUT /api/v1/gamification/challenges/<id>/progresswith{ progress: N, completed: false/true }. - Step transitions to green (completed).
- Progress ring percentage updates.
- If final step: toast "🎉 Challenge completed! +N pts earned".
- If intermediate: toast "Step recorded! N/M done".
- Modal stays open reflecting the updated state (optimistic update).
- Challenge card in the list also updates immediately.
TC-GAM-023 — Challenges — Auto-Tracked Challenge Notice
| Field | Detail |
|---|---|
| Types | Session Attendance, Networking, Social |
Steps:
- Open an auto-tracked challenge (Session Attendance / Networking / Social).
Expected Results:
- A "Auto-tracked" info box is shown instead of a manual "Done" button.
- Message explains how progress is tracked (e.g. "Progress updates automatically when you check in to sessions.").
- Current progress is shown if > 0 (e.g. "2/3 completed so far").
- No manual submission button is shown.
TC-GAM-024 — Challenges — Prizes Section
Steps:
- Open a challenge that has prizes configured.
Expected Results:
- A "Prizes" section appears in the modal with a Trophy icon.
- Each prize shows: name, description, quantity (e.g. "×5").
- When the challenge is completed: a note appears "🎁 Collect your prize at the event info desk — show this completed challenge screen."
TC-GAM-025 — Challenges — Expired Challenge State
Steps:
- Find a challenge whose end date has passed.
- Observe its card and open its modal.
Expected Results:
- Card: no top accent strip, 60% opacity, 🔒 emoji shown, timer shows "Ended".
- Modal: 🔒 emoji in header, no "Done" button, no auto-track notice.
TC-GAM-026 — Challenges — Completed Challenge State
Steps:
- Find a completed challenge. Open its modal.
Expected Results:
- Modal header: ✅ emoji.
- Progress ring: 100%.
- Green "Challenge completed! 🎉" callout with completion timestamp and "+N pts awarded" note.
- All steps shown as green/checked.
- No action buttons shown (challenge is done).
TC-GAM-027 — Points Actions Feed (Cross-feature)
Steps:
- Complete one of each action type:
- Check in to the event.
- Vote in a poll.
- Ask a Q&A question.
- Make a new connection.
- Post on the Social Wall.
- Complete a challenge.
- Open the Leaderboard → own profile → History tab.
Expected Results:
- Each action appears in the history feed within a reasonable time.
- Correct icon and label for each action type.
- Points total on the leaderboard increases accordingly.
- Rank may change if points surpass the person above.
17. Module 15 — Sponsors & Booths
TC-SPON-001 — Sponsors Page
Steps:
- Navigate to
/events/<event-id>/sponsors.
Expected Results:
- Sponsors are listed, grouped by tier (e.g., Gold, Silver, Bronze).
- Each sponsor shows logo, name, and a "Visit Booth" button.
TC-SPON-002 — Sponsor Booth Page
Steps:
- Click "Visit Booth" for a sponsor.
- Navigate to
/events/<event-id>/sponsors/<sponsor-id>.
Expected Results:
- Booth page loads with sponsor branding, description, and website link.
- If the sponsor has resources (PDFs, videos), they are listed and accessible.
- A "Contact Us" or lead capture form may be present.
18. Module 16 — Surveys
TC-SUR-001 — View Available Surveys
Steps:
- Navigate to
/events/<event-id>/surveys.
Expected Results:
- List of available surveys for the event is shown.
- Each survey shows its title and whether it has been completed.
TC-SUR-002 — Complete a Survey
Steps:
- Click on an available survey.
- Answer all questions (various types: text, rating, multiple choice).
- Click "Submit".
Expected Results:
- All question types render correctly.
- Submission succeeds with a confirmation message.
- Survey is marked as "Completed" in the survey list.
- Attempting to re-open shows a completion notice (no re-submission).
19. Module 17 — Certificates
TC-CERT-001 — View Certificate Page
Steps:
- Navigate to
/events/<event-id>/certificate. - (Precondition: attendance has been confirmed for this user.)
Expected Results:
- Certificate page loads with the user's name and event details.
- A "Download Certificate" button is visible.
TC-CERT-002 — Download Certificate
Steps:
- On the certificate page, click "Download Certificate".
Expected Results:
- A PDF or image file of the certificate is downloaded.
- The certificate contains: user name, event name, date, and any credential details.
20. Module 18 — Photo Gallery & Highlights
TC-GAL-001 — Photo Gallery Page
Steps:
- Navigate to
/events/<event-id>/gallery.
Expected Results:
- Gallery page loads with event photos displayed in a grid.
- Clicking a photo opens a lightbox or expanded view.
- Lightbox allows next/previous navigation.
TC-GAL-002 — Event Highlights Page
Steps:
- Navigate to
/events/<event-id>/highlights.
Expected Results:
- Highlights page loads with curated event content (featured moments, key stats, media).
21. Module 19 — Group Chat
TC-GRP-001 — Group Chat Page
Steps:
- Navigate to
/events/<event-id>/group-chat.
Expected Results:
- Group chat page loads.
- Event-wide message feed is displayed.
- Input box allows message composition.
TC-GRP-002 — Send Group Message
Steps:
- In the group chat, type: "Hello everyone!"
- Click "Send" or press
Enter.
Expected Results:
- Message appears in the chat feed immediately.
- Message shows sender name and timestamp.
22. Module 20 — Meeting Scheduler
TC-MTG-001 — Meeting Scheduler Page
Steps:
- Navigate to
/events/<event-id>/meetings.
Expected Results:
- Meeting scheduler loads.
- Existing scheduled meetings are listed (if any).
- A "Schedule a Meeting" or "Book Time" button is visible.
TC-MTG-002 — Schedule a Meeting
Steps:
- Click "Schedule a Meeting".
- Select an attendee from the list.
- Choose a time slot.
- Submit.
Expected Results:
- Meeting is created and appears in the meeting list.
- Both parties receive a notification / confirmation.
23. Module 21 — User Profile
Context: The profile page at
https://uat.events.cardgit.com/profilehas four tabs: Profile, Networking, Notifications, and Privacy. The active tab is synced to the URL via?tab=query param. The hero banner shows the user's avatar, name, email, role badge, and a completeness bar (0–100%) calculated from 11 fields across two tabs. The page useshttps://uat.api2.cardgit.com/api/v1/auth/meon load and separate PUT endpoints per tab.
TC-PROF-001 — Profile Page Hero Banner Loads
| Field | Detail |
|---|---|
| Priority | Critical |
| URL | https://uat.events.cardgit.com/profile |
| Precondition | Logged in as any user |
Steps:
- Navigate to
/profile.
Expected Results:
- A gradient banner (indigo → violet → purple) fills the top section.
- User's avatar (or initial letter placeholder if no avatar) is displayed as a rounded square.
- User's full name appears as an
<h1>. - User's email is shown below the name.
- A role badge (e.g. "ORGANIZER", "ATTENDEE") is shown.
- "Profile completeness" label with a percentage and progress bar are visible.
- If completeness < 80%: a hint reads "Fill in your networking profile to improve your match quality".
- A camera icon button overlays the avatar (used to change it).
TC-PROF-002 — All Four Tabs Visible and Active Default is Profile
Steps:
- Navigate to
/profile. - Observe the tab bar.
Expected Results:
- Four tab buttons are visible: Profile, Networking, Notifications, Privacy — each with an icon.
- The Profile tab is active by default (highlighted with gradient background).
- The tab bar is sticky and overlaps the hero banner as you scroll.
TC-PROF-003 — Tab Click Updates URL
Steps:
- Click the Networking tab.
- Check the URL.
- Click the Privacy tab.
- Check the URL.
Expected Results:
- Clicking Networking: URL becomes
/profile?tab=networking. - Clicking Privacy: URL becomes
/profile?tab=privacy. - Tab switches without a full page reload.
TC-PROF-004 — Direct URL Tab Load
Steps:
- Navigate directly to
/profile?tab=notifications.
Expected Results:
- The Notifications tab is active and its content is shown (Quiet Hours section visible).
- No redirect or default tab override occurs.
TC-PROF-005 — Profile Tab — View Mode Shows All Fields
Steps:
- Navigate to
/profile(Profile tab active).
Expected Results:
- Fields are displayed in read-only view: First name, Last name, Email.
- An "Edit Profile" button is visible.
- No editable inputs are shown by default.
TC-PROF-006 — Profile Tab — Edit Mode Opens Form
Steps:
- Click "Edit Profile".
Expected Results:
- Inline edit form appears with inputs:
input[placeholder="First name"]input[placeholder="Last name"]input[type="email"](email field)
- A Save (submit) button and a Cancel (×) button are visible.
TC-PROF-007 — Profile Tab — Cancel Returns to View Mode
Steps:
- Click "Edit Profile".
- Change the First name field.
- Click the Cancel (×) button.
Expected Results:
- The edit form closes.
- View mode is restored with the original name (change discarded).
- "Edit Profile" button is visible again.
TC-PROF-008 — Profile Tab — Save Updates Name
Steps:
- Click "Edit Profile".
- Update First name to
Sarah. - Click the Save/submit button.
- Wait for the response.
Expected Results:
- API call
PUT /api/v1/auth/meis made with the updated name. - Edit form closes and view mode is restored.
- The updated name appears in the hero banner
<h1>. - Toast: "Profile updated".
TC-PROF-009 — Profile Tab — Avatar Upload
| Field | Detail |
|---|---|
| Max file size | 1 MB |
| Accepted formats | JPEG, PNG, WebP |
Steps:
- Click the camera icon on the avatar in the hero banner.
- Select a valid JPEG/PNG/WebP file under 1 MB.
Expected Results:
- The avatar area shows a loading spinner while uploading.
- API call
POST /api/v1/auth/me/avataris made. - On success: avatar updates in the hero banner and in the navigation bar.
- Toast: "Avatar updated".
TC-PROF-010 — Profile Tab — Avatar Upload Validation
Steps:
- Try to upload a file > 1 MB.
- Try to upload a non-image file (e.g.
.pdf).
Expected Results:
- File > 1 MB: toast error "Image too large. Maximum size is 1 MB."
- Non-image file: toast error "Unsupported format. Use JPEG, PNG, or WebP."
- No upload request is made in either case.
TC-PROF-011 — Profile Completeness Bar Updates After Save
Steps:
- Note the current completeness percentage.
- Fill in a field that was previously empty (e.g. add a bio on the Networking tab and save).
- Return to the Profile tab and observe the hero banner.
Expected Results:
- Completeness percentage increases.
- Progress bar width grows to match the new percentage.
TC-PROF-012 — Networking Tab — All Key Fields Present
Steps:
- Click the Networking tab.
Expected Results:
- The following fields are visible:
- Bio textarea (
placeholdercontains "yourself") with a character counter (e.g. "0 / 500") - Company input
- Job title input
- Industry dropdown (searchable, 20+ groups with 150+ industries)
- Location section with City input and Country dropdown (searchable, 190+ countries)
- Interests tag input (pill chips, add on Enter/comma)
- Looking for line input (bullet-style rows, add on Enter)
- What I can offer line input
- Bio textarea (
- A "Save Networking Profile" button is visible.
TC-PROF-013 — Networking Tab — Bio Character Counter
Steps:
- Click on the Bio textarea.
- Type: "Hello world" (11 characters).
Expected Results:
- Character counter updates to "11 / 500".
- Counter is visible below or near the textarea.
TC-PROF-014 — Networking Tab — Interests Tag Chips
Steps:
- Click in the Interests tag input.
- Type
TypeScriptand press Enter. - Type
Reactand press comma.
Expected Results:
TypeScriptappears as a pill chip after pressing Enter.Reactappears as a pill chip after pressing comma.- Each chip has an × button to remove it.
- The draft input clears after each tag is committed.
TC-PROF-015 — Networking Tab — Tag Chip Removal
Steps:
- Add at least one interest tag.
- Click the × button on a tag chip.
Expected Results:
- The tag is removed from the list.
- Other tags remain unaffected.
TC-PROF-016 — Networking Tab — Suggestions Panel (Interests)
Steps:
- On the Interests field, click "Browse suggestions (X)".
Expected Results:
- A suggestions panel expands below the tag input.
- A filter input is shown ("Filter suggestions…").
- Suggestion chips are displayed (up to 12 initially with a "+ X more" toggle).
- Clicking a suggestion chip adds it as a tag and closes the panel entry.
- "Hide suggestions" collapses the panel.
TC-PROF-017 — Networking Tab — Suggestions Filter
Steps:
- Open the suggestions panel on Interests.
- Type
reactin the filter input.
Expected Results:
- Only suggestions containing "react" are shown.
- Clearing the filter restores all suggestions.
- Typing something with no matches shows "No matches for 'xyz'".
TC-PROF-018 — Networking Tab — Looking For Field
Steps:
- On the Looking for field, type an entry and press Enter or click the + button.
Expected Results:
- Entry appears as a bullet-style row with a remove button.
- Up to 20 entries can be added.
- "Browse suggestions" panel available with relevant presets.
TC-PROF-019 — Networking Tab — Industry Dropdown
Steps:
- Click the Industry dropdown button.
- Type
fintechin the search input inside the dropdown. - Select an industry.
Expected Results:
- Dropdown opens as a portal (fixed-positioned, not clipped by parent).
- Groups are labelled (e.g. "Finance & FinTech").
- Typing filters across all groups.
- Selecting an item closes the dropdown and shows the selected industry on the button.
- "Clear selection" option appears when a value is set.
TC-PROF-020 — Networking Tab — Country Dropdown
Steps:
- Click the Country dropdown.
- Type
unitedin the search. - Select "United Kingdom".
Expected Results:
- Dropdown shows 190+ countries.
- Typing filters in real time.
- "United Kingdom" is selectable and appears on the button after selection.
TC-PROF-021 — Networking Tab — Live Preview
Steps:
- Fill in the Bio textarea with: "I build great products."
Expected Results:
- A "Live Preview" section appears showing how the networking profile card will look to other attendees.
- Preview updates as the bio changes.
TC-PROF-022 — Networking Tab — Save
Steps:
- Fill in Bio, Company, Job Title, and at least one Interest.
- Click "Save Networking Profile".
Expected Results:
- API call
PUT /api/v1/auth/me/networking-profileis made. - Toast: "Networking profile updated".
- Profile completeness bar increases if new fields were filled.
TC-PROF-023 — Notifications Tab — Four Channels Present
Steps:
- Click the Notifications tab.
Expected Results:
- Four notification channels are visible with toggle switches: Email, Push, SMS, In-app.
- Each toggle shows its current state (enabled/disabled) via
aria-checkedattribute. - Toggle buttons have
role="switch".
TC-PROF-024 — Notifications Tab — Toggle Flips State
Steps:
- Note the initial
aria-checkedvalue of the Email toggle. - Click the Email toggle.
Expected Results:
aria-checkedchanges from"true"to"false"(or vice versa).- Toggle button colour changes: indigo (enabled) ↔ grey (disabled).
TC-PROF-025 — Notifications Tab — Quiet Hours
Steps:
- On the Notifications tab, scroll to the Quiet Hours section.
Expected Results:
- "Quiet Hours" heading is visible.
- Two
input[type="time"]fields are shown (start time and end time). - Both are settable.
TC-PROF-026 — Notifications Tab — Save Preferences
Steps:
- Toggle the SMS notification off (if currently on).
- Click "Save Preferences".
Expected Results:
- API call
PUT /api/v1/auth/me/notification-preferencesis made. - Toast: "Saved".
- After reload, the SMS toggle reflects the saved state.
TC-PROF-027 — Privacy Tab — Section Structure
Steps:
- Click the Privacy tab.
Expected Results:
- Visibility section (
<h3>) is present with profile visibility options. - Networking Controls section is present with toggles for:
- Do Not Disturb (DND)
- Incognito Mode
- A "What others can see" summary section is present.
- A "Save Privacy Settings" button is visible.
TC-PROF-028 — Privacy Tab — Do Not Disturb Red Highlight
Steps:
- On the Privacy tab, find the Do Not Disturb toggle.
- Ensure it is off.
- Enable it by clicking.
Expected Results:
- Toggle switches to
aria-checked="true". - The DND row/container gains a red styling (red border or red background class).
- This visually warns the user that DND is active.
TC-PROF-029 — Privacy Tab — Privacy Summary Updates
Steps:
- Change the Profile Visibility setting (e.g. from "Public" to "Connections Only").
- Observe the "What others can see" summary.
Expected Results:
- The summary text updates to reflect the new visibility level.
- Summary describes what information is visible (e.g. "Your profile", "Email address", "Company").
TC-PROF-030 — Privacy Tab — Save Privacy Settings
Steps:
- Change a privacy setting.
- Click "Save Privacy Settings".
Expected Results:
- API call
PUT /api/v1/auth/mewith{ profileVisibility: "..." }is made. - Toast: "Privacy settings saved".
- Setting persists after page reload.
TC-PROF-031 — Mobile — Hero and Tabs Visible (390px)
Steps:
- Set viewport to 390×844.
- Navigate to
/profile.
Expected Results:
- Hero banner, avatar, name, and completeness bar are all visible.
- Tab bar shows icon-only buttons (tab label text is hidden on mobile but icons remain).
- No horizontal overflow (
document.body.scrollWidth <= viewportWidth).
TC-PROF-032 — Mobile — Networking Tab Fields Fit Viewport
Steps:
- At 390px viewport, click the Networking tab.
- Check the Bio textarea dimensions.
Expected Results:
- Bio textarea width ≤ viewport width.
- All fields are usable without horizontal scrolling.
TC-PROF-033 — Mobile — Edit Profile Form Usable
Steps:
- At 390px viewport, click "Edit Profile".
- Update First name. Click Cancel.
Expected Results:
- Edit form opens with full-width inputs.
- Cancel closes the form correctly.
- No layout overflow.
TC-PROF-034 — Viewing Another User's Profile
| Field | Detail |
|---|---|
| URL | https://uat.events.cardgit.com/profile/<userId> |
| Component | UserProfilePage.tsx |
Steps:
- From the networking page or a match card, click on another attendee's name.
- Navigate to
/profile/<userId>.
Expected Results:
- The other user's profile page loads.
- Shows their name, avatar, bio, company, job title, interests, and looking-for items.
- "Edit Profile" button is not shown (read-only view).
- A "Connect" or "Message" button is shown if not already connected.
24. Module 22 — Admin — Login & Role Access
TC-ADM-AUTH-001 — Admin Login (Organizer)
Steps:
- Navigate to
https://uat.events-admin.cardgit.com/login. - Enter email:
sarah@techcorp.io/ password:password123. - Click "Sign In".
Expected Results:
- Redirect to admin dashboard
/. - Navigation sidebar shows: Events, Sessions, Analytics, Settings (Organizer-level).
- Platform admin menu (
/platform) is NOT visible.
TC-ADM-AUTH-002 — Admin Login (Platform Admin)
Steps:
- Navigate to
https://uat.events-admin.cardgit.com/login. - Enter email:
admin@cardgit.com/ password:admin123. - Click "Sign In".
Expected Results:
- Redirect to admin dashboard.
- Sidebar includes Platform section with: Dashboard, Feature Flags, Users, Organizations, Health, Reports, Suspended Events, Email Queue, Exports, Audit Log.
TC-ADM-AUTH-003 — Role-Based Access Control
Steps:
- Log in as an Organizer (
sarah@techcorp.io). - Manually navigate to
https://uat.events-admin.cardgit.com/platform/feature-flags.
Expected Results:
- Access is denied.
- User is redirected to
/or shown a "403 Forbidden" / "Access Denied" page.
TC-ADM-AUTH-004 — Check-In Role Access
Steps:
- Log in with a user who has the
CHECKINrole. - Observe accessible pages.
Expected Results:
- User is redirected to
/checkin(the check-in portal). - Sidebar is not present (standalone portal).
- Platform routes are not accessible.
25. Module 23 — Admin — Event Management
TC-ADM-EVT-001 — Events List Page
Steps:
- Log in as Organizer.
- Navigate to
/eventsin the admin app.
Expected Results:
- Events list loads with all events for the organiser's organisation.
- Each event row shows: title, date, status, registration count.
- "Create Event" / "New Event" button is visible.
- Search and status filter are functional.
TC-ADM-EVT-002 — Create New Event — Page and Stepper Structure
Context: The Create Event wizard at
/events/newhas 6 steps: Basic Info → Venue → Branding → Registration → Features → Review. It shares all step components with the Edit Event page, but has one critical difference: auto-draft — when the user advances from Step 1 (Venue) to Step 2 (Branding), the wizard automatically callsPOST /api/v1/eventsto create a draft in the background. This gives the event an ID, which enables image uploads on the Branding step. The "Save Draft" button appears on Steps 1–5. On Step 6 (Review), it is replaced with "Save as Draft" and "Publish" buttons.
| Field | Detail |
|---|---|
| Priority | Critical |
| URL | https://uat.events-admin.cardgit.com/events/new |
| Role | Organiser or Admin |
Steps:
- Navigate to
/events/new.
Expected Results:
- A 6-step stepper is shown: Basic Info, Venue, Branding, Registration, Features, Review.
- A progress bar (indigo-to-purple gradient) shows current progress.
- Step 1 (Basic Info) is active by default.
- A "Save Draft" button is visible alongside the "Next Step" button.
- The step counter shows "Step 1 / 6".
TC-ADM-EVT-002B — Create Event — Step 1 Basic Info: Minimum Required Fields
Steps:
- Fill in the minimum required fields on Step 1:
- Title:
QA Create Event <timestamp> - Description:
Test event created by QA automation - Start Date & Time: a future datetime (e.g. 14 days from now)
- End Date & Time: Start + 2 hours (auto-set for Single Day)
- Title:
- Click "Next Step".
Expected Results:
- Wizard advances to Step 2 (Venue & Access).
- Step 2 heading: "Venue & Access".
- Progress bar increases to ~33%.
- No API call is made yet (auto-draft has not fired — that happens on Step 1→2 advance).
TC-ADM-EVT-002C — Create Event — Step 1 Validation: Empty Title
Steps:
- On Step 1, leave the Title field empty.
- Click "Next Step".
Expected Results:
- A red error banner or toast appears indicating the title is required.
- The wizard does not advance (URL stays
/events/new).
TC-ADM-EVT-002D — Create Event — Step 1 Validation: Missing Dates
Steps:
- Fill in a title and description but leave both Start Date and End Date empty.
- Click "Next Step".
Expected Results:
- Error shown indicating dates are required.
- Wizard does not advance.
TC-ADM-EVT-002E — Create Event — Step 1 Validation: End Date Before Start
Steps:
- Set Event Duration to "Multi-Day".
- Set Start Date to
2027-06-15T10:00. - Set End Date to
2027-06-14T10:00(before the start). - Click "Next Step".
Expected Results:
- Inline red warning: "End time must be after the start time."
- Wizard does not advance.
TC-ADM-EVT-002F — Create Event — Auto-Draft Fires on Step 1 → Step 2 Transition
| Field | Detail |
|---|---|
| Priority | Critical |
| This is the most important unique behaviour of the Create wizard |
Steps:
- Complete Step 1 (title, description, dates).
- Click "Next Step" to advance to Step 2 (Venue).
- On Step 2, click "Next Step" again to advance to Step 3 (Branding).
- Wait up to 10 seconds.
Expected Results:
- During the Step 1→2 transition:
POST /api/v1/eventsis called automatically withstatus: 'draft'and the Step 1 data. - HTTP 201 is returned and an event UUID is created in the background.
- A loading state or spinner may briefly appear.
- After the auto-draft completes: Step 3 (Branding) heading is visible.
- The URL may update to include the draft event ID, or navigation state carries it.
TC-ADM-EVT-002G — Create Event — Branding Step Shows Image Upload (After Auto-Draft)
Steps:
- Complete Steps 1 and 2 to trigger the auto-draft.
- On Step 3 (Branding), inspect the Logo, Hero Banner, and Event Image fields.
Expected Results:
- Because the event now has an ID (from auto-draft), the Branding step shows image upload components (not plain URL text inputs).
- Each image field has: a current image preview (or placeholder), an "Upload" button, and a "Restore Default" button.
- Default images are auto-generated from the event title and primary colour.
- Colour pickers for Primary and Secondary colours are visible.
- Header Display Mode radio group: Hero Only / Hero + Image / Image Only.
- A live preview panel shows the selected header mode with the current colours and images.
TC-ADM-EVT-002H — Create Event — Branding Step: Colour Pickers
Steps:
- On Step 3 (Branding), change the Primary Color to
#e11d48. - Observe the live preview.
Expected Results:
- Colour picker and hex input stay in sync.
- Live preview updates immediately with the new primary colour.
- The preview shows the correct header display mode.
TC-ADM-EVT-002I — Create Event — Step 4 Registration: Custom Fields Quick-Add
Steps:
- Navigate to Step 4 (Registration).
- Click the "🥗 Dietary Requirements" Quick Add chip.
- Click "👕 T-Shirt Size" chip.
Expected Results:
- "Dietary Requirements" field added (type: checkboxes, options: Vegetarian/Vegan/Gluten-free/Halal/Kosher/None).
- "T-Shirt Size" field added (type: dropdown, options: XS/S/M/L/XL/XXL).
- Both chips turn green with a "✓" after being added.
- Clicking an already-added chip does nothing (disabled, already-green state).
TC-ADM-EVT-002J — Create Event — Step 5 Features Toggles
Steps:
- Navigate to Step 5 (Features).
- Toggle Social Wall off.
- Toggle Q&A Sessions off.
Expected Results:
- Social Wall checkbox unchecks; its nested Social Wall Moderation sub-option disappears.
- Q&A Sessions unchecks; its nested Q&A Moderation sub-option disappears.
- All toggled states will be reflected in the Review step summary.
TC-ADM-EVT-002K — Create Event — Review Step Summary
Steps:
- Navigate through all 6 steps filling in data.
- On Step 6 (Review), inspect all panels.
Expected Results:
- 4 summary panels: Event Details (blue), Venue & Access (emerald), Registration (amber), Enabled Features (purple).
- Event Details shows: title, type, start/end dates formatted in the selected timezone, category, tags.
- Venue & Access shows: privacy type, approval status, venue name, city/state/country, virtual platform if set.
- Registration shows: custom field count and each field's name, type badge, required status.
- Enabled Features shows a chip for every enabled feature.
- Two action buttons: "Save as Draft" (outline) and "Publish" (gradient).
TC-ADM-EVT-002L — Create Event — Save as Draft from Review
Steps:
- Complete all 6 steps.
- On the Review step, click "Save as Draft".
- Wait for navigation.
Expected Results:
PUT /api/v1/events/<draft-id>(orPOSTif auto-draft failed) with all form data andstatus: 'draft'.- Redirect to
/events/<event-id>(event detail page). - Event detail page shows a "Draft" status badge.
- Event does not appear on the public attendee events page.
TC-ADM-EVT-002M — Create Event — Publish from Review
Steps:
- Complete all 6 steps.
- On the Review step, click "Publish".
- Wait for navigation.
Expected Results:
- API call includes
status: 'published'. - Redirect to
/events/<event-id>. - Event status on the detail page shows "Published" / "Live".
- Event appears on the attendee-facing events discovery page (
https://uat.events.cardgit.com/events). - An
event-createdemail is enqueued (verifiable viaGET /api/v1/email-queue?emailType=event-created).
TC-ADM-EVT-002N — Create Event — Save Draft on Intermediate Step (Steps 1–5)
Steps:
- On Step 1, fill in title and dates only.
- Click "Save Draft" (without advancing to Review).
Expected Results:
POST /api/v1/eventsis called withstatus: 'draft'and the current form data.- HTTP 201.
- Redirect to
/events/<new-uuid>. - Event detail shows "Draft" badge.
- Save Draft button visible on Steps 1–5; absent on Step 6 (replaced by "Save as Draft").
TC-ADM-EVT-002O — Create Event — Back Navigation Retains Data
Steps:
- Complete Step 1 (title, description, dates).
- Click "Next Step" to advance to Step 2.
- Click "Back".
- Observe Step 1 fields.
Expected Results:
- Returning to Step 1: all filled values (title, description, dates) are still present.
- No data is lost when using Back navigation.
TC-ADM-EVT-002P — Create Event — Virtual Event Type Shows Meeting Fields
Steps:
- On Step 1, change Event Type to "Virtual".
- Observe the step.
Expected Results:
- A "Virtual Joining Link" panel appears immediately on Step 1 with a Platform select (Zoom / Google Meet / Teams / Hopin / StreamYard / Custom) and a "Meeting / Stream Link" input.
- Venue fields on Step 2 are hidden (or replaced with virtual-only fields).
- Step 2 shows the "Virtual Details" section instead of physical venue fields.
TC-ADM-EVT-003 — Create Event — Validation: Required Fields at Each Step
Steps:
Step 0 — leave Title empty → click "Next Step":
- Error: title required. Wizard stays on Step 1.
Step 0 — fill title and description but no dates → click "Next Step":
- Error: dates required. Wizard stays on Step 1.
Step 2 — set Privacy to "Private", leave Invite Code empty → click "Next Step":
- Error: "Private events require an invite code." Wizard stays on Step 2.
Step 2 — set Privacy to "Private", enter invite code abc (3 chars) → click "Next Step":
- Error: "Invite code must be at least 6 characters." Wizard stays on Step 2.
Step 3 — enable "Require Approval", leave Maximum Registrations empty → click "Next Step":
- Error: "Maximum Registrations is required when approval is enabled." Wizard stays on Step 3.
Expected Results:
- Each validation blocks wizard advancement.
- Errors appear as a red banner above the navigation buttons and/or toast.
- The user is kept on the offending step until the error is resolved.
TC-ADM-EVT-004 — Edit Event — Page Loads with Existing Data
Context: The Edit Event page at
/events/:id/edituses the same 6-step wizard as Create Event (Basic Info → Venue → Branding → Registration → Features → Review), but pre-populated with the event's saved data viaeventToFormData(). A cross-org banner blocks editing when an ADMIN views another org's event. Changes are saved viaPUT /events/:id. A "Save & Publish" button on the Review step is shown only for draft events.
| Field | Detail |
|---|---|
| Priority | Critical |
| URL | https://uat.events-admin.cardgit.com/events/<event-id>/edit |
Steps:
- Navigate to
/events/<event-id>/edit. - Wait for the page to load.
Expected Results:
- A 6-step wizard stepper is shown: Basic Info, Venue, Branding, Registration, Features, Review.
- A progress bar (indigo-to-purple) shows the current step percentage.
- All fields on Step 1 (Basic Info) are pre-populated with the event's existing values.
- Event title, description, type, dates, and timezone all reflect the saved event.
TC-ADM-EVT-004B — Edit Event — Step Navigation
Steps:
- On the Edit Event wizard (Step 1), click "Next Step".
- Continue through Steps 2–5 clicking "Next Step" each time.
- Observe the stepper and progress bar.
Expected Results:
- Each step advances correctly (1→2→3→4→5→6 Review).
- Progress bar increments at each step.
- "Back" button on Steps 2–6 returns to the previous step without losing entered data.
- Step counter badge shows "Step X / 6".
TC-ADM-EVT-004C — Edit Event — Quick Save on Intermediate Step
Steps:
- On the Edit Event wizard (Step 2 — Venue), make a change (e.g. update the venue city).
- Click the "Quick Save" button (without advancing to Review).
Expected Results:
PUT /api/v1/events/<id>is called immediately with the current form data.- Toast: success confirmation (or error if save fails).
- User remains on the current step.
TC-ADM-EVT-004D — Edit Event — Step 1 Basic Info: All Fields
Steps:
- On Step 1, interact with each field:
- Update the Event Title.
- Update the Short Description.
- Change the Event Type to "Virtual".
- Observe that the Virtual Platform and Meeting Link fields appear.
- Toggle between "Single Day" and "Multi-Day" duration.
- Change Start and End dates.
- Change the Timezone using the searchable combobox.
- Add comma-separated Tags.
Expected Results:
- Virtual/Hybrid type: "Virtual Joining Link" panel appears with Platform select and Meeting/Stream Link input.
- In-person type: Virtual panel is hidden.
- Single Day: changing Start auto-sets End to Start + 1 hour.
- Multi-Day: End date field has
min= Start date; red warning shows if End ≤ Start. - Timezone combobox: searchable list of all IANA timezones, sorted by UTC offset; selection updates the displayed value.
TC-ADM-EVT-004E — Edit Event — Step 2 Venue: Privacy and Address Mask
Steps:
- Navigate to Step 2 (Venue).
- Change Privacy from "Public" to "Private".
- Observe the Invite Code field.
- Try to advance to Step 3 without entering an invite code.
- Enter an invite code of only 3 characters and try to advance.
- Enable the "Address Mask" checkbox.
Expected Results:
- Private: Invite Code field appears (required); amber info box explains "completely hidden".
- Unlisted: Invite Code is optional; sky-blue info box explains "link-only".
- Empty invite code with Private: validation error "Private events require an invite code."
- Code < 6 chars: error "Invite code must be at least 6 characters."
- Address Mask on: amber badge "On — Address hidden" visible; description explains only city/state/country are shown publicly.
TC-ADM-EVT-004F — Edit Event — Step 3 Registration: Custom Fields
Steps:
- Navigate to Step 3 (Registration).
- Click "Add Field".
- Fill in the label, change the type to "Dropdown (single choice)", and add options (one per line).
- Click the "🥗 Dietary Requirements" Quick Add chip.
- Remove one field.
Expected Results:
- New field row appears with label input, type select, Required checkbox, delete button.
- Dropdown type: options textarea appears with live preview chips.
- Dietary Requirements quick-add: pre-fills label, type (checkbox), and options (Vegetarian/Vegan/Gluten-free/Halal/Kosher/None).
- Quick-add chip turns green with "✓" once a field with that label exists.
- Deleting a field removes it from the list.
TC-ADM-EVT-004G — Edit Event — Step 3 Registration: Approval + Max Registrations
Steps:
- On Step 3, check "Require Approval".
- Observe the new field that appears.
- Leave "Maximum Registrations" empty and try to advance to Step 4.
Expected Results:
- An amber warning panel appears: "Approval is enabled. You must set Maximum Registrations…"
- "Maximum Registrations" number input is shown and required.
- Advancing with it empty: validation error "Maximum Registrations is required when approval is enabled."
- Setting
maxRegistrations < maxAttendees: inline error "Maximum Registrations must be greater than or equal to Maximum Attendees."
TC-ADM-EVT-004H — Edit Event — Step 4 Features Toggles
Steps:
- Navigate to Step 4 (Features).
- Toggle Social Wall on.
- Observe the sub-option that appears.
- Toggle Q&A Sessions on.
Expected Results:
- All 12 feature toggles are visible as checkboxes.
- Enabled features show a green "Enabled" badge.
- Enabling Social Wall reveals an indented Social Wall Moderation sub-toggle.
- Enabling Q&A Sessions reveals an indented Q&A Moderation sub-toggle.
- Disabling the parent (Social Wall / Q&A) hides the sub-toggle.
TC-ADM-EVT-004I — Edit Event — Review Step and Save Changes
Steps:
- Navigate to Step 6 (Review).
- Inspect all four summary panels.
- Click "Save Changes".
Expected Results:
- Review shows 4 coloured panels: Event Details (blue), Venue & Access (emerald), Registration (amber) with custom fields, Enabled Features (purple).
- If the event is a draft: an amber notice "This event is still a draft" appears with guidance.
- "Save & Publish" button is visible only for draft events.
- "Save Changes":
PUT /api/v1/events/<id>is called with all form data. - On success: redirected to
/events/<id>(event detail page) after 800ms. - On the detail page: updated values are reflected.
TC-ADM-EVT-004J — Edit Event — Save and Publish (Draft → Published)
| Field | Detail |
|---|---|
| Precondition | Event is in Draft status |
Steps:
- Navigate to Step 6 (Review) of a draft event.
- Click "Save & Publish".
Expected Results:
PUT /api/v1/events/<id>is called with{ status: 'published', ...formData }.- On success: redirected to
/events/<id>. - Event status on the detail page shows "Published" / "Live".
- Event is now visible on the attendee-facing events discovery page.
TC-ADM-EVT-004K — Edit Event — Cross-Org View Only (Platform Admin)
| Field | Detail |
|---|---|
| Precondition | Logged in as admin@cardgit.com; viewing an event belonging to a different organisation |
Steps:
- Navigate to
/events/<cross-org-event-id>/edit.
Expected Results:
- An amber banner is shown: "View Only — Different Organization."
- All "Next Step", "Quick Save", "Back" buttons show a Lock icon.
- "Save Changes" and "Save & Publish" are disabled.
- Form fields are visible but editing is blocked (navigation through steps still works to view data).
TC-ADM-EVT-004L — Edit Event — Step 2 Branding: Colour Pickers and Live Preview
Steps:
- Navigate to Step 2 → then Step 3 (Branding, index 2 in Edit).
- Change the Primary Color using the colour picker.
- Enter a custom hex
#e11d48in the hex input. - Change the Header Display Mode to "Image Only".
Expected Results:
- Colour picker and hex input stay in sync.
- Live preview panel updates immediately to reflect new primary colour.
- Header Display Mode "Hero Only": shows gradient banner preview only.
- "Hero + Image": shows banner + event image below.
- "Image Only": shows only the event image.
TC-ADM-EVT-005 — Publish an Event
Steps:
- On the event detail page, find a DRAFT event.
- Click "Publish".
- Confirm in any dialog that appears.
Expected Results:
- Event status changes to "Published" / "Live".
- Event becomes visible on the attendee-facing events page.
TC-ADM-EVT-006 — Delete an Event
Steps:
- On the events list, click the delete (🗑) action for an event.
- Confirm deletion in the dialog.
Expected Results:
- Event is removed from the list.
- Navigating to the event's URL returns 404.
- Attendees who were registered receive a notification (if configured).
TC-ADM-EVT-007 — Event Audit Log
Steps:
- Navigate to
/events/<event-id>/audit-log.
Expected Results:
- Audit log loads with a chronological list of actions.
- Entries show: action type, user, timestamp.
- Filter by date range works correctly.
26. Module 24 — Admin — Session Management
TC-ADM-SES-001 — View Sessions List
Steps:
- Navigate to
/events/<event-id>/scheduleor/sessions.
Expected Results:
- All sessions for the event are listed.
- Each row shows: title, speaker, time, track/room.
TC-ADM-SES-002 — Create a Session
Steps:
- Navigate to
/sessions/new. - Fill in:
- Title:
Keynote: Future of AI - Speaker: Select a speaker
- Start Time:
2027-01-15 09:00 - End Time:
2027-01-15 10:00 - Track:
Main Stage
- Title:
- Click "Save".
Expected Results:
- Session is created and appears in the schedule.
- Session is visible to attendees on the frontend.
TC-ADM-SES-003 — Edit a Session
Steps:
- Click edit on an existing session.
- Update the session title.
- Save.
Expected Results:
- Title is updated.
- Change is reflected on the attendee-facing schedule.
TC-ADM-SES-004 — Schedule Builder — Page Loads
Context: The Schedule Builder at
/events/:eventId/scheduleis a drag-and-drop calendar grid (07:00–22:00, 30-min slots). It requires anowneroradminhost role — all others are redirected. Track columns display sessions colour-coded by type. Overlapping sessions in the same track are rendered Outlook-style (side-by-side). The grid is horizontal-scroll on wide screens; on mobile a "Wider Screen Required" warning is shown instead. Changes are not auto-saved — a "Save Changes" button appears when the schedule is dirty.
| Field | Detail |
|---|---|
| Priority | Critical |
| URL | https://uat.events-admin.cardgit.com/events/<event-id>/schedule |
| Role | Event owner or admin host role |
Steps:
- Navigate to
/events/<event-id>/schedule.
Expected Results:
- Toolbar shows: heading "Schedule Builder", event title subtitle, session/track count.
- Track columns rendered horizontally; time gutter (07:00–22:00, 30-min labels) on the left.
- Each session block shows: title, session type, colour band, drag handle (GripVertical), delete button on hover.
- Toolbar buttons visible: date selector dropdown, Zoom Out/In controls with px display, Templates link, Import CSV, Manage Tracks, Add Session, Refresh.
TC-ADM-SES-004B — Schedule Builder — Date Tab Switching
Steps:
- On the Schedule Builder, observe the date selector dropdown.
- Select a different day (for multi-day events).
Expected Results:
- Dropdown shows all unique session dates (YYYY-MM-DD format, displayed as readable labels e.g. "Mon, 15 Jan 2027").
- Selecting a date filters the grid to show only sessions for that day.
- Session count in the toolbar subtitle updates (e.g. "5 of 12 sessions").
TC-ADM-SES-004C — Schedule Builder — Drag-and-Drop Move Session
Steps:
- Locate a session block in the grid.
- Drag it by the GripVertical handle to a different 30-min slot in the same or a different track column.
- Observe the state before saving.
Expected Results:
- Session block moves to the new position immediately (optimistic update).
- An amber "Unsaved changes. Click 'Save Changes' to persist." banner appears.
- The "Save Changes" button becomes visible in the toolbar.
- No API call is made yet (changes are buffered in
pendingMoves). - Drop target cells show an indigo highlight when hovered during drag.
TC-ADM-SES-004D — Schedule Builder — Save Changes After Drag
Steps:
- Move a session (TC-ADM-SES-004C).
- Click "Save Changes".
Expected Results:
- Button shows "Saving…" while in flight.
PUT /api/v1/sessions/<id>is called for each moved session with updatedstartTime,endTime,trackId.- Toast: "Schedule saved!".
- Unsaved changes banner disappears.
- Save Changes button disappears.
- After page reload, the session remains in the new position.
TC-ADM-SES-004E — Schedule Builder — Edge Resize to Change Duration
Steps:
- Hover over a session block until the resize handle appears at the bottom.
- Drag the bottom edge downward by 2 slots (1 hour).
- Release.
Expected Results:
- Session block height extends live during drag.
- On release:
endTimeis updated (+1 hour), session block reflects new duration. - Unsaved changes banner appears; Save Changes button shown.
- Minimum duration is 1 slot (30 min) — cannot resize shorter than that.
TC-ADM-SES-004F — Schedule Builder — Conflict Detection
Steps:
- Drag a session to overlap with another session in the same track column.
- Observe the conflicting sessions.
Expected Results:
- Both overlapping sessions show a red ring highlight (
ring-2 ring-red-500). - A red gradient banner appears: "N scheduling conflict(s) detected — overlapping sessions are highlighted in red."
- Banner has a dismiss (×) button.
- Conflict count is shown in the toolbar subtitle.
- Conflicts reset when the date is switched.
TC-ADM-SES-004G — Schedule Builder — Outlook-Style Overlap Layout
Steps:
- Ensure two sessions in the same track have overlapping time ranges.
- Observe both session blocks.
Expected Results:
- Both blocks are visible simultaneously (not hidden behind each other).
- They are rendered side-by-side within the track column, each taking a proportional width (e.g. 50% each for 2 overlapping sessions).
TC-ADM-SES-004H — Schedule Builder — Zoom Controls
Steps:
- Click the Zoom In (+) button 3 times.
- Click the Zoom Out (−) button 6 times.
Expected Results:
- Each Zoom In click increases
slotHeightPxby 8 (max 96px). - Each Zoom Out click decreases
slotHeightPxby 8 (min 24px). - Current value is displayed between the two buttons (e.g. "48px").
- Session block heights scale proportionally.
- Zoom buttons stop changing at their limits without error.
TC-ADM-SES-004I — Schedule Builder — Bulk Selection (Ctrl+Click)
Steps:
- Click a session block to select it.
- Ctrl+Click (Windows) or Cmd+Click (Mac) on a second session block.
Expected Results:
- First click: indigo ring appears on the selected session; toolbar shows "1 selected" dropdown.
- Ctrl/Cmd+Click: second session also gets indigo ring; toolbar shows "2 selected".
- Clicking a selected session while holding Ctrl deselects it.
- Regular click (no modifier): selection resets to just the clicked session.
TC-ADM-SES-004J — Bulk Delete Selected Sessions
Steps:
- Select 2 sessions (TC-ADM-SES-004I).
- Click the "N selected" dropdown → choose "Delete selected".
- Confirm in the browser dialog.
Expected Results:
- Dialog: "Delete 2 sessions?"
- On confirm:
POST /api/v1/sessions/bulkwith{ sessionIds: [...], action: 'delete' }. - Both session blocks are removed from the grid.
- Toast: "2 sessions deleted".
- Cancelling leaves both sessions in place.
TC-ADM-SES-004K — Bulk Move to Track
Steps:
- Select 1 or more sessions.
- Click the "N selected" dropdown → "Move to track…".
- Enter a valid track name in the
window.prompt.
Expected Results:
POST /api/v1/sessions/bulkwith{ sessionIds: [...], action: 'move-track', payload: { trackId } }.- Sessions move to the specified track column.
- Toast: "Sessions moved".
- Entering an unknown track name: toast "Track not found"; no change.
TC-ADM-SES-004L — CSV Import
Steps:
- Click "Import CSV" in the toolbar.
- In the modal, paste valid CSV:
title,startTime,endTime,sessionType,room,trackName Morning Keynote,2027-01-15T09:00:00Z,2027-01-15T10:00:00Z,keynote,Main Hall,Main Stage - Observe the preview.
- Click "Import".
Expected Results:
- Modal shows: required columns hint (
title, startTime, endTime), optional columns hint. - After pasting: "1 rows parsed (showing first 5)" preview appears.
- Import:
POST /api/v1/sessions/events/:id/import-csvwith{ rows: [...] }. - Toast: "Imported 1 sessions".
- Modal closes; schedule refreshes with the new session.
TC-ADM-SES-004M — CSV Import — Invalid CSV
Steps:
- Open CSV Import modal.
- Paste CSV with only a header row and no data rows.
- Click "Import".
Expected Results:
- Toast error: "No valid rows found".
- No API call is made.
TC-ADM-SES-004N — Delete a Session from Grid
Steps:
- Hover over a session block.
- Click the Trash2 delete button that appears.
- Confirm in the browser dialog.
Expected Results:
- Dialog: "Remove this session?"
- On confirm:
DELETE /api/v1/sessions/:id. - Session removed from the grid.
- Toast: "Session removed".
TC-ADM-SES-004O — Unassigned Column
Steps:
- On a schedule with tracks defined, navigate to a session that has no trackId assigned.
Expected Results:
- A grey "Unassigned" column is prepended to the grid.
- Sessions with no track are shown in it with hint "drag to assign".
- Dragging a session from Unassigned to a named track column reassigns it.
TC-ADM-SES-004P — Schedule Builder — Access Guard
| Field | Detail |
|---|---|
| Precondition | Logged in as event-moderator@test.com (moderator role, not owner/admin) |
Steps:
- Navigate to
/events/<event-id>/schedule.
Expected Results:
- User is redirected to
/events(<Navigate to="/events" replace />). - Schedule Builder grid is not shown.
TC-ADM-SES-004Q — Mobile Screen Warning
Steps:
- Set viewport to 390×844 (mobile).
- Navigate to
/events/<event-id>/schedule.
Expected Results:
- A warning card is shown: "Wider Screen Required".
- Text: "The drag-and-drop schedule builder needs more horizontal space. Please widen your browser window or use a larger screen."
- A "Go Back" button navigates back.
- The drag-and-drop grid is not rendered.
27. Module 25 — Admin — Speaker Management
TC-ADM-SPK-001 — View Speakers
Steps:
- Navigate to
/events/<event-id>/speakers.
Expected Results:
- Speaker list loads with names, titles, companies, and bios.
- "Add Speaker" button is visible.
TC-ADM-SPK-002 — Add a Speaker
Steps:
- Click "Add Speaker".
- Fill in: Name, Title, Company, Bio.
- Upload a headshot image.
- Save.
Expected Results:
- Speaker is added to the list.
- Speaker appears on the attendee-facing speaker directory.
28. Module 26 — Admin — Registration Management
TC-ADM-REG-001 — View Registrations
Steps:
- Navigate to
/registrations/<event-id>.
Expected Results:
- Table of registered attendees is shown.
- Columns: Name, Email, Status (pending/approved/cancelled), Ticket Type, Check-in Status.
- Search and filter controls are functional.
TC-ADM-REG-002 — Approve a Pending Registration
Steps:
- On the registrations page, find a registration with "Pending" status.
- Click "Approve".
- Confirm.
Expected Results:
- Status changes to "Approved".
- Attendee receives a confirmation notification/email.
TC-ADM-REG-003 — Cancel a Registration
Steps:
- On the registrations page, find an approved registration.
- Click "Cancel" / "Revoke".
- Confirm.
Expected Results:
- Status changes to "Cancelled".
- Attendee loses access to event features.
29. Module 27 — Admin — Check-In Portal
TC-ADM-CHK-001 — Check-In Portal Loads
Steps:
- Navigate to
/checkinor/checkin/<event-id>.
Expected Results:
- Check-in portal loads (may be a standalone page without the admin sidebar).
- Search bar for attendee lookup is prominent.
TC-ADM-CHK-002 — Search and Check In Attendee
Steps:
- On the check-in portal, search for an attendee by name or email.
- Locate the attendee in results.
- Click "Check In".
- Confirm.
Expected Results:
- Attendee is marked as checked in.
- Check-in timestamp is recorded.
- Registration list reflects the check-in status.
30. Module 28 — Admin — Polls & Surveys Builder
TC-ADM-POLL-001 — Create a Poll
Steps:
- Navigate to
/events/<event-id>/polls/new. - Enter poll question: "Which session was your favourite?"
- Add 3 options: "Keynote", "Workshop A", "Workshop B".
- Set the poll to "Open".
- Save.
Expected Results:
- Poll is created and visible on the attendee-facing polls page.
- Options are rendered correctly.
TC-ADM-POLL-002 — Close a Poll
Steps:
- On the poll management page, find an open poll.
- Click "Close Poll".
Expected Results:
- Poll status changes to "Closed".
- Attendees can no longer vote.
- Results remain visible.
TC-ADM-SUR-001 — Create a Survey
Steps:
- Navigate to
/events/<event-id>/surveys/new. - Add a title: "Post-Event Feedback Survey".
- Add questions:
- Rating (1—5): "How would you rate this event overall?"
- Multiple choice: "Would you attend again?" (Yes / No / Maybe)
- Open text: "Any other comments?"
- Save / Publish.
Expected Results:
- Survey is created and accessible to registered attendees.
- All question types render correctly on the attendee side.
31. Module 29 — Admin — Moderation
TC-ADM-MOD-001 — Q&A Moderation Page
Steps:
- Navigate to
/events/<event-id>/moderation/qa.
Expected Results:
- All submitted questions are listed.
- Pending questions (unapproved) are highlighted.
- Each question has "Approve", "Hide", and "Delete" actions.
TC-ADM-MOD-002 — Approve a Question
Steps:
- On the Q&A moderation page, find a pending question.
- Click "Approve".
Expected Results:
- Question status changes to "Approved".
- Question becomes visible to all attendees on the Q&A page.
TC-ADM-MOD-003 — Hide / Remove a Question
Steps:
- Click "Hide" or "Remove" on a question.
- Confirm.
Expected Results:
- Question is removed from the attendee-facing Q&A page.
- Question remains in the moderation view as "Hidden".
TC-ADM-MOD-004 — Social Wall Moderation
Steps:
- Navigate to
/events/<event-id>/moderation/social. - Find a post.
- Click "Remove Post".
- Confirm.
Expected Results:
- Post is removed from the social wall.
- Action is logged in the audit trail.
32. Module 30 — Admin — Announcements
Context: Announcements are broadcast messages sent to all confirmed event registrants. The system has two entry points: the global picker at
/announcements(choose an event then navigate) and the per-event page at/events/:eventId/announcements. The compose form supports a Markdown editor, 4 priority levels (Low/Normal/High/Critical), 3 types (General/Urgent/Sponsor), 2 delivery channels (Email and In-App — no Push), and 6 quick-fill templates (Room Change, Session Soon, Welcome, Break Time, WiFi Details, Directions). Sent announcements appear in the list with a "Sent" badge, delivery channel badges, priority colour coding, timestamp, and view count. Clicking a list item opens a right-side detail panel. Onlyownerandadminevent-host roles can compose; platform admins viewing a cross-org event see a "View Only" banner and a locked "New Announcement" button. Theannouncementsfeature must be enabled via Feature Flags for the page to be accessible.
TC-ADM-ANN-001 — Announcements Sidebar Link and Picker Page
| Field | Detail |
|---|---|
| Priority | High |
| URL | https://uat.events-admin.cardgit.com/announcements |
Steps:
- Log in as
sarah@techcorp.io. - Locate the Announcements link in the admin sidebar.
- Click it.
Expected Results:
- Sidebar contains a link to
/announcements. - Clicking navigates to
/announcements. - Page heading "Announcements" is visible.
- Subtitle: "Choose an event" (or similar).
- An event picker dropdown button is shown.
- A "View Announcements" button is present (disabled until an event is selected).
TC-ADM-ANN-002 — Announcements Picker — Event Dropdown and Search
Steps:
- On
/announcements, click the event picker dropdown. - Type
zzz_no_matchin the search input. - Clear the search and type a real event name.
Expected Results:
- Dropdown opens with a search input (
placeholdercontains "Search events"). - Typing
zzz_no_matchshows a "No events match" empty state. - Typing a valid name filters to matching events.
- Selecting an event enables the "View Announcements" button.
TC-ADM-ANN-003 — Announcements Picker — Navigate to Event Page
Steps:
- Select an event from the picker dropdown.
- Click "View Announcements".
Expected Results:
- Browser navigates to
/events/<event-id>/announcements. - The event's announcements page loads.
TC-ADM-ANN-004 — Announcements Per-Event Page Loads
| Field | Detail |
|---|---|
| URL | https://uat.events-admin.cardgit.com/events/<event-id>/announcements |
| Precondition | Logged in as owner or admin of the event |
Steps:
- Navigate to
/events/<event-id>/announcements.
Expected Results:
- A gradient banner (violet → purple → indigo) is shown with heading "Announcements".
- Event title is shown below the heading.
- Subtitle: "Broadcast messages to all event attendees".
- A "New Announcement" button is in the banner.
- A "← Back to event" link is at the top.
- If no announcements exist: empty state with Megaphone icon and message "No announcements yet".
- If announcements exist: a list of announcement cards is shown.
TC-ADM-ANN-005 — Compose Form Opens
Steps:
- On
/events/<event-id>/announcements, click "New Announcement".
Expected Results:
- A compose form panel appears above the list.
- Form header: "Compose Announcement" with subtitle "Sent to all confirmed registrants".
- A × close button is in the form header.
- The following fields are visible:
- ⚡ Quick Templates strip with 6 buttons: Room Change, Session Soon, Welcome, Break Time, WiFi Details, Directions.
- Title text input (required,
placeholder"e.g. Room change notice"). - Message Markdown editor textarea (
placeholder"Markdown supported…"). - Priority select: Low, Normal, High, Critical.
- Type select: General, Urgent, Sponsor.
- Send via channel checkboxes: Email and In-App (both checked by default).
- Cancel button and "Send to All Attendees" primary button.
- Push channel is not present.
TC-ADM-ANN-006 — Quick Templates Auto-Fill Form
Steps:
- Open the compose form.
- Click the "Room Change" quick template button.
Expected Results:
- Title field is filled: "Room Change Notice".
- Message field is filled with a pre-written room change template (contains
**Important:**). - Priority is set to "High".
- Type is set to "Urgent".
- All fields are editable after the template is applied.
TC-ADM-ANN-007 — All 6 Quick Templates Work
Steps:
- Open the compose form.
- Click each of the 6 template buttons in turn: Room Change, Session Soon, Welcome, Break Time, WiFi Details, Directions.
Expected Results:
- Each click fills the Title and Message fields with relevant pre-written content.
- Priority and Type update to match the template's preset.
- No errors occur on any template click.
TC-ADM-ANN-008 — Send Via Channel Toggles
Steps:
- Open the compose form.
- Uncheck Email by clicking its label.
- Observe.
- Re-check Email and uncheck In-App.
Expected Results:
- Unchecked channel: label/border loses the violet highlight, checkbox is unchecked.
- Both channels can be individually toggled.
- Both channels can be selected simultaneously (default state).
- At least one channel must remain selectable (no hard minimum enforced by UI, but both are valid selections).
TC-ADM-ANN-009 — Validation — Empty Title or Content Blocks Send
Steps:
- Open the compose form.
- Leave Title empty, fill in Message.
- Click "Send to All Attendees".
- Then fill Title but clear Message.
- Click "Send to All Attendees".
Expected Results:
- Empty Title: toast error "Title and content are required". No announcement is created.
- Empty Message: same error. No announcement is created.
TC-ADM-ANN-010 — Send an Announcement Successfully
| Field | Detail |
|---|---|
| Priority | Critical |
| Precondition | Event has at least one approved/confirmed registrant |
Steps:
- Open the compose form.
- Fill in Title: "QA Test — Lunch Break at 12:30".
- Fill in Message: "Important: Lunch is served in Hall B. See you there!".
- Set Priority to High.
- Set Type to General.
- Ensure both Email and In-App channels are checked.
- Click "Send to All Attendees".
- Wait for the response.
Expected Results:
- "Send to All Attendees" button shows "Sending…" while in flight.
- API call
POST /api/v1/notifications/announcementsis made with{ title, content, priority, announcementType, channels, eventId }. - Toast: "Announcement sent!".
- Compose form closes and resets.
- New announcement appears at the top of the list with:
- A "Sent" (green) status badge.
- Correct priority colour (amber for High).
- Correct delivery channel badges (Email + In-App).
- Sent timestamp.
TC-ADM-ANN-011 — Announcement List Card Layout
Steps:
- On a page with at least one sent announcement, inspect a list card.
Expected Results:
- Card has a coloured left border matching the priority (blue = Normal, amber = High, red = Critical, grey = Low).
- Priority pill badge shown with icon (ⓘ Normal, ⚠ High, ⚠ Critical, ↓ Low).
- Announcement type label shown (general / urgent / sponsor).
- Delivery channel badges shown (Email, In-App).
- Announcement title is shown in bold.
- A one-line content preview is shown (markdown stripped).
- Right side shows: status badge (Sent/Scheduled), timestamp, and view count (if > 0).
TC-ADM-ANN-012 — Click Announcement Card Opens Right Panel
Steps:
- Click on any announcement card in the list.
Expected Results:
- A right-side detail panel opens (380px wide on desktop).
- Panel has a priority-coloured top bar.
- Panel header shows: priority badge, type label, and announcement title.
- Panel body renders the message as formatted HTML (Markdown rendered — bold, lists, etc.).
- Panel footer shows:
- Delivery row with channel badges.
- Status row: "Sent" with timestamp, OR "Scheduled" with date, OR "Created" date.
- Views row (if view count > 0).
- A × close button is in the panel header.
TC-ADM-ANN-013 — Right Panel Closes on × Click
Steps:
- Open the detail panel (TC-ADM-ANN-012).
- Click the × button in the panel header.
Expected Results:
- Panel closes.
- The announcement list returns to full width.
- Clicking the same card again reopens the panel (toggle behaviour).
TC-ADM-ANN-014 — Priority Levels Display Correctly
Steps:
- Create announcements with each of the 4 priority levels: Low, Normal, High, Critical.
- Observe the list cards.
Expected Results:
| Priority | Left border | Pill background | Icon |
|---|---|---|---|
| Critical | Red | Red | ⚠ AlertTriangle |
| High | Amber | Amber | ⚠ AlertCircle |
| Normal | Blue | Blue | ℹ Info |
| Low | Grey | Grey | ↓ ChevronDown |
TC-ADM-ANN-015 — Markdown Rendering in Detail Panel
Steps:
- Send an announcement with markdown:
**Bold text** and _italic_\n\n- Item 1\n- Item 2. - Open its detail panel.
Expected Results:
- "Bold text" is rendered as
<strong>. - "italic" is rendered as
<em>. - Bullet list items render as
<li>elements. - Raw markdown syntax (
**,_,-) is not visible.
TC-ADM-ANN-016 — Cross-Org View-Only Banner (Platform Admin)
| Field | Detail |
|---|---|
| Precondition | Logged in as admin@cardgit.com viewing an event owned by a different org |
Steps:
- Navigate to
/events/<cross-org-event-id>/announcements. - Observe the page.
Expected Results:
- An amber "View Only — Different Organization" banner is shown.
- Banner text: "You can view but cannot send announcements for this event."
- The "New Announcement" button is locked (shows a 🔒 icon and is disabled).
- Existing announcements are visible (read-only).
TC-ADM-ANN-017 — Compose Form Closes Without Sending
Steps:
- Open the compose form.
- Fill in Title and Message.
- Click Cancel (not "Send to All Attendees").
Expected Results:
- Form closes.
- No announcement is created.
- The form fields are reset (Title and Message are cleared).
TC-ADM-ANN-018 — Compose Form × Button Closes Form
Steps:
- Open the compose form.
- Click the × button in the form header.
Expected Results:
- Same as Cancel: form closes, no announcement sent, fields reset.
TC-ADM-ANN-019 — Attendee Receives In-App Notification After Announcement
| Field | Detail |
|---|---|
| Precondition | Attendee is registered; announcement sent with In-App channel enabled |
Steps:
- As admin, send an announcement with In-App channel enabled.
- Log in as a registered attendee on the frontend.
- Navigate to
https://uat.events.cardgit.com/events/<event-id>. - Observe the notification bell.
Expected Results:
- The notification bell shows an unread badge/count.
- Clicking the bell shows the announcement in the notification list.
- Notification content matches the sent title and message.
TC-ADM-ANN-020 — Attendee Receives Email After Announcement
| Field | Detail |
|---|---|
| Precondition | Announcement sent with Email channel enabled; UAT email intercept sends to dayotareo@gmail.com |
Steps:
- Send an announcement with Email channel enabled.
- Check the email queue:
GET https://uat.api2.cardgit.com/api/v1/email-queue?emailType=announcement-email.
Expected Results:
- An
announcement-emailrow appears in the email queue. - Status is
pending,processing, orsent. - Subject contains the announcement title.
toAddressmatches the registrant's email (or the UAT intercept address).
TC-ADM-ANN-021 — Non-Owner Role Cannot Access Announcements Page
| Field | Detail |
|---|---|
| Precondition | Logged in as event-moderator@test.com (moderator role) |
Steps:
- Navigate directly to
/events/<event-id>/announcements.
Expected Results:
- Access is denied.
- User is redirected to
/events(theNavigate to="/events"redirect fires for non-owner/non-admin roles). - Announcements page content is not shown.
33. Module 31 — Admin — Analytics & Reports
TC-ADM-ANL-001 — Analytics Landing Page
Steps:
- Navigate to
/analytics.
Expected Results:
- Analytics landing page loads with a list of events to drill into.
TC-ADM-ANL-002 — Event Analytics Dashboard
Steps:
- Click on an event from the analytics landing.
- Navigate to
/analytics/<event-id>.
Expected Results:
- Dashboard shows key metrics: total registrations, check-ins, active users, page views.
- Charts / graphs are rendered without error.
- Data matches known test data.
TC-ADM-ANL-003 — Activity Feed
Steps:
- Navigate to
/events/<event-id>/activity.
Expected Results:
- Real-time activity feed shows recent platform actions (registrations, logins, votes, posts).
- Feed updates without page refresh.
TC-ADM-ANL-004 — Analytics Deep Dive
Steps:
- Navigate to
/events/<event-id>/analytics/deep.
Expected Results:
- Extended analytics view with charts for engagement over time, feature usage, and session popularity.
34. Module 32 — Admin — Sponsors Management
TC-ADM-SPON-001 — View Sponsors for an Event
Steps:
- Navigate to
/sponsors/<event-id>.
Expected Results:
- List of sponsors with name, tier, logo, and status.
- "Add Sponsor" button is visible.
TC-ADM-SPON-002 — Add a Sponsor
Steps:
- Click "Add Sponsor".
- Fill in: Name, Website, Tier (Gold), Description.
- Upload a logo.
- Save.
Expected Results:
- Sponsor appears in the event's sponsor list.
- Sponsor logo and details are shown on the attendee-facing sponsors page.
35. Module 33 — Admin — Team Management
TC-ADM-TEAM-001 — View Event Team
Steps:
- Navigate to
/events/<event-id>/team.
Expected Results:
- Table of team members with columns: Host, Role, Status, Joined, Actions.
- Creator is indicated with a "Creator" badge.
- No "Invalid Date" entries in the Joined column.
TC-ADM-TEAM-002 — Invite a Team Member
Steps:
- Click "Invite Host".
- Enter an email for an existing account.
- Select a role (e.g., Moderator).
- Click "Send Invitation".
Expected Results:
- Invitation is sent.
- Invited user receives an email with an acceptance link.
- Pending invitation appears in the team table.
TC-ADM-TEAM-003 — Invite with Unknown Email
Steps:
- Click "Invite Host".
- Enter an email that is NOT registered:
nobody@nonexistent.test - Click "Send Invitation".
Expected Results:
- Error message: "No account found" or "User must already have an account".
- No invitation is sent.
TC-ADM-TEAM-004 — Accept Invitation
Steps:
- Navigate to
/invitations/<event-id>/accept(as the invited user).
Expected Results:
- Page shows "Co-host Invitation" heading.
- Event title is shown (not a loading spinner).
- Accept / Decline buttons are present.
- Accepting adds the user to the event team.
TC-ADM-TEAM-005 — Invalid Invitation Link
Steps:
- Navigate to
/invitations/00000000-0000-0000-0000-000000000000/accept.
Expected Results:
- Error message: "Something went wrong" or "Invitation not found".
36. Module 34 — Admin — Speed Networking (Admin)
TC-ADM-SN-001 — Speed Networking Admin Page Loads
Steps:
- Navigate to
/events/<event-id>/speed-networkingin the admin app.
Expected Results:
- Page loads with heading "Speed Networking Session Manager".
- "New Session" button is visible.
- "Refresh" button is visible.
- Session list or empty state ("No sessions yet") is shown.
TC-ADM-SN-002 — Create a Speed Networking Session
Steps:
- Click "New Session".
- In the form, fill in:
- Session Name:
Morning Mixer - Start Time:
2027-01-15 09:00 - End Time:
2027-01-15 10:00 - Round Duration: Select
5 minutes - Pairing Algorithm:
Random
- Session Name:
- Click "Create Session".
Expected Results:
- Session is created and appears in the session list.
- Session card shows name, status badge (DRAFT), round duration, and registered count.
TC-ADM-SN-003 — Validate Empty Session Name
Steps:
- Click "New Session".
- Leave Session Name empty.
- Observe the "Create Session" button.
Expected Results:
- "Create Session" button is disabled while name is empty.
- No form submission occurs.
TC-ADM-SN-004 — Interest-Based Pairing Hint
Steps:
- Click "New Session".
- In the Pairing Algorithm select, choose "Interest-based".
Expected Results:
- Informational hint text appears below the select: "Interest-based pairing uses…" or similar.
TC-ADM-SN-005 — Start a Draft Session
Steps:
- Find a session with DRAFT status and at least 2 registered participants.
- Click "Start Session".
Expected Results:
- Session status changes to ACTIVE.
- "Next Round" and "End" buttons become visible.
- Attendees on the frontend see the session is live.
TC-ADM-SN-006 — End an Active Session
Steps:
- Find an ACTIVE session.
- Click "End".
- Confirm.
Expected Results:
- Session status changes to COMPLETED.
- "Results" button becomes visible.
TC-ADM-SN-007 — View Session Results
Steps:
- Find a COMPLETED session.
- Click "Results".
Expected Results:
- Inline stats panel expands showing: Rounds count, Meetings made, Match rate.
- Clicking "Results" again collapses the panel.
37. Module 35 — Admin — Certificates Management
TC-ADM-CERT-001 — View Certificate Settings
Steps:
- Navigate to
/events/<event-id>/certificates.
Expected Results:
- Certificate configuration page loads.
- Template preview or customisation options are visible.
TC-ADM-CERT-002 — Attendance Card Template Editor — Page Structure
Context: The admin attendance card page at
/events/:eventId/attendance-cardlets the organiser choose from 50+ card templates across 8 categories: Classic (4 portrait + 2 square), Modern (5 portrait + 5 square), Bold (4 portrait + 4 square), Elegant (4 portrait + 3 square), Tech (4 portrait + 2 square), Festive (2 portrait + 3 square), Professional (3 portrait + 2 square), Creative (3 portrait + 2 square), Artistic (3 portrait + 3 square). Square templates have a 1:1 aspect ratio. All templates share the same primary and secondary colour set on the event. The selected template ID is saved toevents.attendanceCardTemplateviaPUT /events/:eventId. The same painters (from@cardgit-events/shared) are used for both the admin mini-preview and the 1080×1080 canvas generated for attendees.
| Field | Detail |
|---|---|
| Priority | High |
| URL | https://uat.events-admin.cardgit.com/events/<event-id>/attendance-card |
Steps:
- Navigate to
/events/<event-id>/attendance-card.
Expected Results:
- Page heading "Attendance Card" with a sparkles icon is shown.
- Subtitle: "Choose the design attendees will see when they share their card".
- A back arrow link returns to the event detail page.
- An Active template banner shows the currently saved template name (e.g. "Active template: Wave") with a Preview button.
- The Event Colours panel is visible with Primary and Secondary colour pickers.
- A colour info note explains both colours are used across all card designs.
- Category filter pills are shown: All, Classic, Modern, Bold, Elegant, Tech, Festive, Professional, Creative, Artistic — each with a template count badge.
- Template grid renders with mini-preview cards.
- A Save button is in the top-right (disabled until changes are made).
TC-ADM-CERT-003 — Attendance Card Template Categories Filter
Steps:
- Click the Classic category pill.
- Observe the grid.
- Click Modern, then Artistic, then All.
Expected Results:
- Clicking a category filters the grid to show only templates in that category.
- The active category pill is highlighted.
- Each template card shows: mini preview, template name, category badge.
- Clicking All restores the full grid (50+ templates).
- Square aspect templates show a square-shaped preview (not portrait).
TC-ADM-CERT-004 — Attendance Card Template Selection
Steps:
- Click on any template card (e.g. "Tech — Circuit").
- Observe the Save button.
Expected Results:
- The selected template card shows a highlighted border and a check icon.
- The Save button becomes enabled.
- An "Unsaved changes" amber badge appears in the header.
TC-ADM-CERT-005 — Per-Template Preview Modal
Steps:
- Hover over any template card.
- Click the Preview (eye icon) button that appears on hover.
Expected Results:
- A full-screen modal opens showing a large preview of the template.
- The preview uses the current event title, date, venue, and live colour values.
- Modal has a close (✕) button and a backdrop click dismiss.
- A "Use This Template" button is shown — clicking it selects the template and closes the modal.
- A "Cancel" button closes the modal without selecting.
TC-ADM-CERT-006 — Active Template Preview Button
Steps:
- On the page, click the Preview button in the active template banner (top of page).
Expected Results:
- Preview modal opens for the currently saved template.
- Same behaviour as TC-ADM-CERT-005.
TC-ADM-CERT-007 — Colour Pickers Update Previews in Real Time
Steps:
- Click the primary colour swatch (or use the hex input).
- Change it to
#e11d48(red). - Observe all mini-preview cards and the active template banner.
Expected Results:
- All mini-preview cards immediately re-render using the new primary colour.
- The active template banner preview also updates.
- The Save button becomes enabled and "Unsaved changes" badge appears.
TC-ADM-CERT-008 — Hex Input Colour Entry
Steps:
- Click the hex text field next to the primary colour picker.
- Type a valid hex value:
#10b981. - Tab away or click elsewhere.
Expected Results:
- The colour picker updates to the entered hex value.
- Template previews update in real time as the hex is typed (on valid 6-char hex).
- Invalid partial values (e.g.
#10b) do not break the UI or clear the field.
TC-ADM-CERT-009 — Save Template and Colours
Steps:
- Select a new template (e.g. "Elegant — Gold").
- Change the primary colour.
- Click Save.
Expected Results:
- Button shows "Saving…" while the request is in flight.
- API call
PUT /api/v1/events/<id>is made with{ attendanceCardTemplate: "elegant-gold", colorTheme: { primary: "...", secondary: "..." } }. - Toast: "Attendance card saved!".
- "Unsaved changes" badge disappears.
- Save button returns to disabled.
- Active template banner updates to show the new template name.
TC-ADM-CERT-010 — Unsaved Changes Guard
Steps:
- Select a different template.
- Navigate away using the back arrow without saving.
- Return to
/events/<event-id>/attendance-card.
Expected Results:
- The saved template (from before the unsaved change) is shown as active.
- The unsaved selection is not persisted.
TC-ADM-CERT-011 — Template Persists After Page Reload
Steps:
- Save a template (TC-ADM-CERT-009).
- Reload the page.
Expected Results:
- The same template is pre-selected and shown as active on reload.
- The saved colour values are restored in the colour pickers.
TC-ADM-CERT-012 — Attendee Share Attendance Card Modal — Structure
| Field | Detail |
|---|---|
| Precondition | User is registered for the event; admin has saved a template |
| Triggered from | Event detail page, registration success page, payment success page |
Steps:
- Log in as a registered attendee.
- Navigate to the event detail page.
- Click "Share Attendance Card".
Expected Results:
- A modal dialog opens (
role="dialog",aria-modal="true"). - Modal header: "Share Your Attendance" with subtitle "Download your personalised card and post it on social media".
- A close (✕) button is visible.
- A card preview area shows a loading spinner initially ("Generating your card…").
- After generation (< 5 seconds): a 260×260 px square image of the card is displayed.
- Card contains: attendee's name, event title, event date, venue, and the chosen template design.
- Three action buttons: Download Card (primary, indigo), Share (secondary, white border), Regenerate (text link).
TC-ADM-CERT-013 — Attendance Card Canvas — Content Accuracy
Steps:
- Open the attendance card modal (TC-ADM-CERT-012).
- Inspect the generated card image.
Expected Results:
- Attendee name matches the logged-in user's
firstName + lastName. - Event title matches the event name.
- Date is formatted as e.g. "Thu, 15 Jan 2027".
- Venue shows
venueName, venueCity, venueCountry(or "Online / Virtual" for virtual events). - Template design matches what was saved in admin.
- Primary/secondary colours match the event's saved colour theme.
TC-ADM-CERT-014 — Attendance Card Download
Steps:
- Open the attendance card modal.
- Wait for generation to complete.
- Click "Download Card".
Expected Results:
- A PNG file downloads named
attending-<event-slug>.png. - The file is a 1080×1080 px square PNG (the canvas is
CARD_CANVAS_SIZE = 1080). - Toast: "Social card downloaded!".
- The "Download Card" button is disabled while the card is generating.
TC-ADM-CERT-015 — Attendance Card Share Button
Steps:
- Open the card modal.
- Click "Share".
Expected Results:
- If the browser supports the Web Share API (
navigator.canShare): the native OS share sheet opens with the card PNG attached, title "I'm attending!", and text including "🎉". - If Web Share is not supported (desktop Chrome): falls back to downloading the file and shows a toast: "Web Share not supported — image downloaded instead."
- The "Share" button is disabled while generating.
TC-ADM-CERT-016 — Attendance Card Regenerate Button
Steps:
- Open the card modal.
- Click "Regenerate".
Expected Results:
- Loading spinner appears on the button.
- Card is re-generated from scratch.
- New image replaces the previous one.
- Regenerate button is disabled while generating.
TC-ADM-CERT-017 — Attendance Card Generation Error State
Steps:
- Open the card modal in an environment where image loading may fail (e.g. avatar or logo URL is broken).
- Observe if an error occurs.
Expected Results:
- If generation fails: an error state is shown with an image icon, "Could not generate image" message, and a "Try again" link.
- Clicking "Try again" re-triggers generation.
- The Download and Share buttons remain disabled in error state.
TC-ADM-CERT-018 — Attendance Card for User Without Avatar
Steps:
- Log in as a user with no profile avatar set.
- Open the attendance card modal.
Expected Results:
- Card generates successfully without crashing.
- The avatar area uses a fallback placeholder (initials, default icon, or colour block) consistent with the chosen template.
TC-ADM-CERT-019 — Attendance Card Not Shown on Registration Page When Approval Required
| Field | Detail |
|---|---|
| Context | EventRegisterPage only shows the "Share Attendance Card" button when event.requiresApproval === false |
Steps:
- Navigate to the registration page for an event with Requires Approval enabled.
- Complete registration.
- Observe the post-registration state.
Expected Results:
- The "Share Attendance Card" button is not shown after registration (attendee is pending approval, not yet confirmed).
- For events with
requiresApproval: false, the button is shown after registration.
TC-ADM-CERT-020 — Attendance Card Appears on Payment Success Page
Steps:
- Complete a paid registration (TC-REG-002).
- On the
/events/<event-id>/payment/successpage.
Expected Results:
- "Share Attendance Card" button is visible.
- Clicking it opens the generator modal.
- The card uses the event's saved template and the attendee's name.
TC-ADM-CERT-021 — Attendance Card Template in Event Detail Quick-Action
| Field | Detail |
|---|---|
| URL | Admin event detail page |
Steps:
- Navigate to
/events/<event-id>in the admin app. - Locate the quick-action grid or tiles.
Expected Results:
- An "Attendance Card" tile/link is visible in the event quick-actions.
- Clicking it navigates to
/events/<event-id>/attendance-card.
38. Module 36 — Admin — Data Exports
TC-ADM-EXP-001 — Export Registrations
Steps:
- Navigate to
/exportsor/events/<event-id>/exports. - Select export type: "Registrations".
- Choose format: CSV.
- Click "Export".
Expected Results:
- CSV file is downloaded.
- File contains expected columns: Name, Email, Ticket Type, Status, Check-in, Registration Date.
- Data matches what is shown in the admin registrations table.
TC-ADM-EXP-002 — Export Attendees
Steps:
- Select export type: "Attendees" (checked-in attendees).
- Export as CSV.
Expected Results:
- File downloads with attendee data.
- Check-in timestamps are present.
39. Module 37 — Platform Admin — Dashboard & Health
TC-PLT-DASH-001 — Platform Dashboard Loads
Precondition: Logged in as admin@cardgit.com
Steps:
- Navigate to
/platform/dashboardor/platform.
Expected Results:
- Platform dashboard loads with system-wide metrics: total events, total users, total organisations, active sessions.
- Charts and stat cards are rendered.
TC-PLT-DASH-002 — System Health Page
Steps:
- Navigate to
/platform/health.
Expected Results:
- System health page loads.
- Status indicators for all services (database, Redis, email queue, storage) are shown.
- Each service shows "Healthy" / "Degraded" / "Down" status.
TC-PLT-DASH-003 — Error Logs
Steps:
- Navigate to
/platform/error-logs.
Expected Results:
- Error log viewer loads.
- Log entries are shown with timestamp, severity, and message.
- Filtering by date/severity works.
TC-PLT-DASH-004 — Jobs Queue
Steps:
- Navigate to
/platform/jobs.
Expected Results:
- Jobs dashboard loads showing queue names and counts (waiting, active, completed, failed).
- Click on a queue name.
- Navigate to
/platform/jobs/<queue>.
Expected Results:
- Detailed view of the selected queue with individual job entries.
40. Module 38 — Platform Admin — Feature Flags
Context: The Feature Flags page at
/platform/feature-flagshas two tabs:
- Platform Flags — global platform-level toggles stored in the
feature_flagstable. Each flag has a key, name, description, enabled state, optional rollout percentage, and optional target audience. The API isGET/PUT /platform/feature-flags.- Event Features — global defaults for the 23 per-event feature toggles (networking, matchmaking, socialWall, qna, polls, groupChat, schedule, speakers, sponsors, announcements, surveys, gallery, highlights, gamification, challenges, certificates, speedNetworking, meetings, qaModeration, socialWallModeration, waitlist, showSponsorsOnRegistration). Stored as a special
event_feature_defaultsrow. The API isGET/PUT /platform/event-feature-defaults.The public endpoint
GET /api/v1/flags(no auth required) exposes both platform flags and event feature defaults to the frontend. TheFeatureGatecomponent in the frontend reads this on every gated route — if a feature is disabled at the platform level, navigating to that route redirects to the event detail page.
TC-PLT-FLAG-001 — Feature Flags Page Loads with Two Tabs
| Field | Detail |
|---|---|
| Priority | Critical |
| URL | https://uat.events-admin.cardgit.com/platform/feature-flags |
| Role | Platform Admin only |
Steps:
- Log in as
admin@cardgit.com. - Navigate to
/platform/feature-flags.
Expected Results:
- Page heading "Feature Flags" is visible.
- Two tabs are shown: Platform Flags and Event Features.
- Platform Flags tab is active by default.
- Flag list loads (or a loading spinner then the list).
- Each platform flag shows: name, key (monospaced badge), description, enabled/disabled toggle, last-updated timestamp.
- A total count is shown: "X enabled · Y disabled · Z total".
- A Refresh button is visible.
- A Search input is visible.
TC-PLT-FLAG-002 — Platform Flags Tab — Search
Steps:
- On the Platform Flags tab, type
paymentin the search bar.
Expected Results:
- Only flags whose key, name, or description contains "payment" are shown.
- Other flags are hidden.
- Clearing the search restores all flags.
- If no flags match, a "No flags match your search" empty state appears.
TC-PLT-FLAG-003 — Platform Flags Tab — Toggle a Flag On/Off
Steps:
- Note the current state of the
event_paymentflag (or any platform flag). - Click its toggle button.
- Wait 1 second for the save to complete.
- Observe the toast notification and the toggle state.
- Reload the page.
- Toggle the flag back to its original state.
Expected Results:
- Toggle changes immediately (optimistic update).
- API call
PUT /platform/feature-flags/<id>is made with{ "enabled": <new state> }. - Toast confirms:
"<Flag Name>" enabledor"<Flag Name>" disabled. - After page reload, the flag's state matches what was saved.
- Toggling back restores the original state.
TC-PLT-FLAG-004 — Platform Flag with Rollout Percentage Badge
Steps:
- If a flag exists with a rollout percentage < 100%, observe its card.
Expected Results:
- An amber badge shows the rollout percentage (e.g. "50% rollout").
- The badge is visible alongside the flag name and key.
TC-PLT-FLAG-005 — Platform Flag with Target Audience Badge
Steps:
- If a flag has a
targetAudiencevalue set, observe its card.
Expected Results:
- A sky-blue badge shows the target audience label.
TC-PLT-FLAG-006 — Event Features Tab Loads
Steps:
- Click the Event Features tab.
Expected Results:
- Tab content loads showing 6 category tabs: Engagement, Content, Gamification, Networking Tools, Moderation, Registration.
- Engagement tab is shown by default.
- An amber info banner explains: "Global event feature control — disabling a feature hides it from attendees everywhere on the platform."
- A summary count shows "X of 23 features enabled globally".
- A Last updated timestamp is shown.
TC-PLT-FLAG-007 — Event Features Tab — All 6 Category Tabs Load
Steps:
- On the Event Features tab, click through each category tab:
- Engagement, Content, Gamification, Networking Tools, Moderation, Registration.
Expected Results:
Each tab loads without error. Verify the correct features appear per category:
| Category | Features |
|---|---|
| Engagement | Networking, Messages, Matchmaking, Social Wall, Q&A, Live Polls, Group Chat |
| Content | Schedule, Speakers, Sponsors, Announcements, Surveys, Photo Gallery, Highlights |
| Gamification | Gamification, Challenges, Certificates |
| Networking Tools | Speed Networking, Meetings |
| Moderation | Q&A Moderation, Social Wall Moderation |
| Registration | Waitlist, Sponsors on Registration |
Each feature card shows: feature label, key (monospace badge), description, and an enabled/disabled toggle. Category tab pills show a count badge (e.g. "7/7").
TC-PLT-FLAG-008 — Toggle an Event Feature Default Off
| Field | Detail |
|---|---|
| Priority | Critical |
| Caution | This affects ALL events on the platform — restore immediately after testing |
Steps:
- On the Event Features tab, navigate to the Content category.
- Find the Photo Gallery feature (key:
gallery) — note its current state (should be enabled). - Click its toggle to disable it.
- Wait for the save confirmation.
- Observe the toast.
Expected Results:
- Toggle switches to disabled state immediately.
- API call
PUT /platform/event-feature-defaultsis made with{ "key": "gallery", "enabled": false }. - Toast confirms:
"Photo Gallery" disabled. - The Last updated timestamp updates.
- Category tab badge decrements (e.g. "13/14" → "13/14").
TC-PLT-FLAG-009 — Disabled Event Feature Gates Frontend Route
| Field | Detail |
|---|---|
| Priority | Critical |
| Precondition | gallery feature was disabled in TC-PLT-FLAG-008 |
Steps:
- As an attendee, navigate to
https://uat.events.cardgit.com/events/<event-id>/gallery.
Expected Results:
- User is not shown the Photo Gallery page.
FeatureGateredirects to/events/<event-id>(the event detail page).- No error is shown — it's a silent redirect.
TC-PLT-FLAG-010 — Re-enable Event Feature Default
| Field | Detail |
|---|---|
| Priority | Critical |
| Must run after TC-PLT-FLAG-008 and TC-PLT-FLAG-009 |
Steps:
- Return to
/platform/feature-flags→ Event Features tab → Content. - Toggle Photo Gallery back on.
- Verify the toast.
- Re-navigate to the gallery URL from TC-PLT-FLAG-009.
Expected Results:
- Feature re-enabled. Toast confirms:
"Photo Gallery" enabled. - Frontend gallery page now loads correctly (no longer redirects).
- Category badge restores to previous count.
TC-PLT-FLAG-011 — Public /api/v1/flags Endpoint
| Field | Detail |
|---|---|
| Priority | High |
| Auth | None required — public endpoint |
Steps:
- Send
GET https://uat.api2.cardgit.com/api/v1/flagswith noAuthorizationheader.
Expected Results:
- HTTP 200.
- Response shape:
{ "status": "success", "data": { "flags": { ... }, "eventFeatureDefaults": { ... } } }. flagsobject contains platform-level flag keys with boolean values (e.g.{ "event_payment": true, "speed_networking": true }).eventFeatureDefaultsobject contains event feature keys with boolean values (e.g.{ "networking": true, "gallery": true, ... }).- Response time < 2 seconds.
TC-PLT-FLAG-012 — event_payment Platform Flag — Disabling Hides Paid Tickets
| Field | Detail |
|---|---|
| Priority | High |
| Caution | Restore immediately after testing |
Steps:
- On the Platform Flags tab, find and disable the
event_paymentflag. - Navigate to
https://uat.events.cardgit.com/events/<paid-event-id>/register. - Observe the ticket selection.
- Re-enable
event_paymentafter the test.
Expected Results:
- With
event_paymentdisabled: only free ticket types are shown; paid tickets are hidden from the registration page. - With
event_paymentre-enabled: paid tickets reappear.
TC-PLT-FLAG-013 — Organiser Cannot Access Feature Flags Page
Steps:
- Log in as
sarah@techcorp.io(Organiser). - Navigate to
https://uat.events-admin.cardgit.com/platform/feature-flags.
Expected Results:
- Access denied — user is redirected away.
- Feature Flags page content is not displayed.
TC-PLT-FLAG-014 — Per-Event Feature Override (Event-Level Toggle)
Context: An organiser can also disable features per-event via the event edit page. This overrides the platform default at the event level — both checks must pass in
FeatureGate.
| Field | Detail |
|---|---|
| Priority | High |
| URL | Admin event edit → Features step |
Steps:
- Log in as Organiser. Navigate to
/events/<event-id>/edit. - Go to the Features step of the edit wizard.
- Toggle Social Wall off for this specific event.
- Save.
- Navigate to
https://uat.events.cardgit.com/events/<event-id>/social.
Expected Results:
- The event-level
featuresEnabled.socialWallis saved asfalse. - Navigating to
/events/<event-id>/socialredirects to/events/<event-id>(FeatureGate blocks it). - Other events with Social Wall enabled are unaffected.
- Re-enabling Social Wall for this event restores access.
TC-PLT-FLAG-015 — Event Features Refresh Button
Steps:
- On the Event Features tab, click the Refresh button.
Expected Results:
- Loading spinner appears briefly on the Refresh button.
- Feature states reload from the backend.
- No error toast appears.
41. Module 39 — Platform Admin — User Management
TC-PLT-USR-001 — Platform Users List
Steps:
- Navigate to
/platform/usersor/platform/all-users.
Expected Results:
- Full list of all users across all organisations is shown.
- Columns: Name, Email, Role, Organisation, Status, Created.
- Search and filter controls are functional.
TC-PLT-USR-002 — Search for a User
Steps:
- On the users page, type
marcusin the search bar.
Expected Results:
- Results filter to show Marcus Johnson's entry.
- Other users are hidden.
TC-PLT-USR-003 — Change User Role
Steps:
- Click on a user record.
- Change their role (e.g., from Attendee to Organiser).
- Save.
Expected Results:
- Role is updated.
- The user's access changes on their next login.
42. Module 40 — Platform Admin — Organizations
TC-PLT-ORG-001 — Organizations List
Steps:
- Navigate to
/platform/organizations.
Expected Results:
- List of all registered organisations.
- Each entry shows: org name, owner, event count, member count, plan/tier.
TC-PLT-ORG-002 — Organization Detail
Steps:
- Click on an organisation.
Expected Results:
- Detail view shows org settings, members, and events belonging to the org.
43. Module 41 — Platform Admin — Event Reports & Suspension
TC-PLT-REP-001 — Event Reports Page
Steps:
- Navigate to
/platform/reports.
Expected Results:
- Page heading: "Event Reports".
- Report summary stats (Total, Pending, etc.) are visible.
- Reported events are listed.
TC-PLT-REP-002 — Review a Report
Steps:
- Click on a reported event row.
- Observe the detail panel.
Expected Results:
- Report details are shown: reporter, reason, date.
- "Suspend Event" and "Dismiss" action buttons are visible.
- "Mark Reviewed" button does NOT appear (removed from UI).
TC-PLT-REP-003 — Suspend an Event
Steps:
- On a pending report, click "Suspend Event".
- Confirm the action.
Expected Results:
- Event status changes to "Suspended".
- Event is no longer visible to attendees.
- Event appears in
/platform/suspended.
TC-PLT-SUSP-001 — Suspended Events Page
Steps:
- Navigate to
/platform/suspended.
Expected Results:
- Page heading: "Suspended Events".
- Filter tabs "Active" and "All" are visible and functional.
- Switching filters does not cause errors.
44. Module 42 — Platform Admin — Email Queue
TC-PLT-EMAIL-001 — Email Queue Page
Steps:
- Navigate to
/email-queueor/platform→ Email Queue.
Expected Results:
- Email queue dashboard loads.
- Queued, sent, and failed email counts are shown.
- Individual email entries can be expanded to view content.
45. Module 43 — API Health & Security
TC-API-001 — Health Check Endpoint
Steps:
- Send
GET https://uat.api2.cardgit.com/health.
Expected Results:
- HTTP 200 response.
- Response body:
{ "status": "ok" }.
TC-API-002 — API Base Responds
Steps:
- Send
GET https://uat.api2.cardgit.com/api/v1.
Expected Results:
- HTTP status between 200—499 (not 5xx).
- Response is valid JSON.
TC-API-003 — Unauthenticated Access to Protected Endpoint
Steps:
- Send
GET https://uat.api2.cardgit.com/api/v1/eventswithout anAuthorizationheader.
Expected Results:
- HTTP 200 (public events) or HTTP 401.
- Not HTTP 500 or 403.
TC-API-004 — Login Endpoint — Valid Credentials
Steps:
- Send
POST https://uat.api2.cardgit.com/api/v1/auth/loginwith body:{ "email": "marcus@designstudio.co", "password": "password123" }
Expected Results:
- HTTP 200.
- Response contains
tokenanduserobject.
TC-API-005 — Login Endpoint — Invalid Credentials
Steps:
- Send
POST https://uat.api2.cardgit.com/api/v1/auth/loginwith wrong credentials.
Expected Results:
- HTTP 401 or 400.
- No token in the response.
TC-API-006 — CORS Headers
Steps:
- Send
GET https://uat.api2.cardgit.com/api/v1/eventswith headerOrigin: https://uat.events.cardgit.com.
Expected Results:
- Response includes
Access-Control-Allow-Originheader. - Value is
https://uat.events.cardgit.comor*.
TC-API-007 — Stripe Webhook Endpoint Reachable
Steps:
- Send
POST https://uat.api2.cardgit.com/api/v1/payments/webhookwith headerstripe-signature: invalidand body{}.
Expected Results:
- HTTP 400 (signature rejected) — not 404.
- Endpoint is reachable.
TC-API-008 — 404 for Unknown Route
Steps:
- Send
GET https://uat.api2.cardgit.com/api/v1/unknown-route-xyz.
Expected Results:
- HTTP 404.
- Response body:
{ "status": "error", "message": "Route ... not found" }.
TC-API-009 — Client Error Reporting Endpoint
Steps:
- Send
POST https://uat.api2.cardgit.com/api/v1/client-errorswith:{ "message": "Test error from QA", "url": "https://uat.events.cardgit.com/" }
Expected Results:
- HTTP 204 (no content).
- Error is logged to
frontend-errors.logon the server.
TC-API-010 — Image Proxy — Disallowed Host
Steps:
- Send
GET https://uat.api2.cardgit.com/api/v1/image-proxy?url=https://evil.example.com/img.jpg.
Expected Results:
- HTTP 403.
- Response body:
{ "error": "host not allowed" }.
46. Module 44 — Responsive Design & Mobile
TC-RESP-001 — Homepage on Mobile (375×667)
Steps:
- Set viewport to 375×667.
- Navigate to
https://uat.events.cardgit.com/.
Expected Results:
- Page renders without horizontal overflow.
- CTA buttons are fully visible and tappable.
- Navigation is accessible via hamburger menu.
TC-RESP-002 — Events Page on Tablet (768×1024)
Steps:
- Set viewport to 768×1024.
- Navigate to
/events.
Expected Results:
- Event cards reflow to a suitable grid (1 or 2 columns).
- No content is clipped.
- Search bar is usable.
TC-RESP-003 — Admin Dashboard on Desktop (1920×1080)
Steps:
- Set viewport to 1920×1080.
- Navigate to the admin dashboard.
Expected Results:
- Full sidebar is visible.
- Dashboard stats use available width effectively.
- No layout breaks.
TC-RESP-004 — Admin Mobile Layout (390×844)
Steps:
- Set viewport to 390×844.
- Navigate to the admin app.
Expected Results:
- Sidebar collapses or becomes a hamburger menu.
- All key actions (Create Event, etc.) remain accessible.
- Forms are full-width and scrollable.
47. Module 45 — Accessibility
TC-ACC-001 — Heading Hierarchy
Steps:
- Navigate to
https://uat.events.cardgit.com/. - Inspect the heading structure.
Expected Results:
- There is exactly one
<h1>on the page. <h2>,<h3>elements follow a logical hierarchy (no skipped levels).
TC-ACC-002 — Form Labels
Steps:
- Navigate to
/login. - Inspect all input elements.
Expected Results:
- All form inputs have associated
<label>elements (visible oraria-label). emailandpasswordinputs have descriptive labels.
TC-ACC-003 — Image Alt Text
Steps:
- Navigate to
https://uat.events.cardgit.com/. - Inspect all
<img>elements.
Expected Results:
- All images have an
altattribute (can be empty string for decorative images, but must be present). - Meaningful images have descriptive alt text.
TC-ACC-004 — Keyboard Navigation
Steps:
- Navigate to
/login. - Press
Tabto move focus through elements.
Expected Results:
- Focus moves in logical order (top to bottom, left to right).
- Every interactive element (inputs, buttons, links) is reachable by keyboard.
- Focus outline is visible on focused elements.
TC-ACC-005 — Button and Link Contrast
Steps:
- Navigate to
https://uat.events.cardgit.com/. - Visually inspect CTA buttons.
Expected Results:
- Text on buttons has sufficient contrast against their background (WCAG AA minimum: 4.5:1 for normal text).
- No "invisible" text (white on white, etc.).
TC-ACC-006 — ARIA Roles
Steps:
- Inspect the admin sidebar navigation.
Expected Results:
- Navigation is wrapped in a
<nav>element or hasrole="navigation". - Interactive widgets (modals, dropdowns) use appropriate ARIA attributes (
role="dialog",aria-modal,aria-expanded).
48. Module 46 — Performance
TC-PERF-001 — Homepage Load Time
Steps:
- Record the start time.
- Navigate to
https://uat.events.cardgit.com/. - Wait for
networkidle. - Record the end time.
Expected Results:
- Total load time < 5 seconds on UAT.
TC-PERF-002 — Events Page Load Time (Authenticated)
Steps:
- Log in.
- Record start time.
- Navigate to
/eventsand wait fornetworkidle.
Expected Results:
- Load time < 5 seconds.
TC-PERF-003 — API Response Time
Steps:
- Send
GET https://uat.api2.cardgit.com/api/v1/events. - Measure response time.
Expected Results:
- Response received within 3 seconds.
TC-PERF-004 — Admin Dashboard Load Time
Steps:
- Log in to admin app.
- Navigate to
/. - Wait for
networkidle.
Expected Results:
- Load time < 5 seconds.
TC-PERF-005 — Web Vitals (LCP, CLS)
Steps:
- Open DevTools Performance panel.
- Load
https://uat.events.cardgit.com/with performance recording. - Review Largest Contentful Paint (LCP) and Cumulative Layout Shift (CLS).
Expected Results:
- LCP < 2.5 seconds (Good threshold).
- CLS < 0.1 (Good threshold).
49. Module 47 — Error Handling & Edge Cases
TC-ERR-001 — Network Offline Handling
Steps:
- Log in and navigate to
/events. - Set the browser context to offline (DevTools → Network → Offline).
- Attempt to navigate to another page.
- Restore network connectivity.
- Navigate again.
Expected Results:
- App shows a meaningful offline error message or cached content.
- App does not crash or show a blank screen.
- After reconnection, the app resumes normally.
TC-ERR-002 — Invalid Event ID
Steps:
- Navigate to
/events/00000000-0000-0000-0000-000000000000.
Expected Results:
- A "Not Found" or "Event not found" message is displayed.
- The app does not crash or display raw error output.
TC-ERR-003 — Expired Auth Token
Steps:
- Log in and store the session token.
- Manually expire or invalidate the token in
localStorage. - Attempt to navigate to a protected page.
Expected Results:
- User is logged out automatically.
- Redirect to
/loginoccurs. - No unhandled error is thrown in the console.
TC-ERR-004 — Malformed API Request
Steps:
- Send
POST https://uat.api2.cardgit.com/api/v1/auth/loginwith malformed JSON body.
Expected Results:
- HTTP 400 Bad Request.
- Response body contains a meaningful error message.
- Server does not return HTTP 500.
TC-ERR-005 — Feature Gate Redirect
Steps:
- Navigate to
/events/<event-id>/pollsfor an event where the polls feature is disabled.
Expected Results:
- User is redirected to
/or shown a "Feature not available" message. - No blank page or crash.
TC-ERR-006 — Concurrent Registrations (Race Condition)
Steps:
- Open two browser tabs with the same user account.
- On both tabs, navigate to the same free event's registration page.
- Click "Register Now" on both tabs simultaneously.
Expected Results:
- Only one registration is created.
- The second attempt receives an appropriate response ("Already registered" or gracefully handled duplicate).
50. Module 48 — Ref Source Counter & Page View Tracking
Context: Every time the public event landing page (
/e/<slug>) is loaded, the frontend firesPOST /api/v1/analytics/events/:eventId/pageviewwith the?ref=query parameter. Validrefvalues are:direct,qr. The admin's Public Event URL Card (on the event detail page) readsGET /analytics/events/:eventId/pageviewsand displays a total page view count plus a per-source breakdown. The same?ref=value is stored assignupRefon the user record when they register via that link.
TC-REF-001 — Public Landing Page Records a Page View
| Field | Detail |
|---|---|
| Priority | High |
| URL | /e/<event-slug> |
| API call | POST /api/v1/analytics/events/:eventId/pageview |
Steps:
- Note the current total page view count for an event (check the Public Event URL Card in admin or query the API).
- In an incognito/private window (or a different browser), navigate to
https://uat.events.cardgit.com/e/<event-slug>. - Return to the admin event detail page.
- Observe the page view counter.
Expected Results:
- The total page view count increments by 1.
- No authentication is required to record a page view.
- The request completes silently (no error shown to the user even if it fails).
TC-REF-002 — Ref Source Captured from URL (Twitter)
| Field | Detail |
|---|---|
| URL | /e/<event-slug>?ref=twitter |
Steps:
- Navigate to
https://uat.events.cardgit.com/e/<event-slug>?ref=twitter. - Wait for the page to load (the page view fires on mount).
- In the admin app, navigate to the event detail page.
- Observe the Public Event URL Card's traffic source breakdown.
Expected Results:
- The "X / Twitter" source counter increments by 1.
- Other source counters remain unchanged.
TC-REF-003 — Ref Source Captured from URL (LinkedIn)
Steps:
- Navigate to
https://uat.events.cardgit.com/e/<event-slug>?ref=linkedin. - Check the Public Event URL Card in admin.
Expected Results:
- "LinkedIn" counter increments by 1.
TC-REF-004 — Ref Source Captured from URL (WhatsApp)
Steps:
- Navigate to
https://uat.events.cardgit.com/e/<event-slug>?ref=whatsapp. - Check the admin source breakdown.
Expected Results:
- "WhatsApp" counter increments by 1.
TC-REF-005 — Organic (No Ref) Page View
Steps:
- Navigate to
https://uat.events.cardgit.com/e/<event-slug>with no?ref=parameter. - Check the admin source breakdown.
Expected Results:
- "Organic" counter increments (backend coalesces
NULLref to'organic').
TC-REF-006 — Invalid Ref Value Is Ignored at Registration
| Field | Detail |
|---|---|
| Priority | Security |
Steps:
- Navigate to
https://uat.events.cardgit.com/e/<event-slug>?ref=malicious_source. - Register or sign up via the modal that opens.
Expected Results:
- The
signupRefis NOT stored on the user record (backend only accepts:twitter,linkedin,whatsapp,email,direct,qr). - Registration succeeds normally.
- No XSS or unexpected content appears in the admin source breakdown.
TC-REF-007 — Signup Ref Stored on User Registration
| Field | Detail |
|---|---|
| Precondition | New user (email not previously registered) |
Steps:
- Navigate to
https://uat.events.cardgit.com/e/<event-slug>?ref=linkedin. - Click "Register" / "Get Tickets".
- Complete registration with a new email address.
Expected Results:
- Account is created with
signupRef = 'linkedin'in the database. - The ref value propagates through: landing page → login modal →
POST /auth/register-pending→ verified user row. - The acquisition source is attributable in platform analytics.
TC-REF-008 — Admin Public URL Card — Page View Counter Displays
| Field | Detail |
|---|---|
| URL | Admin event detail page (/events/<event-id>) |
Steps:
- Navigate to the admin event detail page for a published event.
- Locate the "Public Event URL" card component.
- Observe the page view section.
Expected Results:
- Total page view count is shown as a formatted number (e.g., "1,234").
- Below the total, per-source badges are displayed: e.g.,
X / Twitter 42,LinkedIn 19,Organic 73. - Only sources with at least 1 view are shown (empty sources are hidden).
- Labels use human-readable names (
X / Twitter,LinkedIn,WhatsApp,Email,Direct,QR Code) — never raw database values.
TC-REF-009 — Admin Share Buttons Append Ref Tags
Steps:
- On the admin event detail page, locate the Public Event URL card.
- Inspect the generated share links for Twitter, LinkedIn, WhatsApp, and Email.
Expected Results:
- Twitter share URL contains
?ref=twitter. - LinkedIn share URL contains
?ref=linkedin. - WhatsApp share URL contains
?ref=whatsapp. - Email share URL contains
?ref=email. - Direct copy URL contains no
?ref=parameter (organic). - QR code URL contains
?ref=qr.
TC-REF-010 — Frontend Event Detail Share Modal Appends Ref Tags
Steps:
- As an attendee on the event detail page, click the share icon.
- Inspect the generated share links.
Expected Results:
- Same behaviour as TC-REF-009 — each channel appends the correct
?ref=source. - Copying the direct link does not include a ref tag.
TC-REF-011 — Page View API Endpoint Is Public (No Auth Required)
Steps:
- Without any
Authorizationheader, send:POST https://uat.api2.cardgit.com/api/v1/analytics/events/<event-id>/pageview Content-Type: application/json { "ref": "direct" }
Expected Results:
- HTTP 200 or 204 (no auth required).
- Page view is recorded.
TC-REF-012 — Page View Counter Handles Zero State Gracefully
Steps:
- Create a brand-new event that has had no page views.
- Navigate to its admin detail page.
- Observe the Public Event URL card.
Expected Results:
- Total shows
0or no counter is displayed (graceful empty state). - No source breakdown badges are shown when all counts are zero.
- No JavaScript error is thrown.
52. Module 49 — SSO Handoff (Frontend → Admin)
Context: When an authenticated frontend user clicks "Create Event", the app calls
POST /auth/handoffto get a one-time token, then redirects the browser tohttps://uat.events-admin.cardgit.com/?handoff=<token>. The admin app redeems the token on load, hydrates the auth store, and strips?handoff=from the URL. Only Organiser and Admin roles can pass the adminProtectedRouteafter redemption.
TC-SSO-001 — Create Event Button Hidden from Unauthenticated Users
Steps:
- Without logging in, navigate to
https://uat.events.cardgit.com/events. - Observe the navbar.
Expected Results:
- "Create Event" button is not visible.
TC-SSO-002 — Create Event Button Visible to Authenticated Users (Desktop)
Steps:
- Log in as
marcus@designstudio.co. - Observe the desktop navbar.
Expected Results:
- "Create Event" button is visible in the top navigation bar.
TC-SSO-003 — Create Event Button Visible on Mobile Bottom Nav
Steps:
- Set viewport to 390x844.
- Log in as
marcus@designstudio.co. - Observe the bottom navigation bar.
Expected Results:
- A "Create" button is visible in the bottom nav.
TC-SSO-004 — Clicking Create Event Fires POST /auth/handoff
Steps:
- Log in as
sarah@techcorp.io(Organiser). - Open browser DevTools Network tab.
- Click "Create Event".
Expected Results:
POST https://uat.api2.cardgit.com/api/v1/auth/handoffrequest fires.- Response contains a
handoffToken. - Browser redirects to
https://uat.events-admin.cardgit.com/?handoff=<token>.
TC-SSO-005 — Handoff Token Redeemed: User Lands Authenticated in Admin
Steps:
- Log in as
sarah@techcorp.ioon the frontend. - Click "Create Event".
- Observe the admin app after redirect.
Expected Results:
- Browser lands on
https://uat.events-admin.cardgit.com/(or/events/new). - The admin login page is not shown.
- The
?handoff=param is stripped from the URL.
TC-SSO-006 — Handoff Token Stripped from URL (History Safety)
Steps:
- Complete the SSO flow (TC-SSO-004).
- Click browser Back after landing.
Expected Results:
- Back navigation does not return a URL containing
?handoff=.
TC-SSO-007 — Invalid Handoff Token Falls Back to Login Page
Steps:
- Navigate to
https://uat.events-admin.cardgit.com/?handoff=not-a-real-token. - Wait 2 seconds.
Expected Results:
- Redirect to
/login. No?handoff=in URL.
TC-SSO-008 — Expired UUID Token Falls Back to Login
Steps:
- Navigate to
https://uat.events-admin.cardgit.com/?handoff=00000000-0000-0000-0000-000000000000.
Expected Results:
- Redirect to
/login. Login form shown.
TC-SSO-009 — Admin Login Page Still Works Independently
Steps:
- Navigate to
https://uat.events-admin.cardgit.com/login. - Enter
sarah@techcorp.io/password123. Click Sign In.
Expected Results:
- Login succeeds. Redirect to admin dashboard.
53. Module 50 — Dark Mode
Context: Frontend stores preference in
localStoragekeycardgit-theme; admin usescardgit-admin-theme. Valid values:'light','dark','system'. An inline script applies thedarkCSS class to<html>before first paint. Toggle button hasdata-testid="theme-toggle".
TC-DARK-001 — Theme Toggle Button Exists in Frontend Navbar
Steps:
- Navigate to
https://uat.events.cardgit.com/. - Locate
[data-testid="theme-toggle"].
Expected Results:
- Toggle button is visible in the navigation bar.
TC-DARK-002 — Toggle Enables Dark Mode
Steps:
- Confirm light mode active (
darkclass absent on<html>). - Click the theme toggle.
Expected Results:
darkclass added to<html>.- Background colour changes (
rgb(249,250,251)torgb(3,7,18)). localStorage['cardgit-theme']set to'dark'.
TC-DARK-003 — Toggle Twice Returns to Light Mode
Steps:
- Click toggle (light to dark).
- Click again (dark to light).
Expected Results:
darkclass removed.localStorage['cardgit-theme']='light'.
TC-DARK-004 — Dark Mode Persists After Page Reload
Steps:
- Set
localStorage['cardgit-theme'] = 'dark'. - Reload page.
Expected Results:
- Page loads in dark mode immediately (no light-mode flash before React mounts).
TC-DARK-005 — OS Dark Preference Honoured When No Stored Value
Steps:
- Open fresh browser context with
prefers-color-scheme: dark. - Clear
cardgit-themefrom localStorage. Reload.
Expected Results:
- Page renders in dark mode.
TC-DARK-006 — Explicit Saved Preference Overrides OS Preference
Steps:
- Open context with
prefers-color-scheme: dark. - Set
localStorage['cardgit-theme'] = 'light'. Reload.
Expected Results:
- Page renders in light mode (explicit value wins).
TC-DARK-007 — Admin App Uses Separate localStorage Key
Steps:
- Log in to admin. Click the admin theme toggle.
- Inspect localStorage.
Expected Results:
cardgit-admin-theme='dark'.cardgit-themeis not set.
TC-DARK-008 — Admin Dark Mode Persists After Reload
Steps:
- Set
localStorage['cardgit-admin-theme'] = 'dark'. Reload admin.
Expected Results:
- Admin loads in dark mode without a light-mode flash.
54. Module 51 — Address Mask
Context: Events with
addressMask: truehide the venue name and street address from unregistered users. Only city/state/country are shown, plus the message "Full address visible to approved registrants only". This applies on the public landing page, the events discovery page, and for logged-in but unregistered users.
TC-MASK-001 — Landing Page Mask ON Hides Venue Name
Precondition: Published event with addressMask: true, venueName = "Secret Conference Hall", city = "London".
Steps:
- Navigate to
https://uat.events.cardgit.com/e/<slug>without logging in.
Expected Results:
- "Secret Conference Hall" is not visible.
- "42 Hidden Street" is not visible.
- "London" is visible.
- "Full address visible to approved registrants only" notice is shown with a lock icon.
TC-MASK-002 — Landing Page Mask OFF Shows Full Address
Steps:
- Navigate to landing page of an event with
addressMask: false.
Expected Results:
- Full venue name and address visible.
- Mask notice does not appear.
TC-MASK-003 — Logged-In Unregistered User Address Still Masked
Steps:
- Log in as a user NOT registered for a masked event.
- Navigate to its landing page.
Expected Results:
- Address still masked. Login alone does not reveal the venue.
TC-MASK-004 — Events Discovery Page Shows Only City for Masked Event
Steps:
- Navigate to
https://uat.events.cardgit.com/events. - Search for a masked event (e.g., "Afrobeats").
Expected Results:
- City shown (e.g., "Lagos"). Full venue name (e.g., "Eko Atlantic City") not shown on card.
TC-MASK-005 — Registered Attendee Sees Full Address
Steps:
- Log in as a user who IS registered and approved for a masked event.
- Navigate to event detail page.
Expected Results:
- Full venue name and address visible. Mask notice gone.
TC-MASK-006 — Address Mask Toggle in Admin Event Edit
Steps:
- Log in to admin. Navigate to an event's edit page.
- Toggle "Address Mask" on. Save.
- Check frontend landing page. Toggle off. Save. Re-check.
Expected Results:
- Mask ON: venue name hidden on frontend.
- Mask OFF: full address visible on frontend.
55. Module 52 — Create Event Save Draft
Context: The event creation wizard shows "Save Draft" on Steps 1–5. Clicking it immediately POSTs the event as
status: draftand redirects to the event detail page. On the Review step (Step 6), "Save Draft" is replaced with "Save as Draft".
TC-DRAFT-001 — Save Draft on Step 1
Steps:
- Navigate to
https://uat.events-admin.cardgit.com/events/new. - Fill Title, Description, Start Date. Click "Save Draft".
Expected Results:
POST /api/v1/eventsreturns HTTP 201.- Redirect to
/events/<new-uuid>. - "Draft" status badge visible.
TC-DRAFT-002 — Save Draft on Step 2 (Venue)
Steps:
- Fill Step 1. Click "Next Step". Optionally fill venue. Click "Save Draft".
Expected Results:
- HTTP 201. Redirect to event detail with "Draft" badge.
TC-DRAFT-003 — Save Draft Visible on Steps 1–5, Not on Review
Steps:
- Step through Steps 1–5, confirming "Save Draft" is visible each time.
- Advance to Step 6 (Review).
Expected Results:
- "Save Draft" visible on Steps 1–5.
- On Step 6: "Save Draft" gone; "Save as Draft" present.
TC-DRAFT-004 — Back Navigation Retains Data
Steps:
- Fill Step 1 completely. Advance to Step 2. Fill venue. Click "Back".
Expected Results:
- Step 1 data is retained. No fields cleared.
TC-DRAFT-005 — Draft Event Appears in Events List as Draft
Steps:
- Save a draft (TC-DRAFT-001). Navigate to
/events.
Expected Results:
- Draft event appears with "Draft" status.
- NOT visible on the attendee frontend (drafts are not public).
56. Module 53 — Redirect After Login
Context: An unauthenticated user hitting a protected route is redirected to
/login?redirect=<original-path>. After login they land on the original destination. The?redirect=param is preserved when switching between Sign In and Sign Up forms. External URLs in the redirect param are rejected (open-redirect guard).
TC-REDIR-001 — Landing Page Register Now Redirects and Returns to Event Registration
Steps:
- Navigate to
https://uat.events.cardgit.com/e/<slug>(not logged in). - Click "Register Now".
- Log in as
ava.thompson@demo.test/Test1234!.
Expected Results:
- Step 2: Lands on
/login?redirect=/events/<id>/register. - Step 3: After login, lands on
/events/<id>/register— not bare/events.
TC-REDIR-002 — ?redirect Preserved Switching to Sign Up
Steps:
- Navigate to
/login?redirect=/events/<id>/register. - Click the in-form "Sign up" link.
Expected Results:
- URL becomes
/register?redirect=/events/<id>/register.
TC-REDIR-003 — ?redirect Preserved Switching to Sign In
Steps:
- Navigate to
/register?redirect=/events/<id>/register. - Click the in-form "Sign in" link.
Expected Results:
- URL becomes
/login?redirect=/events/<id>/register.
TC-REDIR-004 — ProtectedRoute Bounce Returns to Original Page
Steps:
- Navigate directly to
/events/<id>/registerwithout auth. - Log in after bounce.
Expected Results:
- After login, lands on
/events/<id>/register.
TC-REDIR-005 — Login Without ?redirect Defaults to /events
Steps:
- Navigate to
/loginwith no redirect param. Log in.
Expected Results:
- After login, lands on
/events.
TC-REDIR-006 — Open-Redirect Guard Rejects External URL
Steps:
- Navigate to
/login?redirect=https://evil.example.com. Log in.
Expected Results:
- External URL is not followed. User lands on
/eventsor/.
57. Module 54 — Role-Based Admin Login
Context: 7 granular host roles exist. All use password
Test1234!. Each must log in successfully without showing "Access Restricted". Role scope is enforced — Moderators cannot access Platform Admin routes.
TC-ROLES-001 — Event Admin Can Log In
Steps:
- Navigate to
https://uat.events-admin.cardgit.com/login. - Enter
event-admin@test.com/Test1234!. Click Sign In.
Expected Results:
- Redirected away from
/login. No "Access Restricted". Dashboard shown.
TC-ROLES-002 — Event Moderator Can Log In
event-moderator@test.com |
|---|
Expected Results: Redirected from login. Moderation tools accessible. No "Access Restricted".
TC-ROLES-003 — Speaker Manager Can Log In
event-speaker-mgr@test.com |
|---|
Expected Results: Redirected from login. Speaker management accessible. No "Access Restricted".
TC-ROLES-004 — Sponsor Manager Can Log In
event-sponsor-mgr@test.com |
|---|
Expected Results: Redirected from login. Sponsor management accessible. No "Access Restricted".
TC-ROLES-005 — Registration Role Can Log In
event-registration@test.com |
|---|
Expected Results: Redirected from login. Registrations page accessible. No "Access Restricted".
TC-ROLES-006 — Analyst Can Log In
event-analyst@test.com |
|---|
Expected Results: Redirected from login. Analytics/registrations accessible. No "Access Restricted".
TC-ROLES-007 — Check-In Staff Can Log In
event-checkin@test.com |
|---|
Expected Results: Redirected to /checkin portal (standalone, no sidebar). No "Access Restricted".
TC-ROLES-008 — Moderator Cannot Access Platform Admin Routes
Steps:
- Log in as
event-moderator@test.com. - Navigate to
https://uat.events-admin.cardgit.com/platform/feature-flags.
Expected Results:
- Access denied. Redirected away. No platform admin content shown.
58. Module 55 — Email Templates
Context: Platform admin can preview all templates via
GET https://uat.api2.cardgit.com/api/v1/platform/email/preview/:type. All must return HTTP 200, include CardGit branding, and contain no error strings. Templates are also browsable in the Email Management page under grouped tabs.
TC-ETPL-001 — Registration Confirmation Template
Steps:
GET /api/v1/platform/email/preview/registration-confirmation(platform admin auth).
Expected Results:
- HTTP 200. Contains: "You're registered", recipient name, event title, ticket type, venue, CardGit branding. No
TypeError,Cannot read,undefined,[object Object].
TC-ETPL-002 — Regression: All Core Templates Return 200
Test each of: registration-pending-approval, registration-approved, registration-rejected, waitlist-confirmation, event-reminder, welcome, new-message, connection-request, host-invitation.
Expected Results per template:
- HTTP 200, CardGit branding,
<!DOCTYPE html>, support footer, no error strings. registration-pending-approval: "Pending Approval", "No action needed".waitlist-confirmation: "You're on the Waitlist", "Waitlisted".event-reminder: "starts in 24h".host-invitation: "You're invited to co-host", "Accept Invitation".
TC-ETPL-003 — Event Created Template
GET /api/v1/platform/email/preview/event-created
Expected Results: HTTP 200. Contains: recipient name, event title, "Draft", "hosting team", "Owner", "Moderator", "Approval is on", "Public", "Schedule Builder", "Open Event Dashboard", event ID in CTA link.
TC-ETPL-004 — Event Updated Template
GET /api/v1/platform/email/preview/event-updated
Expected Results: HTTP 200. Contains: recipient name, editor "Jordan Smith", mailto:jordan.smith@techconf.io, "Co-host" badge, "What changed", 3 change fields (Start date, Venue, Description), before/after values with arrow (→), "View Event" CTA.
TC-ETPL-005 — Server Restart Template
GET /api/v1/platform/email/preview/server-restart
Expected Results: HTTP 200. Contains: "API Server Restarted", service table (API Server, Database, Redis), "HEALTHY", "WARNING", "Environment", "Version", "View System Health", "2h 34m".
TC-ETPL-006 — Health Alert Template
GET /api/v1/platform/email/preview/health-alert
Expected Results: HTTP 200. Contains: "CRITICAL", "Database", "DOWN", "All API requests may be affected", "View System Health", "throttled".
TC-ETPL-007 — Health Recovered Template
GET /api/v1/platform/email/preview/health-recovered
Expected Results: HTTP 200. Contains: "Database", "Recovered", "HEALTHY", "14ms", "No further action", "View System Health".
TC-ETPL-008 — Unknown Template Returns 404
GET /api/v1/platform/email/preview/does-not-exist-xyz
Expected Results: HTTP 404.
TC-ETPL-009 — Email Management Page — Template Groups
Steps:
- Log in to admin as platform admin. Navigate to
/email-management. Click "Templates" tab.
Expected Results:
- 4 groups: Registration, Events, Networking, Platform.
- "Event Created", "Event Updated" listed under Events.
- "Server Restart", "Health Alert", "Recovered" listed under Platform.
TC-ETPL-010 — Clicking a Template Loads Preview Iframe
Steps:
- Click "Event Created" in the template list.
Expected Results:
- An
<iframe>renders the email HTML preview.
59. Module 56 — Email Sending (Integration)
Context: Every outbound email is written to the
email_queuetable before SMTP delivery (status:pending/processing/sent/failed). Tests trigger real API actions and pollGET /api/v1/email-queue?emailType=<type>&limit=20(platform admin auth) to confirm the email row appears.
TC-ESND-001 — Creating an Event Enqueues event-created Email
Steps:
- Record
t0. Create a new event viaPOST /api/v1/events(tenant admin auth). - Poll
/email-queue?emailType=event-createdfor rows withcreatedAt > t0(up to 8 s).
Expected Results:
POST /eventsreturns HTTP 201.event-createdemail row appears within 8 s.subjectcontains "is ready to set up".statusispending,processing, orsent.payload.eventIdis present.
TC-ESND-002 — event-created Subject Contains Event Title
Steps:
- Create event with title
TitleCheck <timestamp>. - Poll queue for
event-createdrows aftert0.
Expected Results:
subjectcontains the title. Format:🎉 "<title>" is ready to set up.
TC-ESND-003 — event-created Payload Has requiresApproval
Steps:
- Create event with
requiresApproval: true. Retrieve email row payload.
Expected Results:
payload.requiresApproval === true.
TC-ESND-004 — Updating an Event Enqueues event-updated Emails
Steps:
- Record
t0.PUT /api/v1/events/<id>with a new title. - Poll for
event-updatedrows with subject containing "was updated".
Expected Results:
event-updatedrow found within 8 s.payload.changesis a non-empty array with aTitleentry and correctaftervalue.
TC-ESND-005 — event-updated Payload Has Editor Info
Steps:
- Update an event. Retrieve the email row payload.
Expected Results:
payload.editorName,payload.hostRole,payload.eventTitleall present.
TC-ESND-006 — No event-updated Email When Nothing Changed
Steps:
- Record
t0.PUT /api/v1/events/<id>setting the same title already stored. - Wait 2 s. Query queue for
event-updatedrows aftert0.
Expected Results:
- Zero new rows (diff empty → no email queued).
TC-ESND-007 — No Health Alert Emails Sent at Startup (Cooldown Guard)
Steps:
- Find the latest startup snapshot timestamp from
GET /platform/health/history?hours=1. - Query
email-queue?emailType=health-alertfor rows within 10 min of that timestamp.
Expected Results:
- Zero
health-alertrows in the first 10 minutes after startup.
60. Module 57 — Platform Exports & Audit Log
TC-PEXP-001 — Platform Exports Page Loads with 7 Cards
Steps:
- Log in as platform admin. Navigate to
https://uat.events-admin.cardgit.com/platform/exports.
Expected Results:
- Heading: "Platform Exports".
- 7 export cards: Organizations, Events, Users, Registrations, Revenue, Audit Log, Deleted Records.
- At least 7 "Download CSV" buttons enabled.
TC-PEXP-002 — Deleted Records Card Has Day-Window Selector
Steps:
- On
/platform/exports, locate the Deleted Records card.
Expected Results:
- Time-window selector buttons present (e.g., "30 days", "90 days").
TC-PEXP-003 — Security Notice Mentions All Organizations
Steps:
- On
/platform/exports, observe the page notice.
Expected Results:
- Text contains "all organizations".
TC-PEXP-004 — Platform Audit Log Loads with Category Pills
Steps:
- Navigate to
https://uat.events-admin.cardgit.com/platform/audit-log.
Expected Results:
- Heading: "Platform Audit Log".
- Filter pills: All, Events, Registrations, Platform ops, Data exports.
- Search bar with "action" placeholder. Filters button. CSV button.
TC-PEXP-005 — Platform Audit Log Filters Toggle and Export
Steps:
- Click "Filters" — resource type dropdown appears.
- Click "Events" category pill — results filter without error.
- Click "CSV" — file download initiates.
Expected Results: Each step behaves as described with no JavaScript errors.
TC-PEXP-006 — Platform Audit Log Row Detail Panel
Steps:
- Click any log row.
- Press
Escape.
Expected Results:
- Detail panel opens showing Actor and Timestamp.
- Escape closes the panel.
TC-PEXP-007 — Platform Dashboard Quick-Links Point Correctly
Steps:
- Navigate to
https://uat.events-admin.cardgit.com/platform.
Expected Results:
- Links to
/platform/exports,/platform/audit-log,/platform/analyticsare all visible.
TC-PEXP-008 — Job Monitor Landing Page
Steps:
- Navigate to
https://uat.events-admin.cardgit.com/platform/jobs.
Expected Results:
- Heading: "Job Monitor".
- "Platform totals" section visible.
- Three queue cards: Email Queue, Notification Queue, Analytics Queue, each linking to their detail page.
- "No failed jobs" or "Recent Failures" section present.
TC-PEXP-009 — Job Monitor Email Queue Detail
Steps:
- Navigate to
/platform/jobs/email.
Expected Results:
- Status filter pills: Active, Waiting, Delayed, Completed, Failed.
- Search bar present. Back link to
/platform/jobs.
TC-PEXP-010 — Job Detail Panel Opens and Closes on Escape
Steps:
- Click a job row (if any exist).
- Press
Escape.
Expected Results:
- Panel opens with "Job Detail" heading. No "Remove" button.
- Escape closes panel.
TC-PEXP-011 — Tenant Audit Log Loads
Steps:
- Navigate to
https://uat.events-admin.cardgit.com/events/<test-event-id>/audit-log.
Expected Results:
- Heading: "Audit Log". Category pills: All, Event, Sessions, Registrations.
- Search bar, date range inputs, "Export CSV" button. No JavaScript errors.
TC-PEXP-012 — Tenant Audit Log Row Detail Panel
Steps:
- Click a log row.
- Press
Escape.
Expected Results:
<aside>panel opens with Timestamp label.- Escape removes the panel from DOM.
61. Module 58 — Payment Cancel & My Events
TC-PAY-CANCEL-001 — Payment Cancel Page
| Field | Detail |
|---|---|
| Priority | High |
| URL | /events/<event-id>/payment/cancel |
Steps:
- Start a paid registration (navigate to
/events/<event-id>/register, select a ticket, click "Proceed to Payment"). - On the Stripe Checkout page, click "Back" or the browser back button.
- Observe the resulting page.
Expected Results:
- User lands on
/events/<event-id>/payment/cancel. - A cancellation message is shown (e.g. "Payment cancelled" or "Your payment was not completed").
- A "Try Again" or "Return to Event" button is visible and functional.
- No registration row with
paymentStatus: paidexists for the user.
TC-PAY-CANCEL-002 — Payment Cancel Returns to Event
Steps:
- On the payment cancel page, click "Return to Event" or "Try Again".
Expected Results:
- User navigates back to the event detail page or registration page.
- No error is shown.
TC-MYEVENTS-001 — My Events Page Loads
| Field | Detail |
|---|---|
| Precondition | Logged-in user has at least one registration |
| URL | https://uat.events.cardgit.com/my-events |
Steps:
- Log in as
marcus@designstudio.co. - Navigate to
/my-events.
Expected Results:
- Page heading "My Events" or similar is visible.
- Registered events are listed with title, date, and status.
TC-MYEVENTS-002 — My Events Empty State
Steps:
- Log in as a user with no registrations.
- Navigate to
/my-events.
Expected Results:
- Empty state message is shown (e.g. "You haven't registered for any events yet").
- A CTA to browse events is present.
62. Module 59 — Revenue Page (Admin)
Context: The Revenue page at
/events/:id/revenueshows ticket sales, payment totals, and financial breakdown for an event. Accessible to Organisers and Admins only.
TC-REV-001 — Revenue Page Loads
| Field | Detail |
|---|---|
| Priority | High |
| URL | https://uat.events-admin.cardgit.com/events/<event-id>/revenue |
| Precondition | Logged in as Organiser with at least one paid event |
Steps:
- Navigate to
/events/<event-id>/revenue.
Expected Results:
- Page loads with a revenue/financial heading.
- Total revenue figure is shown.
- Ticket type breakdown is visible (ticket name, quantity sold, revenue per type).
- No JavaScript errors.
TC-REV-002 — Revenue Figures Match Registration Data
Steps:
- Note the number of paid registrations from
/registrations/<event-id>. - Navigate to
/events/<event-id>/revenue. - Compare totals.
Expected Results:
- The total paid registration count on the revenue page matches the registration management page.
- Revenue total = sum of all paid ticket prices.
TC-REV-003 — Revenue Page — Free Event Shows Zero Revenue
Steps:
- Navigate to the revenue page for a free event (all tickets at £0/$0).
Expected Results:
- Total revenue shows £0 / $0.
- No error or blank page.
63. Module 60 — Venues Management (Admin)
Context: Venues are org-scoped physical or virtual spaces managed at
/venues. Each venue has: name (required), type (Room/Hall/Outdoor/Virtual Room/Other), organisation (required), floor/level, capacity, description, notes, and — for virtual type — a meeting link (required). The page shows a stats strip (Total, Rooms, Virtual, Organisations), a search bar, type filter, and org filter. The Add/Edit form is a full-screen modal (slide-up on mobile, centred dialog on desktop) with a teal-to-blue gradient header. Deleting a venue warns that assigned sessions will lose their venue.
TC-VEN-001 — Venues List Page Loads
| Field | Detail |
|---|---|
| URL | https://uat.events-admin.cardgit.com/venues |
| Role | Organiser or Admin |
Steps:
- Log in as
sarah@techcorp.io. Navigate to/venues.
Expected Results:
- Teal-to-blue gradient header with heading "Venues" and "Tenant-Scoped" badge.
- Subtitle shows venue count and org count (e.g. "3 venues across 1 organisation").
- Stats strip: Total Venues, Rooms, Virtual, Organisations — all with correct counts.
- "Add Venue" button is visible.
- Existing venues listed as cards, or an empty state ("No venues yet").
TC-VEN-002 — Venues List — Search, Type Filter, Org Filter
Steps:
- If multiple venues exist, type a partial name in the search bar.
- Use the Type filter dropdown to select "Room".
- Clear the type filter.
Expected Results:
- Search filters cards by name, description, and floor (case-insensitive substring match).
- "No venues match your filters" message shown when no results.
- Result count shows "N of M venues" when any filter is active.
- Type filter "Room" shows only venues with
type = 'room'. - Org filter dropdown appears only when more than 1 organisation is present.
- Clearing filters restores all venues.
TC-VEN-003 — Create a Physical Venue (Room)
Steps:
- Click "Add Venue".
- In the modal, fill in:
- Organisation: select the available org.
- Venue Name:
QA Test Room - Type:
Room - Floor / Level:
Ground Floor - Capacity:
150 - Description:
A standard conference room. - Notes:
AV equipment available.
- Click "Create Venue".
Expected Results:
- Modal header: "Add Venue" with MapPin icon and teal-to-blue gradient.
- Organisation dropdown is pre-filled with the user's org.
- Virtual: Meeting Link field is not shown (type is Room, not Virtual).
- Floor and Capacity fields are visible (not virtual).
- On save:
POST /api/v1/organizations/:orgId/venuesis called. - Toast: "Venue created".
- Modal closes; new venue card appears in the list with: name, type badge ("Room"), capacity bar.
- Stats strip counts update.
TC-VEN-004 — Create a Virtual Venue
Steps:
- Click "Add Venue".
- Set Type to "Virtual Room".
- Fill in Name:
QA Virtual Roomand Meeting Link:https://zoom.us/j/123456789. - Observe that Floor/Capacity fields are hidden.
- Click "Create Venue".
Expected Results:
- Floor/Level and Capacity inputs are not shown when Type is Virtual.
- Meeting Link input appears (required for virtual).
- Zoom icon (Wifi) shown as prefix on the meeting link input.
- Venue card shows the meeting link as a clickable hyperlink.
TC-VEN-005 — Create Venue — Validation
Steps:
- Open the Add Venue modal.
- Leave Venue Name empty. Click "Create Venue".
- Set Type to "Virtual Room", leave Meeting Link empty. Click "Create Venue".
- Leave Organisation unselected. Click "Create Venue".
Expected Results:
- Empty name: inline error "Venue name is required." with red border on the name input.
- Empty meeting link for virtual type: error "Meeting link is required for virtual venues."
- No organisation selected: error "Organisation is required."
- No API call is made in any error case.
TC-VEN-006 — Edit a Venue
Steps:
- Click the Edit button on an existing venue card.
- Update the Capacity to
200. - Click "Save Changes".
Expected Results:
- Modal opens pre-populated with the venue's current values.
- Title: "Edit Venue".
PUT /api/v1/organizations/:orgId/venues/:idis called.- Toast: "Venue updated".
- Venue card updates to show new capacity.
TC-VEN-007 — Delete a Venue
Steps:
- Click the Delete button on a venue card.
- Read the confirm dialog.
- Confirm deletion.
Expected Results:
- Dialog: "Delete this venue? Sessions assigned to it will lose their venue assignment."
- On confirm:
DELETE /api/v1/organizations/:orgId/venues/:id. - Toast: "Venue deleted".
- Venue card removed from the list.
- Stats strip counts update.
- Cancelling the dialog: venue remains unchanged.
TC-VEN-008 — Modal Keyboard Escape Closes Modal
Steps:
- Open the Add Venue modal.
- Press
Escape.
Expected Results:
- Modal closes.
- No venue is created.
- Page scrolling is restored (body
overflowremoved).
TC-VEN-009 — Venue Card Layout — Physical vs Virtual
Steps:
- Observe a Room venue card and a Virtual venue card side by side.
Expected Results:
- Room card: type emoji "🚪", type badge (indigo "Room"), floor text, capacity bar (width proportional to capacity/800), no meeting link shown.
- Virtual card: type emoji "💻", type badge (blue "Virtual Room"), meeting link shown as a clickable
<a>link (opens in new tab), no capacity bar. - Organisation name shown with Building2 icon (if known).
- Notes shown if set.
TC-VEN-010 — Platform Venues Overview
| Field | Detail |
|---|---|
| URL | https://uat.events-admin.cardgit.com/platform/venues |
| Role | Platform Admin only |
Steps:
- Log in as
admin@cardgit.com. Navigate to/platform/venues.
Expected Results:
- All venues across ALL organisations are listed.
- Each entry shows organisation attribution.
- Platform admins can view but not necessarily edit from this view.
64. Module 61 — Sponsor Management (Admin)
Context: Sponsors are managed per-event at
/sponsors/:eventId. Tiers: Platinum, Gold, Silver, Bronze. Each sponsor has a name, logo, website, description, and optional booth.
TC-SPON-ADM-001 — Sponsors Events Picker Loads
| Field | Detail |
|---|---|
| URL | https://uat.events-admin.cardgit.com/sponsors |
Steps:
- Navigate to
/sponsors.
Expected Results:
- Event picker/dropdown is shown.
- List of events the organiser manages is displayed.
TC-SPON-ADM-002 — Sponsors List Per Event
Steps:
- Navigate to
/sponsors/<event-id>.
Expected Results:
- Page heading references the event name.
- Existing sponsors are listed with name, tier, and logo.
- "Add Sponsor" button is visible.
TC-SPON-ADM-003 — Create a Sponsor
Steps:
- Click "Add Sponsor".
- Fill in: Name =
QA Sponsor Ltd, Tier =Gold, Website =https://qasponsor.test, Description =A test sponsor. - Upload a logo image (PNG < 2 MB).
- Save.
Expected Results:
- Sponsor appears in the list with the correct tier badge.
- Logo is displayed.
- Sponsor is visible on the attendee-facing sponsors page.
TC-SPON-ADM-004 — Edit a Sponsor
Steps:
- Click edit on an existing sponsor.
- Change the tier from Gold to Silver.
- Save.
Expected Results:
- Tier badge updates to Silver.
- No other sponsor data is lost.
TC-SPON-ADM-005 — Delete a Sponsor
Steps:
- Click delete on a sponsor.
- Confirm.
Expected Results:
- Sponsor is removed from the list.
- Sponsor no longer appears on the attendee-facing sponsors page.
65. Module 62 — Survey Builder & Submission (Admin + Attendee)
Context: Admins build surveys at
/events/:eventId/surveys/new. Attendees complete them at/events/:eventId/surveys→/surveys/:surveyId. Survey question types: short text, long text, multiple choice, rating (1–5), checkbox.
TC-SUR-ADM-001 — Survey Builder Page Loads
| Field | Detail |
|---|---|
| URL | https://uat.events-admin.cardgit.com/events/<event-id>/surveys/new |
Steps:
- Navigate to
/events/<event-id>/surveys/new.
Expected Results:
- Survey builder loads with a title field and "Add Question" button.
TC-SUR-ADM-002 — Build a Survey with Multiple Question Types
Steps:
- Set survey title:
Post-Event QA Survey. - Add a Rating question: "Overall satisfaction (1–5)".
- Add a Multiple Choice question: "Would you attend again?" with options Yes / No / Maybe.
- Add a Short Text question: "Any comments?".
- Set Opens/Closes dates.
- Click "Publish".
Expected Results:
- Survey is saved with all three questions.
- Survey appears in
/events/<event-id>/surveysfor attendees. - Question types render correctly on the attendee side.
TC-SUR-ADM-003 — Survey Responses Summary (Admin)
Steps:
- After at least one attendee submits the survey, navigate to the survey in admin.
- Open the responses/results view.
Expected Results:
- Response count is shown.
- Rating questions show average score.
- Multiple choice questions show percentage breakdown.
- Text responses are listed individually.
TC-SUR-ATT-001 — Attendee Survey Submission
| Field | Detail |
|---|---|
| Precondition | Active survey exists; user is registered for the event |
Steps:
- Navigate to
/events/<event-id>/surveys. - Click on the available survey.
- Answer all questions.
- Click "Submit".
Expected Results:
- All question types render without errors.
- Submission succeeds with a confirmation message.
- Survey is marked "Completed" in the list.
TC-SUR-ATT-002 — No Re-submission After Completion
Steps:
- Submit a survey (TC-SUR-ATT-001).
- Navigate back to
/events/<event-id>/surveys. - Click the completed survey.
Expected Results:
- Survey is shown as "Completed".
- Form is not re-submittable (either read-only or a completion notice is shown).
66. Module 63 — Social Moderation (Admin)
Context: The Social Moderation page (
/events/:eventId/moderation/social) is distinct from Q&A moderation. It shows social wall posts that have been flagged or are pending review.
TC-SOCMOD-001 — Social Moderation Page Loads
| Field | Detail |
|---|---|
| URL | https://uat.events-admin.cardgit.com/events/<event-id>/moderation/social |
Steps:
- Navigate to
/events/<event-id>/moderation/social.
Expected Results:
- Page heading references social or wall moderation.
- Posts are listed (or empty state if none pending).
- Filter tabs for pending / approved / rejected are present.
TC-SOCMOD-002 — Approve a Flagged Post
Steps:
- Find a post in "Pending" state.
- Click "Approve".
Expected Results:
- Post status changes to "Approved".
- Post becomes visible on the attendee-facing social wall.
TC-SOCMOD-003 — Reject/Remove a Post
Steps:
- Find a post in "Pending" or "Approved" state.
- Click "Reject" / "Remove".
- Confirm.
Expected Results:
- Post is hidden from the attendee social wall.
- Status shows "Rejected" in the moderation view.
TC-SOCMOD-004 — Moderation Picker Shows Social Option
| Field | Detail |
|---|---|
| URL | https://uat.events-admin.cardgit.com/moderation/social |
Steps:
- Navigate to
/moderation/social(global moderation picker).
Expected Results:
- Event selection picker is shown (same pattern as Q&A moderation picker).
- Selecting an event navigates to
/events/<id>/moderation/social.
67. Module 64 — Speaker Management (Admin)
Context: Speakers are managed per-event at
/events/:eventId/speakers. Speakers have a name, title, company, bio, and headshot. They are linked to sessions.
TC-SPK-ADM-001 — Speakers Page Loads
| Field | Detail |
|---|---|
| URL | https://uat.events-admin.cardgit.com/events/<event-id>/speakers |
Steps:
- Navigate to
/events/<event-id>/speakers.
Expected Results:
- Page heading "Speakers" is shown.
- Existing speakers are listed (or empty state).
- "Add Speaker" button is visible.
TC-SPK-ADM-002 — Add a Speaker
Steps:
- Click "Add Speaker".
- Fill in: Name =
Jane QA, Title =QA Lead, Company =Test Corp, Bio =Expert tester. - Upload a headshot image.
- Save.
Expected Results:
- Speaker appears in the list.
- Speaker appears on the attendee-facing speaker directory.
TC-SPK-ADM-003 — Link Speaker to a Session
Steps:
- Navigate to a session's edit page.
- Add the speaker created in TC-SPK-ADM-002.
- Save.
Expected Results:
- Speaker name appears on the session in the schedule.
TC-SPK-ADM-004 — Edit a Speaker
Steps:
- Click edit on a speaker.
- Update the bio.
- Save.
Expected Results:
- Updated bio is saved and shown on the attendee-facing directory.
TC-SPK-ADM-005 — Delete a Speaker
Steps:
- Click delete on a speaker.
- Confirm.
Expected Results:
- Speaker removed from the list.
- Speaker no longer appears on the attendee-facing directory.
68. Module 65 — Registration Management (Admin)
Context: Registrations are managed at
/registrations/:eventId. Admins can approve/reject attendees, view check-in status, download QR codes, and export the list.
TC-REGMGT-001 — Registration Events Picker Loads
| Field | Detail |
|---|---|
| URL | https://uat.events-admin.cardgit.com/registrations |
Steps:
- Navigate to
/registrations.
Expected Results:
- Page heading "Registrations" is visible.
- Event picker dropdown is shown.
- "Manage Registrations" button is present.
TC-REGMGT-002 — Registration List Per Event
Steps:
- Navigate to
/registrations/<event-id>.
Expected Results:
- Table of registrations with columns: Name, Email, Status, Ticket Type, Check-in Status, Registration Date.
- Search bar filters by name/email.
- Status filter (All / Pending / Approved / Cancelled) works.
- At least one row is visible for a seeded event.
TC-REGMGT-003 — Approve a Pending Registration
Steps:
- On
/registrations/<event-id>, find a "Pending" registration. - Click "Approve".
- Confirm.
Expected Results:
- Status changes to "Approved".
- Attendee receives a confirmation email (verifiable via email queue:
GET /api/v1/email-queue?emailType=registration-approved).
TC-REGMGT-004 — Reject a Registration
Steps:
- Find a "Pending" or "Approved" registration.
- Click "Reject" / "Cancel".
- Confirm and optionally add a reason.
Expected Results:
- Status changes to "Rejected" / "Cancelled".
- Attendee loses event access.
TC-REGMGT-005 — Manual Check-In from Registration List
Steps:
- Find an approved, unchecked-in registration.
- Click "Check In".
Expected Results:
checkedInstatus changes to ✓.- Check-in timestamp is recorded.
TC-REGMGT-006 — Search and Filter Registrations
Steps:
- Type a known attendee name in the search bar.
- Apply the "Approved" status filter.
Expected Results:
- Results filter to matching rows.
- Clearing the search restores all results.
TC-REGMGT-007 — Export Registration List
Steps:
- Click "Export" or "Download CSV" on the registrations page.
Expected Results:
- A CSV file downloads with: Name, Email, Ticket Type, Status, Check-in, Registration Date.
- Data matches what is shown in the table.
69. Module 66 — Settings Page (Admin — All Tabs)
Context: The Settings page at
/settingshas multiple tabs.11-notifications-announcements.spec.tsonly covers the Notifications tab. Other tabs are untested.
TC-SETTINGS-001 — Settings Page Loads
| Field | Detail |
|---|---|
| URL | https://uat.events-admin.cardgit.com/settings |
Steps:
- Navigate to
/settings.
Expected Results:
- Page heading "Settings" is visible.
- Multiple tabs are shown (Profile, Notifications, and any additional tabs).
TC-SETTINGS-002 — Notifications Tab Saves Preferences
Steps:
- Click the "Notifications" tab.
- Toggle one notification preference off.
- Save.
- Reload the page.
Expected Results:
- The toggled preference remains off after reload (persisted to backend).
TC-SETTINGS-003 — Profile/Account Tab Updates Display Name
Steps:
- Click the "Profile" or "Account" tab.
- Update the display name field.
- Save.
Expected Results:
- Updated name is reflected in the admin sidebar/header.
70. Module 67 — Enhanced Event Dashboard (Admin)
Context: Each event has its own analytics dashboard at
/events/:eventId/dashboard(EnhancedDashboardPage), separate from the global analytics landing page.
TC-EVTDASH-001 — Enhanced Event Dashboard Loads
| Field | Detail |
|---|---|
| URL | https://uat.events-admin.cardgit.com/events/<event-id>/dashboard |
Steps:
- Navigate to
/events/<event-id>/dashboard.
Expected Results:
- Dashboard loads with the event name in the heading.
- Key metric cards are visible: Registrations, Check-ins, Sessions, Revenue.
- Charts render without errors.
TC-EVTDASH-002 — Dashboard Links Navigate Correctly
Steps:
- On the event dashboard, click a metric card or quick-action tile (e.g. "Manage Sessions", "View Registrations").
Expected Results:
- Navigates to the correct sub-page (e.g.
/events/<id>/schedule,/registrations/<id>).
71. Module 68 — Tracks Management (Admin)
Context: Tracks organise sessions into parallel streams in the Schedule Builder. Managed at
/events/:eventId/tracks. Each track has: name (required), colour (8 presets + custom hex input), room/location (optional), floor (optional), display order (integer). The UI shows a gradient header with breadcrumb (Events → [title] → Tracks), an inline add/edit form, a sortable list with ↑/↓ reorder buttons, and inline edit/delete controls. Deleting warns that sessions will become unassigned. Reordering is optimistic — it reverts on failure.
TC-TRACKS-001 — Tracks Page Loads
| Field | Detail |
|---|---|
| URL | https://uat.events-admin.cardgit.com/events/<event-id>/tracks |
Steps:
- Navigate to
/events/<event-id>/tracks.
Expected Results:
- Indigo-to-cyan gradient header with heading "Track Management".
- Event title subtitle is shown.
- Breadcrumb: Events → [event name] → Tracks.
- Back arrow link returns to the event detail page.
- Track count badge shown in the header.
- "Add Track" button is present.
- Existing tracks listed (or an empty state "No tracks yet").
- Each track row shows: colour swatch, name, room/floor (or italic "No room / floor set"), display order number, ↑/↓ reorder buttons, Edit and Delete buttons.
TC-TRACKS-002 — Create a Track
Steps:
- Click "Add Track".
- In the inline form, fill in:
- Track Name:
Main Stage - Colour: click the amber preset swatch (
#f59e0b) - Room / Location:
Hall A - Floor:
Ground Floor
- Track Name:
- Click "Create Track".
Expected Results:
- Inline form appears with: Name input, ColorPicker (8 preset swatches + custom hex input), Room input, Floor input, Display Order number.
- Selecting the amber swatch: colour dot updates immediately.
- On save:
POST /api/v1/sessions/trackswith{ eventId, name, color, room, floor, displayOrder }. - Toast: "Track created".
- Track appears in the list with the selected colour dot and room label.
- Track is now available as a column in the Schedule Builder.
TC-TRACKS-003 — Create Track — Name Required Validation
Steps:
- Click "Add Track".
- Leave Track Name empty.
- Click "Create Track".
Expected Results:
- Inline error message: "Track name is required."
- No API call is made.
- Form remains open.
TC-TRACKS-004 — Color Picker — Custom Hex Input
Steps:
- Click "Add Track".
- In the color picker, type
#e11d48in the custom hex input field.
Expected Results:
- The hex input accepts the value.
- The preview colour dot next to the input updates to the entered colour.
- Saving uses the custom hex value (not a preset).
TC-TRACKS-005 — Edit an Existing Track
Steps:
- Click the Edit (pencil) button on an existing track.
- Update the Room field to
Hall B. - Click "Save Changes".
Expected Results:
- Inline form opens pre-populated with the track's current name, colour, room, floor, and display order.
- Button label changes to "Save Changes" (instead of "Create Track").
- On save:
PUT /api/v1/sessions/tracks/:idwith updated fields. - Toast: "Track updated".
- Track row reflects the updated room label.
TC-TRACKS-006 — Cancel Edit Returns to List
Steps:
- Click Edit on a track.
- Change the track name.
- Click the "Cancel" (X) button.
Expected Results:
- Form closes without saving.
- Track name remains as it was before editing.
- No API call is made.
TC-TRACKS-007 — Delete a Track
Steps:
- Click the Delete (Trash2) button on a track.
- Read the confirm dialog.
- Confirm.
Expected Results:
- Dialog: "Delete this track? Sessions assigned to it will become unassigned."
- On confirm:
DELETE /api/v1/sessions/tracks/:id. - Toast: "Track deleted".
- Track removed from the list.
- In the Schedule Builder, sessions that were in this track move to the "Unassigned" column.
- Cancelling the dialog: track remains unchanged.
TC-TRACKS-008 — Reorder Tracks — Move Up
Steps:
- With at least 2 tracks, click the ↑ (Up) button on the second track.
Expected Results:
- Track moves up in the list immediately (optimistic update).
PUT /api/v1/sessions/tracks/:idcalled for both affected tracks with swappeddisplayOrdervalues.- Order persists after page reload.
- ↑ button is disabled on the first track (can't move above the top).
TC-TRACKS-009 — Reorder Tracks — Move Down
Steps:
- Click the ↓ (Down) button on the first track.
Expected Results:
- Track moves down immediately.
- ↓ button is disabled on the last track.
TC-TRACKS-010 — Reorder Reverts on API Failure
Steps:
- Simulate an API failure during reorder (e.g. network disconnect, or inspect from logs).
- Observe the UI.
Expected Results:
- Toast: "Failed to reorder tracks".
- Track list reverts to the original order (calls
load()to reset state).
72. Module 69 — User Management (Admin)
TC-USRMGT-001 — User Management Page Loads
| Field | Detail |
|---|---|
| URL | https://uat.events-admin.cardgit.com/users |
| Role | Organiser or Admin |
Steps:
- Log in as Organiser. Navigate to
/users.
Expected Results:
- Page heading "Users" or "Team" is visible.
- List of users in the organisation is shown.
- Search bar is functional.
TC-USRMGT-002 — Org Users Page
| Field | Detail |
|---|---|
| URL | /users/org |
Steps:
- Navigate to
/users/org.
Expected Results:
- Org-scoped user list loads.
- Each user shows: name, email, role, joined date.
TC-USRMGT-003 — Platform All Users Page
| Field | Detail |
|---|---|
| URL | /platform/all-users |
| Role | Platform Admin only |
Steps:
- Log in as
admin@cardgit.com. Navigate to/platform/all-users.
Expected Results:
- Full cross-org user list loads.
- Columns: Name, Email, Role, Organisation, Created.
- Search and filter work.
73. Module 70 — Platform Events List & Detail (Admin)
TC-PLEVT-001 — Platform Events List Loads
| Field | Detail |
|---|---|
| URL | https://uat.events-admin.cardgit.com/platform/events |
| Role | Platform Admin only |
Steps:
- Navigate to
/platform/events.
Expected Results:
- Page heading "Events" or "Platform Events" is visible.
- All events across all organisations are listed.
- Columns include: title, organisation, status, registration count, dates.
TC-PLEVT-002 — Platform Event Detail Page
Steps:
- Click on an event in the platform events list.
- Navigate to
/platform/events/<event-id>.
Expected Results:
- Event detail page loads with full event info.
- Organisation name and owner are shown.
- Quick-action links to registrations, analytics, and moderation are present.
74. Module 71 — Activity Feed (Admin)
TC-ACT-001 — Activity Feed Loads
| Field | Detail |
|---|---|
| URL | https://uat.events-admin.cardgit.com/events/<event-id>/activity |
Steps:
- Navigate to
/events/<event-id>/activity.
Expected Results:
- Activity feed loads with a list of recent platform actions for the event.
- Entries show: action type, user, timestamp.
- Feed auto-refreshes or has a refresh button.
TC-ACT-002 — Activity Feed Filters
Steps:
- On the activity feed, use the filter options (by action type or date range).
Expected Results:
- Results filter correctly without error.
76. Module 72 — Command Palette (Quick Access)
Context: The admin app has a keyboard-driven command palette accessible via
Ctrl+K(Windows/Linux) orCmd+K(Mac). It is also triggered by clicking the search bar in the topbar that reads "Quick access — events, sessions, attendees…". The palette renders 40+ commands organised into categories: Go to (navigate) and Create. Commands are filtered by the logged-in user's role — an Organiser sees different commands than a Platform Admin. Keyboard navigation uses↑↓arrows andEnterto execute.Escapecloses it. The palette is mounted inTopbar.tsxand rendered as a full-screen overlay.
TC-CMD-001 — Command Palette Opens via Keyboard Shortcut
| Field | Detail |
|---|---|
| Priority | High |
| Precondition | Logged in to admin app as any role |
Steps:
- Log in as
sarah@techcorp.io. Navigate to any admin page. - Press
Ctrl+K(Windows) orCmd+K(Mac).
Expected Results:
- A full-screen overlay appears.
- A modal panel is centred at ~15% from the top.
- Search input has placeholder "Quick access — type to filter…" and is auto-focused.
- Commands are listed under "Go to" and "Create" category headings.
- Footer shows:
↑↓ navigate,↵ open,ESC close.
TC-CMD-002 — Command Palette Opens via Topbar Click
Steps:
- Click the topbar bar showing "Quick access — events, sessions, attendees…" and the
⌘Kbadge.
Expected Results:
- Palette opens identically to TC-CMD-001. Input is auto-focused.
TC-CMD-003 — Closes via Escape Key
Steps:
- Open the palette. Press
Escape.
Expected Results:
- Palette closes. No navigation occurs.
TC-CMD-004 — Closes via Backdrop Click
Steps:
- Open the palette. Click the dark overlay area outside the modal panel.
Expected Results:
- Palette closes. No navigation occurs.
TC-CMD-005 — Click Inside Panel Does Not Close
Steps:
- Open the palette. Click inside the modal panel (not on a command row).
Expected Results:
- Palette stays open.
TC-CMD-006 — Search Filters Commands in Real Time
Steps:
- Open the palette. Type
ana.
Expected Results:
- Only commands containing "ana" are shown (e.g. "Analytics", "Platform Analytics").
- Results update on every keystroke.
- Active highlight resets to the first result.
TC-CMD-007 — No Results Empty State
Steps:
- Open the palette. Type
xyznotacommand.
Expected Results:
- No command rows shown.
- Message reads:
No results for "xyznotacommand".
TC-CMD-008 — Arrow Key Navigation
Steps:
- Open the palette. Press
↓three times, then↑once.
Expected Results:
- Highlighted row moves down on
↓, up on↑. - Active row shows indigo background and
↵badge. - Navigation stops at the first and last items (does not wrap).
TC-CMD-009 — Enter Key Executes Selected Command
Steps:
- Open the palette. Type
analytics. PressEnter.
Expected Results:
- Palette closes. Browser navigates to
/analytics.
TC-CMD-010 — Mouse Click Executes Command
Steps:
- Open the palette. Click the "Registrations" row.
Expected Results:
- Palette closes. Browser navigates to
/registrations.
TC-CMD-011 — Mouse Hover Updates Active Highlight
Steps:
- Open the palette. Move the cursor over several rows.
Expected Results:
- The indigo highlight follows the cursor as it moves across rows.
TC-CMD-012 — Role Filtering — Organiser Does Not See Platform Admin Commands
| Field | Detail |
|---|---|
| Precondition | Logged in as sarah@techcorp.io (ORGANIZER) |
Steps:
- Open the palette. Browse the full unfiltered list.
Expected Results:
- Platform-admin-only commands are not visible: "Platform Dashboard", "Organizations", "Platform Users", "All Users", "System Health", "Feature Flags", "Event Reports", "Job Queue Monitor", "Error Logs", "Platform Audit Log", "Platform Analytics", "Platform Exports", "All Events", "Venues Overview", "Suspended Events", "Product Management", "Email Queue", "Email Management".
- Organiser commands are visible: "Dashboard", "Events", "Sessions", "Schedule Builder", "Venues", "Registrations", "Check-in Portal", "Sponsors", "Analytics", "Settings", "Create New Event", "Create New Session".
TC-CMD-013 — Role Filtering — Platform Admin Sees All Commands
| Field | Detail |
|---|---|
| Precondition | Logged in as admin@cardgit.com (ADMIN) |
Steps:
- Open the palette. Browse the full list.
Expected Results:
- All 40+ commands are visible including all platform admin entries.
- "Email Management" is present (ADMIN-only command).
TC-CMD-014 — "Create New Event" Navigates to Event Wizard
Steps:
- Open the palette. Type
create. Select "Create New Event".
Expected Results:
- Palette closes. Browser navigates to
/events/new.
TC-CMD-015 — "Create New Session" Navigates to Session Form
Steps:
- Open the palette. Select "Create New Session".
Expected Results:
- Palette closes. Browser navigates to
/sessions/new.
TC-CMD-016 — Palette Not Available on Check-in Portal
| Field | Detail |
|---|---|
| Precondition | Logged in as event-checkin@test.com (CHECKIN role) |
| Context | /checkin uses a standalone layout — Topbar is not rendered |
Steps:
- Navigate to
https://uat.events-admin.cardgit.com/checkin. - Press
Ctrl+K.
Expected Results:
- The palette does not open. No overlay appears.
TC-CMD-017 — Command Palette on Mobile (390px)
Steps:
- Set viewport to 390×844. Log in. Click the topbar quick-access bar.
Expected Results:
- Palette opens and is usable within the mobile viewport.
- Topbar shows short placeholder text "Quick access…" (full text hidden).
⌘Kbadge is hidden on small screens.- Command list is scrollable when it exceeds the panel height.
75. Appendix — Test Data & Notes
Known Test Event IDs
| Event | Event ID |
|---|---|
| DevSummit 2026 (paid) | 92ca8128-756b-44df-a99a-1c8a6803c946 |
| Platform Test Event | f106b634-038a-4587-8d33-c03c8017286d |
Event IDs vary by environment. Confirm current UAT event IDs via
GET https://uat.api2.cardgit.com/api/v1/eventsbefore running tests.
Feature Flag Defaults
| Feature | Default | Notes |
|---|---|---|
speed_networking |
Enabled | Gated per event |
announcements |
Enabled | Gated per event |
event_payment |
Enabled | Allows paid tickets |
event_feature_defaults |
Various | Per-feature defaults map |
Test Execution Order (Recommended)
- Confirm UAT environment is live:
GET https://uat.api2.cardgit.com/healthshould return{ "status": "ok" }. - Run global setup to create auth state files:
tests/e2e/global-setup.ts. - Execute in this order to avoid dependency failures:
chromium-public(auth flows, no pre-existing session)chromium-admin(requires saved admin session)chromium-frontend(requires saved user session)chromium-profile,chromium-matchmaking,chromium-darkmodechromium-sso,chromium-auth-modal,chromium-create-eventandroid-mobile-admin
Notes for Testers
- Stripe payments use test mode only. Use card
4242 4242 4242 4242with any future expiry. - Real-time features (messaging, Q&A, social wall) require WebSocket or SSE connectivity. Ensure the backend is running before testing these modules.
- Feature gates on events are controlled by admin. If a feature tab is missing, verify it is enabled in
/events/<id>/edit(Features step) or via/platform/feature-flags. - Speed Networking requires at least 2 registered participants to start a session.
- Certificates require the user to be checked in (attendance confirmed) before they can download.
- All password fields should be tested with a password manager auto-fill scenario to ensure
autocompleteattributes are set correctly. - For accessibility tests, supplement automated checks with manual testing using a screen reader (NVDA on Windows, VoiceOver on macOS).