Unit tests for AssignmentHistoryRepository and cross-repository integration
epic-peer-mentor-detail-screen-data-layer-task-012 — Write unit tests for AssignmentHistoryRepository covering: empty list return for NHF and HLF org IDs, successful fetch for Blindeforbundet with open/closed status filtering, deadline metadata correctness (overdue flag when due date is past), and fetchOpenAssignments filtering. Additionally write an integration-level test confirming all four repositories can be instantiated together from the same Supabase client provider and called in parallel without resource conflicts.
Acceptance Criteria
Technical Requirements
Execution Context
Tier 4 - 323 tasks
Can start after Tier 3 completes
Implementation Notes
The integration test is not a true end-to-end test — it is a structural test confirming the repositories can coexist and share a client without stateful collisions (e.g., no global variables, no singleton misuse). The primary risk this test guards against is a developer accidentally using a module-level Supabase singleton instead of injected dependencies. For the overdue flag determinism, create a simple ClockProvider interface with a realNow implementation and a testNow(DateTime fixed) implementation, and inject it into the mapper. The integration test's Future.wait() pattern mirrors how the BLoC or Riverpod provider will actually call these repositories in production — so if the test passes, the production parallel-fetch pattern is validated by design.
Testing Requirements
Unit tests in assignment_history_repository_test.dart using flutter_test and mockito/mocktail. Inject a fixed Clock/DateTime for overdue flag tests so results are deterministic regardless of when CI runs. For the integration test in data_layer_integration_test.dart: create a single shared MockSupabaseClient, instantiate all four repositories with it, define separate when() stubs for each repository's query (using argument matchers that distinguish between table names), call all four via Future.wait(), and assert each resolved to its expected type. Verify that each repository's stub was called exactly once and no other repository's stub was called more than expected.
Group tests using Dart's group() for readability.
Supabase RLS policies for peer mentor data may block coordinator queries if the RLS rules are written for peer-mentor-self access only, requiring policy updates that affect other features sharing the same tables.
Mitigation & Contingency
Mitigation: Review existing RLS policies on peer_mentors, certification_records, and activity_log tables before writing repository queries. Coordinate with the database team to add coordinator-role predicates without weakening existing mentor-self policies.
Contingency: If policy changes are blocked, implement a Supabase Edge Function as a secure query proxy that enforces authorization server-side, avoiding direct RLS policy modification.
The activity log table schema may not have a mentor_id foreign key column or may require a JOIN through an intermediate table, making the aggregation query significantly more complex than anticipated.
Mitigation & Contingency
Mitigation: Inspect the actual Supabase activity_log table schema before starting the MentorActivityLogRepository implementation. Document the exact JOIN path needed and validate it returns correct results for a known mentor.
Contingency: If schema requires complex multi-table aggregation, implement a Supabase database function (RPC) and expose it via the repository's fetchSummary method to keep Dart code clean.
The Blindeforbundet assignment table may not yet exist in the shared Supabase schema or may have a different structure than assumed, blocking the AssignmentHistoryRepository implementation.
Mitigation & Contingency
Mitigation: Verify the assignments table exists and confirm its column structure with the Contact Detail & Edit Screen team which also depends on assignment data (assignment-repository in that feature).
Contingency: If the assignments table is not yet available, implement the AssignmentHistoryRepository with a stub returning empty list and a TODO marker, unblocking the aggregation service while the schema is finalized.