diff --git a/docs/20260609_채팅_탭_페이지/plan-task.md b/docs/20260609_채팅_탭_페이지/plan-task.md index 00ea0e5e..b4c3521d 100644 --- a/docs/20260609_채팅_탭_페이지/plan-task.md +++ b/docs/20260609_채팅_탭_페이지/plan-task.md @@ -144,7 +144,7 @@ ### Phase 3: Filter, 시간 formatter, mapper 작성 -- [ ] **Task 3.1: Filter 매핑 RED 테스트 작성** +- [x] **Task 3.1: Filter 매핑 RED 테스트 작성** - Create: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/chat/ChatRoomFilterTest.kt` - 테스트 케이스: - index `0` -> `ChatRoomFilter.ALL` @@ -155,7 +155,7 @@ - 검증 명령: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatRoomFilterTest"` - 기대 결과: `ChatRoomFilter` 미구현으로 RED 실패. -- [ ] **Task 3.2: Filter 모델 구현** +- [x] **Task 3.2: Filter 모델 구현** - Create: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/model/ChatRoomFilter.kt` - 구현: - `enum class ChatRoomFilter(val apiValue: String) { ALL("ALL"), AI("AI"), DM("DM") }` @@ -164,7 +164,7 @@ - 검증 명령: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatRoomFilterTest"` - 기대 결과: PASS. -- [ ] **Task 3.3: 시간 formatter RED 테스트 작성** +- [x] **Task 3.3: 시간 formatter RED 테스트 작성** - Create: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/chat/ChatRoomTimeTextFormatterTest.kt` - 테스트 기준: - 기준 now: `2026-06-09T12:00:00Z` @@ -184,7 +184,7 @@ - 검증 명령: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatRoomTimeTextFormatterTest"` - 기대 결과: formatter 미구현으로 RED 실패. -- [ ] **Task 3.4: 다국어 string과 시간 formatter 구현** +- [x] **Task 3.4: 다국어 string과 시간 formatter 구현** - Modify: `app/src/main/res/values/strings.xml` - Modify: `app/src/main/res/values-en/strings.xml` - Modify: `app/src/main/res/values-ja/strings.xml` @@ -207,7 +207,7 @@ - 검증 명령: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatRoomTimeTextFormatterTest"` - 기대 결과: PASS. -- [ ] **Task 3.5: DTO -> UI model mapper RED 테스트 작성** +- [x] **Task 3.5: DTO -> UI model mapper RED 테스트 작성** - Create: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/chat/ChatRoomMapperTest.kt` - 테스트 케이스: - `chatType="AI"`는 Direct badge 미표시 item으로 매핑한다. @@ -218,7 +218,7 @@ - 검증 명령: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatRoomMapperTest"` - 기대 결과: UI model/mapper 미구현으로 RED 실패. -- [ ] **Task 3.6: UI model과 mapper 구현** +- [x] **Task 3.6: UI model과 mapper 구현** - Create: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/model/ChatRoomUiModels.kt` - Create: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/model/ChatRoomMappers.kt` - 구현: @@ -477,3 +477,12 @@ - 2026-06-09: Phase 2.2 완료. `ChatRoomApi`에 `GET /api/v2/chat/rooms`, `Authorization`, `filter`, nullable `cursor` query와 `Single>` 반환 계약을 추가했고, `ChatRoomRepository.getChatRooms(token, filter, cursor)`에서 API 호출을 위임하도록 작성했다. - 2026-06-09: Phase 2.3 완료 범위. `AppDI`의 `networkModule`에 `ChatRoomApi`, `repositoryModule`에 `ChatRoomRepository`를 등록했다. `ChatMainViewModel`은 현재 소스 파일이 없고 Phase 4.2 생성 대상이라 이번 단계에서 등록하면 컴파일이 실패하므로, ViewModel 등록은 Phase 4.2 구현 시 수행하도록 이연했다. - 2026-06-09: Phase 2 검증 완료. `rg -n "HomeChatModels|ChatRoomModels|ChatRoomApi|ChatRoomRepository|ChatMainViewModel" "app/src/main/java" "app/src/test/java"`로 `HomeChatModels` 잔여 참조가 없고 `ChatRoomApi`, `ChatRoomRepository`, `AppDI` 등록만 존재함을 확인했다. `./gradlew :app:compileDebugKotlin` 실행 결과 `BUILD SUCCESSFUL in 43s`로 Kotlin 컴파일이 성공했다. 빌드 중 Agora namespace 중복 warning과 Gradle deprecation warning이 출력됐으나 Phase 2 변경으로 인한 컴파일 실패는 없었다. +- 2026-06-09: Phase 3.1/3.3/3.5 RED 테스트를 추가했다. `ChatRoomFilterTest`, `ChatRoomTimeTextFormatterTest`, `ChatRoomMapperTest` 실행 시 production model/formatter/mapper 및 string 미구현으로 `Unresolved reference 'ChatRoomFilter'`, `formatChatRoomLastMessageTime`, `ChatRoomType`, `toUiItem`, `screen_chat_time_*` 컴파일 실패가 발생해 RED 상태를 확인했다. 병렬 Gradle 실행 중 Kotlin incremental cache 충돌 메시지가 함께 출력되어 이후 검증은 순차 실행으로 전환했다. +- 2026-06-09: Phase 3.2 완료. `ChatRoomFilter` enum을 추가하고 tab index `0/1/2`를 `ALL/AI/DM`으로 매핑했으며, 유효하지 않은 index는 `ALL`로 처리했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatRoomFilterTest"` 실행 결과 `BUILD SUCCESSFUL in 1m 23s`로 통과했다. +- 2026-06-09: Phase 3.4 완료. `screen_chat_time_just_now`, `screen_chat_time_minutes`, `screen_chat_time_hours`, `screen_chat_time_days`를 `values`, `values-en`, `values-ja`에 추가하고, `formatChatRoomLastMessageTime(...)`을 `SimpleDateFormat`, `Calendar`, `TimeZone`, `Locale` 기반으로 구현했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatRoomTimeTextFormatterTest"` 실행 결과 `BUILD SUCCESSFUL in 9s`로 통과했다. +- 2026-06-09: Phase 3.6 완료. `ChatRoomType`, `ChatRoomListUiItem`, `ChatRoomListUiState`와 `ChatRoomListItemResponse.toUiItem(context)`, `List.toUiItems(context)` mapper를 추가했다. `AI`는 Direct badge 미표시, `DM`은 표시, 알 수 없는 `chatType`은 제외하도록 구현했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatRoomMapperTest"` 실행 결과 `BUILD SUCCESSFUL in 7s`로 통과했다. +- 2026-06-09: Phase 3 통합 검증 완료. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.*"`는 `BUILD SUCCESSFUL in 9s`, `./gradlew :app:mergeDebugResources`는 `BUILD SUCCESSFUL in 1s`, `./gradlew :app:compileDebugKotlin`은 `BUILD SUCCESSFUL in 1s`로 통과했다. 최초 `./gradlew :app:ktlintCheck`는 `ChatRoomTimeTextFormatterTest.kt` 긴 줄로 실패했으며, 줄바꿈 수정 후 재실행한 `./gradlew :app:ktlintCheck`는 `BUILD SUCCESSFUL in 4s`로 통과했다. ktlint 실행 중 `.editorconfig`의 `disabled_rules` deprecation warning은 기존 설정 경고로 남아 있다. +- 2026-06-09: 자체 점검 중 `ChatRoomTimeTextFormatter.kt`의 parse pattern 순회 예외 처리에 `continue`를 명시하도록 보강했다. 보강 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.*"`는 `BUILD SUCCESSFUL in 19s`, `./gradlew :app:ktlintCheck`는 `BUILD SUCCESSFUL in 4s`로 재통과했다. +- 2026-06-09: 사용자 지적에 따라 Phase 3 테스트 메소드명을 저장소 가이드에 맞춰 한글 시나리오 설명으로 수정했다. `rg`로 `ChatRoomFilterTest`, `ChatRoomTimeTextFormatterTest`, `ChatRoomMapperTest`의 테스트명이 모두 한글 설명임을 확인했다. 수정 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.*"`는 `BUILD SUCCESSFUL in 12s`, `./gradlew :app:ktlintCheck`는 `BUILD SUCCESSFUL in 4s`로 통과했다. +- 2026-06-09: 리뷰 게이트에서 `ChatRoomTimeTextFormatter`의 ISO-8601 offset 분 단위 파싱 결함과 trailing garbage 부분 파싱 가능성이 발견되어 보강했다. `분 단위 offset이 포함된 ISO 시간은 offset 전체를 반영한다` 테스트를 추가해 기존 구현에서 `ComparisonFailure` RED를 확인했고, parser를 `ParsePosition` 기반 전체 문자열 소비 검증과 `XXX`, `XX`, `X` 순서의 구체 패턴 우선순위로 수정했다. 수정 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatRoomTimeTextFormatterTest"`는 `BUILD SUCCESSFUL in 9s`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.*"`는 `BUILD SUCCESSFUL in 6s`, `./gradlew :app:mergeDebugResources`는 `BUILD SUCCESSFUL in 1s`, `./gradlew :app:compileDebugKotlin`은 `BUILD SUCCESSFUL in 1s`, `./gradlew :app:ktlintCheck`는 `BUILD SUCCESSFUL in 3s`로 통과했다. +- 2026-06-09: 최종 컨텍스트 리뷰에서 mapper 테스트가 `lastMessageAt`의 formatter 결과 문자열 매핑을 `isNotBlank()`로만 확인한다는 점과 신규 테스트 추가에 따른 `docs/agent-guides/build-test-style.md` 단일 실행 예시 갱신 누락이 발견되어 보강했다. `ChatRoomMapperTest`는 `formatChatRoomLastMessageTime(context, lastMessageAt)` 결과와 `lastMessageTimeText`를 직접 비교하도록 수정했고, `build-test-style.md`에 `ChatRoomFilterTest`, `ChatRoomTimeTextFormatterTest`, `ChatRoomMapperTest`, `kr.co.vividnext.sodalive.v2.main.chat.*` 실행 예시를 추가했다. 수정 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatRoomMapperTest"`는 `BUILD SUCCESSFUL in 20s`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.*"`는 `BUILD SUCCESSFUL in 6s`, `./gradlew :app:ktlintCheck`는 `BUILD SUCCESSFUL in 3s`, `./gradlew tasks --all`은 `BUILD SUCCESSFUL in 1s`로 통과했다.