Skip to Content
📚 MyStoryFlow Docs — Your guide to preserving family stories

Test Scenarios: Campaign-to-Book Merge

Purpose: Comprehensive UI-based scenario testing for the campaign-to-book merge implementation Tester: QA / Intern Last Updated: 2025-12-04


Quick Reference: Key URLs

URLWhat to Verify
/booksBook list loads, can create new
/books/newWizard works end-to-end
/books/[id]Dashboard shows book info, stories
/books/[id]/storiesStory list for book
/books/[id]/stories/newCreate story with prompts
/books/[id]/stories/[sid]/editEdit story, auto-save works
/books/[id]/recordVoice recording, book-scoped
/books/[id]/conversationsAI chat, book context
/books/[id]/shareSharing UI, action-oriented
/books/[id]/settingsBook configuration
/api/cron/weekly-promptsWeekly prompts cron endpoint
/settings/notificationsUser notification preferences

Test Accounts Required

  • User A (Primary): Creates books, shares, tests owner flows
  • User B (Family): Receives shares, tests permission boundaries
  • User C (Gift Recipient): Tests gift acceptance flow

Part 1: Book Creation Flows

Scenario 1.1: Create Personal Memoir (Self Path)

Goal: Complete book creation wizard for “writing my own story”

StepActionExpected ResultPass
1Go to /books/newWizard loads with path selection[ ]
2Select “I’m writing my own story”Proceeds to template selection (skips storyteller step)[ ]
3Browse templates, select “Life Story Memoir”Template preview shows chapters[ ]
4Click “Use This Template”Proceeds to book details[ ]
5Enter title: “My Journey”Title field accepts input[ ]
6Verify Goals step loads with defaults10 stories pre-selected with auto-populated target date[ ]
7See weekly prompts info boxAmber box says “We’ll send weekly story prompts”[ ]
8Select different goal (e.g., 15 stories)Target date auto-adjusts (~15 weeks out)[ ]
9Optionally change target dateDate picker accepts custom date[ ]
10Select “No goal” optionTarget date field hides[ ]
11Select 10 stories againTarget date auto-populates again[ ]
12Review summary screenAll entered info displays correctly[ ]
13Click “Start Book”Book created, redirects to dashboard[ ]
14Verify dashboardTitle shows, progress 0/10, chapters visible[ ]

Scenario 1.2: Create Book for Family Member

Goal: Complete wizard for “capturing someone else’s story”

StepActionExpected ResultPass
1Go to /books/newWizard loads[ ]
2Select “I’m capturing someone else’s story”Proceeds to storyteller info step[ ]
3Enter storyteller name: “Grandma Rose”Field accepts input[ ]
4Select relationship: “Grandparent”Dropdown works[ ]
5Enter optional emailField validates email format[ ]
6Continue through template selectionTemplate picker loads[ ]
7Select “Family History” templatePreview shows chapters[ ]
8Complete remaining stepsAll steps work[ ]
9Verify dashboardShows “About: Grandma Rose”[ ]

Scenario 1.3: Create Gift Book

Goal: Complete gift flow with recipient info

StepActionExpected ResultPass
1Go to /books/newWizard loads[ ]
2Select “I’m giving this as a gift”Proceeds to gift recipient step[ ]
3Enter recipient name: “Dad”Field accepts input[ ]
4Enter recipient emailField validates[ ]
5Enter gift messageText area accepts long message[ ]
6Complete template and book detailsAll steps work[ ]
7Review shows gift infoRecipient name, message visible[ ]
8Complete creationBook marked as gift (is_gift: true)[ ]

Scenario 1.4: Wizard Navigation and Validation

Goal: Test wizard edge cases

StepActionExpected ResultPass
1Start wizard, click Back on step 1Should not error/crash[ ]
2Try to proceed without selecting pathValidation prevents advance[ ]
3Try to proceed without selecting templateValidation prevents advance[ ]
4Leave title blank, try to continueValidation shows error[ ]
5Enter very long title (100+ chars)Truncates or shows error[ ]
6Navigate forward then backPrevious selections preserved[ ]
7Refresh browser mid-wizardProgress preserved OR clean restart[ ]
8Close browser, returnDraft wizard state handled[ ]

Part 2: Story Creation and Editing

Scenario 2.1: Create Story by Writing

Goal: Test text-based story creation

StepActionExpected ResultPass
1From book dashboard, click “Add Story”Story creation page loads[ ]
2See two equal options: Record / WriteNeither dominates visually[ ]
3Click “Write”Editor loads[ ]
4See template prompt suggestionsPrompts relevant to chapter[ ]
5Select a prompt OR skipWorks both ways[ ]
6Type story titleTitle saves[ ]
7Type 2+ paragraphs of contentContent accepts formatting[ ]
8Apply bold, italic, headingFormatting works[ ]
9See auto-save indicatorShows “Saving…” then “Saved”[ ]
10Click Done/SaveReturns to book dashboard[ ]
11Verify story appears in listNew story shows with title[ ]
12Progress counter updatedShows 1/10 (or appropriate)[ ]

Scenario 2.2: Create Story by Voice Recording

Goal: Test voice recording flow

StepActionExpected ResultPass
1From book dashboard, click “Record”Recording page loads at /books/[id]/record[ ]
2See large microphone buttonButton is prominent, easy to tap[ ]
3Click to start recordingRecording starts, timer visible[ ]
4Speak for 15-30 secondsRecording captures audio[ ]
5Click stopRecording stops[ ]
6See playback optionCan listen to recording[ ]
7Click “Create Story from Recording”Transcription begins[ ]
8See transcription resultText appears (or loading state)[ ]
9Edit transcription if neededCan modify text[ ]
10Save with titleStory created in book[ ]
11Return to record pageRecording shows in history[ ]

Scenario 2.3: Edit Existing Story

Goal: Test story editing workflow

StepActionExpected ResultPass
1Open book dashboardStories list visible[ ]
2Click on existing storyStory view loads[ ]
3Click “Edit”Editor loads with content[ ]
4Modify titleTitle updates[ ]
5Add paragraph to contentContent expands[ ]
6Delete some textContent shrinks[ ]
7See auto-save workingIndicator shows saves[ ]
8Add an image (if supported)Image uploads and displays[ ]
9Click DoneReturns to story view[ ]
10Verify changes persistedAll edits visible[ ]

Scenario 2.4: Draft Recovery After Crash

Goal: Test single-session draft persistence

StepActionExpected ResultPass
1Open existing story in edit modeEditor loads[ ]
2Make significant changesAdd new paragraph[ ]
3DO NOT click saveLeave changes unsaved[ ]
4Close browser tab abruptlyTab closes[ ]
5Reopen app, navigate to same story editEdit page loads[ ]
6See draft recovery modal”We found unsaved work” message[ ]
7Click “Restore”Unsaved changes reappear[ ]
8Save properlyContent saves[ ]
9Close and reopenNo recovery modal (draft cleared)[ ]

Alternative path:

StepActionExpected ResultPass
7aClick “Discard” insteadOriginal content loads[ ]
8aVerify draft clearedNo recovery on next visit[ ]

Scenario 2.5: Placeholder Stories (Progressive Reveal)

Goal: Test placeholder/chapter experience

StepActionExpected ResultPass
1Create new book with 12-chapter templateBook created[ ]
2View book dashboardSee encouraging first prompt (not all 12)[ ]
3Click on first placeholderEditor opens with prompt context[ ]
4Write and save first storyReturns to dashboard[ ]
5See celebration/success messagePositive feedback shown[ ]
6See next prompt suggestions”Want to write another?” with ideas[ ]
7Toggle “View all chapters” (if available)All 12 placeholders visible[ ]
8Delete an unwanted placeholderPlaceholder removed[ ]
9Reorder placeholders (if supported)Order changes[ ]

Part 3: Book-Scoped Features

Scenario 3.1: Recordings Stay Book-Scoped

Goal: Verify recordings don’t leak between books

StepActionExpected ResultPass
1Create Book A with 1 recordingRecording saved[ ]
2Create Book BNew book created[ ]
3Go to Book A’s record pageSee Book A’s recording[ ]
4Go to Book B’s record pageNO recordings visible (empty)[ ]
5Record in Book BNew recording saved[ ]
6Go back to Book AStill only shows Book A’s recording[ ]

Scenario 3.2: AI Conversations Book-Scoped

Goal: Verify AI uses correct book context

StepActionExpected ResultPass
1Create Book A with story titled “My Childhood”Story saved[ ]
2Go to Book A conversationsChat loads[ ]
3Ask “What stories have I written?”AI mentions “My Childhood”[ ]
4Create Book B (no stories)Book created[ ]
5Go to Book B conversationsChat loads[ ]
6Ask same questionAI does NOT mention “My Childhood”[ ]

Scenario 3.3: Multiple Books Stay Independent

Goal: Verify book isolation

StepActionExpected ResultPass
1Create Book A: “Dad’s Stories”Book created[ ]
2Add 2 stories to Book AStories saved[ ]
3Create Book B: “My Childhood”Book created[ ]
4Add 1 story to Book BStory saved[ ]
5Open Book A dashboardShows only 2 stories[ ]
6Open Book B dashboardShows only 1 story[ ]
7Delete story from Book BBook A unaffected[ ]

Part 4: Sharing and Permissions

Scenario 4.1: Share Book as View-Only

Goal: Test “Share” button (Viewer role)

StepActionExpected ResultPass
1As User A, open book you ownBook loads[ ]
2Go to Share page/books/[id]/share loads[ ]
3Click “Share” buttonGenerates shareable link[ ]
4Copy linkLink copied to clipboard[ ]
5As User B, open link in incognitoPrompted to login or view[ ]
6Log in as User BBook visible[ ]
7Try to edit a storyEdit button disabled/hidden[ ]
8Try to add new storyAdd button disabled/hidden[ ]
9Verify can view all contentStories readable[ ]

Scenario 4.2: Invite Family to Help (Contributor)

Goal: Test “Invite to Help” flow

StepActionExpected ResultPass
1As User A, go to Share pagePage loads[ ]
2Click “Invite to Help”Invitation form appears[ ]
3Enter User B’s emailEmail accepted[ ]
4See permission question”Should they edit your stories or only add their own?”[ ]
5Select “Only add their own”Contributor role selected[ ]
6Send invitationSuccess message[ ]
7As User B, check emailInvitation received[ ]
8Accept invitationBook appears in User B’s list[ ]
9As User B, open the bookCan view all stories[ ]
10Try to edit User A’s storyCannot edit (blocked)[ ]
11Add new storyStory created successfully[ ]
12Edit own storyWorks[ ]

Scenario 4.3: Invite Family to Help (Editor)

Goal: Test full edit permission

StepActionExpected ResultPass
1As User A, invite User B as EditorSelect “Edit your stories” option[ ]
2As User B, accept and open bookBook accessible[ ]
3Edit User A’s storyEdit allowed[ ]
4Save changesChanges persist[ ]
5As User A, view the storySee User B’s edits[ ]

Scenario 4.4: Revoke Permissions

Goal: Test permission removal

StepActionExpected ResultPass
1As User A, go to Share pageSee User B listed[ ]
2Remove User B’s accessConfirmation prompt[ ]
3Confirm removalUser B removed[ ]
4As User B, try to access bookAccess denied[ ]

Part 5: Gift Flow

Scenario 5.1: Send Gift Book

Goal: Test gift sending flow

StepActionExpected ResultPass
1Create gift book for User CBook created with is_gift: true[ ]
2Optionally add starter storiesStories saved[ ]
3Go to gift send flowSend options appear[ ]
4Send gift to User C’s emailGift sent, status: “sent”[ ]
5Check User A’s book listBook shows as “Gift sent”[ ]

Scenario 5.2: Receive and Accept Gift

Goal: Test gift acceptance and ownership transfer

StepActionExpected ResultPass
1As User C, check emailGift notification received[ ]
2Click accept linkRedirected to app[ ]
3Create account (if new)Account created[ ]
4See gift acceptance screenGift message displayed[ ]
5Accept giftBook ownership transfers[ ]
6Verify User C is now ownerFull edit/delete access[ ]
7Verify User A is contributorCan still add stories[ ]

Scenario 5.3: Decline Gift

Goal: Test gift decline flow

StepActionExpected ResultPass
1As User C, click declineConfirmation prompt[ ]
2Confirm declineGift declined[ ]
3As User A, see notificationGift status: “declined”[ ]
4User A retains ownershipBook still accessible[ ]

Part 6: Template and Settings

Scenario 6.1: Change Template Mid-Project

Goal: Test template switching

StepActionExpected ResultPass
1Create book with “Quick Memoir” templateBook created[ ]
2Add 3 storiesStories saved[ ]
3Go to Book SettingsSettings page loads[ ]
4Click “Change Template”Template picker opens[ ]
5See warning message”Your stories will be preserved”[ ]
6Select “Life Story Memoir”Template changes[ ]
7See mapping suggestions”These stories might fit…”[ ]
8Confirm changeTemplate updated[ ]
9Verify stories preservedAll 3 stories still exist[ ]
10See new prompt suggestionsNew template prompts available[ ]

Scenario 6.2: Update Book Settings

Goal: Test settings modification

StepActionExpected ResultPass
1Open book settingsSettings page loads[ ]
2Change book titleNew title saved[ ]
3Change notification frequencySetting updated[ ]
4Update storyteller infoInfo saved[ ]
5Return to dashboardNew title displayed[ ]
6Verify notification settingPersisted correctly[ ]

Scenario 6.3: Delete Book

Goal: Test book deletion

StepActionExpected ResultPass
1Go to book settingsPage loads[ ]
2Click “Delete Book”Warning modal appears[ ]
3Warning mentions stories count”This book has X stories”[ ]
4Confirm deletionBook deleted[ ]
5Redirected to book listBook no longer visible[ ]
6Shared users lose accessUser B can’t access[ ]

Part 7: Story Duplication

Scenario 7.1: Duplicate Story to Another Book

Goal: Test story duplication feature

StepActionExpected ResultPass
1Open a story in Book AStory view loads[ ]
2Click “Duplicate to another book”Modal shows book list[ ]
3Select Book BBook B highlighted[ ]
4Click DuplicateSuccess message[ ]
5Open Book BSee duplicated story[ ]
6Verify title has “(Copy)” suffixTitle modified[ ]
7Edit duplicated storyChanges save[ ]
8Check original in Book AUnchanged[ ]

Part 8: Navigation and Routing

Scenario 8.1: URL Routes Work Correctly

Goal: Test all book-related routes

StepActionExpected ResultPass
1Navigate to /booksBook list loads[ ]
2Navigate to /books/newWizard loads[ ]
3Navigate to /books/[valid-id]Book dashboard loads[ ]
4Navigate to /books/[invalid-id]404 or error page[ ]
5Navigate to /books/[id]/storiesStory list loads[ ]
6Navigate to /books/[id]/stories/newCreate story page loads[ ]
7Navigate to /books/[id]/recordRecording page loads[ ]
8Navigate to /books/[id]/conversationsChat loads[ ]
9Navigate to /books/[id]/shareShare page loads[ ]
10Navigate to /books/[id]/settingsSettings load[ ]

Scenario 8.2: Breadcrumb Navigation

Goal: Test navigation hierarchy

StepActionExpected ResultPass
1Navigate deep: /books/[id]/stories/[sid]/editPage loads[ ]
2Check breadcrumbsShows: Books > Book Title > Story Title[ ]
3Click “Book Title” crumbReturns to book dashboard[ ]
4Click “Books” crumbReturns to book list[ ]

Scenario 8.3: Back Navigation

Goal: Test browser back button

StepActionExpected ResultPass
1Books list > Book > Story > EditNavigate through flow[ ]
2Click browser backReturns to story view[ ]
3Click back againReturns to book dashboard[ ]
4Click back againReturns to books list[ ]

Part 9: Mobile Experience

Scenario 9.1: Mobile Book Creation

Goal: Test wizard on mobile viewport

StepActionExpected ResultPass
1Set viewport to 375px (iPhone)Responsive layout[ ]
2Start book creation wizardSingle-column layout[ ]
3Verify buttons are 48px+Tappable targets[ ]
4Complete all wizard stepsAll steps usable[ ]
5Verify bottom navigationBottom tabs visible[ ]

Scenario 9.2: Mobile Story Editing

Goal: Test editor on mobile

StepActionExpected ResultPass
1Open story editor on mobileEditor loads[ ]
2Verify toolbar at bottomAccessible by thumb[ ]
3Type contentKeyboard doesn’t obscure input[ ]
4Apply formattingToolbar buttons work[ ]
5See auto-save indicatorVisible on mobile[ ]

Scenario 9.3: Mobile Voice Recording

Goal: Test recording on mobile

StepActionExpected ResultPass
1Open record page on mobilePage loads[ ]
2Mic button large and centeredEasy to tap[ ]
3Start/stop recordingWorks on mobile[ ]
4Playback worksAudio plays[ ]

Part 10: Error Handling

Scenario 10.1: Network Error During Save

Goal: Test graceful error handling

StepActionExpected ResultPass
1Open story editorEditor loads[ ]
2Make changesContent modified[ ]
3Disable network (dev tools)Offline mode[ ]
4See auto-save attemptShows “Saved locally” indicator[ ]
5Re-enable networkOnline mode[ ]
6See sync completeContent syncs to server[ ]

Scenario 10.2: Recording Upload Failure

Goal: Test recording error recovery

StepActionExpected ResultPass
1Record a storyRecording saved locally[ ]
2Disable networkOffline[ ]
3Try to uploadError message shown[ ]
4Verify recording not lostCan retry later[ ]
5Re-enable network, retryUpload succeeds[ ]

Scenario 10.3: Validation Errors

Goal: Test form validation

StepActionExpected ResultPass
1Create book with empty titleError: “Title required”[ ]
2Create book with invalid emailError: “Invalid email”[ ]
3Error messages are clearNot technical jargon[ ]
4Error messages use amber colorNot alarming red[ ]

Part 11: Accessibility Quick Checks

Scenario 11.1: Keyboard Navigation

Goal: Test keyboard accessibility

StepActionExpected ResultPass
1Tab through wizard stepsFocus moves logically[ ]
2Focus indicators visible3px amber outline[ ]
3Enter/Space activates buttonsAll buttons work[ ]
4Escape closes modalsModal dismissed[ ]

Scenario 11.2: Screen Reader Basics

Goal: Test assistive technology

StepActionExpected ResultPass
1Enable VoiceOver/NVDAScreen reader active[ ]
2Navigate to book list”Books” heading announced[ ]
3Save a story”Saved” status announced[ ]
4Error occursError message announced[ ]

Part 12: Data Integrity

Scenario 12.1: Chapter Ordering (Junction Table)

Goal: Test concurrent editing doesn’t cause data loss

StepActionExpected ResultPass
1Create book with 5 storiesStories ordered 1-5[ ]
2As User A, start reorderingDrag story 3 to position 1[ ]
3Simultaneously as User B, reorderDrag story 5 to position 2[ ]
4Both saveBoth changes persist[ ]
5Refresh pageNo stories lost[ ]
6Verify final order makes senseNo duplicates, no gaps[ ]

Scenario 12.2: Story Count Accuracy

Goal: Verify counts stay accurate

StepActionExpected ResultPass
1Create book with goal: 10Progress shows 0/10[ ]
2Add 1 storyProgress shows 1/10[ ]
3Add 2 more storiesProgress shows 3/10[ ]
4Delete 1 storyProgress shows 2/10[ ]
5Duplicate story from another bookProgress shows 3/10[ ]

Part 13: Weekly Story Prompts System

Scenario 13.1: Weekly Prompts Cron Job Execution

Goal: Test the weekly prompts cron endpoint (requires CRON_SECRET)

Prerequisites:

  • Set CRON_SECRET environment variable in Vercel/local environment
  • Have at least one user with email_frequency = 'weekly' and email_notifications = true
  • User must have at least one book
StepActionExpected ResultPass
1Make POST request to /api/cron/weekly-prompts without authReturns 401 Unauthorized[ ]
2Make POST with wrong Bearer tokenReturns 401 Unauthorized[ ]
3Make POST with correct Bearer {CRON_SECRET}Returns 200 with results[ ]
4Check response bodyContains processed, succeeded, failed, skipped counts[ ]
5Check prompt_delivery_log tableNew entry created for processed users[ ]
6Run cron again within 6 daysUser skipped (recently received prompt)[ ]

Scenario 13.2: Prompt Selection Algorithm

Goal: Test intelligent prompt selection

StepActionExpected ResultPass
1Create book with “Life Story Memoir” templateBook created with template_type[ ]
2Trigger prompt for this userGets template-specific prompt[ ]
3Check prompt_delivery_logPrompt text logged[ ]
4Trigger again (after 6+ days)Gets DIFFERENT prompt (not repeated)[ ]
5Create book with no templateBook created[ ]
6Trigger prompt for this userGets generic fallback prompt[ ]

Scenario 13.3: Email Delivery (Resend Integration)

Goal: Test weekly prompt email sends correctly

Prerequisites:

  • Resend API key configured
  • User has valid email address
StepActionExpected ResultPass
1Trigger cron for eligible userEmail queued in email_send_queue[ ]
2Check Resend dashboardEmail appears in sent list[ ]
3Open email in inboxEmail received[ ]
4Verify email contentContains user name, prompt text, book title[ ]
5Verify “Write your story” CTALinks to /books/[id]/write?prompt=...[ ]
6Verify unsubscribe linkLinks to /settings/notifications[ ]
7Click write linkOpens app at correct book with prompt pre-filled[ ]

Scenario 13.4: User Prompt Preferences

Goal: Test user can control prompt frequency

StepActionExpected ResultPass
1Go to /settings/notificationsSettings page loads[ ]
2Find email frequency settingOptions: weekly, monthly, never[ ]
3Set to “weekly”Setting saved[ ]
4Trigger cronUser receives prompt[ ]
5Set to “never”Setting saved[ ]
6Trigger cronUser skipped (notifications disabled)[ ]
7Set to “monthly”Setting saved[ ]
8Check next prompt timingRespects monthly interval[ ]

Scenario 13.5: Prompt Delivery Log Verification

Goal: Verify prompt tracking works correctly

StepActionExpected ResultPass
1Query prompt_delivery_log before testNote current count[ ]
2Trigger prompt delivery for User AEntry created[ ]
3Verify log entry fieldsuser_id, book_id, prompt_text, delivered_at populated[ ]
4Attempt duplicate delivery same dayBlocked by 6-day check[ ]
5Check for leaksUser A’s prompts don’t appear for User B[ ]

Scenario 13.6: Template-Based Prompts (Seed Data)

Goal: Verify seeded prompts work for each template

StepActionExpected ResultPass
1Query book_chapter_prompts table60+ prompts seeded[ ]
2Filter by template “life-story-memoir”~15 prompts found[ ]
3Filter by template “quick-memoir”~15 prompts found[ ]
4Filter by template “family-history”~15 prompts found[ ]
5Filter by template “war-service”~15 prompts found[ ]
6Verify prompt qualityThoughtful, engaging questions[ ]
7Verify chapter_title populatedOptional chapter association[ ]

Scenario 13.7: Edge Cases and Error Handling

Goal: Test prompt system resilience

StepActionExpected ResultPass
1User with no booksSkipped in cron results[ ]
2User with no emailSkipped in cron results[ ]
3User with invalid emailError logged but cron continues[ ]
4Resend API failureError logged, user marked failed[ ]
5Database connection failureCron returns 500 with error details[ ]
6All prompts exhausted for userFalls back to generic prompts[ ]
7Check cron runs on scheduleVercel cron: Sundays 10 AM UTC[ ]

Part 14: GoalsStep UI Testing

Scenario 14.1: Goals Step Mobile Experience

Goal: Test goals step responsive design

StepActionExpected ResultPass
1Open wizard on mobile (375px)Single-column layout[ ]
2Story count buttons2x2 grid on mobile[ ]
3Button labelsShort labels: “10”, “15”, “20”, “None”[ ]
4Weekly prompts boxCompact text on mobile[ ]
5Date pickerFull width, accessible[ ]
6Tap targetsMin 44px height on all buttons[ ]

Scenario 14.2: Goals Step Desktop Experience

Goal: Test goals step on desktop

StepActionExpected ResultPass
1Open wizard on desktop (1024px+)Centered content, max-width container[ ]
2Story count buttons4-column grid[ ]
3Button labelsFull labels: “10 stories”, “15 stories”, etc.[ ]
4Weekly prompts boxFull text with “delivered to your inbox”[ ]
5”Recommended” badgeVisible on 10 stories option[ ]
6Check mark indicatorShows on selected option[ ]

Scenario 14.3: Goals Step Auto-Population

Goal: Test date auto-population logic

StepActionExpected ResultPass
1Wizard loads fresh10 stories + date ~10 weeks out[ ]
2Select 15 storiesDate updates to ~15 weeks out[ ]
3Select 20 storiesDate updates to ~20 weeks out[ ]
4Select “No goal”Date field hides completely[ ]
5Select 10 stories againDate reappears with ~10 weeks[ ]
6Manually change dateCustom date persists[ ]
7Change story countDate resets to calculated value[ ]

Scenario 14.4: Goals Step Accessibility

Goal: Test goals step keyboard and screen reader

StepActionExpected ResultPass
1Tab to story count buttonsFocus visible on each[ ]
2Use arrow keys in radio groupSelection moves (if supported)[ ]
3Press Enter/Space on buttonSelects the option[ ]
4Screen reader reads group”Select story count goal” announced[ ]
5Screen reader reads selection”10 stories, Recommended, selected”[ ]
6Focus on date inputLabel “Target finish date” announced[ ]

Final Sign-Off Checklist

Before marking testing complete:

Core Functionality:

  • All critical scenarios (Part 1-6) pass
  • Mobile scenarios (Part 9) pass
  • At least one full user journey per persona (self/family/gift)
  • Permission boundaries tested
  • Error handling tested
  • No data loss observed

Weekly Story Prompts System (Part 13):

  • Cron endpoint authentication works
  • Prompt selection algorithm selects appropriate prompts
  • Email delivery via Resend works
  • User can control prompt frequency in settings
  • Prompt delivery log tracks deliveries correctly
  • Template-based prompts seeded for all 4 templates

GoalsStep UI (Part 14):

  • Auto-population of target date works on initial load
  • Date recalculates when story count changes
  • Mobile responsive (2x2 grid, short labels)
  • Desktop layout (4-column grid, full labels)
  • Weekly prompts info box displays correctly
  • Keyboard navigation works

Database Migrations:

  • prompt_delivery_log table exists
  • book_chapter_prompts table exists with 60+ seed prompts
  • user_prompt_preferences table exists
  • RLS policies enforced on all prompt tables

Tester Name: _______________ Date Completed: _______________ Blockers Found: _______________


Appendix A: Environment Variables Required

For testing the weekly prompts system, ensure these are configured:

VariablePurposeRequired For
CRON_SECRETAuthenticates cron requestsScenario 13.1
RESEND_API_KEYSends emails via ResendScenario 13.3
NEXT_PUBLIC_APP_URLBase URL for email linksScenario 13.3

Appendix B: SQL Queries for Verification

Check seeded prompts:

SELECT template_type, COUNT(*) FROM book_chapter_prompts GROUP BY template_type;

Check prompt delivery log:

SELECT * FROM prompt_delivery_log WHERE user_id = '[USER_ID]' ORDER BY delivered_at DESC LIMIT 5;

Check eligible users for weekly prompts:

SELECT id, email, email_frequency, email_notifications FROM profiles WHERE email_frequency = 'weekly' AND email_notifications = true AND email IS NOT NULL;