CCExtractor / CCExtractor/taskwarrior-flutter

Add Unit Tests for v3 Layer and All GetX Controllers

Aperta
#619 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Dart
Stelle
244
Fork
179
Merge medio
12h 42m
PR unite (30g)
2

Descrizione

### Summary

The project has 91+ existing tests covering utilities, JSON models, routes, and tour UI — but **the v3 data layer (12 files) and all 14 GetX controllers have zero unit test coverage**. These are the most critical parts of the codebase: v3 contains the task database, network sync, and core models, while controllers hold all business logic and state management.

### Motivation

- Controllers are the sole owners of business logic per the GetX architecture contract — regressions here break the entire UI silently
- The v3 layer handles live task data sync; bugs here cause data loss
- No test infrastructure exists yet for either layer, making refactors risky

---

### Scope

#### Phase 1 — Test Infrastructure
- [ ] Add `test/v3/helpers.dart` — shared setup for sqflite FFI, SharedPreferences mock, binding init
- [ ] Add `test/modules/controllers/helpers.dart` — GetX test mode setup (`Get.testMode = true`, `Get.reset()`)
- [ ] Run `build_runner` to regenerate mocks

#### Phase 2 — V3 Unit Tests (12 files)

**Models** (`test/v3/models/`)
- [ ] `test/v3/models/task_test.dart` — `Task` fromJson/toJson, null fields, edge cases
- [ ] `test/v3/models/annotation_test.dart` — `Annotation` serialization
- [ ] `test/v3/models/task_for_replica_test.dart` — `TaskForReplica` model

**Database** (`test/v3/db/`)
- [ ] `test/v3/db/task_database_test.dart` — open, CRUD operations (sqflite FFI)
- [ ] `test/v3/db/update_test.dart` — migration/update logic

**Network** (`test/v3/net/`)
- [ ] `test/v3/net/add_task_test.dart`
- [ ] `test/v3/net/complete_test.dart`
- [ ] `test/v3/net/delete_test.dart`
- [ ] `test/v3/net/fetch_test.dart`
- [ ] `test/v3/net/modify_test.dart`
- [ ] `test/v3/net/origin_test.dart`

**Champion** (`test/v3/champion/`)
- [ ] `test/v3/champion/replica_test.dart` — sync logic with mocked DB and origin

#### Phase 3 — Controller Unit Tests (14 files in `test/modules/controllers/`)

- [ ] `home_controller_test.dart` — filterTasks, updateTags, reactive state, search
- [ ] `splash_controller_test.dart` — init flow, navigation state
- [ ] `taskc_details_controller_test.dart` — task init from args, field mutation, save
- [ ] `settings_controller_test.dart` — language change, directory pick, theme
- [ ] `widget_controller_test.dart`
- [ ] `logs_controller_test.dart`
- [ ] `about_controller_test.dart`
- [ ] `detail_route_controller_test.dart`
- [ ] `manage_task_server_controller_test.dart` — server add/remove, connection test
- [ ] `reports_controller_test.dart`
- [ ] `profile_controller_test.dart`
- [ ] `permission_controller_test.dart`
- [ ] `onboarding_controller_test.dart`
- [ ] `manage_task_champion_creds_controller_test.dart`

---

### Acceptance Criteria

- [ ] `flutter test test/v3/` passes with all 12 v3 tests green
- [ ] `flutter test test/modules/controllers/` passes with all 14 controller tests green
- [ ] `flutter test` full suite passes without regression
- [ ] Each controller test covers: `onInit` state, at least 2 state-mutating methods, and error/edge cases

### Implementation Notes

- No new pub dependencies needed — `mockito` and `sqflite_ffi` are already in `pubspec.yaml`
- Reference existing patterns in `test/api_service_test.dart` (mock setup) and `test/models/json/task_test.dart` (model tests)
- All 14 controllers extend `GetxController` — use `Get.testMode = true` per test group
- v3 net tests should mock `http.Client` via `@GenerateMocks([http.Client])`

### Labels
`testing` `good first issue` `help wanted` `v3` `controllers`

Guida per i contributori

Apri la guida per i contributori

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.