o2o-negosium-original/negodata/backend/tests/test_item.py
Mina Choi 82076e138e [test] negodata: 백엔드 테스트 스위트 구축 + 공통 픽스처(conftest) 정비
- test DB 세션마다 자동 create/drop (팀원은 Postgres만 있으면 pytest 한 방)
- auth_headers 시드 픽스처(무인증 /auth/create 제거 대응) + other_company_id
- 커버: 회사 스코프(견적·상품·협력사·대시보드·세팅), 견적 마감 재견적 O/X + 알림,
  견적 생성·목표가, 알림함 읽기, 회사유저 OWNER 게이팅, 기존 파일 검증/기대결과 주석 정비

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 15:06:55 +09:00

42 lines
1.9 KiB
Python

"""item 도메인 e2e — 상품 CRUD. 회사 스코프(타사 격리)는 test_company_scope.py. 로그인은 auth_headers."""
import uuid
async def test_item_crud_flow(client, auth_headers):
"""검증: 상품 생성→목록→단건→부분수정→soft삭제 전체 흐름.
기대결과: 각 단계 success, 부분수정은 준 필드만 변경(나머지 유지), soft삭제 후 목록 total=0."""
h = await auth_headers("itemuser")
r = await client.post("/v1/item/create", json={"name": "상품A", "price": 1000, "code": "C1"}, headers=h)
assert r.status_code == 200
body = r.json()
assert body["result"]["success"] is True
item_id = body["item"]["item_id"]
assert body["item"]["name"] == "상품A"
r = await client.get("/v1/item/list", headers=h)
body = r.json()
assert body["total"] == 1 and len(body["items"]) == 1
r = await client.get(f"/v1/item/{item_id}", headers=h)
assert r.json()["item"]["item_id"] == item_id
# 부분 수정: 준 필드(price)만 바뀌고 안 준 필드(name)는 유지돼야 한다
r = await client.patch(f"/v1/item/update/{item_id}", json={"price": 2000}, headers=h)
assert r.json()["item"]["price"] == 2000
assert r.json()["item"]["name"] == "상품A"
# soft delete → 행은 남지만 목록엔 안 잡힌다
assert (await client.delete(f"/v1/item/delete/{item_id}", headers=h)).json()["result"]["success"] is True
assert (await client.get("/v1/item/list", headers=h)).json()["total"] == 0
async def test_item_not_found(client, auth_headers):
"""검증: 존재하지 않는 상품 단건 조회.
기대결과: success=False, code=1300(ITEM_NOT_FOUND)."""
h = await auth_headers("itemuser")
r = await client.get(f"/v1/item/{uuid.uuid4()}", headers=h)
body = r.json()
assert body["result"]["success"] is False
assert body["result"]["code"] == 1300