CCExtractor / CCExtractor/taskwarrior-flutter

Add Unit Tests for v3 Layer and All GetX Controllers

オープン
#619 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
Dart
スター
244
フォーク
179
平均マージ
12時間 42分
マージ済み PR(30日)
2

説明

### 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`

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

pubspec.yaml と test/api_service_test.dart および test/models/json/task_test.dart にある既存のパターンから始めます。test/v3/ と test/modules/controllers/ の下に、一覧にあるヘルパーとテストを追加し、その後、完全なテストスイートの前に build_runner と、対象を絞った 2 つの flutter test コマンドを実行します。12 件すべての v3 テストと 14 件の controller テストがパスし、指定された状態、ミューテーション、エッジケースのカバレッジが確保されていれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
dart, flutter
領域
mobile-dev, testing
issue の種類
機能追加
難易度
5/5
見積もり時間
1週間以上
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。