Write widget and integration tests for referral UI
epic-membership-recruitment-peer-mentor-ui-task-013 — Write Flutter widget tests for ReferralCodeScreen, RecruitmentStatsWidget, and NewMemberOnboardingScreen covering rendering, user interactions (copy, share, form submit), loading/error states, and Riverpod provider mocking. Add integration tests for the deep-link → onboarding → attribution submission flow.
Acceptance Criteria
Technical Requirements
Execution Context
Tier 6 - 158 tasks
Can start after Tier 5 completes
Implementation Notes
Structure test files to mirror the source file structure (test/screens/, test/widgets/). Use a shared test_helpers.dart to define reusable widget wrapper factories (pumpApp() that wraps under ProviderScope + MaterialApp + GoRouter). Prefer pump() + tester.tap() + pump() over pumpAndSettle() to avoid flaky timeouts on async operations; use pumpAndSettle() only where animations must complete. For async provider states, use tester.pumpWidget with a ProviderContainer and explicitly set provider state before pumping the widget.
The integration test deep link simulation can use Flutter's IntegrationTestWidgetsFlutterBinding and send a platform message simulating a deep link URI. Document any skipped edge cases with a // TODO: comment referencing the specific acceptance criterion number.
Testing Requirements
This task IS the testing work. Use flutter_test for widget tests. Use Riverpod's ProviderContainer with overrides to inject mocks. Use GoRouter's NavigatorObserver or a fake router to assert navigation events without a real router instance.
For the copy button, mock Clipboard via the test binding. For the share button, mock share_plus using a platform channel mock. Write parametrized tests for form validation edge cases (boundary values, Norwegian chars). Integration tests: use flutter_driver or integration_test package; seed a referral code in Supabase test DB before each test run and clean up afterward using tearDownAll.
QR codes rendered at the minimum 200×200 size may fail to scan under typical indoor lighting conditions on older or lower-resolution phone cameras, causing recruitment moments to fail when a peer mentor shows the screen to a prospective member.
Mitigation & Contingency
Mitigation: Set the default QR render size to 260×260 logical pixels (not the 200px minimum) and apply a high-contrast white module background. Test scan reliability on at minimum three physical devices (budget Android, mid-range Android, iPhone SE) before marking the screen as done.
Contingency: If scan reliability remains an issue, add a 'Enlarge QR' full-screen mode triggered by tapping the code, and ensure the text referral URL with copy-to-clipboard is always visible as a fallback sharing method.
The onboarding screen submits attribution and then hands off to an external membership registration URL (HLF's Dynamics portal or similar). If the external URL is unavailable, changes its format, or requires authentication the new member does not have, the conversion funnel is broken at its final step.
Mitigation & Contingency
Mitigation: Confirm the external registration URL and its expected query parameters with HLF's portal team before implementing the handoff. Record the pending_signup attribution event before launching the URL so data is not lost if the external site fails. Display a fallback message with contact information if the URL launch fails.
Contingency: If the external membership URL is not available at feature launch, implement a temporary form that collects name and email and stores a pending_member record in Supabase, allowing coordinators to manually complete registration while the integration is finalised.
Embedding the RecruitmentStatsWidget on the peer mentor home screen may conflict with existing layout components (activity summary, badge shelf), causing overflow or requiring a redesign of the home screen that is outside this epic's scope.
Mitigation & Contingency
Mitigation: Design the widget as a horizontally constrained card with a maximum height of 96dp so it can be inserted into any vertical list without overflow. Coordinate with the home screen's existing layout owners before starting the embedding task.
Contingency: If home screen embedding creates unacceptable layout conflicts, defer embedding to a separate home-screen redesign task and make the widget accessible only via the dedicated ReferralCodeScreen for the initial release.