# backend/tests 전 파일 ledger

## 기준

- `failing`: 2026-04-21 전체 실행 `backend/.venv/bin/python -m pytest backend/tests -q`에서 실제 실패/에러가 난 파일
- `review`: 현재는 통과하지만 회귀 범위가 넓거나 구조 전환과 직접 맞닿아 있어 계속 봐야 하는 파일
- `support`: 보조 fixture이거나 현재 기준에서 비교적 안정적인 파일

## 실행 결과

- 전체 실행: `backend/.venv/bin/python -m pytest backend/tests -q`
- 결과: `56 failed, 637 passed, 2 errors, 1 skipped, 10 warnings` (`124.30s`)
- 단독 대조 실행: `backend/.venv/bin/python -m pytest backend/tests/test_pipeline_e2e.py -q`
- 결과: `2 passed, 1 skipped`

의미:

- `test_pipeline_e2e.py`는 단독으로는 통과하지만 전체 suite에서는 startup 중 `user_account` 테이블 부재로 에러가 났다.
- 이건 "테스트 하나가 깨졌다"기보다 `app.main` import/startup과 DB schema 준비가 강하게 결합돼 있다는 증거다.
- 나머지 대다수 실패는 v2/v3 legacy contract가 현재 구현과 드리프트한 케이스다.

## 대표 실패 클러스터

### 1. startup/schema coupling

- `backend/tests/test_pipeline_e2e.py:10`은 전역 `app`를 import한다.
- `backend/tests/test_pipeline_e2e.py:15`는 바로 `TestClient(app)`를 연다.
- `backend/app/main.py:39`의 `init_db()` import side effect와 `backend/app/main.py:45-93`의 startup bootstrap이 합쳐지면서, 전체 suite에서는 `_ensure_default_user()`가 `user_account` 테이블 없는 DB에 접근해 실패했다.

### 2. legacy pipeline contract drift

- `backend/tests/test_pipeline_v3_e2e.py:170-188`은 분석 단계가 1..20 순차 order라는 v3 계약을 전제한다.
- 하지만 현재 `backend/app/core/step_manifest.py:1-12`는 총 48단계 / active 40단계를 전제로 한다.
- `backend/tests/test_pipeline_v3_e2e.py:249-258`은 `scene_detail` 의존성이 4개라고 가정하지만, 현재 manifest는 더 많은 의존성을 가진다.
- `backend/tests/test_sync_v3.py:24-49`는 `entity_review`, `outlook_dedup` 같은 예전 step key를 아직 registry에 기대한다.

### 3. helper/constructor API drift

- `backend/tests/test_text_cleanup.py:7-31`은 `clean_text` 함수를 import하지만, 현재 `backend/app/modules/pipeline/text_cleaner.py`는 `extract_text_from_pdf_llm()`만 노출한다.
- `backend/tests/test_variation_pipeline.py:181-260`은 `VariationRecommender(llm_client=...)` 주입을 기대하지만, 현재 구현 `backend/app/modules/variation_recommender.py:103-157`은 `project_llm_config`만 받는다.

### 4. checkpoint/response projection drift

- `backend/tests/test_sync_v3.py:153-285`는 `scene_director`의 V/A/H 데이터와 `scene_summary`가 `scene_still`에 투영되길 기대하지만 현재 suite에서는 그 assertion이 깨진다.
- `backend/tests/test_entities_api.py`, `backend/tests/test_images_api.py`, `backend/tests/test_variation_pipeline.py`는 still/image 응답 shape와 개수 계약이 현재 API 응답과 어긋난다.

## ledger

| file | LOC | class | note |
|---|---:|---|---|
| backend/tests/__init__.py | 1 | support | - |
| backend/tests/compare_t2i_models.py | 313 | review | image/model 비교용 장기 검증 |
| backend/tests/conftest.py | 11 | support | fixture |
| backend/tests/conftest_pg.py | 29 | support | fixture |
| backend/tests/core/__init__.py | 1 | support | core-test |
| backend/tests/core/test_build_opik_metadata.py | 112 | support | core-test |
| backend/tests/core/test_consumes_downstream_integration.py | 146 | support | core-test |
| backend/tests/core/test_location_consistency.py | 227 | failing | current implementation drift |
| backend/tests/core/test_low_freq_skip.py | 70 | support | core-test |
| backend/tests/core/test_name_matcher.py | 169 | support | core-test |
| backend/tests/core/test_scene_analysis_dto.py | 197 | support | core-test |
| backend/tests/core/test_scene_detail_analyze_one.py | 411 | failing | still_frame_prompt / sanitize contract drift |
| backend/tests/core/test_shot_validator.py | 506 | review | core-test |
| backend/tests/core/test_step_runner_consumes_downstream.py | 239 | support | core-test |
| backend/tests/core/test_step_runner_editorial_cascade.py | 121 | support | core-test |
| backend/tests/gemini_pro_scene10_result.json | 43 | support | fixture-data |
| backend/tests/gemini_scene10_result.json | 47 | support | fixture-data |
| backend/tests/gpt_scene10_result.json | 59 | support | fixture-data |
| backend/tests/pipeline/__init__.py | 1 | support | pipeline-test |
| backend/tests/pipeline/test_outlook_dedup.py | 382 | review | pipeline-test |
| backend/tests/services/__init__.py | 1 | support | service-test |
| backend/tests/services/test_analysis_dispatch_service.py | 422 | review | service-test, current-refactor |
| backend/tests/services/test_checkpoint_sync_services.py | 158 | support | service-test, current-refactor |
| backend/tests/services/test_image_service_helpers.py | 265 | support | service-test |
| backend/tests/services/test_outlook_delta_sync.py | 304 | review | service-test |
| backend/tests/services/test_prompt_service.py | 362 | review | service-test |
| backend/tests/services/test_reference_image_service.py | 512 | review | service-test |
| backend/tests/services/test_relation_delta_sync.py | 377 | review | service-test |
| backend/tests/services/test_scene_image_service.py | 323 | review | service-test |
| backend/tests/services/test_shot_selection_service.py | 150 | support | service-test |
| backend/tests/services/test_snapshot_service.py | 64 | support | service-test |
| backend/tests/test_activity_logger.py | 62 | support | - |
| backend/tests/test_api_endpoint_decorator.py | 65 | support | - |
| backend/tests/test_applicability.py | 60 | support | current-refactor |
| backend/tests/test_auth_api.py | 57 | support | startup 의존하지만 현재 통과 |
| backend/tests/test_checkpoint_io.py | 77 | support | current-refactor |
| backend/tests/test_entities_api.py | 343 | failing | stills count/shape drift |
| backend/tests/test_entity_dependency.py | 256 | support | - |
| backend/tests/test_entity_extract_v4.py | 219 | failing | entity extract/filter contract drift |
| backend/tests/test_entity_filter.py | 227 | failing | low-frequency filter contract drift |
| backend/tests/test_entity_review_v4.py | 177 | failing | reviewer contract drift |
| backend/tests/test_episode_summary.py | 42 | support | - |
| backend/tests/test_episodes_api.py | 165 | support | - |
| backend/tests/test_exports_api.py | 109 | support | - |
| backend/tests/test_fal_angle_edit.py | 268 | support | - |
| backend/tests/test_gemini_i2i_angle.py | 332 | review | - |
| backend/tests/test_gpt_scene10_analysis.py | 255 | support | - |
| backend/tests/test_i18n.py | 10 | support | - |
| backend/tests/test_image_validator.py | 229 | support | - |
| backend/tests/test_images_api.py | 497 | failing | image generation / still response drift |
| backend/tests/test_manifest_fields.py | 191 | support | - |
| backend/tests/test_models.py | 48 | support | schema smoke test |
| backend/tests/test_moderation.py | 532 | review | - |
| backend/tests/test_moderation_retry_strategies.py | 304 | review | - |
| backend/tests/test_outlook_v2.py | 338 | failing | legacy-contract, phase2 schema/temp id drift |
| backend/tests/test_pipeline_e2e.py | 57 | failing | startup/schema coupling; 단독 실행은 통과 |
| backend/tests/test_pipeline_v3_e2e.py | 788 | failing | legacy-contract, v3 order/dependency/class registry drift |
| backend/tests/test_progress.py | 238 | support | - |
| backend/tests/test_project_export_import.py | 252 | support | - |
| backend/tests/test_projects_api.py | 190 | support | - |
| backend/tests/test_provenance.py | 399 | review | - |
| backend/tests/test_scene_dependency_v2.py | 510 | failing | legacy-contract, dependency prompt/step drift |
| backend/tests/test_scene_detail_v3.py | 307 | failing | legacy-contract, detail batch behavior drift |
| backend/tests/test_scene_director_v2.py | 510 | failing | legacy-contract, schema enum/prompt drift |
| backend/tests/test_scene_steps_v3.py | 322 | failing | legacy-contract, StepRunner init/opik_context + scene_save source-selection drift |
| backend/tests/test_scene_summary.py | 253 | support | - |
| backend/tests/test_scene_verify_v2.py | 284 | failing | legacy-contract, verify prompt context drift |
| backend/tests/test_security.py | 47 | support | - |
| backend/tests/test_settings_registry.py | 41 | support | - |
| backend/tests/test_step_catalog.py | 101 | support | current-refactor |
| backend/tests/test_step_manifest_v3.py | 187 | support | legacy-contract, current-refactor |
| backend/tests/test_sync_v3.py | 286 | failing | legacy-contract, registry/projection drift |
| backend/tests/test_text_cleanup.py | 33 | failing | removed `clean_text` API |
| backend/tests/test_users_api.py | 123 | support | - |
| backend/tests/test_variation_pipeline.py | 778 | failing | constructor/prompt/response/version drift |
| backend/tests/test_visual_world_rules.py | 76 | support | - |
