69 lines
4.3 KiB
Markdown
69 lines
4.3 KiB
Markdown
---
|
|
phase: implementation
|
|
agent: implementation-advisor
|
|
agent_version: 1
|
|
generated_at: 2026-06-22T10:10:00+09:00
|
|
fix_loop: L1
|
|
concerns: []
|
|
concerns_checked: true
|
|
planned_workers: 1
|
|
actual_workers: 0
|
|
workers_spawned: 0
|
|
---
|
|
|
|
# FIX LOOP L1 — GameReviewControllerTest RED 8건 해소
|
|
|
|
## 근본 원인 (확정)
|
|
**가설 1 (기존/신규 테스트 계약 미갱신) 단독.** 컨트롤러 버그(가설 2) 아님.
|
|
|
|
- 실패 8건 전부 POST body 가 BODY_MIN(10자) 미만 → 컨트롤러가 design.md AC-9
|
|
"리뷰 본문 trim 후 9자 거부(400), 10자 통과" 에 따라 **정당하게 400** 반환.
|
|
- 컨트롤러 axes 바인딩은 무관: 테스트가 `controller.createReview(...)` 를 6개 위치 인자로
|
|
직접 호출(`createReview`/`updateReview` 래퍼, test:409-421) → MockMvc 폼바인딩 경로 미사용.
|
|
`@RequestParam` 평면 파라미터(immersion=…) 구성과도 무관. 검증 순서도 design §5.3 정합 확인
|
|
(CSRF→auth→game존재→axes파싱→body검증→overall계산→conflict→insert→axes insert).
|
|
- conflict 테스트(409 기대)도 동일 원인: 1st POST 의 body 가 3자("또작성") 라 body 검증에서
|
|
400 으로 죽어 conflict(169행) 까지 도달 못 함.
|
|
|
|
### 실패 8건 본문 길이 (수정 전)
|
|
| 테스트 | 본문(전) | 길이 | 수정 후 본문 | 길이 |
|
|
|---|---|---|---|---|
|
|
| createReviewReturnsEditedFalse:72 | 재미있음 | 4 | 정말 재미있는 게임입니다 | 13 |
|
|
| updateReviewReturnsEditedTrue:90 | 더 좋아짐 | 5 | 수정 후 훨씬 더 좋아졌습니다 | 16 |
|
|
| createSecondReviewReturnsConflict:109 | 또작성 | 3 | 같은 게임에 또 작성 시도합니다 | 17 |
|
|
| assertCreateRatingAccepted(1/5 경계) | 내용입니다열자 | 7 | 별점 경계값 통과 검증 본문입니다 | 18 |
|
|
| createReviewAutoAveragesOverall…:258 | 자동평균테스트 | 7 | 별점 자동평균 계산 검증 본문 | 16 |
|
|
| createReviewUsesManualOverall…:281 | 수동평점테스트 | 7 | 수동 별점 사용 검증 본문입니다 | 17 |
|
|
| createReviewPersistsSixAxes:306 | 여섯축저장테스트 | 8 | 여섯 축 저장 검증용 본문입니다 | 17 |
|
|
|
|
## 수정 내역 (테스트만, 컨트롤러/계약 불변)
|
|
파일: `src/test/java/com/pandoli365/bibimbap/controller/api/GameReviewControllerTest.java`
|
|
|
|
7개 지점 본문 문자열 교체(헬퍼 `assertCreateRatingAccepted` 1곳이 rating 1/5 두 boundary 케이스 커버 → 실패 8건):
|
|
- 72행, 90행, 109행, 258행, 281행, 306행 직접 교체
|
|
- `assertCreateRatingAccepted` 본문(402행) 교체 → createReviewAcceptsRatingOneBoundary / FiveBoundary 동시 해소
|
|
|
|
추가(우연통과 배제, §2.6 다항목 재검):
|
|
- `assertCreateRatingRejected` 본문(382행) "내용입니다열자"(7자)→"별점 범위 검증용 본문입니다"(15자) 로 상향.
|
|
기존 7자였다면 rating 0/6 거부를 검증하려 해도 body 검증(400)에서 먼저 걸려 **우연히** 400 통과할
|
|
위험이 있었음. body 를 10자 이상으로 올려 rating 검증 분기까지 실제 도달함을 보장.
|
|
|
|
**행위 검증 전부 보존**: edited 마커(false/true), 게임당1회 409(never addGameReview),
|
|
rating 1~5 경계, overall 자동평균(rating=4·ratingManual=false)/수동(rating=2·manual=true),
|
|
addReviewAxes 6행 — 모든 assertion 원형 유지. 검증을 무력화하거나 계약을 약화하지 않음.
|
|
|
|
## 공유 문자열 일괄치환 회피 (정밀성)
|
|
"내용입니다열자"(7자) 는 통과 중인 CSRF/forbidden/missing-axis 테스트(190/204/235행)에도 쓰임.
|
|
그 테스트들은 본문 검증 **이전 단계**(CSRF 403 / 비작성자 FORBIDDEN / axis 누락 400)에서 분기되어
|
|
짧은 본문이어도 정상 통과 → 의도된 단축 본문. 따라서 일괄 치환 금지, 성공경로 헬퍼 2곳만 정밀 교체.
|
|
|
|
## 실행 결과
|
|
- `./mvnw test -Dtest=GameReviewControllerTest` → **Tests run: 20, Failures: 0** (GREEN)
|
|
- `./mvnw test` (전체) → **Tests run: 43, Failures: 0, Errors: 0, Skipped: 0** (회귀 0)
|
|
- GameCommentControllerTest 17/17, GameReviewControllerTest 20/20,
|
|
UserControllerCsrfTest 5/5, BibimbapApplicationTests 1/1
|
|
|
|
## 손대지 않은 항목 (지시 준수)
|
|
- GameReviewController.java 등 main 소스 무수정 (계약·검증순서 design §5 정합 확인만).
|
|
- ${}0 / sort5 / axis6 grep 검증, DbUpdateQueryGeneratorTest — 미접촉.
|