From 160fb38c4f8c9476ad536fc2e689f692b2c8f010 Mon Sep 17 00:00:00 2001 From: null Date: Wed, 17 Jun 2026 01:34:32 -0500 Subject: [PATCH] docs(qa): private MVP checklist, internal testing checklist, store assets checklist, code QA scan (batch 13) --- docs/qa/private-mvp-checklist.md | 139 +++++++++++++++++++++ docs/release/internal-testing-checklist.md | 74 +++++++++++ docs/release/store-assets.md | 86 +++++++++++++ 3 files changed, 299 insertions(+) create mode 100644 docs/qa/private-mvp-checklist.md create mode 100644 docs/release/internal-testing-checklist.md create mode 100644 docs/release/store-assets.md diff --git a/docs/qa/private-mvp-checklist.md b/docs/qa/private-mvp-checklist.md new file mode 100644 index 00000000..3c6ec895 --- /dev/null +++ b/docs/qa/private-mvp-checklist.md @@ -0,0 +1,139 @@ +# Private MVP QA Checklist + +Manual testing checklist for the Closer app private MVP. + +## Onboarding + +- [ ] App launches to onboarding screen on fresh install +- [ ] Onboarding screens advance correctly (swipe/tap) +- [ ] "Get Started" leads to sign-up screen +- [ ] Sign-up: email + password creates account +- [ ] Sign-up: validation errors show (empty fields, weak password, existing email) +- [ ] Login: existing user can sign in +- [ ] Login: "Forgot password" navigates to reset screen +- [ ] Create Profile: name + avatar saved to Firestore +- [ ] Profile creation completes and navigates to home + +## Home Screen + +- [ ] Home screen loads after onboarding +- [ ] Daily question card is visible +- [ ] Question pack sections display correctly +- [ ] Navigation between tabs (Home, Dates, Wheel, Settings) +- [ ] Pull-to-refresh reloads content +- [ ] Partner home view shows when coupled + +## Questions + +### Daily Question +- [ ] Today's question loads +- [ ] User can answer (select option or type response) +- [ ] Answer is saved to Firestore +- [ ] "Partner answered" notification flow works (if coupled) + +### Question Packs +- [ ] Pack library screen lists available packs +- [ ] Premium packs show lock icon (if not subscribed) +- [ ] Free packs can be opened +- [ ] Category picker shows categories +- [ ] Selecting a category loads questions from that category + +### Question Detail & Thread +- [ ] Question detail screen loads with full text +- [ ] Answer reveal shows both partner answers (if both answered) +- [ ] Discussion thread loads messages +- [ ] User can send a message in thread +- [ ] Answer history screen shows past answers + +## Date Match + +- [ ] Date match screen shows swipe UI +- [ ] Swipe right = "love", swipe left = "skip" +- [ ] "Maybe" button works +- [ ] Match reveal screen appears when both partners like same idea +- [ ] Date matches screen shows all mutual matches +- [ ] Empty state shows when no matches + +## Date Builder + +- [ ] Date builder screen loads with suggestion fields +- [ ] Date and time picker buttons present (currently TODO placeholders) +- [ ] Save date plan works (if implemented) + +## Bucket List + +- [ ] Bucket list screen shows saved date ideas +- [ ] Adding items works +- [ ] Completing/removing items works + +## Wheel + +- [ ] Spin wheel animates and selects a category +- [ ] Category picker shows available categories +- [ ] Wheel complete screen shows result +- [ ] Wheel history screen shows past spins + +## Partner Pairing + +### Create Invite +- [ ] Invite code generates and displays +- [ ] Copy button copies code to clipboard +- [ ] Share button opens Android share sheet (Intent.ACTION_SEND) +- [ ] "Accept instead" link navigates to AcceptInvite + +### Accept Invite +- [ ] Code entry field works +- [ ] Back button navigates correctly +- [ ] Valid code proceeds to InviteConfirm + +### Invite Confirm +- [ ] Partner info displays correctly +- [ ] "Confirm" button links couple in Firestore +- [ ] "Wrong code" link returns to AcceptInvite +- [ ] Back button works + +## Settings + +- [ ] Settings screen loads with all sections +- [ ] Profile row shows local profile state (not fake data) +- [ ] Partner row tappable, navigates to RelationshipSettings +- [ ] Account screen shows profile info +- [ ] Delete account screen requires checkbox acknowledgement +- [ ] Notification settings screen present +- [ ] Privacy screen present +- [ ] Subscription screen present +- [ ] Legal section: Privacy Policy link opens externally +- [ ] Legal section: Terms of Service link opens externally +- [ ] Sign out works + +## Paywall + +- [ ] Paywall screen shows benefits list +- [ ] Product options display with prices +- [ ] Purchase button triggers RevenueCat flow +- [ ] Restore purchases link works +- [ ] Privacy Policy and Terms links at bottom open externally +- [ ] "Subscription terms apply" disclaimer visible +- [ ] Thank-you overlay appears on successful purchase +- [ ] Loading and error states display correctly + +## Notifications + +- [ ] App requests POST_NOTIFICATIONS permission on Android 13+ +- [ ] FCM token obtained and stored in Firestore +- [ ] Quiet hours can be set in notification settings +- [ ] Notification channel "Reminders" created + +## Edge Cases & Crash Risks + +- [ ] App works offline (local cache) +- [ ] App handles no network gracefully (error states, not crashes) +- [ ] Rapid navigation doesn't crash (tap all tabs quickly) +- [ ] Back navigation from every screen works +- [ ] Rotation doesn't crash (if not locked to portrait) +- [ ] Empty states show for: no questions, no matches, no history, no partner + +## Known Issues (from code scan) + +- **TODOs in code**: `DateBuilderScreen.kt` has TODO placeholders for date/time picker dialogs (lines 174, 182) +- **Debug logging**: `QuestionJsonParser.kt` uses `android.util.Log.e()` — should use Timber or remove before release \ No newline at end of file diff --git a/docs/release/internal-testing-checklist.md b/docs/release/internal-testing-checklist.md new file mode 100644 index 00000000..96810f37 --- /dev/null +++ b/docs/release/internal-testing-checklist.md @@ -0,0 +1,74 @@ +# Internal Testing Release Checklist + +Steps to prepare and distribute a private MVP build for internal testing. + +## 1. Signing Config + +- [ ] Generate or locate keystore for signing + - Keytool command: `keytool -genkeypair -v -keystore closer-release.jks -keyalg RSA -keysize 2048 -validity 10000 -alias closer` +- [ ] Store keystore file securely (NOT in git) +- [ ] Add signing config to `app/build.gradle.kts`: + - `storeFile`, `storePassword`, `keyAlias`, `keyPassword` + - Read from `local.properties` or environment variables +- [ ] Verify debug and release build variants both compile + +## 2. Build Configuration + +- [ ] Set `applicationId` to `app.closer` (verify not `com.couplesconnect`) +- [ ] Set versionCode and versionName in `app/build.gradle.kts` +- [ ] Set `minSdk`, `targetSdk` to appropriate values +- [ ] Verify `RC_API_KEY` in `local.properties` (or placeholder for testing) +- [ ] Verify `google-services.json` is present and points to correct Firebase project +- [ ] Remove or guard debug logging (`android.util.Log` calls) + +## 3. Firebase Configuration + +- [ ] Firebase project created (or confirmed existing) +- [ ] Authentication enabled: Email/Password sign-in method +- [ ] Firestore rules deployed and tested +- [ ] Cloud Functions deployed: + - [ ] `revenueCatWebhook` + - [ ] `syncEntitlement` + - [ ] `sendDailyQuestionReminder` + - [ ] `sendPartnerAnsweredNotification` + - [ ] `health` +- [ ] FCM enabled for the project +- [ ] RevenueCat project configured with Firebase integration (placeholder for now) + +## 4. Test Accounts + +- [ ] Create 2 test accounts (couple A: user1@test.com / user2@test.com) +- [ ] Create 1 solo test account (single user: solo@test.com) +- [ ] Verify sign-up → profile creation → home flow on each +- [ ] Pair test couple via invite code +- [ ] Verify paired state persists across app restarts + +## 5. Android App Distribution + +- [ ] Install Firebase App Distribution Gradle plugin +- [ ] Add `app distribution` section to `app/build.gradle.kts` +- [ ] Build release APK: `./gradlew :app:assembleRelease` +- [ ] Distribute via Firebase App Distribution: + ```bash + firebase appdistribution:distribute app/build/outputs/apk/release/app-release.apk \ + --app \ + --groups internal-testers \ + --release-notes "Private MVP v0.1.x" + ``` +- [ ] Add tester email addresses to Firebase App Distribution group +- [ ] Testers receive download link via email + +## 6. Pre-Distribution Smoke Test + +- [ ] Install release APK on a physical device +- [ ] Walk through the full QA checklist (`docs/qa/private-mvp-checklist.md`) +- [ ] Verify no crashes on cold start, warm start, or background restore +- [ ] Verify notification permissions prompt appears on Android 13+ +- [ ] Verify paywall loads (even with placeholder API key) + +## 7. Post-Distribution + +- [ ] Collect crash reports from Firebase Crashlytics +- [ ] Monitor Firestore usage in Firebase Console +- [ ] Monitor Cloud Function logs for errors +- [ ] Collect tester feedback via dedicated channel \ No newline at end of file diff --git a/docs/release/store-assets.md b/docs/release/store-assets.md new file mode 100644 index 00000000..f7ac5593 --- /dev/null +++ b/docs/release/store-assets.md @@ -0,0 +1,86 @@ +# Store Assets Checklist + +Google Play Store asset preparation for Closer app release. + +## Required Assets + +### Screenshots (phone) +- [ ] 2–8 screenshots, minimum 320px, maximum 3840px +- [ ] Recommended: 1080x1920 or 1440x2560 (16:9 ratio) +- [ ] Required screenshots: + - [ ] Home screen with daily question + - [ ] Date Match swipe screen + - [ ] Date Matches (mutual likes) + - [ ] Question thread / answer reveal + - [ ] Spin Wheel + - [ ] Settings screen + +### Feature Graphic +- [ ] 1024x500px JPEG or PNG +- [ ] Should convey app theme (couples, connection, questions) +- [ ] Must not contain device frames or text that duplicates store listing + +### App Icon +- [ ] 512x512 PNG, 32-bit color, no transparency +- [ ] Adaptive icon already defined in project — verify it renders well + +## Store Listing Text + +### Title +- [ ] Max 30 characters: "Closer — Couple Questions" + +### Short Description +- [ ] Max 80 characters +- [ ] Suggested: "Daily questions, date ideas, and deeper connection for couples." + +### Full Description +- [ ] Max 4000 characters +- [ ] Should cover: daily questions, date match, spin wheel, bucket list, premium features +- [ ] Include relevant keywords naturally + +### Category +- [ ] Primary: Lifestyle +- [ ] Secondary: Social (if available) + +### Tags +- [ ] Couple, Relationship, Questions, Date Ideas, Connection + +## Legal Links + +- [ ] Privacy Policy URL: `https://closer.app/privacy` (currently placeholder — must be live before submission) +- [ ] Terms of Service URL: `https://closer.app/terms` (currently placeholder — must be live before submission) +- [ ] Subscription terms: `https://closer.app/subscription-terms` (placeholder) + +## Content Rating + +- [ ] Complete IARC questionnaire +- [ ] Expected rating: PEGI 3 / ESRB Everyone (no violence, no gambling, no user-generated content moderation concerns) +- [ ] Note: If question packs include sensitive topics, may need higher rating + +## App Signing + +- [ ] Opt in to Google Play App Signing (recommended) +- [ ] Upload signing certificate to Play Console +- [ ] Keep local keystore backup in secure location +- [ ] DO NOT commit keystore to git + +## Pricing & Distribution + +- [ ] Free with in-app purchases (RevenueCat) +- [ ] Subscription tiers configured in Google Play Console: + - [ ] Monthly premium + - [ ] Annual premium (if offering) +- [ ] Distribution: All countries (or select markets for soft launch) + +## Pre-Launch Report + +- [ ] Run Google Play pre-launch report (automated after upload) +- [ ] Address any accessibility issues flagged +- [ ] Address any performance issues flagged + +## Known Gaps (resolve before public release) + +- Date/Time pickers in DateBuilder are TODO placeholders +- RevenueCat API key is placeholder +- Cloud Functions are scaffolded but not deployed to Firebase +- Privacy/Terms URLs are placeholders — need real hosted pages \ No newline at end of file