Write unit tests for BadgeDefinitionRepository
epic-achievement-badges-foundation-task-011 — Write unit tests for BadgeDefinitionRepository covering: correct deserialisation of the criteria JSON column into typed BadgeCriteria models, handling of missing or malformed criteria JSON without throwing, fetching definitions returns only organisation-scoped results, and creating a definition with threshold criteria persists the JSON correctly. Include edge case tests for the honorar-threshold criteria with values 3 and 15.
Acceptance Criteria
Technical Requirements
Execution Context
Tier 3 - 413 tasks
Can start after Tier 2 completes
Implementation Notes
The honorar-threshold values (3 and 15) are not arbitrary — they map to specific business rules for Blindeforbundet (kontorhonorar triggers at 3rd assignment, higher rate at 15th). Make sure BadgeCriteria models expose these threshold values as named fields so the business logic layer can compare them without parsing JSON again. For malformed JSON handling, use a try/catch around jsonDecode inside the repository and log with a structured logger rather than print() — follow the project's existing logging pattern. Ensure that the mock setup for createBadgeDefinition verifies the exact JSON payload sent to Supabase (use mocktail's verify() / captured arguments) so the test catches any serialisation regressions.
Testing Requirements
Use flutter_test and mocktail. Organise tests in group() blocks: 'criteria deserialisation', 'organisation scoping', 'createBadgeDefinition'. For deserialisation tests, construct mock Supabase responses directly as Map
Include a test for criteria JSON with extra unknown fields to verify the deserialiser ignores unknown keys rather than throwing. Run flutter test --coverage and confirm 80% line coverage.
Badge criteria are stored as structured JSON in badge_definitions. If the JSON schema for criteria (threshold counts, streak lengths, training completion flags) is not well-defined upfront, the evaluation service will be built against a moving target, requiring costly migrations and refactors.
Mitigation & Contingency
Mitigation: Define and document the criteria JSON schema in a shared type file before any repository code is written. Review the schema with all three organisations' badge requirements — especially Blindeforbundet's honorar thresholds — and version the JSON schema using a 'criteria_version' field from day one.
Contingency: If the criteria schema must change after services are built, write a Supabase migration to backfill existing rows and add a migration version column. Keep the evaluation service criteria parser isolated behind an interface so only one function needs updating.
Badge icon assets may not yet exist or may fail WCAG 2.2 AA contrast validation (minimum 3:1 for graphical objects) when rendered over design-token backgrounds. Missing or non-compliant icons could block UI epic delivery for Blindeforbundet, for whom screen reader and visual accessibility is non-negotiable.
Mitigation & Contingency
Mitigation: During this epic, implement the contrast-ratio validator in badge-icon-asset-manager and run it as a Flutter test against all candidate icon assets early. Coordinate with the design team to provide WCAG-compliant SVG icons in both locked and unlocked variants before the UI epic begins.
Contingency: If assets are late or fail contrast checks, ship placeholder icons that are guaranteed compliant (solid design-token colour fills with text labels) and swap in final assets post-QA without requiring a code change.