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| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| FI-01 | Critical |
Open app in fresh incognito window
|
Welcome screen appears with three options: Join Existing Club, Create New Club, Just Exploring | |
| FI-02 | Critical | TEST CLUB seeded in background
|
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
|
Roster shows: JANE DOE, JOHN SMITH, MARY JOHNSON, ROBERT BROWN, SUSAN DAVIS | |
| FI-04 | High | No sync option visible for TEST CLUB
|
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
|
Welcome screen appears again (incognito cleared storage) |
2. Welcome Screen
| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| WS-01 | Critical | Create New Club flow
|
App opens on main menu with "Test Org" as active club. No sync enabled yet. | |
| WS-02 | Critical | Create New Club — Practice Only
|
App opens. Settings → Clubs shows "Practice Org" with practice label, no sync button. | |
| WS-03 | Critical | Join Existing Club flow
|
App opens with club name, roster populated, filler words populated, API key synced (check Settings) | |
| WS-04 | High | Join with invalid code
|
Error modal: "No club found with that code." | |
| WS-05 | High | Create Club with empty name
|
Error modal: "Please enter a club name." Modal stays open. |
3. Club Management
| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| CM-01 | High | Add second club
|
"Second Club" appears in club list. Can be switched to from club switcher. | |
| CM-02 | High | Switch active 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
|
Club removed from list. Its local data cleared. | |
| CM-04 | Medium | Rename a club
|
Club name updates everywhere — menu header, footer, settings label. | |
| CM-05 | High | Data isolation between clubs
|
Club B roster does not contain ALICE. Each club's roster is fully separate. | |
| CM-06 | High | Cannot delete 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
|
Sync code shows as ••••-•••• by default. Tap 👁 reveals full code. Tap again to re-mask. |
4. Cloud Sync
| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| SY-01 | Critical | Enable cloud sync generates code
|
8-character code appears (format XXXX-XXXX). Sync status shows "Pushed [time]". | |
| SY-02 | Critical | Manual Push sends roster and fillers
|
Status shows "Pushed [time]". Check Firestore console — speakers and fillers arrays updated. | |
| SY-03 | Critical | Manual Push includes API key
|
Firestore document has apiKey field populated. | |
| SY-04 | Critical | Manual Pull receives API key
|
API key field is pre-filled. Placeholder shows "Shared by club ☁". | |
| SY-05 | Critical | Auto-sync on app open
|
"AUTO SYNC TEST" appears on Device B's roster without any manual pull. | |
| SY-06 | Critical | Auto-push on speaker add
|
Firestore document's speakers array updated within seconds. No manual push needed. | |
| SY-07 | High | Practice club never syncs
|
No Firestore activity for practice clubs. App functions normally. | |
| SY-08 | High | Auto-sync on club switch
|
Roster and fillers update from cloud automatically on switch. No manual pull needed. |
5. Word of the Day
| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| WD-01 | Critical | Random WOD with API key
|
Word displays with AI-generated definition and usage example. "● CHATGPT READY" indicator visible. | |
| WD-02 | High | Search custom word
|
Definition and example shown for "Perspicacity" specifically. | |
| WD-03 | Critical | Select WOD activates in tally
|
Tally grid shows word at top with gold "WORD OF DAY" badge. | |
| WD-04 | Medium | WOD without API key
|
Word displays but no definition. Prompt to add API key in Settings. | |
| WD-05 | High | Select WOD writes to Firestore
|
Club document has wod field with word/definition/example and wodDate matching today's date string. Cloud report will use this data. |
6. Timer
| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| TM-01 | Critical | Full timer flow — Table Topics
|
Background: green at 1:00, yellow at 1:30, red at 2:00. Time committed to report. | |
| TM-02 | High | Pause and 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
|
Background changes at exactly 1:00, 2:00, 3:00. | |
| TM-04 | Critical | Result saves to report
|
Report shows the speaker name, role, and elapsed time formatted correctly. | |
| TM-05 | Critical | Background resets on exit
|
Background returns to default grey immediately on exit. Red does not persist to menu. | |
| TM-06 | High | Timer session writes to Firestore
|
New session document with speaker, role, result, elapsedSeconds, type: "timer". | |
| TM-07 | Medium | No Firestore write for practice club
|
No new session document in Firestore. | |
| TM-08 | High | Validation — no name or role
|
Error modal: "Enter Name & Role." | |
| TM-09 | High | Reset button
|
Clock resets to 00:00. Background returns to default. Timer immediately restarts from zero for the same speaker. |
7. Ah-Counter
| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| AC-01 | Critical | Full counter flow
|
Counts register correctly. Save confirmation modal. Session in Counter Report shows "AH: 3, UM: 2". | |
| AC-02 | High | Decrement does not go below zero
|
Count stays at 0. No negative values. | |
| AC-03 | High | Session merge for same speaker
|
Report shows KEVIN SHAN with UM: 5 (merged, not duplicated). | |
| AC-04 | High | WOD card in tally grid
|
WOD card appears at top of grid with gold border and "WORD OF DAY" badge. | |
| AC-05 | High | Delete filler from session
|
ER card removed from grid for this session only. Other fillers unaffected. | |
| AC-06 | Medium | Full name warning
|
Warning modal asking to confirm single name or go back to add last name. | |
| AC-07 | High | Add filler word on the fly
|
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
|
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
|
Field clears. Clear button disappears. Full roster list resets. |
8. Speech Transcription
| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| TR-01 | Critical | Full transcription flow
|
Transcript appears with filler words highlighted in red. Score and stats displayed. | |
| TR-02 | Critical | Merge to Counter
|
Navigates to counter display with tally pre-populated from auto-detected fillers. | |
| TR-03 | High | WOD highlighted in gold
|
The WOD appears in gold highlight in the transcript. Other fillers appear in red. | |
| TR-04 | High | Filler score calculation
|
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
|
Error shown prompting user to add OpenAI key in Settings. | |
| TR-06 | High | Transcription session writes to Firestore
|
Session document contains fillerPct, fillerScore, totalWords, fillersPerMin, durationMins. |
9. Transcripts
| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| TS-01 | High | Transcript saved after merge
|
Transcript list shows the speaker with date and role. | |
| TS-02 | High | Open and view a transcript
|
Full highlighted transcript shows with filler summary, score, and Share button. | |
| TS-03 | Medium | Share transcript — plain text
|
Plain text shared with **double asterisks** around filler words. | |
| TS-04 | Medium | Share transcript — markdown
|
Markdown formatted text with headers, blockquotes, bold fillers. | |
| TS-05 | High | Transcripts cleared with meeting data
|
Transcript list is empty. |
10. Progress Tracking
| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| PR-01 | High | Progress list loads
|
List of speakers each showing latest filler rate, trend indicator, and session count. | |
| PR-02 | High | Speaker detail view
|
Shows Latest, Average, Best percentages. Session-by-session log with date, role, and stats. | |
| PR-03 | High | Progress prompts for sync
|
Screen shows prompt to enable cloud sync with explanation. | |
| PR-04 | Medium | Trend indicator accuracy
|
↑ Improving shown in green. ↓ Worsening in red. → Steady in grey. | |
| PR-05 | High | Progress filters to current roster
|
Deleted speaker no longer appears in Progress list. Their Firestore history is preserved but hidden. | |
| PR-06 | Medium | Manual counter sessions in progress detail
|
Session appears in detail list showing "X fillers (manual)" with per-word breakdown. Not counted in filler % average. |
11. Settings
| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| ST-01 | High | API key persists across reload
|
API key field is still populated. | |
| ST-02 | High | Markdown toggle persists
|
Toggle is still ON after reload. | |
| ST-03 | High | Filler manager — add word
|
"BASICALLY" appears in filler manager list and in counter tally grid next session. | |
| ST-04 | High | Filler manager — delete word
|
"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
|
Firestore fillers array updated within seconds. |
12. Data Management
| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| DM-01 | High | Export backup
|
JSON file downloads. Contains speakers, fillers, and apiKey for active club. | |
| DM-02 | High | Import backup restores data
|
Roster, filler words, and API key all restored. Page reloads automatically. | |
| DM-03 | Critical | Clear Meeting Data
|
Logs cleared. WOD cleared. Transcripts cleared. Roster and filler words unchanged. | |
| DM-04 | High | Stale data banner appears
|
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
|
No banner shown — data is less than 3 hours old. | |
| DM-06 | Medium | Stale banner Clear button works
|
Meeting data cleared. Banner disappears. Roster and fillers unchanged. | |
| DM-07 | High | Report copy
|
Full report text pasted correctly, formatted per markdown toggle state. | |
| DM-08 | Medium | Markdown report format
|
Report has markdown table with | Name | Role | Result | header row. |
13. Cloud Meeting Report
| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| CR-01 | Critical | Report screen shows two tabs
|
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
|
"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
|
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
|
Cloud report loads without a WOD section — only today's date matches. | |
| CR-05 | High | Refresh button re-queries Firestore
|
Cloud report reloads. New session from second device now appears. Status line timestamp updates. | |
| CR-06 | High | Copy on Cloud tab copies cloud content
|
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
|
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
|
"This Device" tab is active on re-entry. Local report is shown. Cloud tab does not auto-load. |
14. Manual Filler Scoring
| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| MF-01 | Critical | Score card shown after session ≥15 seconds
|
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
|
Modal shows plain "Counts saved." text — no score card, no percentage. Raw counts are saved normally. | |
| MF-03 | High | Score color reflects filler rate
|
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
|
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
|
Counter Report section shows the session. Filler breakdown visible. | |
| MF-06 | Medium | Unscored sessions labeled "counted, no score" in Progress
|
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
|
Transcription score card shows exact word count and exact percentage (not estimated). No "estimated" label. sessionFromTranscript prevents duplicate writeSession call. |
15. Offline & Edge Cases
| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| OE-01 | Critical | App works fully offline
|
Both sessions complete normally. No errors shown to user. Results save to local logs. | |
| OE-02 | High | Sync fails silently offline
|
Speaker added locally. No error modal. Sync failure is silent (console log only). | |
| OE-03 | High | Very long speaker name
|
Name added. UI handles long name gracefully — no overflow breaking layout. | |
| OE-04 | Medium | Duplicate speaker name
|
Second add is silently ignored. No duplicate in roster. | |
| OE-05 | Medium | Test/prod data isolation
|
"TEST ONLY" does not appear in prod roster. Keys are fully isolated by prefix. | |
| OE-06 | Medium | Empty report
|
Report shows "No data recorded." — no errors or blank screen. | |
| OE-07 | High | Back navigation from all screens
|
Every screen has a valid back path. No dead ends. Timer screen stops interval on exit. |
16. PWA
| ✓ | ID | Priority | Test Description | Expected Result |
|---|---|---|---|---|
| PW-01 | High | Install to home screen (iOS)
|
App opens fullscreen, no Safari chrome. Timer icon appears on home screen. | |
| PW-02 | High | No horizontal scroll
|
No horizontal scrolling on any screen. All content fits within viewport. | |
| PW-03 | High | Safe area insets respected
|
Content not obscured by notch or home indicator. Bottom buttons have safe area padding. | |
| PW-04 | Medium | Version label displays correctly
|
Shows "Version 3.2.2 (TEST)" at /test/ or "Version 3.2.2" at root. | |
| PW-05 | Medium | New deploy loads fresh
|
New version loads. Service worker network-first strategy serves fresh file. |