docs(v2): 라이브 액션 검증 기록을 갱신한다
This commit is contained in:
@@ -423,7 +423,7 @@
|
||||
- 2026-07-14: `git diff --check HEAD`는 whitespace 오류 없이 통과했다.
|
||||
|
||||
### Phase 3: Live 공통 Action
|
||||
- [ ] **Task 3.1: 기존 Live 흐름 차이와 레거시 의존 목록 확정**
|
||||
- [x] **Task 3.1: 기존 Live 흐름 차이와 레거시 의존 목록 확정**
|
||||
- 확인 예정 파일:
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveCoordinator.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt`
|
||||
@@ -433,33 +433,57 @@
|
||||
- 검증 기준:
|
||||
- Live 공통 정책과 화면별 후처리가 구분된다.
|
||||
- 라이브 생성 결과를 포함한 raw Activity result의 Live 결과 변환과 feature 단일 handler가 확정된다.
|
||||
- 확인 결과:
|
||||
- Home은 로그인 후 상세를 조회해 `isAdult`를 확인하고 기존 coordinator에 상세를 전달하며, Creator Channel 현재 라이브는 응답의 `isAdult`를 먼저 확인한 뒤 coordinator가 상세를 다시 조회한다. On-air는 로그인, 상세 조회, channel 유효성, 성인 접근을 확인한 뒤 Activity 안에 복제된 입장 분기를 실행한다.
|
||||
- 공통 입장 결정 순서는 channel 없음의 상세 표시, 관리자 직접 입장, 무료/결제 완료 방의 비밀번호 또는 직접 입장, 미결제 유료 비밀번호 또는 결제 Dialog다. 오디오 서비스 중단과 입장 성공 후 `LiveRoomActivity` 이동도 세 흐름에서 동일하다.
|
||||
- 일정 상세의 예약, 수정, 시작, 취소는 기존 coordinator만 소유하며 레거시 `LiveViewModel`, Dialog, Activity를 호출한다. 이 동작은 Live 소유 coordinator로 함께 이동하되 정책 판단과 화면 adapter를 추가로 분리하지 않는다.
|
||||
- On-air는 channel이 없으면 공통 오류 Toast를 표시하고, Home/Creator Channel은 라이브 상세를 표시한다. 이 차이는 공통 입장 정책이 아닌 호출 화면의 unavailable callback으로 유지한다.
|
||||
- Creator Channel의 라이브 생성 raw Activity result는 성공 여부, room ID, channel name을 `LiveCreationResult.Enter`, `Created`, `RefreshOnly`, `Ignored`로 변환한다. Activity의 `handleLiveCreationResult` 단일 handler가 성공 결과의 Home refresh 후 즉시 입장 또는 생성 안내를 결정한다. 실패/cancel은 `Ignored`, channel은 있지만 room ID가 유효하지 않은 성공 결과는 `RefreshOnly`로 변환한다.
|
||||
- 별도 observer/SharedFlow는 추가하지 않는다. Live 생성 결과의 소비자는 Creator Channel Activity 하나이고 Home/On-air refresh 요구도 각각 현재 화면 callback으로 충분하다.
|
||||
- 검증 기록:
|
||||
- 2026-07-14: 대상 운영 코드와 source test를 대조해 위 공통 정책, 레거시 의존, Activity result 및 화면별 후처리 차이를 확정했다.
|
||||
- 2026-07-14: 구현 전 `./gradlew :app:testDebugUnitTest`를 실행해 전체 debug 단위 테스트 기준선이 `BUILD SUCCESSFUL`임을 확인했다.
|
||||
|
||||
- [ ] **Task 3.2: Live 입장 결정 계약과 단위 테스트 작성**
|
||||
- [x] **Task 3.2: Live 입장 결정 계약과 단위 테스트 작성**
|
||||
- 생성 예정 파일:
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/action/LiveEntryDecision.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/action/LiveEntryPolicy.kt`
|
||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/live/action/LiveEntryPolicyTest.kt`
|
||||
- 검증 대상: 관리자, 무료/결제 완료, 비밀번호, 유료, 상세 표시 분기.
|
||||
- 검증 기준: Activity/Dialog 없이 기존 분기 순서를 순수 입력·출력으로 검증한다.
|
||||
- RED 검증 기록:
|
||||
- 2026-07-14: `LiveEntryPolicyTest`를 먼저 추가하고 단일 테스트를 실행해 `LiveEntryDecision`, `LiveEntryContext`, `LiveEntryPolicy` 미정의 컴파일 오류와 `BUILD FAILED`를 확인했다.
|
||||
- GREEN 검증 기록:
|
||||
- 2026-07-14: channel 없음, 관리자, 무료/결제 완료 공개·비밀번호 방, 미결제 유료 공개·비밀번호 방만 표현하는 순수 정책을 최소 구현하고 같은 단일 테스트를 재실행해 `BUILD SUCCESSFUL`을 확인했다.
|
||||
|
||||
- [ ] **Task 3.3: Live Action/Coordinator 단일 구현과 호환 adapter 구성**
|
||||
- [x] **Task 3.3: Live Action/Coordinator 단일 구현과 호환 adapter 구성**
|
||||
- 생성/이동/수정 예정 파일:
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/action/LiveActions.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/action/LiveCreationResult.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/action/LiveActionCoordinator.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveCoordinator.kt`
|
||||
- 작업:
|
||||
- 기존 Coordinator 동작을 Live 소유 진입점으로 옮기고 필요한 동안 기존 이름은 얇은 adapter로 유지한다.
|
||||
- 하위 Activity가 반환하는 Live 결과는 명시적 result로 변환하고 호출 feature의 단일 handler로 전달한다.
|
||||
- 검증 기준: 새 구현이 Creator Channel feature를 import하지 않고 레거시 Live 기능만 adapter로 호출한다.
|
||||
- RED 검증 기록:
|
||||
- 2026-07-14: `LiveActionsTest`와 `LiveActionCoordinatorSourceTest`를 먼저 추가했다. 결과 타입/변환 함수 미정의 컴파일 실패를 확인한 뒤 최소 결과 계약을 추가했고, 새 coordinator 파일과 세 화면 결선 및 Creator Channel handler가 없어 source 결선 테스트 3건이 실패함을 확인했다.
|
||||
- 2026-07-14: diff 검토에서 channel은 있지만 room ID가 유효하지 않은 기존 무동작 edge를 발견해 `Ignored` 기대 테스트로 변경하고 실제 `Created` 반환 실패를 재현했다. 이 당시 계약은 후속 Task 3.6에서 성공 결과의 Home refresh를 보장하도록 `RefreshOnly`로 변경했다.
|
||||
- GREEN 검증 기록:
|
||||
- 2026-07-14: 기존 coordinator를 `v2.live.action.LiveActionCoordinator`로 이동하고 `LiveEntryPolicy` 결과에 따라 기존 `LiveViewModel`, Dialog, Activity를 호출하도록 전환했다. 모든 호출부를 함께 전환해 이전 이름의 호환 adapter는 남길 필요가 없었으며 feature 역의존도 제거했다.
|
||||
- 2026-07-14: `LiveCreationResult`와 `resolveLiveCreationResult`를 구현하고 Creator Channel의 `handleLiveCreationResult` 단일 handler가 `Ignored`, `Created`, `Enter` 후처리를 소유하도록 연결했다. invalid room ID는 기존처럼 `Ignored`로 보존한 뒤 결과 테스트를 통과시켰다. 이 동작은 후속 Task 3.6에서 `RefreshOnly`로 변경했다.
|
||||
|
||||
- [ ] **Task 3.4: Home/Creator Channel/On-air 호출부 전환과 중복 제거**
|
||||
- [x] **Task 3.4: Home/Creator Channel/On-air 호출부 전환과 중복 제거**
|
||||
- 수정 예정 파일:
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/onair/HomeOnAirLiveActivity.kt`
|
||||
- 검증 기준: 세 화면이 동일 Live Action을 사용하고 On-air의 중복 입장 조건이 제거된다.
|
||||
- 검증 기록:
|
||||
- 2026-07-14: Home은 lifecycle 확인 callback과 함께 공통 coordinator를 사용하고, Creator Channel은 현재 라이브의 알려진 성인 여부를 전달하며 일정 상세도 같은 coordinator를 사용하도록 전환했다.
|
||||
- 2026-07-14: On-air Activity의 상세 이후 관리자/무료/결제/비밀번호 분기와 Dialog/navigation 구현을 제거하고 공통 coordinator에 unavailable Toast callback만 전달했다. 이에 따라 단일 boolean helper와 파일도 제거했다.
|
||||
- 2026-07-14: 신규 결선 테스트와 기존 Home login guard, Creator Channel, On-air source 테스트를 함께 실행해 `BUILD SUCCESSFUL`을 확인했다.
|
||||
|
||||
- [ ] **Task 3.5: Live Phase 회귀 검증**
|
||||
- [x] **Task 3.5: Live Phase 회귀 검증**
|
||||
- 실행 명령:
|
||||
```bash
|
||||
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.*"
|
||||
@@ -467,8 +491,263 @@
|
||||
./gradlew :app:compileDebugKotlin
|
||||
./gradlew :app:ktlintCheck
|
||||
git diff --check
|
||||
```
|
||||
```
|
||||
- 수동 확인: 무료, 유료, 비밀번호, 관리자, 상세 표시, 예약/취소 흐름과 화면별 refresh 동작이 기존과 동일하다.
|
||||
- 검증 기록:
|
||||
- 2026-07-14: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.*" --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.*" --rerun-tasks`를 실행해 Live 관련 테스트가 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 2026-07-14: 최종 변경 후 `./gradlew :app:testDebugUnitTest --rerun-tasks`를 실행해 전체 debug 단위 테스트와 production/test 컴파일이 1분 43초에 `BUILD SUCCESSFUL`로 통과했다. 기존 deprecation 및 manifest namespace 경고는 있었지만 실패는 없었다.
|
||||
- 2026-07-14: `./gradlew :app:compileDebugKotlin`은 별도 실행에서도 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 2026-07-14: `./gradlew :app:ktlintTestSourceSetCheck --rerun-tasks`는 `BUILD SUCCESSFUL`로 통과했다. `./gradlew :app:ktlintCheck --rerun-tasks`는 기존 main source 기준선 위반으로 실패했으며, filename 위반을 수정한 뒤 main source 보고서 550줄에서 Phase 3 변경 Kotlin 파일 위반이 0건임을 확인했다.
|
||||
- 2026-07-14: `./gradlew tasks --all`은 `BUILD SUCCESSFUL`로 통과했고 `git diff --check HEAD`도 whitespace 오류 없이 통과했다.
|
||||
- 2026-07-14: `adb devices`에 연결된 기기/에뮬레이터가 없어 무료, 유료, 비밀번호, 관리자, 상세, 예약/취소의 실제 Dialog/Activity 수동 탭 검증은 수행하지 못했다. 해당 분기는 순수 정책 테스트와 기존 레거시 결선 source 테스트로 회귀 검증했다.
|
||||
|
||||
- [x] **Task 3.6: Live 진입·생성 결과 회귀와 리뷰 발견사항 보완**
|
||||
- 수정 대상 파일:
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/action/LiveActionCoordinator.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/action/LiveCreationResult.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
|
||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/live/action/LiveActionCoordinatorSourceTest.kt`
|
||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/live/action/LiveActionsTest.kt`
|
||||
- `docs/20260714_V2_공통_접근_가드와_도메인_액션/prd.md`
|
||||
- `docs/20260714_V2_공통_접근_가드와_도메인_액션/plan-task.md`
|
||||
- 정리 대상 파일:
|
||||
- `docs/20260715_라이브_진입과_생성_결과_회귀_수정/prd.md`
|
||||
- `docs/20260715_라이브_진입과_생성_결과_회귀_수정/plan-task.md`
|
||||
- 작업:
|
||||
- unavailable을 성인 접근 확인과 오디오 중단보다 먼저 처리하되, 상세 fallback은 호출자 성인 힌트와 상세 응답을 OR로 합성한 접근 조건을 정상 진입과 함께 사용한다.
|
||||
- 라이브 생성 성공 후 즉시 입장할 room ID가 유효하지 않아도 `RefreshOnly`로 Home refresh를 보장한다.
|
||||
- 신규 source test의 ktlint 위반 3건을 고치고 test source 검증 게이트를 복구한다.
|
||||
- 연속 작업으로 별도 생성된 2026-07-15 문서의 요구사항과 검증 기록을 본 PRD와 Phase 3에 이관한 뒤 중복 문서를 제거한다.
|
||||
- 검증 기준:
|
||||
- 합성 성인 접근 조건이 정상 진입과 unavailable 상세 fallback에서 동일하게 사용된다.
|
||||
- `LiveActionCoordinatorSourceTest`와 Live action 관련 테스트가 통과한다.
|
||||
- `:app:ktlintTestSourceSetCheck`가 통과하고 Phase 3 변경 Kotlin 파일의 신규 main source 위반이 없다.
|
||||
- 별도 2026-07-15 문서가 남지 않고 현행 생성 결과 계약이 구현과 일치한다.
|
||||
- 이관한 구현·검증 기록:
|
||||
- 2026-07-15: 성공했지만 channel 정보가 있고 room ID가 유효하지 않은 결과를 `RefreshOnly`로 기대하는 테스트를 먼저 추가해 타입 미정의 컴파일 오류로 RED를 확인했다.
|
||||
- 2026-07-15: `LiveCreationResult.RefreshOnly`를 추가하고 Creator Channel의 단일 handler가 해당 결과에서 `homeActionDelegate?.refreshHome()`만 실행하도록 구현했다.
|
||||
- 2026-07-15: `ShowDetail`을 성인 접근 확인과 오디오 중단보다 먼저 처리하도록 source test와 구현을 보완했다. source 문자열을 실제 구현 호출 형태로 조정한 뒤 테스트가 통과했다.
|
||||
- 2026-07-15: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.action.*"`는 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 2026-07-15: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"`는 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 2026-07-15: `./gradlew :app:assembleDebug`는 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 2026-07-15: 리뷰에서 상세 조회 전 성인 접근 확인이 실행되는 순서 문제와 callback 없는 `ShowDetail` fallback이 성인 접근 확인 없이 열리는 문제가 확인되었다. 로그인만 먼저 확인하고, fallback은 `roomDetail.isAdult`로 성인 접근을 확인하도록 보완한 뒤 Live action 테스트, Creator Channel source test, assembleDebug가 통과했다.
|
||||
- 2026-07-15: 보안 재리뷰에서 호출자 힌트가 `false`여도 상세 응답이 `true`이면 성인 접근을 요구해야 하는 문제가 확인되었다. 정상 진입 조건을 `requiresAdultContentAccess == true || roomDetail.isAdult`로 바꾸는 테스트에서 기존 구현의 assertion 2건 실패로 RED를 확인한 뒤 보완했고, Live action 테스트, Creator Channel source test, assembleDebug가 통과했다.
|
||||
- 리뷰 발견 및 RED 검증 기록:
|
||||
- 2026-07-15: Creator Channel 목록의 `isAdult == true`와 unavailable 상세 응답의 `isAdult == false`가 다를 때 fallback이 `roomDetail.isAdult`만 사용해 호출자 힌트를 잃는 P1 회귀를 코드 경로 대조로 확인했다.
|
||||
- 2026-07-15: `./gradlew :app:ktlintTestSourceSetCheck --rerun-tasks`를 실행해 `LiveActionCoordinatorSourceTest.kt:79`의 `max-line-length` 1건과 `argument-list-wrapping` 2건, 총 3건으로 `BUILD FAILED`를 재현했다.
|
||||
- 2026-07-15: 합성 성인 접근 조건의 단일 계산과 정상 진입·fallback 재사용을 요구하도록 `LiveActionCoordinatorSourceTest`를 먼저 변경했다. 대상 테스트를 실행해 5개 중 기존 구현과 불일치한 3개가 실패하고 `BUILD FAILED`가 되는 RED를 확인했다.
|
||||
- GREEN 및 회귀 검증 기록:
|
||||
- 2026-07-15: `requiresAdultContentAccess == true || roomDetail.isAdult`를 `requiresAdultAccess`로 한 번 계산하고 정상 진입 guard와 unavailable 상세 fallback에 함께 전달하도록 수정했다.
|
||||
- 2026-07-15: source test가 정상 진입과 fallback 함수 구간을 분리해 동일 성인 조건을 검증하고, unavailable 처리 후 `return@handleRoomDetail`, callback의 `return`, 성인 guard, 상세 표시 순서를 고정하도록 보강했다. `RefreshOnly` 분기의 Home refresh와 invalid room ID `null`, `0L`, 음수도 함께 검증했다.
|
||||
- 2026-07-15: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.action.*"`와 최종 `LiveActionCoordinatorSourceTest` 단일 실행은 각각 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 2026-07-15: 최종 `./gradlew :app:testDebugUnitTest --rerun-tasks`는 39개 작업을 모두 실행해 3분 20초에 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 2026-07-15: 최종 `./gradlew :app:ktlintTestSourceSetCheck --rerun-tasks`는 `BUILD SUCCESSFUL`로 통과했고 test source 리포트는 0건이다.
|
||||
- 2026-07-15: `./gradlew :app:assembleDebug`는 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 2026-07-15: `./gradlew :app:ktlintMainSourceSetCheck --rerun-tasks`는 기존 main source 기준선 550건으로 실패했으며, 갱신된 리포트에서 Phase 3 변경 Kotlin 파일의 위반은 0건임을 확인했다.
|
||||
- 2026-07-15: `./gradlew tasks --all`은 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 2026-07-15: 별도 `docs/20260715_라이브_진입과_생성_결과_회귀_수정/`의 두 문서 내용을 본 PRD와 Task 3.6으로 이관한 뒤 중복 문서 파일을 제거했다.
|
||||
- 2026-07-15: 독립 코드 재리뷰에서 정상·fallback 성인 guard, 두 unavailable short-circuit, `RefreshOnly` refresh 계약을 재확인했고 Critical/Important 이슈 없이 Ready 판정을 받았다.
|
||||
- 2026-07-15: 최종 `git diff --check HEAD`는 whitespace 오류 없이 통과했다.
|
||||
|
||||
- [x] **Task 3.7: Live coordinator lifecycle·중복 표시·계약 리뷰 반영**
|
||||
- 수정 대상 파일:
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/action/LiveActionCoordinator.kt`
|
||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/live/action/LiveActionCoordinatorSourceTest.kt`
|
||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/live/action/LiveActionCoordinatorUiGateTest.kt`
|
||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/live/action/LiveEntryPolicyTest.kt`
|
||||
- `docs/agent-guides/build-test-style.md`
|
||||
- `docs/20260714_V2_공통_접근_가드와_도메인_액션/prd.md`
|
||||
- `docs/20260714_V2_공통_접근_가드와_도메인_액션/plan-task.md`
|
||||
- 작업:
|
||||
- 비동기 `enterRoom` 성공 callback에서 `LiveRoomActivity`를 열기 직전에 lifecycle predicate를 다시 검사한다.
|
||||
- 라이브 상세 bottom sheet는 Activity/호출 화면 predicate, `FragmentManager.isStateSaved`, 안정적인 tag의 기존 fragment 존재 여부를 모두 통과할 때만 표시한다.
|
||||
- `channelName` 없음과 본인 manager 조건이 동시에 있을 때 `ShowDetail`이 manager 직접 입장보다 우선함을 실행형 정책 테스트로 고정한다.
|
||||
- `LiveActionCoordinator`가 presentation adapter로서 `refreshHome` callback을 주입받는 예외와 순수 도메인 계약의 callback 금지를 문서에서 명확히 구분한다.
|
||||
- 검증 기준:
|
||||
- `canHandleResult` 기본값은 Activity 종료/파괴 상태를 반영하고, Fragment 호출부의 더 엄격한 predicate override는 유지된다.
|
||||
- 모든 비동기 UI 후처리 직전에는 `canHandleResult`가 재검사된다.
|
||||
- 상세 sheet 중복 방지는 새 fragment 인스턴스의 `isAdded`가 아니라 안정적인 tag와 표시 가능 상태를 기준으로 동작한다.
|
||||
- 정책 테스트와 coordinator gate/source 테스트, 컴파일, test source ktlint, whitespace 검증이 통과한다.
|
||||
- RED 검증 기록:
|
||||
- 2026-07-15: lifecycle/detail gate 실행형 테스트와 source test를 먼저 추가한 뒤 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.action.LiveEntryPolicyTest" --tests "kr.co.vividnext.sodalive.v2.live.action.LiveActionCoordinatorSourceTest" --tests "kr.co.vividnext.sodalive.v2.live.action.LiveActionCoordinatorUiGateTest" --rerun-tasks`를 실행해 `runLiveActionUiSideEffect`, `canShowLiveRoomDetail` 미정의 컴파일 오류로 `BUILD FAILED`를 확인했다.
|
||||
- GREEN 및 회귀 검증 기록:
|
||||
- 2026-07-15: `LiveActionCoordinator`의 기본 `canHandleResult`를 Activity 종료/파괴 상태 기반으로 바꾸고, `canHandleUiResult()`에서 Activity 상태, `FragmentManager.isStateSaved`, 호출 화면 predicate를 합성하도록 보완했다.
|
||||
- 2026-07-15: 상세 sheet는 `LIVE_ROOM_DETAIL_TAG`로 `findFragmentByTag`를 먼저 확인하고, 같은 tag로 `show`하도록 수정했다. 새 `LiveRoomDetailFragment` 인스턴스의 `isAdded`와 nullable `tag` 기반 중복 방지는 제거했다.
|
||||
- 2026-07-15: `enterRoom` 성공 callback과 `startLive` 성공 callback은 `runOnUiThread` 내부에서 `runLiveActionUiSideEffect(::canHandleUiResult)`를 통과한 뒤에만 `openLiveRoom(roomId)`를 호출하도록 보강했다. 비밀번호/결제/예약/수정/시작/취소 UI side effect도 표시 또는 실행 직전 `canHandleUiResult()`를 검사한다.
|
||||
- 2026-07-15: `LiveEntryPolicyTest`에 `channelName == null`과 본인 manager 조건이 동시에 있을 때 `LiveEntryDecision.ShowDetail`을 반환하는 실행형 회귀 테스트를 추가했다.
|
||||
- 2026-07-15: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.action.LiveEntryPolicyTest" --tests "kr.co.vividnext.sodalive.v2.live.action.LiveActionCoordinatorSourceTest" --tests "kr.co.vividnext.sodalive.v2.live.action.LiveActionCoordinatorUiGateTest" --rerun-tasks`를 실행해 `BUILD SUCCESSFUL`을 확인했다.
|
||||
- 2026-07-15: 최종 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.action.*" --rerun-tasks`를 실행해 Live action 테스트 묶음이 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 2026-07-15: `./gradlew :app:compileDebugKotlin`은 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 2026-07-15: `./gradlew :app:ktlintTestSourceSetCheck --rerun-tasks`는 `BUILD SUCCESSFUL`로 통과했다. `./gradlew :app:ktlintMainSourceSetCheck --rerun-tasks`는 기존 main source 기준선 위반으로 실패했으며, ktlint main/test 리포트에서 이번 변경 Kotlin 파일명 검색 결과는 0건이다.
|
||||
- 2026-07-15: `./gradlew tasks --all`은 `BUILD SUCCESSFUL`로 통과했고 `git diff --check HEAD`는 whitespace 오류 없이 통과했다.
|
||||
- 2026-07-15: `adb devices`는 연결된 기기/에뮬레이터가 없음을 반환해 실제 탭 기반 Dialog/Activity 수동 검증은 수행하지 못했다. 대신 lifecycle/detail gate 실행형 단위 테스트와 source order 테스트로 회귀를 고정했다.
|
||||
- 리뷰 게이트 후속 보완 기록:
|
||||
- 2026-07-15: 리뷰 게이트에서 `DialogFragment.show()`가 비동기 `commit()`을 사용해 첫 transaction 반영 전 연속 호출 시 `findFragmentByTag`가 중복을 막지 못할 수 있다는 차단 이슈와, unavailable/adult guard/audio 순서가 source test에만 의존한다는 차단 이슈를 확인했다.
|
||||
- 2026-07-15: `LiveActionCoordinatorSourceTest`를 먼저 `showNow(fragmentManager, LIVE_ROOM_DETAIL_TAG)` 기대값으로 바꾸고, `LiveActionCoordinatorUiGateTest`에 `runLiveEntryDecisionFlow` 실행형 순서 테스트를 추가한 뒤 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.action.LiveActionCoordinatorSourceTest" --tests "kr.co.vividnext.sodalive.v2.live.action.LiveActionCoordinatorUiGateTest" --rerun-tasks`를 실행해 `runLiveEntryDecisionFlow` 미정의 컴파일 오류로 `BUILD FAILED`를 확인했다.
|
||||
- 2026-07-15: 상세 sheet 표시를 `showNow(fragmentManager, LIVE_ROOM_DETAIL_TAG)`로 바꿔 pending transaction 경쟁 구간을 제거하고, 입장 분기 순서를 Android 비의존 `runLiveEntryDecisionFlow`로 분리해 `ShowDetail -> unavailable`, `Enter -> adult guard -> audio/entry`, adult guard 거부 시 audio/entry 미실행을 실행형 테스트로 고정했다.
|
||||
- 2026-07-15: 후속 보완 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.action.LiveActionCoordinatorSourceTest" --tests "kr.co.vividnext.sodalive.v2.live.action.LiveActionCoordinatorUiGateTest" --rerun-tasks`를 재실행해 `BUILD SUCCESSFUL`을 확인했다.
|
||||
- 2026-07-15: 후속 보완 최종 확인으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.action.*" --rerun-tasks`를 재실행해 39개 작업이 모두 실행되고 `BUILD SUCCESSFUL`로 종료됨을 확인했다.
|
||||
- 2026-07-15: `./gradlew :app:testDebugUnitTest --rerun-tasks` 전체 debug 단위 테스트를 재실행해 39개 작업이 모두 실행되고 `BUILD SUCCESSFUL`로 종료됨을 확인했다.
|
||||
- 2026-07-15: `./gradlew :app:compileDebugKotlin`은 `BUILD SUCCESSFUL`, `./gradlew :app:ktlintTestSourceSetCheck --rerun-tasks`는 `BUILD SUCCESSFUL`, `./gradlew tasks --all`은 `BUILD SUCCESSFUL`, `git diff --check HEAD`는 무출력으로 통과했다.
|
||||
- 2026-07-15: `./gradlew :app:ktlintMainSourceSetCheck --rerun-tasks`는 기존 main source 기준선 위반으로 실패했으며, 갱신된 ktlint main 리포트에서 이번 변경 파일명 검색 결과는 0건이다.
|
||||
- 2026-07-15: `adb devices`는 연결된 기기/에뮬레이터가 없음을 반환해 실제 탭 기반 수동 QA는 수행하지 못했다. 대신 Live action 대상 실행형 테스트, 전체 debug 단위 테스트, 컴파일, ktlint test source, whitespace 검증으로 대체 확인했다.
|
||||
- 보안 리뷰 후속 보완 기록:
|
||||
- 2026-07-15: 재리뷰 게이트에서 Creator Channel 일정 경로가 `showLiveRoomDetail(roomId)`를 직접 호출할 때 공개 상세 진입점 자체에는 로그인·성인 접근 확인이 없어 성인 라이브 상세를 열 수 있다는 보안 차단 이슈를 확인했다.
|
||||
- 2026-07-15: `LiveActionCoordinatorSourceTest`에 공개 `showLiveRoomDetail(roomId)`가 `AccessRequirement.Login`, `liveViewModel.getRoomDetail(roomId)`, `AccessRequirement.forAdultContent(roomDetail.isAdult)`를 거친 뒤 내부 표시 함수로 이동해야 한다는 source test를 먼저 추가했다. 생산 코드 변경 전 단일 source test 실행에서 해당 테스트가 실패해 RED를 확인했다.
|
||||
- 2026-07-15: 공개 `showLiveRoomDetail(roomId)`는 로그인 확인 후 room detail을 조회하고 `roomDetail.isAdult` 기준 성인 접근을 통과한 뒤 `showLiveRoomDetailContent(roomId)`를 호출하도록 분리했다. 이미 성인 가드를 통과한 unavailable fallback은 공개 진입점 재호출 대신 내부 표시 함수만 호출하도록 수정했다.
|
||||
- 2026-07-15: 보안 보완 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.action.LiveActionCoordinatorSourceTest" --rerun-tasks`와 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.action.*" --rerun-tasks`가 모두 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 2026-07-15: 전체 `./gradlew :app:testDebugUnitTest --rerun-tasks`는 최초 재실행에서 이번 변경과 직접 관련 없는 `CreatorChannelHomeViewModelTest` 1건이 실패했으나, 해당 단일 테스트 재실행과 전체 재실행이 모두 `BUILD SUCCESSFUL`로 통과해 일시적 격리 실패로 기록한다.
|
||||
- 2026-07-15: 보안 보완 후 `./gradlew :app:compileDebugKotlin`은 `BUILD SUCCESSFUL`, `./gradlew :app:ktlintTestSourceSetCheck --rerun-tasks`는 `BUILD SUCCESSFUL`, `git diff --check HEAD`는 무출력으로 통과했다. `./gradlew :app:ktlintMainSourceSetCheck --rerun-tasks`는 기존 main source 기준선 위반으로 실패했으며 변경 파일명 검색 결과는 0건이다.
|
||||
|
||||
- [x] **Task 3.8: Phase 3 실기기 수동 회귀 테스트**
|
||||
- 확인 대상 파일:
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/action/LiveActionCoordinator.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/onair/HomeOnAirLiveActivity.kt`
|
||||
- 대상 화면:
|
||||
- `HomeMainFragment` 추천 라이브
|
||||
- `CreatorChannelActivity` 현재 라이브, 일정 상세, owner 라이브 생성
|
||||
- `HomeOnAirLiveActivity` 라이브 목록
|
||||
- 완료 기준:
|
||||
- 아래 필수 시나리오가 모두 기대 결과와 일치하면 각 항목을 `[x]`로 변경한다.
|
||||
- 재현 데이터나 외부 환경이 없어 실행하지 못한 항목은 체크하지 않고 검증 기록에 `BLOCKED`와 사유를 남긴다.
|
||||
- 최종 수동 검증에서 사용자가 테스트 불가능 또는 의미 없음으로 판단한 항목은 미체크 상태를 유지하고 `SKIPPED`로 기록하며 완료 판정 대상에서 제외한다.
|
||||
- 기대 결과와 다른 항목은 체크하지 않고 화면, 계정 조건, room ID, 실제 결과, 로그 또는 캡처 위치를 검증 기록에 남긴다.
|
||||
|
||||
#### 사전 준비
|
||||
|
||||
- [x] **M3-P01: 테스트 환경 준비**
|
||||
- 절차: 최신 debug 빌드를 실기기 또는 에뮬레이터에 설치하고 네트워크 연결, 알림/오디오 재생, 로그인 화면 이동이 가능한지 확인한다.
|
||||
- 기대 결과: 앱을 실행해 Home, Creator Channel, On-air 화면에 진입할 수 있고 라이브 상세/입장 API 응답을 받을 수 있다.
|
||||
- [x] **M3-P02: 접근 상태별 계정 준비**
|
||||
- 절차: 로그아웃 상태, 국내 미인증 계정, 본인인증 완료·성인 콘텐츠 표시 비활성 계정, 성인 콘텐츠 접근 허용 일반 계정, 라이브 관리자 계정을 준비한다.
|
||||
- 기대 결과: 각 계정의 로그인, `isAuth`, 성인 콘텐츠 표시 설정, 관리자 여부를 테스트 전에 구분할 수 있다.
|
||||
- [x] **M3-P03: 라이브 분기별 데이터 준비**
|
||||
- 절차: 아래 조건을 각각 만족하는 현재 라이브 또는 예약 라이브의 room ID와 노출 화면을 기록한다.
|
||||
|
||||
| 데이터 | 조건 | 주요 검증 |
|
||||
| --- | --- | --- |
|
||||
| `R1` | Home 추천, Creator Channel, On-air에 노출되는 무료 공개 현재 라이브 | 세 화면 공통 진입 |
|
||||
| `R2` | 무료 비밀번호 현재 라이브 | 결제액 없는 비밀번호 Dialog |
|
||||
| `R3` | 결제 완료 유료 공개 현재 라이브 | 결제 없는 직접 입장 |
|
||||
| `R4` | 결제 완료 유료 비밀번호 현재 라이브 | 결제액 없는 비밀번호 Dialog |
|
||||
| `R5` | 미결제 유료 공개 현재 라이브 | 결제 Dialog |
|
||||
| `R6` | 미결제 유료 비밀번호 현재 라이브 | 가격이 표시되는 비밀번호 Dialog |
|
||||
| `R7` | 관리자 본인의 유료·비밀번호 현재 라이브 | 관리자 직접 입장 우선순위 |
|
||||
| `R8` | 각 대상 화면에 노출 가능한 `channelName` null 또는 blank 라이브 | 화면별 unavailable 처리 |
|
||||
| `R9` | 성인 현재 라이브 | 본인인증/표시 설정 가드 |
|
||||
| `R10` | 일반 사용자가 예약 가능한 무료·유료·비밀번호 예약 라이브 | 예약 분기 |
|
||||
|
||||
- 기대 결과: 각 데이터의 가격, 결제 여부, 비밀번호 여부, 성인 여부, 관리자 ID, `channelName` 조건을 QA 환경에서 확인할 수 있다.
|
||||
|
||||
#### 화면 결선과 접근 가드
|
||||
|
||||
- [x] **M3-01: 세 화면의 무료 공개 라이브 진입**
|
||||
- 절차: 접근 허용 일반 계정으로 `R1`을 Home 추천, Creator Channel 현재 라이브, On-air 목록에서 각각 한 번 선택한다.
|
||||
- 기대 결과: 세 경로 모두 기존 로딩 표시 후 같은 room ID의 `LiveRoomActivity`로 이동하며 중복 상세 조회 화면이나 추가 Dialog가 나타나지 않는다.
|
||||
- [x] **M3-02: 로그아웃 상태의 라이브 선택**
|
||||
- 절차: 로그아웃 상태에서 Home 추천 라이브를 선택하고, Home의 On-air 더보기 진입도 시도한다.
|
||||
- 기대 결과: 기존 `LoginActivity`가 열리고 라이브 상세 조회, 오디오 중단, `LiveRoomActivity` 이동은 실행되지 않는다.
|
||||
- [ ] **M3-03: 국내 미인증 계정의 성인 라이브 선택**
|
||||
- 절차: 국내 미인증 계정으로 `R9`를 Home 추천 또는 Creator Channel 현재 라이브에서 선택한다.
|
||||
- 기대 결과: 로그인 확인과 상세 조회 뒤 기존 V2 본인인증 안내가 표시되고 오디오 중단, 비밀번호/결제 Dialog, 라이브 입장은 실행되지 않는다.
|
||||
- [ ] **M3-04: 성인 콘텐츠 표시가 비활성인 계정의 성인 라이브 선택**
|
||||
- 절차: 본인인증 완료·성인 콘텐츠 표시 비활성 계정으로 `R9`를 선택한다.
|
||||
- 기대 결과: `ContentSettingsActivity`가 성인 콘텐츠 안내 상태로 열리고 라이브 입장과 오디오 중단은 실행되지 않는다.
|
||||
- [x] **M3-05: 성인 콘텐츠 접근 허용 계정의 성인 라이브 선택**
|
||||
- 절차: 성인 콘텐츠 접근 허용 계정으로 `R9`를 선택한다.
|
||||
- 기대 결과: 추가 접근 안내 없이 `R9`의 입장 정책에 맞는 직접 입장, 비밀번호 Dialog 또는 결제 Dialog가 실행된다.
|
||||
- [ ] **M3-06: 호출자 성인 힌트와 상세 응답 불일치**
|
||||
- 절차: QA fixture에서 Creator Channel 목록 `isAdult=true`·상세 `isAdult=false`인 방과 목록 `isAdult=false`·상세 `isAdult=true`인 방을 각각 선택한다.
|
||||
- 기대 결과: 두 경우 모두 성인 콘텐츠 접근 조건을 요구하며, 접근이 거부되면 상세 표시와 라이브 입장이 실행되지 않는다.
|
||||
|
||||
#### Live 입장 분기
|
||||
|
||||
- 공통 절차: 각 항목 실행 전에 오디오 콘텐츠를 재생하고, 접근 허용 일반 계정 또는 명시된 관리자 계정으로 대상 라이브를 선택한다.
|
||||
|
||||
| 완료 | 시나리오 | 기대 결과 |
|
||||
|-----| --- | --- |
|
||||
| [x] | **M3-07: 관리자 본인의 유료·비밀번호 현재 라이브** | `R7` 선택 시 비밀번호/결제 Dialog 없이 오디오가 중단되고 `LiveRoomActivity`로 이동한다. |
|
||||
| [x] | **M3-08: 무료 공개 현재 라이브** | `R1` 선택 시 오디오가 중단되고 `LiveRoomActivity`로 이동한다. |
|
||||
| [x] | **M3-09: 무료 또는 결제 완료 비밀번호 현재 라이브** | `R2`와 `R4` 선택 시 결제액 없는 비밀번호 Dialog가 표시되고 올바른 비밀번호 입력 성공 후 입장한다. |
|
||||
| [x] | **M3-10: 결제 완료 유료 공개 현재 라이브** | `R3` 선택 시 결제 Dialog 없이 오디오가 중단되고 바로 입장한다. |
|
||||
| [x] | **M3-11: 미결제 유료 공개 현재 라이브** | `R5` 선택 시 오디오가 중단되고 기존 금액·시간 문구의 결제 Dialog가 표시되며, 취소 시 현재 화면을 유지하고 확인 성공 시 입장한다. |
|
||||
| [x] | **M3-12: 미결제 유료 비밀번호 현재 라이브** | `R6` 선택 시 결제 Dialog 대신 가격이 표시되는 비밀번호 Dialog가 나타나고 올바른 비밀번호 입력 성공 후 입장한다. |
|
||||
| [x] | **M3-13: 비밀번호 또는 입장 API 실패** | 잘못된 비밀번호 또는 QA 실패 응답에서 기존 오류 안내가 표시되고 `LiveRoomActivity`는 열리지 않으며 로딩 표시가 종료된다. |
|
||||
|
||||
#### unavailable과 예약 라이브 상세
|
||||
|
||||
- [x] **M3-14: Home과 Creator Channel의 unavailable 상세 fallback**
|
||||
- 절차: 오디오를 재생한 상태에서 `R8`을 Home 추천과 Creator Channel 현재 라이브에서 각각 선택한다.
|
||||
- 기대 결과: 성인 접근 조건을 통과한 뒤 라이브 상세 bottom sheet가 표시되고 오디오는 계속 재생된다.
|
||||
- [ ] **M3-15: On-air의 unavailable 처리**
|
||||
- 절차: 오디오를 재생한 상태에서 On-air 목록에 노출된 `R8`을 선택한다.
|
||||
- 기대 결과: 기존 공통 오류 Toast만 표시되고 성인 안내, 라이브 상세, 비밀번호/결제 Dialog, 오디오 중단, 라이브 입장은 실행되지 않는다.
|
||||
- [x] **M3-16: 예약 라이브 상세의 로그인·성인 접근 확인**
|
||||
- 절차: Creator Channel 일정에서 일반 예약 라이브와 성인 예약 라이브를 각각 선택하고, 성인 예약 라이브는 접근 거부 계정과 허용 계정으로 나누어 확인한다.
|
||||
- 기대 결과: 일반 예약 라이브는 로그인 후 상세가 표시되고, 성인 예약 라이브는 성인 접근 허용 시에만 상세가 표시된다.
|
||||
- [x] **M3-17: 라이브 상세 중복 표시 방지**
|
||||
- 절차: Creator Channel 일정의 같은 예약 라이브를 빠르게 연속 선택한다.
|
||||
- 기대 결과: 같은 `LiveRoomDetailFragment`가 한 번만 표시되며 중복 bottom sheet나 `FragmentManager` 예외가 발생하지 않는다.
|
||||
- [x] **M3-18: 일반 사용자의 무료·유료·비밀번호 예약**
|
||||
- 절차: 일반 계정으로 `R10`의 무료 공개, 미결제 유료 공개, 비밀번호 예약 라이브를 각각 열어 예약을 진행한다.
|
||||
- 기대 결과: 무료 공개는 바로 예약되고, 유료 공개는 기존 결제 Dialog를 거치며, 비밀번호 방은 기존 비밀번호 Dialog를 거친다. 성공 후 `LiveReservationCompleteActivity`가 열리고 Creator Channel Home이 새로고침된다.
|
||||
- [x] **M3-19: 관리자 예약 라이브 수정**
|
||||
- 절차: 관리자 계정으로 본인 예약 라이브 상세에서 수정을 선택한다.
|
||||
- 기대 결과: 기존 room detail extra를 가진 `LiveRoomEditActivity`가 열린다.
|
||||
- [x] **M3-20: 관리자 예약 라이브 시작**
|
||||
- 절차: 관리자 계정으로 본인 예약 라이브 상세에서 시작을 선택하고 API 성공까지 기다린다.
|
||||
- 기대 결과: Creator Channel Home이 새로고침되고 해당 room ID의 `LiveRoomActivity`로 이동한다.
|
||||
- [x] **M3-21: 관리자 예약 라이브 취소**
|
||||
- 절차: 관리자 계정으로 본인 예약 라이브 상세에서 취소를 선택해 사유를 입력하고 완료한다.
|
||||
- 기대 결과: 기존 취소 성공 Toast가 표시되고 Creator Channel Home이 새로고침되며 취소된 일정 상태가 반영된다.
|
||||
|
||||
#### 라이브 생성 결과
|
||||
|
||||
- [x] **M3-22: 예약 라이브 생성 완료**
|
||||
- 절차: Creator Channel owner FAB에서 즉시 시작되지 않는 예약 라이브를 생성한다.
|
||||
- 기대 결과: Creator Channel Home이 새로고침되고 기존 생성 완료 Toast가 표시되며 `LiveRoomActivity`는 열리지 않는다.
|
||||
- [x] **M3-23: 즉시 시작 라이브 생성 완료**
|
||||
- 절차: Creator Channel owner FAB에서 channel과 유효한 room ID가 반환되는 즉시 시작 라이브를 생성한다.
|
||||
- 기대 결과: Creator Channel Home이 새로고침되고 생성된 room ID의 입장 흐름을 거쳐 `LiveRoomActivity`로 이동한다.
|
||||
- [ ] **M3-24: 유효한 room ID가 없는 생성 성공 결과**
|
||||
- 절차: QA backend에서 channel은 반환하지만 room ID가 null, `0L` 또는 음수인 성공 응답으로 라이브 생성을 완료한다.
|
||||
- 기대 결과: Creator Channel Home만 새로고침되고 생성 Toast, 비밀번호/결제 Dialog, `LiveRoomActivity` 이동은 실행되지 않는다.
|
||||
- [x] **M3-25: 라이브 생성 취소**
|
||||
- 절차: 라이브 생성 화면을 결과 없이 닫는다.
|
||||
- 기대 결과: Creator Channel Home 새로고침, 생성 Toast, 라이브 입장이 실행되지 않는다.
|
||||
- [ ] **M3-26: 라이브 생성 실패 응답**
|
||||
- 절차: QA backend에서 라이브 생성 실패 응답을 반환하도록 설정하고 생성 요청을 완료한다.
|
||||
- 기대 결과: 기존 생성 실패 안내만 표시되고 Creator Channel Home 새로고침, 생성 완료 Toast, 라이브 입장은 실행되지 않는다.
|
||||
|
||||
#### lifecycle과 오류 회귀
|
||||
|
||||
- [x] **M3-27: 상세 조회 중 호출 화면 이탈**
|
||||
- 절차: 느린 네트워크에서 라이브를 선택한 직후 Home Fragment를 벗어나는 경우와 Activity를 종료하는 경우를 각각 실행하고 상세 응답을 기다린다.
|
||||
- 기대 결과: 이탈한 화면 위에 Toast, Dialog, bottom sheet, `LiveRoomActivity`가 늦게 표시되지 않고 앱이 종료되지 않는다.
|
||||
- [x] **M3-28: 입장 또는 라이브 시작 요청 중 화면 이탈**
|
||||
- 절차: 비밀번호/결제 확인 또는 관리자 라이브 시작 직후 요청이 완료되기 전에 Activity 종료와 앱 백그라운드 전환을 각각 실행한다.
|
||||
- 기대 결과: lifecycle이 유효하지 않은 동안 `LiveRoomActivity`가 늦게 열리지 않고 `FragmentManager`/Activity state 예외가 발생하지 않는다.
|
||||
- [ ] **M3-29: 상세 조회 API 실패**
|
||||
- 절차: QA 실패 응답 또는 네트워크 차단 상태에서 Home, Creator Channel, On-air 중 한 경로의 라이브를 선택한다.
|
||||
- 기대 결과: 기존 라이브 상세 조회 오류 안내가 표시되고 오디오 중단, Dialog, 상세 bottom sheet, 라이브 입장은 실행되지 않으며 로딩 표시가 종료된다.
|
||||
- [ ] **M3-30: 수동 테스트 종료 후 화면 상태 확인**
|
||||
- 절차: 네트워크를 복구하고 Home, Creator Channel, On-air를 다시 열어 목록 로딩과 라이브 선택을 한 번씩 수행한다.
|
||||
- 기대 결과: 이전 실패/취소/화면 이탈로 인한 고정 loading, 중복 Dialog, 중복 상세, 잘못된 Home 상태가 남지 않고 정상 동작한다.
|
||||
|
||||
#### 수동 검증 기록 형식
|
||||
|
||||
- 각 실행 결과는 다음 형식으로 본 Task 아래에 누적한다.
|
||||
- `YYYY-MM-DD / M3-번호 / 기기·OS / 계정 조건 / room ID / PASS·FAILED·BLOCKED·SKIPPED / 실제 결과와 증빙 위치`
|
||||
- 전체 항목 완료 후 여러 화면에 걸친 최종 결과는 문서 최하단 `Verification Log`에도 요약한다.
|
||||
- 체크리스트 작성 검증 기록:
|
||||
- 2026-07-15: Phase 3 요구사항과 구현 분기를 대조해 사전 준비 3개와 수동 시나리오 `M3-01`~`M3-30`을 작성했다. 시나리오 번호 중복과 placeholder가 없음을 확인했고, `./gradlew tasks --all`은 `BUILD SUCCESSFUL`, `git diff --check HEAD`는 무출력으로 통과했다.
|
||||
- 사용자 수동 검증 기록:
|
||||
- 2026-07-15 / `M3-P01`~`M3-P03` / 기기·OS·계정·room ID 상세 미제공 / PASS / 사용자가 사전 준비 3개 항목을 모두 완료로 확인했다.
|
||||
- 2026-07-15 / `M3-01`, `M3-02`, `M3-05`, `M3-07`~`M3-14`, `M3-16`~`M3-23`, `M3-25`, `M3-27`, `M3-28` / 기기·OS·계정·room ID 상세 미제공 / PASS / 사용자가 체크한 22개 시나리오를 기대 결과와 일치한 것으로 확인했다.
|
||||
- 2026-07-15 / `M3-03`, `M3-04`, `M3-06`, `M3-15`, `M3-24`, `M3-26`, `M3-29`, `M3-30` / 기기·OS·계정·room ID 상세 미제공 / SKIPPED / 사용자가 테스트 불가능 또는 의미 없음으로 판단했으며, 항목은 미체크 상태로 유지했다.
|
||||
- 2026-07-15: 사전 준비 3개와 시나리오 22개는 `PASS`, 시나리오 8개는 `SKIPPED`, `FAILED`는 0개로 판정되어 Task 3.8을 완료 처리했다.
|
||||
|
||||
### Phase 4: Creator와 Community 공통 Action
|
||||
- [ ] **Task 4.1: Creator Channel 진입 호출부와 계약 확정**
|
||||
@@ -611,3 +890,4 @@
|
||||
- 2026-07-14: 사용자 확인에 따라 Activity result가 필요한 모든 도메인 Action에 공통 결과 전달 원칙을 확장했다. 기본 방식은 `ActivityResult -> 명시적 도메인 결과 -> feature 단일 handler`이며, Action/Repository 직접 결과도 동일 handler로 합류한다. `SharedFlow`/observer는 Activity 밖의 독립 소비자와 lifecycle/replay 요구가 확인될 때만 도입한다.
|
||||
- 2026-07-14: Phase 0/1 리뷰 답변을 반영해 Legacy MyPage 호출부와 로그인 token 정책 확인, FanTalk source assertion 수동 삭제 사유를 기록했다. 문서 변경 후 `./gradlew tasks --all`은 `BUILD SUCCESSFUL`, `git diff --check HEAD`는 무출력으로 통과했다.
|
||||
- 2026-07-14: Phase 2 Content Action 전환 후 전체 `:app:testDebugUnitTest`, `:app:compileDebugKotlin`, `tasks --all`, `git diff --check HEAD`가 통과했다. 전체 ktlint는 기존 main source 550줄 기준선 위반으로 실패했지만 Phase 2 변경 Kotlin 파일과 test source의 신규 위반은 0건이다. 연결된 Android 기기가 없어 실기기 수동 탭 검증은 후속 확인 항목으로 남겼다.
|
||||
- 2026-07-15: 사용자 수동 테스트 결과 Phase 3 사전 준비 3개와 시나리오 22개를 `PASS`로 확인했다. 미체크 시나리오 `M3-03`, `M3-04`, `M3-06`, `M3-15`, `M3-24`, `M3-26`, `M3-29`, `M3-30`은 사용자 판단에 따라 테스트 불가능 또는 의미 없음으로 보아 `SKIPPED` 처리했으며, `FAILED`는 0개다. 모든 항목의 판정이 완료되어 Task 3.8과 Phase 3 수동 회귀 검증을 완료 처리했다.
|
||||
|
||||
Reference in New Issue
Block a user