Integration tests for aggregation, BLoC, and screen assembly
epic-peer-mentor-detail-screen-bloc-and-assembly-task-013 — Write integration and unit tests covering: PeerMentorAggregationService parallel fetch with mocked repositories including partial failure scenarios, PeerMentorDetailBLoC state transitions for all events, and PeerMentorDetailScreenWidget rendering correct UI for loading/loaded/partial-error/full-error states. Use flutter_test and bloc_test. Verify pull-to-refresh dispatches correct event and certification expiry navigation fires correct route.
Acceptance Criteria
Technical Requirements
Execution Context
Tier 10 - 11 tasks
Can start after Tier 9 completes
Implementation Notes
Structure the test file into three sections matching the three layers under test: (1) AggregationService tests — pure unit tests with no Flutter framework, using dart:test group(); (2) BLoC tests — using bloc_test's blocTest() macro with act/expect; (3) Widget tests — using flutter_test's testWidgets() with pumped widget trees. For AggregationService parallel failure tests, use Completer objects to simulate delayed repository responses and verify that Future.wait([...]) error semantics are handled correctly (i.e., a single failure does not cancel other in-flight fetches if using Future.wait(eagerError: false) or a custom gather utility). For widget navigation tests, inject a MockGoRouter via a Provider override and assert the push method was called with the expected arguments — avoid relying on real navigation stack changes in widget tests. Define a shared buildTestWidget(BLoC bloc) helper that wraps PeerMentorDetailScreenWidget with all required Providers (BlocProvider, GoRouter, localization) to reduce boilerplate across test cases.
Testing Requirements
Use the bloc_test package for all BLoC state transition tests — do not use raw StreamController mocking. Use mocktail for repository mocks (preferred over mockito for null-safety ergonomics). For widget tests, inject the BLoC via BlocProvider with a MockBLoC created using bloc_test's MockBloc
For navigation tests, use GoRouter's testing overrides or a custom NavigatorObserver to capture push calls. For the aggregation service parallel fetch tests, use Future.wait with mocked async delays to verify partial failure handling. Run all tests with flutter test --coverage and assert >= 85% line coverage on BLoC and screen widget files.
The parallel Future.wait aggregation pattern may produce race conditions or incorrect merged state when some repositories resolve significantly faster than others, particularly if the BLoC receives a RefreshDetail event while a prior fetch is still in flight.
Mitigation & Contingency
Mitigation: Implement cancellation token pattern in the aggregation service to abort in-flight fetches on new events. Add BLoC test scenarios for rapid successive refresh events to validate state consistency.
Contingency: If race conditions persist, switch to a sequential-with-timeout fetch strategy for the first release and profile the performance impact before deciding whether parallel fetch optimization is worth the complexity.
Integrating PeerMentorDetailScreenWidget into the existing StatefulShellRoute navigation structure may conflict with the Contacts tab's existing route hierarchy, requiring changes to navigation-route-config that could affect other teams' features.
Mitigation & Contingency
Mitigation: Coordinate with the Contact List and Contact Detail feature teams before adding the new route. Review the existing StatefulShellRoute configuration and confirm the peer mentor detail route can be nested under the Contacts branch without path conflicts.
Contingency: If route conflicts arise, temporarily implement the peer mentor detail as a modal overlay (push route) rather than a shell route child, preserving functionality while the navigation architecture conflict is resolved.
The course enrollment screen that the certification alert banner links to may not yet exist or may be implemented in a separate feature epic, leaving a broken navigation tap for HLF users in the initial release.
Mitigation & Contingency
Mitigation: Check the certification management feature implementation status before finalizing Epic 4 scope. If the enrollment screen is not available, design the tap action to open the HLF course enrollment URL in an external browser as an interim solution.
Contingency: Implement the CTA as a configurable action: if the enrollment route exists in the router, push it; otherwise, launch the configured org-specific enrollment URL via url_launcher, ensuring HLF users can always take action on expired certifications.