- 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>
42 lines
1.9 KiB
Python
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
|