o2o-negosium-original/negodata/docs/imk-test-coverage.md

5.5 KiB
Raw Blame History

IMK 요구사항 테스트 커버리지 (2026-07-24 실행)

IMK 요청 표(14~23) 항목별 자동 테스트가 실제로 걸려 있는지와, 이번에 돌린 실행 플로우를 정리한다. 결론부터: 자동 테스트가 있는 IMK 항목은 #15(공급사 재협상) 하나뿐. 나머지는 UI·라벨·엑셀·스크립트 변경이라 전 스위트(회귀 안전망)만 통과할 뿐 항목 전용 테스트는 없다.

1. 실행한 테스트 스위트

스위트 실행 커맨드 DB 결과
negodata 전체 APP_ENV=test .venv/bin/python -m pytest tests/ 격리 test DB(negosium_test_db, 세션마다 재생성) 83 passed / 1 failed
포털(negosium) 전체 컨테이너 APP_ENV=local pytest tests/ dev DB(negosium_db), 테스트가 자기 행만 시드/정리(비파괴) 71 passed
negodata #15 심사 pytest tests/test_renegotiation.py 격리 test DB 9 passed
포털 #15 요청/철회 컨테이너 pytest tests/test_renegotiation.py dev DB(자기정리, 잔여 0 확인) 6 passed
  • negodata 1 실패 = test_scheduler::test_scheduler_registers_both_jobs — 스케줄러에 sync_lps_results 잡이 새로 추가됐는데 단언을 안 고친 stale 테스트. IMK 항목과 무관.
  • 포털은 로컬 venv가 없어 컨테이너에 pytest 임시 설치 후 실행. dev DB지만 PYTESTRENEGO-/PYTESTNEGO- 프리픽스로 자기 행만 지운다.

2. IMK 표(14~23) 항목별 커버리지

# 요구사항 자동 테스트 근거/플로우
14 발주배수 필드 추가 ❌ 없음 companies.settings 커스텀 필드. 전용 테스트 없음
15 공급사 재협상 요청 + 승인 화면 ✅ 있음(15건) 포털 요청/철회 6 + negodata 심사 9. 아래 3절
16 통계 인상 억제율 지표 ❌ 없음 통계 파생집계, 전용 테스트 없음
17 협력사 분류카테고리 추가 ❌ 없음(간접만) test_quotation_create/anchoring이 category 값을 쓰지만 분류 기능 자체 검증 아님
18 배송리드타임 → 표준납기일 ❌ 없음 라벨 문자열 변경, 테스트 대상 아님
19 협력사 화면 구분 영역 삭제 ❌ 없음 프론트 UI 제거, 테스트 대상 아님
20 실적(계약) 공급사 컬럼 추가 ❌ 없음 상품 컬럼 추가, 전용 테스트 없음
21 스크립트 변수명 노출(internet_lowest_price) ❌ 없음 agent 스크립트 렌더 수정, 전용 테스트 없음
22 협상카드 일괄 선택 ❌ 없음 프론트 UI, 테스트 대상 아님
23 상품 업로드 양식 수정 ❌ 없음 엑셀 양식/컬럼, 전용 테스트 없음

정리: 10개 중 자동 테스트 보유는 1개(#15). 나머지 9개는 성격상(UI/라벨/엑셀/스크립트) 단위테스트 대상이 아니거나 아직 미작성 → 사람이 화면에서 확인해야 함.

3. #15 재협상 — 테스트별 검증 플로우

포털(negosium) — 요청/철회 (backend/tests/test_renegotiation.py, e2e HTTP)

개찰(OPEN_*) 마감 + 본인 마지막 라운드 세션을 시드하고 실제 로그인 → 엔드포인트 호출로 검증.

테스트 플로우 기대
request_records_pending 개찰건에 POST .../renegotiation success + custom.renegotiation=PENDING(사유·희망가) + 담당자 알림 1건
request_twice_blocked 같은 세션에 요청 2회 2번째 거부, PENDING 1건 유지
request_blocked_on_awarded 낙찰(AWARDED)건에 요청 거부 + 미기록
request_forbidden_other_supplier 남의 공급사 세션에 요청 거부 + 미기록
cancel_sets_canceled_and_allows_rerequest 요청 후 DELETE 철회 → 재요청 CANCELED → 재요청 시 PENDING
cancel_requires_pending 대기 요청 없는데 철회 거부

negodata — 심사(승인/반려) (negodata/backend/tests/test_renegotiation.py, 서비스 단위)

승인이 호출하는 regenerate_quotation(견적 풀체인)은 스텁으로 격리하고 #15 고유 계약만 검증.

테스트 플로우 기대
list_scoped_to_company 내 회사·남의 회사 요청 각 1건 → 목록 내 회사 건만(total=1)
list_filters_by_status 대기·반려 각 1건 → status=1 필터 대기 건만
approve_transitions_and_persists 대기건 승인(재생성 성공 스텁) APPROVED + next_quotation_id + memo 박제, 요청 공급사 포함 호출
approve_includes_extra_suppliers 승인 시 추가 공급사 지정 재생성 공급사 = 요청자 ∪ 추가(중복 제거)
approve_blocks_when_not_pending 이미 승인된 건 재승인 거부(INVALID) + 재생성 미호출
approve_keeps_pending_when_regenerate_fails 재생성 실패 스텁 실패 반환 + 상태 PENDING 유지
approve_other_company_not_found 남의 회사 세션 승인(IDOR) NOT_FOUND + 재생성 미호출
reject_transitions_and_saves_memo 대기건 반려(사유) REJECTED + 반려사유 저장
reject_blocks_when_not_pending 이미 반려된 건 재반려 거부(INVALID)

4. 미커버 항목에 대한 권고

  • #14/#16/#17/#20/#23(데이터·집계·엑셀)은 서비스 단위 테스트를 붙일 수 있음 — 필요 시 작성.
  • #18/#19/#22(라벨·UI)와 #21(스크립트 렌더)은 화면·실협상으로 확인하는 게 맞음.
  • #15는 "승인 → 실제 다음 라운드 견적이 올바른 상품/카드로 생성되는지"는 스텁으로 끊었으므로, 실 데이터 승인 1회로 최종 확인 필요.