CardGit Events — End-to-End Test Script

Version1.0
DateSeptember 3, 2026
Prepared forQA / Software Testing Team
PlatformFrontend · Admin · Backend API

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

  1. Test Environment & Setup
  2. Test Credentials
  3. Module 1 — Authentication
  4. Module 2 — Public Pages & Navigation
  5. Module 3 — Event Discovery (Frontend)
  6. Module 4 — Event Registration & Payment
  7. Module 5 — Event Detail Features
  8. Module 6 — Session Schedule
  9. Module 7 — Q&A (Questions)
  10. Module 8 — Polls
  11. Module 9 — Networking Hub
  12. Module 10 — Matchmaking
  13. Module 11 — Speed Networking
  14. Module 12 — Direct Messaging
  15. Module 13 — Social Wall
  16. Module 14 — Gamification (Leaderboard, Achievements, Challenges)
  17. Module 15 — Sponsors & Booths
  18. Module 16 — Surveys
  19. Module 17 — Certificates
  20. Module 18 — Photo Gallery & Highlights
  21. Module 19 — Group Chat
  22. Module 20 — Meeting Scheduler
  23. Module 21 — User Profile
  24. Module 22 — Admin — Login & Role Access
  25. Module 23 — Admin — Event Management
  26. Module 24 — Admin — Session Management
  27. Module 25 — Admin — Speaker Management
  28. Module 26 — Admin — Registration Management
  29. Module 27 — Admin — Check-In Portal
  30. Module 28 — Admin — Polls & Surveys Builder
  31. Module 29 — Admin — Moderation
  32. Module 30 — Admin — Announcements
  33. Module 31 — Admin — Analytics & Reports
  34. Module 32 — Admin — Sponsors Management
  35. Module 33 — Admin — Team Management
  36. Module 34 — Admin — Speed Networking (Admin)
  37. Module 35 — Admin — Certificates Management
  38. Module 36 — Admin — Data Exports
  39. Module 37 — Platform Admin — Dashboard & Health
  40. Module 38 — Platform Admin — Feature Flags
  41. Module 39 — Platform Admin — User Management
  42. Module 40 — Platform Admin — Organizations
  43. Module 41 — Platform Admin — Event Reports & Suspension
  44. Module 42 — Platform Admin — Email Queue
  45. Module 43 — API Health & Security
  46. Module 44 — Responsive Design & Mobile
  47. Module 45 — Accessibility
  48. Module 46 — Performance
  49. Module 47 — Error Handling & Edge Cases
  50. Module 48 — Ref Source Counter & Page View Tracking
  51. 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) and test-results/results.json (JSON)

2. Test Credentials

Role Name Email 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:

  1. Navigate to https://uat.events.cardgit.com/login.
  2. Verify the page title contains "CardGit Events".
  3. Verify email input field is visible and focusable.
  4. Verify password input field is visible.
  5. Verify "Sign In" / "Login" button is visible.
  6. Enter email: marcus@designstudio.co
  7. Enter password: password123
  8. Click the "Sign In" button.
  9. Wait for navigation.

Expected Results:

  • User is redirected to /events or 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:

  1. Navigate to https://uat.events.cardgit.com/login.
  2. Enter email: wrong@example.com
  3. Enter password: wrongpassword
  4. Click "Sign In".
  5. 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:

  1. Navigate to /login.
  2. Leave both fields empty.
  3. 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:

  1. Navigate to /register.
  2. Verify the registration form is visible.
  3. Fill in: Full Name = New Test User
  4. Fill in: Email = newuser_<timestamp>@test.com (unique)
  5. Fill in: Password = SecurePass123!
  6. Fill in: Confirm Password = SecurePass123!
  7. Click "Register" / "Create Account".
  8. Wait for response.

Expected Results:

  • User is redirected to /events or a verification prompt.
  • No error is displayed.
  • If email verification is required, a confirmation notice appears.

TC-AUTH-005 — Registration with duplicate email

Steps:

  1. Navigate to /register.
  2. Use an email that already exists: marcus@designstudio.co
  3. Fill in all other fields with valid data.
  4. 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:

  1. Trigger a registration to receive a verification email (or use a pre-existing token).
  2. Navigate to /email-verified?token=<valid_token>.
  3. Observe the page.

Expected Results:

  • Page confirms email verification success.
  • User is prompted to log in or is automatically redirected.

Steps:

  1. Obtain a valid magic-link token from the backend (via invite email or API).
  2. Navigate to /join/<token>.
  3. 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:

  1. Log in as any valid user.
  2. Locate the user avatar / menu in the navigation bar.
  3. Click on it and select "Logout" / "Sign Out".
  4. Observe the result.

Expected Results:

  • User is redirected to /login or /.
  • 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:

  1. Ensure the user is logged out.
  2. 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:

  1. Log in as a valid user.
  2. Hard-refresh the browser (Ctrl + Shift + R).
  3. 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:

  1. Navigate to https://uat.events.cardgit.com/ (not logged in).
  2. 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:

  1. Navigate to https://uat.events.cardgit.com/events without logging in.
  2. 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:

  1. 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:

  1. 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:

  1. Navigate to https://uat.events.cardgit.com/waitlist.
  2. Fill in the waitlist form with a valid email and name.
  3. 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:

  1. 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:

  1. Set viewport to 375×667 (iPhone SE).
  2. Navigate to https://uat.events.cardgit.com/.
  3. Locate the hamburger / menu icon.
  4. Click it.
  5. Verify menu items are visible.
  6. 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:

  1. Navigate to https://uat.events.cardgit.com/events.
  2. 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:

  1. On /events, locate the search input.
  2. Type a partial event name (e.g., "Tech").
  3. 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:

  1. On /events, click the "Upcoming" filter.
  2. Observe the list.
  3. Click "Past".
  4. Observe the list.
  5. 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:

  1. Log in as a user who has registered for at least one event.
  2. 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:

  1. Navigate to /events and click a free event.
  2. On the event detail page, click "Register Now".
  3. In the confirmation modal/dialog, confirm registration details.
  4. Click "Confirm Registration".
  5. 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:

  1. Navigate to /events/<event-id>/register.
  2. Select the "Early Bird" or "General Admission" ticket.
  3. Click "Proceed to Payment".
  4. Verify redirect to checkout.stripe.com.
  5. Fill in test card: 4242 4242 4242 4242, expiry 12/28, CVC 123.
  6. Fill in cardholder name and postal code.
  7. Click "Pay".
  8. 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:

  1. Start the paid registration flow (TC-REG-002 steps 1—4).
  2. On Stripe Checkout, click "Back" or "Cancel".
  3. 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 pending or is removed.

TC-REG-004 — Duplicate Registration Attempt

Steps:

  1. Log in as a user who is ALREADY registered for an event.
  2. 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>/register again shows an appropriate message.

TC-REG-005 — Event Check-In

Precondition: User is registered for the event.

Steps:

  1. Navigate to the event detail page for an event the user is registered for.
  2. Locate the "Check In" button.
  3. 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:

  1. Navigate to /events/<event-id>.
  2. 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:

  1. Navigate to /events/<event-id>.
  2. Click the share icon / "Share event" button.
  3. 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:

  1. 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:

  1. Navigate to /events/<event-id>/sponsors.
  2. 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:

  1. 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:

  1. Navigate to /events/<event-id>/sessions.
  2. 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:

  1. Navigate to /events/<event-id>/my-schedule.
  2. 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:

  1. On the sessions/schedule page, use the track filter dropdown or tabs.
  2. 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/qa lets attendees submit questions to speakers/hosts. Questions go through a moderation workflow: pendingapprovedanswered (or rejected). Only approved and answered questions are visible to all attendees by default. The page uses Socket.io for real-time updates (useQA hook) — 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:

  1. 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:

  1. Click in the textarea ("What would you like to know?").
  2. Type: "What are the key takeaways from this session?"
  3. Click "Submit Question".

Expected Results:

  • Button shows "Submitting…" while in flight.
  • API call POST /api/v1/questions is 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:

  1. Leave the question textarea empty.
  2. Observe the Submit button.

Expected Results:

  • "Submit Question" button is disabled (disabled attribute set).
  • Clicking it does nothing.

TC-QA-004 — Submit Question Anonymously

Steps:

  1. Type a question.
  2. Check the "Submit anonymously" checkbox.
  3. 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:

  1. 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:

  1. Click the "Approved" filter tab.

Expected Results:

  • Only questions with status: approved are shown.
  • Tab becomes active (gradient highlight).
  • API refetch is triggered with status=approved param.
  • Switching back to "All Questions" restores the full list.

TC-QA-007 — Filter Tab — Answered

Steps:

  1. Click the "Answered" filter tab.

Expected Results:

  • Only questions with status: answered are 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:

  1. Find an approved question in the list.
  2. Note the upvote count.
  3. Click the 👍 upvote button.
  4. 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>/upvote each time.

TC-QA-009 — Unauthenticated User Cannot Upvote

Steps:

  1. Log out.
  2. Navigate to /events/<event-id>/qa.
  3. Click the upvote button on a question.

Expected Results:

  • Toast: "Please sign in to upvote".
  • Upvote count does not change.
  • The upvote button has disabled styling (opacity-40, cursor-not-allowed).

TC-QA-010 — Answered Question Shows Answer Block

Steps:

  1. On the Q&A page, find a question with status: answered.
  2. 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:

  1. 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:

  1. Open the Q&A page as User A.
  2. 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:

  1. As an admin, approve a pending question via the moderation page.
  2. 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:

  1. 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:

  1. 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:

  1. On the polls page, find an active poll.
  2. Select an answer option.
  3. 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:

  1. 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:

  1. Navigate to https://uat.events.cardgit.com/networking or /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:

  1. On the Networking page, locate an attendee card.
  2. Click "Connect" or "Send Request".
  3. 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:

  1. Log in as the user who received a connection request.
  2. Navigate to the networking page or notification area.
  3. 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:

  1. 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:

  1. From the networking page, click on an attendee card.
  2. 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 signupRef acquisition sources: twitter, linkedin, whatsapp, email, 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:

  1. Navigate to /events/<event-id>/matchmaking.
  2. Wait up to 10 seconds for SSE connection.
  3. 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:

  1. 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:

  1. On the matchmaking page, click the "Like" / ✓ button on the first card.
  2. 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>/matches with a "Matched" or confirmed badge.

TC-MATCH-004 — Pass (Swipe Left) a Match

Steps:

  1. 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:

  1. Pass on a card.
  2. Click the "Rewind" / undo button.

Expected Results:

  • The previously dismissed card reappears.
  • API call POST /matchmaking/v2/matches/<id>/rewind succeeds (HTTP 200).
  • Rewind button becomes inactive after use (one rewind at a time).

TC-MATCH-006 — Regenerate Matches

Steps:

  1. Click "Refresh Matches" or "Regenerate" on the matchmaking page.

Expected Results:

  • A fresh set of candidate cards is fetched (?regenerate=true query 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:

  1. Log in as User A in Browser 1; navigate to matchmaking for the event.
  2. Log in as User B in Browser 2; navigate to matchmaking for the same event.
  3. User A likes User B.
  4. 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>/matches for both users immediately.
  • Connection summary page /events/<event-id>/connections shows the new connection with source badge "Smart Match".

TC-MATCH-008 — Confirmed Matches List

Steps:

  1. 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:

  1. 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:

  1. Navigate to the matchmaking page; confirm Connected indicator.
  2. Disable the network (DevTools → Network → Offline).
  3. Observe the indicator.
  4. 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:

  1. 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:

  1. 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:

  1. Stay on the speed-networking lobby page.
  2. 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:

  1. 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:

  1. 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:

  1. During a round, click "I want to connect" / interest button.
  2. The paired attendee also clicks the same button.

Expected Results:

  • Both parties see a "🎉 It's a match!" notification (via WebSocket matchmaking:mutualMatch event).
  • The connection appears in /events/<event-id>/connections with source badge "Speed Network".
  • No page reload is required.

TC-SN-007 — Round Progression (Next Round)

Steps:

  1. 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:

  1. After all rounds complete (or admin ends the session).
  2. 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:

  1. 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:

  1. 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:

  1. Open a conversation.
  2. Type in the message input: "Hello from the QA test!"
  3. 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:

  1. Log in as User A in Browser 1 and User B in Browser 2.
  2. User A sends a message to User B.
  3. 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 /social standalone) 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:

  1. 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:

  1. Type in the compose textarea: "Really enjoying this event! Great sessions so far."
  2. Click "Post".

Expected Results:

  • Button shows "Posting…" while in flight.
  • API call POST /api/v1/gamification/social-wall with { 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:

  1. Type exactly 500 characters in the composer textarea.
  2. Observe the counter.
  3. 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:

  1. Type a post in the textarea.
  2. Press Ctrl+Enter (Windows) or Cmd+Enter (Mac).

Expected Results:

  • Post is submitted without clicking the Post button.

TC-SOC-005 — Post Emoji Picker — Open, Browse, Select

Steps:

  1. 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:

  1. Open the emoji picker. Type rocket in 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:

  1. Open the emoji picker.
  2. Click outside the picker panel and emoji button.

Expected Results:

  • Picker closes without inserting anything.

TC-SOC-008 — Post Card Layout

Steps:

  1. 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:

  1. Click the Like button on a post.
  2. Click it again.

Expected Results:

  • First click: button turns blue/filled with "Like" label; like count increments; API call POST .../like with { reaction: "👍" }.
  • Second click: button returns to grey; count decrements; unlike registered.

TC-SOC-010 — LinkedIn-Style Reaction Picker (Hover)

Steps:

  1. 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:

  1. Hover the Like button to open the picker.
  2. 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:

  1. 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:

  1. Open comments. Type "Great point!" in the input. Press Enter or click Send.

Expected Results:

  • Comment appears immediately. commentCount increments. Input clears.
  • API call POST .../comment with { content }.

TC-SOC-014 — Comment Emoji Picker

Steps:

  1. 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:

  1. Find a post authored by the logged-in user.
  2. 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:

  1. 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:

  1. 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.

Steps:

  1. 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:

  1. 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:

  1. User B comments on a post, then likes a post.
  2. 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:

  1. 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 the gamification feature 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:

  1. 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:

  1. 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:

  1. 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:

  1. 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:

  1. 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:

  1. 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:

  1. 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:

  1. User A has the leaderboard open.
  2. 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:

  1. 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:

  1. 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:

  1. 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:

  1. Click the Earned tab.
  2. Click the Locked tab.
  3. 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:

  1. 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:

  1. Find a locked achievement that has been partially progressed.
  2. 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.
  • pct shown on the mini progress ring.

TC-GAM-016 — Achievements — Tier Card and Progress

Steps:

  1. Observe the tier card on the Achievements page.
  2. 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:

  1. 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:

  1. 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:

  1. Click Active filter tab.
  2. Click Completed.
  3. Click Expired.
  4. 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:

  1. 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:

  1. 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:

  1. Open a manual challenge (Scavenger Hunt or Sponsor Challenge) with uncompleted steps.
  2. 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>/progress with { 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:

  1. 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:

  1. 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:

  1. Find a challenge whose end date has passed.
  2. 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:

  1. 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:

  1. 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.
  2. 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:

  1. 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:

  1. Click "Visit Booth" for a sponsor.
  2. 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:

  1. 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:

  1. Click on an available survey.
  2. Answer all questions (various types: text, rating, multiple choice).
  3. 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:

  1. Navigate to /events/<event-id>/certificate.
  2. (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:

  1. 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.

Steps:

  1. 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:

  1. 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:

  1. 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:

  1. In the group chat, type: "Hello everyone!"
  2. 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:

  1. 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:

  1. Click "Schedule a Meeting".
  2. Select an attendee from the list.
  3. Choose a time slot.
  4. 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/profile has 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 uses https://uat.api2.cardgit.com/api/v1/auth/me on 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:

  1. 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:

  1. Navigate to /profile.
  2. 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:

  1. Click the Networking tab.
  2. Check the URL.
  3. Click the Privacy tab.
  4. 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:

  1. 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:

  1. 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:

  1. 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:

  1. Click "Edit Profile".
  2. Change the First name field.
  3. 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:

  1. Click "Edit Profile".
  2. Update First name to Sarah.
  3. Click the Save/submit button.
  4. Wait for the response.

Expected Results:

  • API call PUT /api/v1/auth/me is 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:

  1. Click the camera icon on the avatar in the hero banner.
  2. 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/avatar is 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:

  1. Try to upload a file > 1 MB.
  2. 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:

  1. Note the current completeness percentage.
  2. Fill in a field that was previously empty (e.g. add a bio on the Networking tab and save).
  3. 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:

  1. Click the Networking tab.

Expected Results:

  • The following fields are visible:
    • Bio textarea (placeholder contains "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
  • A "Save Networking Profile" button is visible.

TC-PROF-013 — Networking Tab — Bio Character Counter

Steps:

  1. Click on the Bio textarea.
  2. 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:

  1. Click in the Interests tag input.
  2. Type TypeScript and press Enter.
  3. Type React and press comma.

Expected Results:

  • TypeScript appears as a pill chip after pressing Enter.
  • React appears 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:

  1. Add at least one interest tag.
  2. 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:

  1. 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:

  1. Open the suggestions panel on Interests.
  2. Type react in 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:

  1. 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:

  1. Click the Industry dropdown button.
  2. Type fintech in the search input inside the dropdown.
  3. 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:

  1. Click the Country dropdown.
  2. Type united in the search.
  3. 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:

  1. 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:

  1. Fill in Bio, Company, Job Title, and at least one Interest.
  2. Click "Save Networking Profile".

Expected Results:

  • API call PUT /api/v1/auth/me/networking-profile is made.
  • Toast: "Networking profile updated".
  • Profile completeness bar increases if new fields were filled.

TC-PROF-023 — Notifications Tab — Four Channels Present

Steps:

  1. 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-checked attribute.
  • Toggle buttons have role="switch".

TC-PROF-024 — Notifications Tab — Toggle Flips State

Steps:

  1. Note the initial aria-checked value of the Email toggle.
  2. Click the Email toggle.

Expected Results:

  • aria-checked changes from "true" to "false" (or vice versa).
  • Toggle button colour changes: indigo (enabled) ↔ grey (disabled).

TC-PROF-025 — Notifications Tab — Quiet Hours

Steps:

  1. 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:

  1. Toggle the SMS notification off (if currently on).
  2. Click "Save Preferences".

Expected Results:

  • API call PUT /api/v1/auth/me/notification-preferences is made.
  • Toast: "Saved".
  • After reload, the SMS toggle reflects the saved state.

TC-PROF-027 — Privacy Tab — Section Structure

Steps:

  1. 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:

  1. On the Privacy tab, find the Do Not Disturb toggle.
  2. Ensure it is off.
  3. 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:

  1. Change the Profile Visibility setting (e.g. from "Public" to "Connections Only").
  2. 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:

  1. Change a privacy setting.
  2. Click "Save Privacy Settings".

Expected Results:

  • API call PUT /api/v1/auth/me with { profileVisibility: "..." } is made.
  • Toast: "Privacy settings saved".
  • Setting persists after page reload.

TC-PROF-031 — Mobile — Hero and Tabs Visible (390px)

Steps:

  1. Set viewport to 390×844.
  2. 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:

  1. At 390px viewport, click the Networking tab.
  2. 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:

  1. At 390px viewport, click "Edit Profile".
  2. 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:

  1. From the networking page or a match card, click on another attendee's name.
  2. 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:

  1. Navigate to https://uat.events-admin.cardgit.com/login.
  2. Enter email: sarah@techcorp.io / password: password123.
  3. 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:

  1. Navigate to https://uat.events-admin.cardgit.com/login.
  2. Enter email: admin@cardgit.com / password: admin123.
  3. 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:

  1. Log in as an Organizer (sarah@techcorp.io).
  2. 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:

  1. Log in with a user who has the CHECKIN role.
  2. 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:

  1. Log in as Organizer.
  2. Navigate to /events in 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/new has 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 calls POST /api/v1/events to 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:

  1. 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:

  1. 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)
  2. 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:

  1. On Step 1, leave the Title field empty.
  2. 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:

  1. Fill in a title and description but leave both Start Date and End Date empty.
  2. 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:

  1. Set Event Duration to "Multi-Day".
  2. Set Start Date to 2027-06-15T10:00.
  3. Set End Date to 2027-06-14T10:00 (before the start).
  4. 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:

  1. Complete Step 1 (title, description, dates).
  2. Click "Next Step" to advance to Step 2 (Venue).
  3. On Step 2, click "Next Step" again to advance to Step 3 (Branding).
  4. Wait up to 10 seconds.

Expected Results:

  • During the Step 1→2 transition: POST /api/v1/events is called automatically with status: '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:

  1. Complete Steps 1 and 2 to trigger the auto-draft.
  2. 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:

  1. On Step 3 (Branding), change the Primary Color to #e11d48.
  2. 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:

  1. Navigate to Step 4 (Registration).
  2. Click the "🥗 Dietary Requirements" Quick Add chip.
  3. 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:

  1. Navigate to Step 5 (Features).
  2. Toggle Social Wall off.
  3. 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:

  1. Navigate through all 6 steps filling in data.
  2. 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:

  1. Complete all 6 steps.
  2. On the Review step, click "Save as Draft".
  3. Wait for navigation.

Expected Results:

  • PUT /api/v1/events/<draft-id> (or POST if auto-draft failed) with all form data and status: '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:

  1. Complete all 6 steps.
  2. On the Review step, click "Publish".
  3. 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-created email is enqueued (verifiable via GET /api/v1/email-queue?emailType=event-created).

TC-ADM-EVT-002N — Create Event — Save Draft on Intermediate Step (Steps 1–5)

Steps:

  1. On Step 1, fill in title and dates only.
  2. Click "Save Draft" (without advancing to Review).

Expected Results:

  • POST /api/v1/events is called with status: '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:

  1. Complete Step 1 (title, description, dates).
  2. Click "Next Step" to advance to Step 2.
  3. Click "Back".
  4. 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:

  1. On Step 1, change Event Type to "Virtual".
  2. 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/edit uses the same 6-step wizard as Create Event (Basic Info → Venue → Branding → Registration → Features → Review), but pre-populated with the event's saved data via eventToFormData(). A cross-org banner blocks editing when an ADMIN views another org's event. Changes are saved via PUT /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:

  1. Navigate to /events/<event-id>/edit.
  2. 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:

  1. On the Edit Event wizard (Step 1), click "Next Step".
  2. Continue through Steps 2–5 clicking "Next Step" each time.
  3. 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:

  1. On the Edit Event wizard (Step 2 — Venue), make a change (e.g. update the venue city).
  2. 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:

  1. 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:

  1. Navigate to Step 2 (Venue).
  2. Change Privacy from "Public" to "Private".
  3. Observe the Invite Code field.
  4. Try to advance to Step 3 without entering an invite code.
  5. Enter an invite code of only 3 characters and try to advance.
  6. 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:

  1. Navigate to Step 3 (Registration).
  2. Click "Add Field".
  3. Fill in the label, change the type to "Dropdown (single choice)", and add options (one per line).
  4. Click the "🥗 Dietary Requirements" Quick Add chip.
  5. 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:

  1. On Step 3, check "Require Approval".
  2. Observe the new field that appears.
  3. 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:

  1. Navigate to Step 4 (Features).
  2. Toggle Social Wall on.
  3. Observe the sub-option that appears.
  4. 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:

  1. Navigate to Step 6 (Review).
  2. Inspect all four summary panels.
  3. 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:

  1. Navigate to Step 6 (Review) of a draft event.
  2. 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:

  1. 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:

  1. Navigate to Step 2 → then Step 3 (Branding, index 2 in Edit).
  2. Change the Primary Color using the colour picker.
  3. Enter a custom hex #e11d48 in the hex input.
  4. 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:

  1. On the event detail page, find a DRAFT event.
  2. Click "Publish".
  3. 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:

  1. On the events list, click the delete (🗑) action for an event.
  2. 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:

  1. 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:

  1. Navigate to /events/<event-id>/schedule or /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:

  1. Navigate to /sessions/new.
  2. 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
  3. 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:

  1. Click edit on an existing session.
  2. Update the session title.
  3. 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/schedule is a drag-and-drop calendar grid (07:00–22:00, 30-min slots). It requires an owner or admin host 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:

  1. 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:

  1. On the Schedule Builder, observe the date selector dropdown.
  2. 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:

  1. Locate a session block in the grid.
  2. Drag it by the GripVertical handle to a different 30-min slot in the same or a different track column.
  3. 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:

  1. Move a session (TC-ADM-SES-004C).
  2. Click "Save Changes".

Expected Results:

  • Button shows "Saving…" while in flight.
  • PUT /api/v1/sessions/<id> is called for each moved session with updated startTime, 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:

  1. Hover over a session block until the resize handle appears at the bottom.
  2. Drag the bottom edge downward by 2 slots (1 hour).
  3. Release.

Expected Results:

  • Session block height extends live during drag.
  • On release: endTime is 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:

  1. Drag a session to overlap with another session in the same track column.
  2. 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:

  1. Ensure two sessions in the same track have overlapping time ranges.
  2. 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:

  1. Click the Zoom In (+) button 3 times.
  2. Click the Zoom Out (−) button 6 times.

Expected Results:

  • Each Zoom In click increases slotHeightPx by 8 (max 96px).
  • Each Zoom Out click decreases slotHeightPx by 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:

  1. Click a session block to select it.
  2. 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:

  1. Select 2 sessions (TC-ADM-SES-004I).
  2. Click the "N selected" dropdown → choose "Delete selected".
  3. Confirm in the browser dialog.

Expected Results:

  • Dialog: "Delete 2 sessions?"
  • On confirm: POST /api/v1/sessions/bulk with { 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:

  1. Select 1 or more sessions.
  2. Click the "N selected" dropdown → "Move to track…".
  3. Enter a valid track name in the window.prompt.

Expected Results:

  • POST /api/v1/sessions/bulk with { 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:

  1. Click "Import CSV" in the toolbar.
  2. 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
    
  3. Observe the preview.
  4. 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-csv with { rows: [...] }.
  • Toast: "Imported 1 sessions".
  • Modal closes; schedule refreshes with the new session.

TC-ADM-SES-004M — CSV Import — Invalid CSV

Steps:

  1. Open CSV Import modal.
  2. Paste CSV with only a header row and no data rows.
  3. 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:

  1. Hover over a session block.
  2. Click the Trash2 delete button that appears.
  3. 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:

  1. 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:

  1. 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:

  1. Set viewport to 390×844 (mobile).
  2. 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:

  1. 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:

  1. Click "Add Speaker".
  2. Fill in: Name, Title, Company, Bio.
  3. Upload a headshot image.
  4. 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:

  1. 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:

  1. On the registrations page, find a registration with "Pending" status.
  2. Click "Approve".
  3. Confirm.

Expected Results:

  • Status changes to "Approved".
  • Attendee receives a confirmation notification/email.

TC-ADM-REG-003 — Cancel a Registration

Steps:

  1. On the registrations page, find an approved registration.
  2. Click "Cancel" / "Revoke".
  3. 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:

  1. Navigate to /checkin or /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:

  1. On the check-in portal, search for an attendee by name or email.
  2. Locate the attendee in results.
  3. Click "Check In".
  4. 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:

  1. Navigate to /events/<event-id>/polls/new.
  2. Enter poll question: "Which session was your favourite?"
  3. Add 3 options: "Keynote", "Workshop A", "Workshop B".
  4. Set the poll to "Open".
  5. 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:

  1. On the poll management page, find an open poll.
  2. 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:

  1. Navigate to /events/<event-id>/surveys/new.
  2. Add a title: "Post-Event Feedback Survey".
  3. 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?"
  4. 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:

  1. 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:

  1. On the Q&A moderation page, find a pending question.
  2. 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:

  1. Click "Hide" or "Remove" on a question.
  2. 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:

  1. Navigate to /events/<event-id>/moderation/social.
  2. Find a post.
  3. Click "Remove Post".
  4. 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. Only owner and admin event-host roles can compose; platform admins viewing a cross-org event see a "View Only" banner and a locked "New Announcement" button. The announcements feature must be enabled via Feature Flags for the page to be accessible.

Field Detail
Priority High
URL https://uat.events-admin.cardgit.com/announcements

Steps:

  1. Log in as sarah@techcorp.io.
  2. Locate the Announcements link in the admin sidebar.
  3. 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).

Steps:

  1. On /announcements, click the event picker dropdown.
  2. Type zzz_no_match in the search input.
  3. Clear the search and type a real event name.

Expected Results:

  • Dropdown opens with a search input (placeholder contains "Search events").
  • Typing zzz_no_match shows 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:

  1. Select an event from the picker dropdown.
  2. 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:

  1. 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:

  1. 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:

  1. Open the compose form.
  2. 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:

  1. Open the compose form.
  2. 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:

  1. Open the compose form.
  2. Uncheck Email by clicking its label.
  3. Observe.
  4. 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:

  1. Open the compose form.
  2. Leave Title empty, fill in Message.
  3. Click "Send to All Attendees".
  4. Then fill Title but clear Message.
  5. 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:

  1. Open the compose form.
  2. Fill in Title: "QA Test — Lunch Break at 12:30".
  3. Fill in Message: "Important: Lunch is served in Hall B. See you there!".
  4. Set Priority to High.
  5. Set Type to General.
  6. Ensure both Email and In-App channels are checked.
  7. Click "Send to All Attendees".
  8. Wait for the response.

Expected Results:

  • "Send to All Attendees" button shows "Sending…" while in flight.
  • API call POST /api/v1/notifications/announcements is 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:

  1. 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:

  1. 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:

  1. Open the detail panel (TC-ADM-ANN-012).
  2. 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:

  1. Create announcements with each of the 4 priority levels: Low, Normal, High, Critical.
  2. 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:

  1. Send an announcement with markdown: **Bold text** and _italic_\n\n- Item 1\n- Item 2.
  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:

  1. Navigate to /events/<cross-org-event-id>/announcements.
  2. 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:

  1. Open the compose form.
  2. Fill in Title and Message.
  3. 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:

  1. Open the compose form.
  2. 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:

  1. As admin, send an announcement with In-App channel enabled.
  2. Log in as a registered attendee on the frontend.
  3. Navigate to https://uat.events.cardgit.com/events/<event-id>.
  4. 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:

  1. Send an announcement with Email channel enabled.
  2. Check the email queue: GET https://uat.api2.cardgit.com/api/v1/email-queue?emailType=announcement-email.

Expected Results:

  • An announcement-email row appears in the email queue.
  • Status is pending, processing, or sent.
  • Subject contains the announcement title.
  • toAddress matches 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:

  1. Navigate directly to /events/<event-id>/announcements.

Expected Results:

  • Access is denied.
  • User is redirected to /events (the Navigate 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:

  1. 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:

  1. Click on an event from the analytics landing.
  2. 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:

  1. 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:

  1. 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:

  1. 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:

  1. Click "Add Sponsor".
  2. Fill in: Name, Website, Tier (Gold), Description.
  3. Upload a logo.
  4. 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:

  1. 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:

  1. Click "Invite Host".
  2. Enter an email for an existing account.
  3. Select a role (e.g., Moderator).
  4. 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:

  1. Click "Invite Host".
  2. Enter an email that is NOT registered: nobody@nonexistent.test
  3. 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:

  1. 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.

Steps:

  1. 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:

  1. Navigate to /events/<event-id>/speed-networking in 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:

  1. Click "New Session".
  2. 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
  3. 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:

  1. Click "New Session".
  2. Leave Session Name empty.
  3. 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:

  1. Click "New Session".
  2. 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:

  1. Find a session with DRAFT status and at least 2 registered participants.
  2. 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:

  1. Find an ACTIVE session.
  2. Click "End".
  3. Confirm.

Expected Results:

  • Session status changes to COMPLETED.
  • "Results" button becomes visible.

TC-ADM-SN-007 — View Session Results

Steps:

  1. Find a COMPLETED session.
  2. 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:

  1. 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-card lets 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 to events.attendanceCardTemplate via PUT /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:

  1. 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:

  1. Click the Classic category pill.
  2. Observe the grid.
  3. 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:

  1. Click on any template card (e.g. "Tech — Circuit").
  2. 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:

  1. Hover over any template card.
  2. 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:

  1. 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:

  1. Click the primary colour swatch (or use the hex input).
  2. Change it to #e11d48 (red).
  3. 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:

  1. Click the hex text field next to the primary colour picker.
  2. Type a valid hex value: #10b981.
  3. 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:

  1. Select a new template (e.g. "Elegant — Gold").
  2. Change the primary colour.
  3. 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:

  1. Select a different template.
  2. Navigate away using the back arrow without saving.
  3. 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:

  1. Save a template (TC-ADM-CERT-009).
  2. 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:

  1. Log in as a registered attendee.
  2. Navigate to the event detail page.
  3. 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:

  1. Open the attendance card modal (TC-ADM-CERT-012).
  2. 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:

  1. Open the attendance card modal.
  2. Wait for generation to complete.
  3. 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:

  1. Open the card modal.
  2. 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:

  1. Open the card modal.
  2. 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:

  1. Open the card modal in an environment where image loading may fail (e.g. avatar or logo URL is broken).
  2. 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:

  1. Log in as a user with no profile avatar set.
  2. 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:

  1. Navigate to the registration page for an event with Requires Approval enabled.
  2. Complete registration.
  3. 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:

  1. Complete a paid registration (TC-REG-002).
  2. On the /events/<event-id>/payment/success page.

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:

  1. Navigate to /events/<event-id> in the admin app.
  2. 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:

  1. Navigate to /exports or /events/<event-id>/exports.
  2. Select export type: "Registrations".
  3. Choose format: CSV.
  4. 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:

  1. Select export type: "Attendees" (checked-in attendees).
  2. 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:

  1. Navigate to /platform/dashboard or /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:

  1. 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:

  1. 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:

  1. Navigate to /platform/jobs.

Expected Results:

  • Jobs dashboard loads showing queue names and counts (waiting, active, completed, failed).
  1. Click on a queue name.
  2. 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-flags has two tabs:

  • Platform Flags — global platform-level toggles stored in the feature_flags table. Each flag has a key, name, description, enabled state, optional rollout percentage, and optional target audience. The API is GET/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_defaults row. The API is GET/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. The FeatureGate component 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:

  1. Log in as admin@cardgit.com.
  2. 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.

Steps:

  1. On the Platform Flags tab, type payment in 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:

  1. Note the current state of the event_payment flag (or any platform flag).
  2. Click its toggle button.
  3. Wait 1 second for the save to complete.
  4. Observe the toast notification and the toggle state.
  5. Reload the page.
  6. 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>" enabled or "<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:

  1. 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:

  1. If a flag has a targetAudience value set, observe its card.

Expected Results:

  • A sky-blue badge shows the target audience label.

TC-PLT-FLAG-006 — Event Features Tab Loads

Steps:

  1. 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:

  1. 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:

  1. On the Event Features tab, navigate to the Content category.
  2. Find the Photo Gallery feature (key: gallery) — note its current state (should be enabled).
  3. Click its toggle to disable it.
  4. Wait for the save confirmation.
  5. Observe the toast.

Expected Results:

  • Toggle switches to disabled state immediately.
  • API call PUT /platform/event-feature-defaults is 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:

  1. As an attendee, navigate to https://uat.events.cardgit.com/events/<event-id>/gallery.

Expected Results:

  • User is not shown the Photo Gallery page.
  • FeatureGate redirects 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:

  1. Return to /platform/feature-flags → Event Features tab → Content.
  2. Toggle Photo Gallery back on.
  3. Verify the toast.
  4. 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:

  1. Send GET https://uat.api2.cardgit.com/api/v1/flags with no Authorization header.

Expected Results:

  • HTTP 200.
  • Response shape: { "status": "success", "data": { "flags": { ... }, "eventFeatureDefaults": { ... } } }.
  • flags object contains platform-level flag keys with boolean values (e.g. { "event_payment": true, "speed_networking": true }).
  • eventFeatureDefaults object 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:

  1. On the Platform Flags tab, find and disable the event_payment flag.
  2. Navigate to https://uat.events.cardgit.com/events/<paid-event-id>/register.
  3. Observe the ticket selection.
  4. Re-enable event_payment after the test.

Expected Results:

  • With event_payment disabled: only free ticket types are shown; paid tickets are hidden from the registration page.
  • With event_payment re-enabled: paid tickets reappear.

TC-PLT-FLAG-013 — Organiser Cannot Access Feature Flags Page

Steps:

  1. Log in as sarah@techcorp.io (Organiser).
  2. 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:

  1. Log in as Organiser. Navigate to /events/<event-id>/edit.
  2. Go to the Features step of the edit wizard.
  3. Toggle Social Wall off for this specific event.
  4. Save.
  5. Navigate to https://uat.events.cardgit.com/events/<event-id>/social.

Expected Results:

  • The event-level featuresEnabled.socialWall is saved as false.
  • Navigating to /events/<event-id>/social redirects 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:

  1. 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:

  1. Navigate to /platform/users or /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:

  1. On the users page, type marcus in 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:

  1. Click on a user record.
  2. Change their role (e.g., from Attendee to Organiser).
  3. 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:

  1. 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:

  1. 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:

  1. 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:

  1. Click on a reported event row.
  2. 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:

  1. On a pending report, click "Suspend Event".
  2. 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:

  1. 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:

  1. Navigate to /email-queue or /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:

  1. Send GET https://uat.api2.cardgit.com/health.

Expected Results:

  • HTTP 200 response.
  • Response body: { "status": "ok" }.

TC-API-002 — API Base Responds

Steps:

  1. 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:

  1. Send GET https://uat.api2.cardgit.com/api/v1/events without an Authorization header.

Expected Results:

  • HTTP 200 (public events) or HTTP 401.
  • Not HTTP 500 or 403.

TC-API-004 — Login Endpoint — Valid Credentials

Steps:

  1. Send POST https://uat.api2.cardgit.com/api/v1/auth/login with body:
    { "email": "marcus@designstudio.co", "password": "password123" }
    

Expected Results:

  • HTTP 200.
  • Response contains token and user object.

TC-API-005 — Login Endpoint — Invalid Credentials

Steps:

  1. Send POST https://uat.api2.cardgit.com/api/v1/auth/login with wrong credentials.

Expected Results:

  • HTTP 401 or 400.
  • No token in the response.

TC-API-006 — CORS Headers

Steps:

  1. Send GET https://uat.api2.cardgit.com/api/v1/events with header Origin: https://uat.events.cardgit.com.

Expected Results:

  • Response includes Access-Control-Allow-Origin header.
  • Value is https://uat.events.cardgit.com or *.

TC-API-007 — Stripe Webhook Endpoint Reachable

Steps:

  1. Send POST https://uat.api2.cardgit.com/api/v1/payments/webhook with header stripe-signature: invalid and body {}.

Expected Results:

  • HTTP 400 (signature rejected) — not 404.
  • Endpoint is reachable.

TC-API-008 — 404 for Unknown Route

Steps:

  1. 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:

  1. Send POST https://uat.api2.cardgit.com/api/v1/client-errors with:
    { "message": "Test error from QA", "url": "https://uat.events.cardgit.com/" }
    

Expected Results:

  • HTTP 204 (no content).
  • Error is logged to frontend-errors.log on the server.

TC-API-010 — Image Proxy — Disallowed Host

Steps:

  1. 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:

  1. Set viewport to 375×667.
  2. 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:

  1. Set viewport to 768×1024.
  2. 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:

  1. Set viewport to 1920×1080.
  2. 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:

  1. Set viewport to 390×844.
  2. 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:

  1. Navigate to https://uat.events.cardgit.com/.
  2. 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:

  1. Navigate to /login.
  2. Inspect all input elements.

Expected Results:

  • All form inputs have associated <label> elements (visible or aria-label).
  • email and password inputs have descriptive labels.

TC-ACC-003 — Image Alt Text

Steps:

  1. Navigate to https://uat.events.cardgit.com/.
  2. Inspect all <img> elements.

Expected Results:

  • All images have an alt attribute (can be empty string for decorative images, but must be present).
  • Meaningful images have descriptive alt text.

TC-ACC-004 — Keyboard Navigation

Steps:

  1. Navigate to /login.
  2. Press Tab to 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.

Steps:

  1. Navigate to https://uat.events.cardgit.com/.
  2. 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:

  1. Inspect the admin sidebar navigation.

Expected Results:

  • Navigation is wrapped in a <nav> element or has role="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:

  1. Record the start time.
  2. Navigate to https://uat.events.cardgit.com/.
  3. Wait for networkidle.
  4. Record the end time.

Expected Results:

  • Total load time < 5 seconds on UAT.

TC-PERF-002 — Events Page Load Time (Authenticated)

Steps:

  1. Log in.
  2. Record start time.
  3. Navigate to /events and wait for networkidle.

Expected Results:

  • Load time < 5 seconds.

TC-PERF-003 — API Response Time

Steps:

  1. Send GET https://uat.api2.cardgit.com/api/v1/events.
  2. Measure response time.

Expected Results:

  • Response received within 3 seconds.

TC-PERF-004 — Admin Dashboard Load Time

Steps:

  1. Log in to admin app.
  2. Navigate to /.
  3. Wait for networkidle.

Expected Results:

  • Load time < 5 seconds.

TC-PERF-005 — Web Vitals (LCP, CLS)

Steps:

  1. Open DevTools Performance panel.
  2. Load https://uat.events.cardgit.com/ with performance recording.
  3. 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:

  1. Log in and navigate to /events.
  2. Set the browser context to offline (DevTools → Network → Offline).
  3. Attempt to navigate to another page.
  4. Restore network connectivity.
  5. 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:

  1. 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:

  1. Log in and store the session token.
  2. Manually expire or invalidate the token in localStorage.
  3. Attempt to navigate to a protected page.

Expected Results:

  • User is logged out automatically.
  • Redirect to /login occurs.
  • No unhandled error is thrown in the console.

TC-ERR-004 — Malformed API Request

Steps:

  1. Send POST https://uat.api2.cardgit.com/api/v1/auth/login with 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:

  1. Navigate to /events/<event-id>/polls for 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:

  1. Open two browser tabs with the same user account.
  2. On both tabs, navigate to the same free event's registration page.
  3. 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 fires POST /api/v1/analytics/events/:eventId/pageview with the ?ref= query parameter. Valid ref values are: twitter, linkedin, whatsapp, email, direct, qr. The admin's Public Event URL Card (on the event detail page) reads GET /analytics/events/:eventId/pageviews and displays a total page view count plus a per-source breakdown. The same ?ref= value is stored as signupRef on 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:

  1. Note the current total page view count for an event (check the Public Event URL Card in admin or query the API).
  2. In an incognito/private window (or a different browser), navigate to https://uat.events.cardgit.com/e/<event-slug>.
  3. Return to the admin event detail page.
  4. 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:

  1. Navigate to https://uat.events.cardgit.com/e/<event-slug>?ref=twitter.
  2. Wait for the page to load (the page view fires on mount).
  3. In the admin app, navigate to the event detail page.
  4. 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:

  1. Navigate to https://uat.events.cardgit.com/e/<event-slug>?ref=linkedin.
  2. 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:

  1. Navigate to https://uat.events.cardgit.com/e/<event-slug>?ref=whatsapp.
  2. Check the admin source breakdown.

Expected Results:

  • "WhatsApp" counter increments by 1.

TC-REF-005 — Organic (No Ref) Page View

Steps:

  1. Navigate to https://uat.events.cardgit.com/e/<event-slug> with no ?ref= parameter.
  2. Check the admin source breakdown.

Expected Results:

  • "Organic" counter increments (backend coalesces NULL ref to 'organic').

TC-REF-006 — Invalid Ref Value Is Ignored at Registration

Field Detail
Priority Security

Steps:

  1. Navigate to https://uat.events.cardgit.com/e/<event-slug>?ref=malicious_source.
  2. Register or sign up via the modal that opens.

Expected Results:

  • The signupRef is 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:

  1. Navigate to https://uat.events.cardgit.com/e/<event-slug>?ref=linkedin.
  2. Click "Register" / "Get Tickets".
  3. 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:

  1. Navigate to the admin event detail page for a published event.
  2. Locate the "Public Event URL" card component.
  3. 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:

  1. On the admin event detail page, locate the Public Event URL card.
  2. 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:

  1. As an attendee on the event detail page, click the share icon.
  2. 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:

  1. Without any Authorization header, 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:

  1. Create a brand-new event that has had no page views.
  2. Navigate to its admin detail page.
  3. Observe the Public Event URL card.

Expected Results:

  • Total shows 0 or 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/handoff to get a one-time token, then redirects the browser to https://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 admin ProtectedRoute after redemption.

TC-SSO-001 — Create Event Button Hidden from Unauthenticated Users

Steps:

  1. Without logging in, navigate to https://uat.events.cardgit.com/events.
  2. Observe the navbar.

Expected Results:

  • "Create Event" button is not visible.

TC-SSO-002 — Create Event Button Visible to Authenticated Users (Desktop)

Steps:

  1. Log in as marcus@designstudio.co.
  2. 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:

  1. Set viewport to 390x844.
  2. Log in as marcus@designstudio.co.
  3. 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:

  1. Log in as sarah@techcorp.io (Organiser).
  2. Open browser DevTools Network tab.
  3. Click "Create Event".

Expected Results:

  • POST https://uat.api2.cardgit.com/api/v1/auth/handoff request 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:

  1. Log in as sarah@techcorp.io on the frontend.
  2. Click "Create Event".
  3. 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:

  1. Complete the SSO flow (TC-SSO-004).
  2. 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:

  1. Navigate to https://uat.events-admin.cardgit.com/?handoff=not-a-real-token.
  2. Wait 2 seconds.

Expected Results:

  • Redirect to /login. No ?handoff= in URL.

TC-SSO-008 — Expired UUID Token Falls Back to Login

Steps:

  1. 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:

  1. Navigate to https://uat.events-admin.cardgit.com/login.
  2. 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 localStorage key cardgit-theme; admin uses cardgit-admin-theme. Valid values: 'light', 'dark', 'system'. An inline script applies the dark CSS class to <html> before first paint. Toggle button has data-testid="theme-toggle".

TC-DARK-001 — Theme Toggle Button Exists in Frontend Navbar

Steps:

  1. Navigate to https://uat.events.cardgit.com/.
  2. Locate [data-testid="theme-toggle"].

Expected Results:

  • Toggle button is visible in the navigation bar.

TC-DARK-002 — Toggle Enables Dark Mode

Steps:

  1. Confirm light mode active (dark class absent on <html>).
  2. Click the theme toggle.

Expected Results:

  • dark class added to <html>.
  • Background colour changes (rgb(249,250,251) to rgb(3,7,18)).
  • localStorage['cardgit-theme'] set to 'dark'.

TC-DARK-003 — Toggle Twice Returns to Light Mode

Steps:

  1. Click toggle (light to dark).
  2. Click again (dark to light).

Expected Results:

  • dark class removed. localStorage['cardgit-theme'] = 'light'.

TC-DARK-004 — Dark Mode Persists After Page Reload

Steps:

  1. Set localStorage['cardgit-theme'] = 'dark'.
  2. 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:

  1. Open fresh browser context with prefers-color-scheme: dark.
  2. Clear cardgit-theme from localStorage. Reload.

Expected Results:

  • Page renders in dark mode.

TC-DARK-006 — Explicit Saved Preference Overrides OS Preference

Steps:

  1. Open context with prefers-color-scheme: dark.
  2. 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:

  1. Log in to admin. Click the admin theme toggle.
  2. Inspect localStorage.

Expected Results:

  • cardgit-admin-theme = 'dark'.
  • cardgit-theme is not set.

TC-DARK-008 — Admin Dark Mode Persists After Reload

Steps:

  1. 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: true hide 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:

  1. 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:

  1. 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:

  1. Log in as a user NOT registered for a masked event.
  2. 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:

  1. Navigate to https://uat.events.cardgit.com/events.
  2. 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:

  1. Log in as a user who IS registered and approved for a masked event.
  2. 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:

  1. Log in to admin. Navigate to an event's edit page.
  2. Toggle "Address Mask" on. Save.
  3. 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: draft and 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:

  1. Navigate to https://uat.events-admin.cardgit.com/events/new.
  2. Fill Title, Description, Start Date. Click "Save Draft".

Expected Results:

  • POST /api/v1/events returns HTTP 201.
  • Redirect to /events/<new-uuid>.
  • "Draft" status badge visible.

TC-DRAFT-002 — Save Draft on Step 2 (Venue)

Steps:

  1. 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:

  1. Step through Steps 1–5, confirming "Save Draft" is visible each time.
  2. 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:

  1. 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:

  1. 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:

  1. Navigate to https://uat.events.cardgit.com/e/<slug> (not logged in).
  2. Click "Register Now".
  3. 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:

  1. Navigate to /login?redirect=/events/<id>/register.
  2. 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:

  1. Navigate to /register?redirect=/events/<id>/register.
  2. 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:

  1. Navigate directly to /events/<id>/register without auth.
  2. Log in after bounce.

Expected Results:

  • After login, lands on /events/<id>/register.

TC-REDIR-005 — Login Without ?redirect Defaults to /events

Steps:

  1. Navigate to /login with no redirect param. Log in.

Expected Results:

  • After login, lands on /events.

TC-REDIR-006 — Open-Redirect Guard Rejects External URL

Steps:

  1. Navigate to /login?redirect=https://evil.example.com. Log in.

Expected Results:

  • External URL is not followed. User lands on /events or /.

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:

  1. Navigate to https://uat.events-admin.cardgit.com/login.
  2. 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

Email event-moderator@test.com

Expected Results: Redirected from login. Moderation tools accessible. No "Access Restricted".


TC-ROLES-003 — Speaker Manager Can Log In

Email event-speaker-mgr@test.com

Expected Results: Redirected from login. Speaker management accessible. No "Access Restricted".


TC-ROLES-004 — Sponsor Manager Can Log In

Email event-sponsor-mgr@test.com

Expected Results: Redirected from login. Sponsor management accessible. No "Access Restricted".


TC-ROLES-005 — Registration Role Can Log In

Email event-registration@test.com

Expected Results: Redirected from login. Registrations page accessible. No "Access Restricted".


TC-ROLES-006 — Analyst Can Log In

Email event-analyst@test.com

Expected Results: Redirected from login. Analytics/registrations accessible. No "Access Restricted".


TC-ROLES-007 — Check-In Staff Can Log In

Email 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:

  1. Log in as event-moderator@test.com.
  2. 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:

  1. 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:

  1. 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:

  1. 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_queue table before SMTP delivery (status: pending / processing / sent / failed). Tests trigger real API actions and poll GET /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:

  1. Record t0. Create a new event via POST /api/v1/events (tenant admin auth).
  2. Poll /email-queue?emailType=event-created for rows with createdAt > t0 (up to 8 s).

Expected Results:

  • POST /events returns HTTP 201.
  • event-created email row appears within 8 s.
  • subject contains "is ready to set up".
  • status is pending, processing, or sent.
  • payload.eventId is present.

TC-ESND-002 — event-created Subject Contains Event Title

Steps:

  1. Create event with title TitleCheck <timestamp>.
  2. Poll queue for event-created rows after t0.

Expected Results:

  • subject contains the title. Format: 🎉 "<title>" is ready to set up.

TC-ESND-003 — event-created Payload Has requiresApproval

Steps:

  1. 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:

  1. Record t0. PUT /api/v1/events/<id> with a new title.
  2. Poll for event-updated rows with subject containing "was updated".

Expected Results:

  • event-updated row found within 8 s.
  • payload.changes is a non-empty array with a Title entry and correct after value.

TC-ESND-005 — event-updated Payload Has Editor Info

Steps:

  1. Update an event. Retrieve the email row payload.

Expected Results:

  • payload.editorName, payload.hostRole, payload.eventTitle all present.

TC-ESND-006 — No event-updated Email When Nothing Changed

Steps:

  1. Record t0. PUT /api/v1/events/<id> setting the same title already stored.
  2. Wait 2 s. Query queue for event-updated rows after t0.

Expected Results:

  • Zero new rows (diff empty → no email queued).

TC-ESND-007 — No Health Alert Emails Sent at Startup (Cooldown Guard)

Steps:

  1. Find the latest startup snapshot timestamp from GET /platform/health/history?hours=1.
  2. Query email-queue?emailType=health-alert for rows within 10 min of that timestamp.

Expected Results:

  • Zero health-alert rows 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:

  1. 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:

  1. 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:

  1. On /platform/exports, observe the page notice.

Expected Results:

  • Text contains "all organizations".

TC-PEXP-004 — Platform Audit Log Loads with Category Pills

Steps:

  1. 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:

  1. Click "Filters" — resource type dropdown appears.
  2. Click "Events" category pill — results filter without error.
  3. 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:

  1. Click any log row.
  2. Press Escape.

Expected Results:

  • Detail panel opens showing Actor and Timestamp.
  • Escape closes the panel.

Steps:

  1. Navigate to https://uat.events-admin.cardgit.com/platform.

Expected Results:

  • Links to /platform/exports, /platform/audit-log, /platform/analytics are all visible.

TC-PEXP-008 — Job Monitor Landing Page

Steps:

  1. 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:

  1. 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:

  1. Click a job row (if any exist).
  2. Press Escape.

Expected Results:

  • Panel opens with "Job Detail" heading. No "Remove" button.
  • Escape closes panel.

TC-PEXP-011 — Tenant Audit Log Loads

Steps:

  1. 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:

  1. Click a log row.
  2. 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:

  1. Start a paid registration (navigate to /events/<event-id>/register, select a ticket, click "Proceed to Payment").
  2. On the Stripe Checkout page, click "Back" or the browser back button.
  3. 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: paid exists for the user.

TC-PAY-CANCEL-002 — Payment Cancel Returns to Event

Steps:

  1. 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:

  1. Log in as marcus@designstudio.co.
  2. 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:

  1. Log in as a user with no registrations.
  2. 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/revenue shows 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:

  1. 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:

  1. Note the number of paid registrations from /registrations/<event-id>.
  2. Navigate to /events/<event-id>/revenue.
  3. 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:

  1. 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:

  1. 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:

  1. If multiple venues exist, type a partial name in the search bar.
  2. Use the Type filter dropdown to select "Room".
  3. 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:

  1. Click "Add Venue".
  2. 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.
  3. 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/venues is 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:

  1. Click "Add Venue".
  2. Set Type to "Virtual Room".
  3. Fill in Name: QA Virtual Room and Meeting Link: https://zoom.us/j/123456789.
  4. Observe that Floor/Capacity fields are hidden.
  5. 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:

  1. Open the Add Venue modal.
  2. Leave Venue Name empty. Click "Create Venue".
  3. Set Type to "Virtual Room", leave Meeting Link empty. Click "Create Venue".
  4. 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:

  1. Click the Edit button on an existing venue card.
  2. Update the Capacity to 200.
  3. Click "Save Changes".

Expected Results:

  • Modal opens pre-populated with the venue's current values.
  • Title: "Edit Venue".
  • PUT /api/v1/organizations/:orgId/venues/:id is called.
  • Toast: "Venue updated".
  • Venue card updates to show new capacity.

TC-VEN-007 — Delete a Venue

Steps:

  1. Click the Delete button on a venue card.
  2. Read the confirm dialog.
  3. 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:

  1. Open the Add Venue modal.
  2. Press Escape.

Expected Results:

  • Modal closes.
  • No venue is created.
  • Page scrolling is restored (body overflow removed).

TC-VEN-009 — Venue Card Layout — Physical vs Virtual

Steps:

  1. 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:

  1. 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:

  1. 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:

  1. 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:

  1. Click "Add Sponsor".
  2. Fill in: Name = QA Sponsor Ltd, Tier = Gold, Website = https://qasponsor.test, Description = A test sponsor.
  3. Upload a logo image (PNG < 2 MB).
  4. 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:

  1. Click edit on an existing sponsor.
  2. Change the tier from Gold to Silver.
  3. Save.

Expected Results:

  • Tier badge updates to Silver.
  • No other sponsor data is lost.

TC-SPON-ADM-005 — Delete a Sponsor

Steps:

  1. Click delete on a sponsor.
  2. 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:

  1. 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:

  1. Set survey title: Post-Event QA Survey.
  2. Add a Rating question: "Overall satisfaction (1–5)".
  3. Add a Multiple Choice question: "Would you attend again?" with options Yes / No / Maybe.
  4. Add a Short Text question: "Any comments?".
  5. Set Opens/Closes dates.
  6. Click "Publish".

Expected Results:

  • Survey is saved with all three questions.
  • Survey appears in /events/<event-id>/surveys for attendees.
  • Question types render correctly on the attendee side.

TC-SUR-ADM-003 — Survey Responses Summary (Admin)

Steps:

  1. After at least one attendee submits the survey, navigate to the survey in admin.
  2. 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:

  1. Navigate to /events/<event-id>/surveys.
  2. Click on the available survey.
  3. Answer all questions.
  4. 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:

  1. Submit a survey (TC-SUR-ATT-001).
  2. Navigate back to /events/<event-id>/surveys.
  3. 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:

  1. 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:

  1. Find a post in "Pending" state.
  2. 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:

  1. Find a post in "Pending" or "Approved" state.
  2. Click "Reject" / "Remove".
  3. 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:

  1. 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:

  1. 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:

  1. Click "Add Speaker".
  2. Fill in: Name = Jane QA, Title = QA Lead, Company = Test Corp, Bio = Expert tester.
  3. Upload a headshot image.
  4. Save.

Expected Results:

  • Speaker appears in the list.
  • Speaker appears on the attendee-facing speaker directory.

Steps:

  1. Navigate to a session's edit page.
  2. Add the speaker created in TC-SPK-ADM-002.
  3. Save.

Expected Results:

  • Speaker name appears on the session in the schedule.

TC-SPK-ADM-004 — Edit a Speaker

Steps:

  1. Click edit on a speaker.
  2. Update the bio.
  3. Save.

Expected Results:

  • Updated bio is saved and shown on the attendee-facing directory.

TC-SPK-ADM-005 — Delete a Speaker

Steps:

  1. Click delete on a speaker.
  2. 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:

  1. 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:

  1. 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:

  1. On /registrations/<event-id>, find a "Pending" registration.
  2. Click "Approve".
  3. 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:

  1. Find a "Pending" or "Approved" registration.
  2. Click "Reject" / "Cancel".
  3. 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:

  1. Find an approved, unchecked-in registration.
  2. Click "Check In".

Expected Results:

  • checkedIn status changes to ✓.
  • Check-in timestamp is recorded.

TC-REGMGT-006 — Search and Filter Registrations

Steps:

  1. Type a known attendee name in the search bar.
  2. 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:

  1. 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 /settings has multiple tabs. 11-notifications-announcements.spec.ts only 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:

  1. 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:

  1. Click the "Notifications" tab.
  2. Toggle one notification preference off.
  3. Save.
  4. 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:

  1. Click the "Profile" or "Account" tab.
  2. Update the display name field.
  3. 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:

  1. 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.

Steps:

  1. 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:

  1. 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:

  1. Click "Add Track".
  2. In the inline form, fill in:
    • Track Name: Main Stage
    • Colour: click the amber preset swatch (#f59e0b)
    • Room / Location: Hall A
    • Floor: Ground Floor
  3. 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/tracks with { 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:

  1. Click "Add Track".
  2. Leave Track Name empty.
  3. 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:

  1. Click "Add Track".
  2. In the color picker, type #e11d48 in 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:

  1. Click the Edit (pencil) button on an existing track.
  2. Update the Room field to Hall B.
  3. 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/:id with updated fields.
  • Toast: "Track updated".
  • Track row reflects the updated room label.

TC-TRACKS-006 — Cancel Edit Returns to List

Steps:

  1. Click Edit on a track.
  2. Change the track name.
  3. 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:

  1. Click the Delete (Trash2) button on a track.
  2. Read the confirm dialog.
  3. 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:

  1. 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/:id called for both affected tracks with swapped displayOrder values.
  • 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:

  1. 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:

  1. Simulate an API failure during reorder (e.g. network disconnect, or inspect from logs).
  2. 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:

  1. 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:

  1. 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:

  1. 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:

  1. 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:

  1. Click on an event in the platform events list.
  2. 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:

  1. 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:

  1. 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) or Cmd+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 and Enter to execute. Escape closes it. The palette is mounted in Topbar.tsx and 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:

  1. Log in as sarah@techcorp.io. Navigate to any admin page.
  2. Press Ctrl+K (Windows) or Cmd+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:

  1. Click the topbar bar showing "Quick access — events, sessions, attendees…" and the ⌘K badge.

Expected Results:

  • Palette opens identically to TC-CMD-001. Input is auto-focused.

TC-CMD-003 — Closes via Escape Key

Steps:

  1. Open the palette. Press Escape.

Expected Results:

  • Palette closes. No navigation occurs.

TC-CMD-004 — Closes via Backdrop Click

Steps:

  1. 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:

  1. 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:

  1. 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:

  1. Open the palette. Type xyznotacommand.

Expected Results:

  • No command rows shown.
  • Message reads: No results for "xyznotacommand".

TC-CMD-008 — Arrow Key Navigation

Steps:

  1. 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:

  1. Open the palette. Type analytics. Press Enter.

Expected Results:

  • Palette closes. Browser navigates to /analytics.

TC-CMD-010 — Mouse Click Executes Command

Steps:

  1. Open the palette. Click the "Registrations" row.

Expected Results:

  • Palette closes. Browser navigates to /registrations.

TC-CMD-011 — Mouse Hover Updates Active Highlight

Steps:

  1. 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:

  1. 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:

  1. 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:

  1. 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:

  1. 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:

  1. Navigate to https://uat.events-admin.cardgit.com/checkin.
  2. Press Ctrl+K.

Expected Results:

  • The palette does not open. No overlay appears.

TC-CMD-017 — Command Palette on Mobile (390px)

Steps:

  1. 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).
  • ⌘K badge 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/events before 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

  1. Confirm UAT environment is live: GET https://uat.api2.cardgit.com/health should return { "status": "ok" }.
  2. Run global setup to create auth state files: tests/e2e/global-setup.ts.
  3. 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-darkmode
    • chromium-sso, chromium-auth-modal, chromium-create-event
    • android-mobile-admin

Notes for Testers

  • Stripe payments use test mode only. Use card 4242 4242 4242 4242 with 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 autocomplete attributes are set correctly.
  • For accessibility tests, supplement automated checks with manual testing using a screen reader (NVDA on Windows, VoiceOver on macOS).