Write unit tests for OrgPersistenceRepository
epic-organization-selection-infrastructure-task-008 — Write unit tests for OrgPersistenceRepository using a mocked LocalStorageAdapter. Cover: save writes the correct key/value pair, get returns the saved org ID, get returns null when nothing is persisted, and save overwrites a previously stored value. Verify the repository delegates correctly without introducing its own storage logic.
Acceptance Criteria
Technical Requirements
Execution Context
Tier 4 - 323 tasks
Can start after Tier 3 completes
Implementation Notes
Use mocktail (preferred for null-safety) or mockito with build_runner. Pattern: setUp creates a MockLocalStorageAdapter and a LocalOrgPersistenceRepository(mockAdapter). Each test uses when(mockAdapter.getString(any)).thenReturn(...) to set up the stub, calls the repository method, then verifies with verify(mockAdapter.getString(LocalStorageKeys.selectedOrgId)).called(1). Keep tests focused on delegation behavior — do NOT test what SharedPreferences does internally.
If the project uses mocktail, use registerFallbackValue for any custom types passed to the adapter.
Testing Requirements
Unit tests only using flutter_test and Mockito (or mocktail). Create a MockLocalStorageAdapter using @GenerateMocks or mocktail's Mock class. Use when()/verify() patterns to assert both the return values and the interactions (key used, value passed). No widget tests or integration tests needed for this repository layer.
Aim for 100% method coverage of LocalOrgPersistenceRepository.
SharedPreferences behaves differently on iOS (NSUserDefaults) vs Android (SharedPreferences) for edge cases such as first-launch cold reads, storage quota exceeded, or process kill mid-write. If the adapter does not account for these differences, the persistence layer can silently return null on one platform while returning a stale value on the other, causing incorrect routing decisions downstream.
Mitigation & Contingency
Mitigation: Write platform-specific integration tests using flutter_test device runners for both iOS and Android. Document known platform delta in the adapter's inline comments and encode defensive fallback for null returns at the repository boundary.
Contingency: If platform delta causes persistent issues, replace SharedPreferences with flutter_secure_storage for this key — the LocalStorageAdapter abstraction makes this a single-file swap with no impact on the repository or service layer.
The shared_preferences Flutter plugin may have a version conflict with other plugins already in the project pubspec.yaml. A conflict discovered late in the epic blocks all downstream epics.
Mitigation & Contingency
Mitigation: Resolve and pin the shared_preferences version in pubspec.yaml as the very first task of this epic before writing any implementation code. Run flutter pub get and resolve any version conflicts immediately.
Contingency: If version pinning is impossible due to transitive conflicts, implement LocalStorageAdapter using path_provider + dart:io for JSON file storage as an alternative — the interface contract remains unchanged.