Integration tests: repository and RPC bulk insert
epic-proxy-activity-registration-foundation-task-012 — Write integration tests for `ProxyActivityRepository` against a local Supabase test instance. Verify: single proxy insert populates both registered_by and attributed_to correctly; bulk insert via RPC rolls back on partial failure; RLS blocks non-coordinator inserts; fetchByAttributedTo returns only records attributed to the queried peer mentor. Confirm defaults provider hydrates correctly from persisted SharedPreferences.
Acceptance Criteria
Technical Requirements
Execution Context
Tier 4 - 323 tasks
Can start after Tier 3 completes
Implementation Notes
Set up a supabase/seed.sql script under test/supabase/ that creates the minimum schema and roles needed for these tests — run it via supabase db reset before the suite. For the RLS test, create a helper createTestJwt(role: UserRole) that mints a valid JWT signed with the local JWT secret; inject it into a fresh SupabaseClient instance. For the bulk rollback test, craft a BulkRegistrationRequest where one BulkParticipant has a peer_mentor_id that violates a foreign key constraint — verify via a SELECT that the table is empty after the failed RPC call. Keep all Supabase credentials in a test/.env.test file loaded via dotenv in the test bootstrap, and add test/.env.test to .gitignore.
Structure tests so they can run in parallel (each suite inserts/deletes its own uniquely-prefixed rows) to keep total integration test time low.
Testing Requirements
Integration tests using flutter_test with real Supabase connections to a local Docker-based Supabase instance. Each test group should have a setUpAll that seeds prerequisite data (coordinator user, peer mentor user, organisation) and a tearDownAll that deletes all rows inserted during the suite. Use separate Supabase clients with different JWT roles for RLS tests — create JWTs via the test helper using the local anon and service keys. For the SharedPreferences hydration test, use shared_preferences_platform_interface's InMemorySharedPreferencesStore to avoid filesystem side effects.
Tag all tests with @Tags(['integration']) and document the required environment variables in a comment at the top of each test file.
The activities table migration adding registered_by and attributed_to columns may conflict with existing RLS policies or FK constraints if the user profile table structure differs from assumptions, blocking all subsequent epics.
Mitigation & Contingency
Mitigation: Review existing activities table schema and RLS policies before writing the migration. Run the migration against a staging database clone first. Write rollback scripts alongside the migration.
Contingency: If migration fails in staging, isolate the conflict with a targeted schema audit, adjust FK references or RLS policy scope, and re-run before touching production.
The RLS policy must filter proxy inserts to the coordinator's chapter scope. If the chapter-scope resolver pattern differs between organisations (multi-chapter coordinators in NHF vs single-chapter in HLF), the policy may be too broad or too restrictive.
Mitigation & Contingency
Mitigation: Design the RLS policy to accept a coordinator's full set of assigned chapter IDs (array) rather than a single chapter_id. Validate the policy against NHF multi-chapter test fixtures during the integration test phase.
Contingency: If the policy is found to be incorrect after deployment, introduce a server-side validation edge function as a safety net while the RLS policy is corrected.
The bulk_register_activities RPC function may time out or cause lock contention when inserting large participant batches (e.g. 40+ peer mentors in a single group session), degrading the user experience.
Mitigation & Contingency
Mitigation: Benchmark the RPC function with 50-participant batches during development. Use unnest-based bulk insert rather than row-by-row PL/pgSQL loops. Set a reasonable statement_timeout.
Contingency: If performance is insufficient, split the client-side submission into chunks of 20 participants with progress feedback, rather than a single RPC call.