← Back to Manual

Test Plan

Meeting Tools v3.2.2  ·  Southern Dutchess Toastmasters  ·  Test environment: /test/index.html

Test Sections 1. Fresh Install 2. Welcome Screen 3. Club Management 4. Cloud Sync 5. Word of the Day 6. Timer 7. Ah-Counter 8. Transcription 9. Transcripts 10. Progress 11. Settings 12. Data Management 13. Offline / Edge Cases 14. PWA
How to use: Open /test/index.html in a browser. Use an incognito window for fresh-install tests. Check each box as you verify. Priority levels: Critical = must pass before any release   High = should pass   Medium = nice to verify   Low = edge case.

1. Fresh Install

Tests in incognito / cleared storage
IDPriorityTest DescriptionExpected Result
FI-01 Critical Open app in fresh incognito window
  1. Open new incognito tab
  2. Navigate to /test/index.html
Welcome screen appears with three options: Join Existing Club, Create New Club, Just Exploring
FI-02 Critical TEST CLUB seeded in background
  1. From welcome screen tap Just Exploring
App opens on main menu showing "TEST CLUB (Practice)" as active club with Timer and Ah-Counter tabs
FI-03 High TEST CLUB has sample speakers
  1. From menu tap New Timer or Start Tracking
  2. Check speaker roster
Roster shows: JANE DOE, JOHN SMITH, MARY JOHNSON, ROBERT BROWN, SUSAN DAVIS
FI-04 High No sync option visible for TEST CLUB
  1. Go to Settings → Clubs
  2. Find TEST CLUB entry
TEST CLUB shows "⚗ Practice club — local only, no cloud sync" instead of Enable Cloud Sync button
FI-05 Medium Second fresh open still shows welcome screen
  1. Close and reopen incognito
  2. Navigate to app again
Welcome screen appears again (incognito cleared storage)

2. Welcome Screen

IDPriorityTest DescriptionExpected Result
WS-01 Critical Create New Club flow
  1. Fresh incognito, tap Create New Club
  2. Enter "Test Org"
  3. Leave Practice Only off
  4. Tap OK
App opens on main menu with "Test Org" as active club. No sync enabled yet.
WS-02 Critical Create New Club — Practice Only
  1. Fresh incognito, tap Create New Club
  2. Enter "Practice Org"
  3. Toggle Practice Only ON
  4. Tap OK
App opens. Settings → Clubs shows "Practice Org" with practice label, no sync button.
WS-03 Critical Join Existing Club flow
  1. Fresh incognito, tap Join Existing Club
  2. Enter valid 8-char sync code from your club
  3. Tap OK
App opens with club name, roster populated, filler words populated, API key synced (check Settings)
WS-04 High Join with invalid code
  1. Fresh incognito, tap Join Existing Club
  2. Enter "XXXX-XXXX"
  3. Tap OK
Error modal: "No club found with that code."
WS-05 High Create Club with empty name
  1. Tap Create New Club
  2. Leave name blank
  3. Tap OK
Error modal: "Please enter a club name." Modal stays open.

3. Club Management

IDPriorityTest DescriptionExpected Result
CM-01 High Add second club
  1. Settings → Clubs → New Club
  2. Enter "Second Club"
  3. Tap OK
"Second Club" appears in club list. Can be switched to from club switcher.
CM-02 High Switch active club
  1. Tap club name on main menu
  2. Select a different club
Header updates to new club name. Roster updates to that club's speakers. Auto-sync pulls if sync enabled.
CM-03 High Delete a club
  1. Settings → Clubs
  2. Tap delete on a non-active club
  3. Confirm
Club removed from list. Its local data cleared.
CM-04 Medium Rename a club
  1. Settings → Clubs
  2. Tap rename on a club
  3. Enter new name
Club name updates everywhere — menu header, footer, settings label.
CM-05 High Data isolation between clubs
  1. Switch to Club A, add speaker "ALICE"
  2. Switch to Club B
  3. Go to Setup, check roster
Club B roster does not contain ALICE. Each club's roster is fully separate.
CM-06 High Cannot delete active club
  1. Settings → Clubs
  2. Tap delete (✕) on the currently active club
Error modal: "Switch to a different club before deleting this one." Club is not deleted.
CM-07 Medium Sync code masked by default
  1. Settings → Clubs
  2. Check sync code display for a synced club
  3. Tap 👁 icon
Sync code shows as ••••-•••• by default. Tap 👁 reveals full code. Tap again to re-mask.

4. Cloud Sync

IDPriorityTest DescriptionExpected Result
SY-01 Critical Enable cloud sync generates code
  1. Settings → Clubs
  2. Tap Enable Cloud Sync on a non-practice club
8-character code appears (format XXXX-XXXX). Sync status shows "Pushed [time]".
SY-02 Critical Manual Push sends roster and fillers
  1. Club has sync enabled
  2. Tap Push ↑
Status shows "Pushed [time]". Check Firestore console — speakers and fillers arrays updated.
SY-03 Critical Manual Push includes API key
  1. Add API key in Settings
  2. Go to Clubs → Push ↑ on synced club
  3. Check Firestore console
Firestore document has apiKey field populated.
SY-04 Critical Manual Pull receives API key
  1. Open incognito, join club by code
  2. Check Settings → ChatGPT API Key
API key field is pre-filled. Placeholder shows "Shared by club ☁".
SY-05 Critical Auto-sync on app open
  1. On Device A: add speaker "AUTO SYNC TEST"
  2. On Device B (or incognito): reload app
"AUTO SYNC TEST" appears on Device B's roster without any manual pull.
SY-06 Critical Auto-push on speaker add
  1. Add new speaker to synced club
  2. Immediately check Firestore console
Firestore document's speakers array updated within seconds. No manual push needed.
SY-07 High Practice club never syncs
  1. Add speaker to TEST CLUB
  2. Check Firestore — no TEST CLUB document should exist or be updated
No Firestore activity for practice clubs. App functions normally.
SY-08 High Auto-sync on club switch
  1. Have two clubs, one synced
  2. Switch to the synced club
Roster and fillers update from cloud automatically on switch. No manual pull needed.

5. Word of the Day

IDPriorityTest DescriptionExpected Result
WD-01 Critical Random WOD with API key
  1. Add valid OpenAI key in Settings
  2. Ah-Counter tab → Word of the Day
  3. Tap Random
Word displays with AI-generated definition and usage example. "● CHATGPT READY" indicator visible.
WD-02 High Search custom word
  1. Type "Perspicacity" in search field
  2. Tap 🔍
Definition and example shown for "Perspicacity" specifically.
WD-03 Critical Select WOD activates in tally
  1. Random or search a word
  2. Tap Select
  3. Go to Start Tracking → pick speaker and role
  4. Tap START
Tally grid shows word at top with gold "WORD OF DAY" badge.
WD-04 Medium WOD without API key
  1. Clear API key in Settings
  2. Go to WOD screen, tap Random
Word displays but no definition. Prompt to add API key in Settings.
WD-05 High Select WOD writes to Firestore
  1. Open Firebase Console → club doc
  2. In app, select a WOD
  3. Confirm modal
  4. Refresh console
Club document has wod field with word/definition/example and wodDate matching today's date string. Cloud report will use this data.

6. Timer

IDPriorityTest DescriptionExpected Result
TM-01 Critical Full timer flow — Table Topics
  1. Timer tab → New Timer
  2. Enter "TEST SPEAKER", select TABLE TOPICS
  3. Tap START
  4. Wait through 1:00, 1:30, 2:00
  5. Tap Commit & Exit
Background: green at 1:00, yellow at 1:30, red at 2:00. Time committed to report.
TM-02 High Pause and resume
  1. Start any timer
  2. At ~15 seconds tap PAUSE
  3. Wait 5 seconds
  4. Tap RESUME
Timer freezes exactly at pause point. Button label changes to RESUME. Tap again — resumes from exact same elapsed time. Button returns to PAUSE. Background holds color state.
TM-03 High Custom timer thresholds
  1. Setup → select CUSTOM
  2. Enter Green: 1, Yellow: 2, Red: 3
  3. Tap OK and START
Background changes at exactly 1:00, 2:00, 3:00.
TM-04 Critical Result saves to report
  1. Complete a timer with Commit & Exit
  2. Return to menu → Meeting Report
Report shows the speaker name, role, and elapsed time formatted correctly.
TM-05 Critical Background resets on exit
  1. Run timer past red threshold
  2. Tap Commit & Exit
Background returns to default grey immediately on exit. Red does not persist to menu.
TM-06 High Timer session writes to Firestore
  1. With synced club, complete a timer
  2. Check Firestore sessions subcollection
New session document with speaker, role, result, elapsedSeconds, type: "timer".
TM-07 Medium No Firestore write for practice club
  1. Switch to TEST CLUB
  2. Complete a timer
  3. Check Firestore
No new session document in Firestore.
TM-08 High Validation — no name or role
  1. Setup screen with empty name
  2. Tap START
Error modal: "Enter Name & Role."
TM-09 High Reset button
  1. Start a timer, let it run to ~30 seconds
  2. Tap RESET
Clock resets to 00:00. Background returns to default. Timer immediately restarts from zero for the same speaker.

7. Ah-Counter

IDPriorityTest DescriptionExpected Result
AC-01 Critical Full counter flow
  1. Counter tab → Start Tracking
  2. Select speaker and AH COUNTER role
  3. Tap START
  4. Tap AH 3 times, UM 2 times
  5. Tap SAVE RESULTS
Counts register correctly. Save confirmation modal. Session in Counter Report shows "AH: 3, UM: 2".
AC-02 High Decrement does not go below zero
  1. Start a counter session
  2. Tap − on a filler that is at 0
Count stays at 0. No negative values.
AC-03 High Session merge for same speaker
  1. Save a session for "KEVIN SHAN" with UM: 3
  2. Start a new counter session for "KEVIN SHAN"
  3. Tap UM 2 times
  4. Save Results
Report shows KEVIN SHAN with UM: 5 (merged, not duplicated).
AC-04 High WOD card in tally grid
  1. Select a WOD first
  2. Start a counter session
WOD card appears at top of grid with gold border and "WORD OF DAY" badge.
AC-05 High Delete filler from session
  1. Start counter session
  2. Tap red ✕ on ER card
  3. Confirm deletion
ER card removed from grid for this session only. Other fillers unaffected.
AC-06 Medium Full name warning
  1. Setup screen, type "Kevin" (single name)
  2. Tap Add
Warning modal asking to confirm single name or go back to add last name.
AC-07 High Add filler word on the fly
  1. Start a live counter session
  2. Tap the + ADD WORD card at the end of the grid
  3. Enter "BASICALLY", leave "Save to club list" toggled on
  4. Tap OK
BASICALLY card appears in grid with count of 1. Word added to club filler list permanently and auto-pushed to cloud.
AC-08 Medium Add filler on the fly — don't save permanently
  1. Start a live counter session
  2. Tap + ADD WORD
  3. Enter word, toggle "Save to club list" OFF
  4. Tap OK
Word appears in current session grid at count 1. Not added to club filler list — will not appear in next session.
AC-09 Medium Name input clear button
  1. Setup screen
  2. Type any text in the name field
  3. Tap the ✕ button inside the field
Field clears. Clear button disappears. Full roster list resets.

8. Speech Transcription

IDPriorityTest DescriptionExpected Result
TR-01 Critical Full transcription flow
  1. Counter tab → Start Tracking
  2. Toggle Record Speech ON
  3. Select speaker and role, tap START
  4. Tap Start Recording, say "Um I think like you know this is a test"
  5. Tap End Speech
Transcript appears with filler words highlighted in red. Score and stats displayed.
TR-02 Critical Merge to Counter
  1. Complete transcription
  2. Tap Merge to Counter
Navigates to counter display with tally pre-populated from auto-detected fillers.
TR-03 High WOD highlighted in gold
  1. Select a WOD (e.g. "Tenacious")
  2. Transcribe a speech that uses the word
The WOD appears in gold highlight in the transcript. Other fillers appear in red.
TR-04 High Filler score calculation
  1. Complete a transcription
  2. Note total words and total fillers
Score = fillers/words × 100. Under 5% = Excellent (green), 5–10% = Good (yellow), over 10% = Needs Work (red).
TR-05 Medium No API key — transcription blocked
  1. Clear API key
  2. Enable Record Speech and try to start
Error shown prompting user to add OpenAI key in Settings.
TR-06 High Transcription session writes to Firestore
  1. Merge a transcription to counter and save with a synced club
  2. Check Firestore
Session document contains fillerPct, fillerScore, totalWords, fillersPerMin, durationMins.

9. Transcripts

IDPriorityTest DescriptionExpected Result
TS-01 High Transcript saved after merge
  1. Complete a transcription and merge to counter
  2. Save counter session
  3. Counter tab → Transcripts
Transcript list shows the speaker with date and role.
TS-02 High Open and view a transcript
  1. Transcripts screen
  2. Tap a speaker name
Full highlighted transcript shows with filler summary, score, and Share button.
TS-03 Medium Share transcript — plain text
  1. Markdown Export OFF in Settings
  2. Open a transcript, tap Share
Plain text shared with **double asterisks** around filler words.
TS-04 Medium Share transcript — markdown
  1. Markdown Export ON in Settings
  2. Open a transcript, tap Share
Markdown formatted text with headers, blockquotes, bold fillers.
TS-05 High Transcripts cleared with meeting data
  1. Have at least one saved transcript
  2. Settings → Clear Meeting Data → confirm
  3. Counter tab → Transcripts
Transcript list is empty.

10. Progress Tracking

IDPriorityTest DescriptionExpected Result
PR-01 High Progress list loads
  1. Synced club with multiple sessions in Firestore
  2. Counter tab → Progress
List of speakers each showing latest filler rate, trend indicator, and session count.
PR-02 High Speaker detail view
  1. Progress screen
  2. Tap a speaker with multiple sessions
Shows Latest, Average, Best percentages. Session-by-session log with date, role, and stats.
PR-03 High Progress prompts for sync
  1. Practice club active
  2. Go to Counter tab → Progress
Screen shows prompt to enable cloud sync with explanation.
PR-04 Medium Trend indicator accuracy
  1. Speaker with improving sessions (lower filler % over time)
  2. Check trend indicator
↑ Improving shown in green. ↓ Worsening in red. → Steady in grey.
PR-05 High Progress filters to current roster
  1. Ensure a session exists for a speaker
  2. Delete that speaker from the roster
  3. Open Progress screen
Deleted speaker no longer appears in Progress list. Their Firestore history is preserved but hidden.
PR-06 Medium Manual counter sessions in progress detail
  1. Save a counter session manually (no transcription)
  2. Open that speaker's detail in Progress
Session appears in detail list showing "X fillers (manual)" with per-word breakdown. Not counted in filler % average.

11. Settings

IDPriorityTest DescriptionExpected Result
ST-01 High API key persists across reload
  1. Enter API key in Settings
  2. Reload page
  3. Return to Settings
API key field is still populated.
ST-02 High Markdown toggle persists
  1. Toggle Markdown Export ON
  2. Reload page
  3. Return to Settings
Toggle is still ON after reload.
ST-03 High Filler manager — add word
  1. Settings → Filler Words
  2. Tap Add, enter "BASICALLY"
  3. Confirm
"BASICALLY" appears in filler manager list and in counter tally grid next session.
ST-04 High Filler manager — delete word
  1. Settings → Filler Words
  2. Delete "ER"
  3. Confirm
"ER" gone from list. Auto-push to cloud if sync enabled. Does not appear in next tally session.
ST-05 Medium Filler changes auto-push
  1. Synced club
  2. Add a new filler word
  3. Immediately check Firestore
Firestore fillers array updated within seconds.

12. Data Management

IDPriorityTest DescriptionExpected Result
DM-01 High Export backup
  1. Settings → Backup Data
JSON file downloads. Contains speakers, fillers, and apiKey for active club.
DM-02 High Import backup restores data
  1. Export backup
  2. Clear all data manually in DevTools
  3. Reload and set up fresh
  4. Settings → Restore Data, select the file
Roster, filler words, and API key all restored. Page reloads automatically.
DM-03 Critical Clear Meeting Data
  1. Have logs, transcripts, and WOD set
  2. Settings → Clear Meeting Data → confirm
Logs cleared. WOD cleared. Transcripts cleared. Roster and filler words unchanged.
DM-04 High Stale data banner appears
  1. Commit a session
  2. Manually set last_session_ts in DevTools to 4 hours ago
  3. Navigate to menu
Yellow banner appears below tabs: "Meeting data from 4h ago still saved. Clear before your next meeting?" with inline Clear button.
DM-05 Medium Stale banner not shown for recent data
  1. Commit a session
  2. Return to menu immediately
No banner shown — data is less than 3 hours old.
DM-06 Medium Stale banner Clear button works
  1. Trigger stale banner (see DM-04)
  2. Tap Clear in the banner
  3. Confirm
Meeting data cleared. Banner disappears. Roster and fillers unchanged.
DM-07 High Report copy
  1. Have at least one logged session
  2. Report screen → Copy
  3. Paste into a text editor
Full report text pasted correctly, formatted per markdown toggle state.
DM-08 Medium Markdown report format
  1. Enable Markdown Export
  2. Copy report
Report has markdown table with | Name | Role | Result | header row.

13. Cloud Meeting Report

IDPriorityTest DescriptionExpected Result
CR-01 Critical Report screen shows two tabs
  1. Timer tab → Meeting Report
Report screen shows "This Device" and "☁ Cloud" tabs. "This Device" is active by default. Local report content is visible.
CR-02 Critical Cloud tab loads today's sessions from all devices
  1. Record at least two sessions on two different devices (or two different browsers) for the same club
  2. On either device, open Report → ☁ Cloud tab
"Loading from cloud…" briefly appears, then all today's sessions from both devices display in Name | Role | Result | By columns. Status line shows session count and load timestamp.
CR-03 High WOD appears in cloud report when selected today
  1. Ah-Counter → Word of the Day → select any word
  2. Open Report → ☁ Cloud tab
Cloud report header includes WOD word and definition above the session table.
CR-04 Medium WOD does not appear if selected on a different day
  1. In Firebase Console, set wodDate on the club doc to yesterday's date string
  2. Open Report → ☁ Cloud tab
Cloud report loads without a WOD section — only today's date matches.
CR-05 High Refresh button re-queries Firestore
  1. Open Report → ☁ Cloud tab
  2. On a second device, commit a new session
  3. Tap ↺ Refresh on first device
Cloud report reloads. New session from second device now appears. Status line timestamp updates.
CR-06 High Copy on Cloud tab copies cloud content
  1. Open Report → ☁ Cloud tab (with data loaded)
  2. Tap Copy
  3. Paste into a text editor
Pasted text is the cloud report content (not the local report). Includes all sessions from all devices.
CR-07 Medium Practice-only club shows clear message
  1. Switch to a Practice Only club
  2. Open Report → ☁ Cloud tab
Cloud panel shows "Cloud sync is not enabled for this club. Enable it in Settings > Clubs to use Cloud Report." No Firestore query is attempted.
CR-08 Medium Report tab resets to This Device on re-open
  1. Open Report → tap ☁ Cloud tab
  2. Tap Done → navigate back to Report
"This Device" tab is active on re-entry. Local report is shown. Cloud tab does not auto-load.

14. Manual Filler Scoring

IDPriorityTest DescriptionExpected Result
MF-01 Critical Score card shown after session ≥15 seconds
  1. Start a counter session for any speaker
  2. Wait 15+ seconds, tap 2–3 fillers
  3. Tap SAVE RESULTS
Modal shows a color-coded score card with filler %, EXCELLENT / GOOD / NEEDS WORK label, duration, and rate. Labeled "Filler Score (estimated)" with "Word count estimated at 130 wpm" footnote. Button reads "Done".
MF-02 Critical No score card for sessions under 15 seconds
  1. Start a counter session
  2. Immediately tap SAVE RESULTS (under 15s)
Modal shows plain "Counts saved." text — no score card, no percentage. Raw counts are saved normally.
MF-03 High Score color reflects filler rate
  1. Run a 20-second session with 0 fillers (EXCELLENT expected)
  2. Run a 30-second session with 3 fillers (rate ~6/min = ~GOOD)
  3. Run a 20-second session with 10 fillers (NEEDS WORK expected)
Card border and text color are green for EXCELLENT (<5%), yellow/amber for GOOD (5–10%), red for NEEDS WORK (>10%).
MF-04 High Scored session appears in Progress tracker
  1. Complete a scored manual session (MF-01)
  2. Open Ah-Counter → Progress → tap the speaker
Session appears in history with color-coded filler percentage — same display as a transcription session. Not labeled "counted, no score".
MF-05 High Scored session appears in Cloud Report counter section
  1. Complete a scored manual session
  2. Open Report → ☁ Cloud tab
Counter Report section shows the session. Filler breakdown visible.
MF-06 Medium Unscored sessions labeled "counted, no score" in Progress
  1. View a speaker who has older sessions from before v3.2.3 (no fillerPct field)
  2. Open their progress history
Old sessions display as "X fillers (counted, no score)" — distinct from new sessions which show a percentage. No crashes or blank entries.
MF-07 Medium Transcription path not affected
  1. Run a full transcription session (Record Speech on)
  2. Merge to Counter → Save Results
Transcription score card shows exact word count and exact percentage (not estimated). No "estimated" label. sessionFromTranscript prevents duplicate writeSession call.

15. Offline & Edge Cases

IDPriorityTest DescriptionExpected Result
OE-01 Critical App works fully offline
  1. Enable airplane mode or use DevTools offline
  2. Complete a full timer session
  3. Complete a full counter session
Both sessions complete normally. No errors shown to user. Results save to local logs.
OE-02 High Sync fails silently offline
  1. Enable airplane mode
  2. Add a speaker to a synced club
Speaker added locally. No error modal. Sync failure is silent (console log only).
OE-03 High Very long speaker name
  1. Add speaker with 50+ character name
Name added. UI handles long name gracefully — no overflow breaking layout.
OE-04 Medium Duplicate speaker name
  1. Add "KEVIN SHAN" to roster
  2. Try to add "KEVIN SHAN" again
Second add is silently ignored. No duplicate in roster.
OE-05 Medium Test/prod data isolation
  1. Add speaker "TEST ONLY" in /test/ version
  2. Open root / version in same browser
"TEST ONLY" does not appear in prod roster. Keys are fully isolated by prefix.
OE-06 Medium Empty report
  1. Clear Meeting Data
  2. Open Meeting Report
Report shows "No data recorded." — no errors or blank screen.
OE-07 High Back navigation from all screens
  1. Navigate to each screen
  2. Use Back or Cancel buttons
Every screen has a valid back path. No dead ends. Timer screen stops interval on exit.

16. PWA

IDPriorityTest DescriptionExpected Result
PW-01 High Install to home screen (iOS)
  1. Open in Safari
  2. Share → Add to Home Screen
  3. Launch from home screen icon
App opens fullscreen, no Safari chrome. Timer icon appears on home screen.
PW-02 High No horizontal scroll
  1. Open on phone
  2. Check all screens
No horizontal scrolling on any screen. All content fits within viewport.
PW-03 High Safe area insets respected
  1. Open on iPhone with notch or Dynamic Island
  2. Check header and bottom buttons
Content not obscured by notch or home indicator. Bottom buttons have safe area padding.
PW-04 Medium Version label displays correctly
  1. Check bottom of main menu
Shows "Version 3.2.2 (TEST)" at /test/ or "Version 3.2.2" at root.
PW-05 Medium New deploy loads fresh
  1. Deploy a new version
  2. Hard refresh in existing tab
New version loads. Service worker network-first strategy serves fresh file.