o2o-site-AEO/solution/backend/tests/test_admin_access.py
Mina Choi 14b6e95f9d [feat] solution/backend,frontend: 관리자가 모든 사업장을 열고 관리 — 사이트관리 검색·업종 필터·삭제, 사장님 더보기 정리
사업장 API 가 전부 "요청자 = 소유자" 로 걸러져서 관리자가 남의 빌더·미니블로그를 열면
PLACE_NOT_FOUND 였다. 운영 중 사업장 정리도 사장님 계정으로 들어가야 했다.

- validator/dependencies: DEVELOPER 가 place_id 경로를 부르면 그 사업장 소유자 신원으로 처리 — [admin-access] 로그
- ops/sites: search(상호·소유자 이메일·이름·아이디) · category 필터, 건수도 같은 조건
- OpsSitesPage: 검색창 · 업종 칩 · 행마다 빌더·미니블로그·삭제(공개 중이면 발행 내린 뒤 삭제)
- SitesPage: 더보기에서 미니블로그 관리 · 예약요청 관리 제거

테스트 4건 추가(test_admin_access). 전체 900 passed · 145 failed(변경 전과 같은 파일: agent_runtime·gemini 등)
frontend tsc·eslint 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 15:34:20 +09:00

58 lines
2.8 KiB
Python

from common.enums import UserRole
async def _place(client, headers, name="남의가게"):
r = await client.post("/v1/place", headers=headers, json={"name": name, "category": 2})
return r.json()["place"]["place_id"]
async def test_개발자는_남의_사업장을_열고_고칠_수_있다(auth_headers, client):
owner = await auth_headers("owner1")
dev = await auth_headers("dev1", role=UserRole.DEVELOPER.value)
pid = await _place(client, owner)
got = (await client.get(f"/v1/place/{pid}", headers=dev)).json()
assert got["result"]["success"] is True
assert got["place"]["name"] == "남의가게"
assert (await client.get(f"/v1/place/{pid}/media/list", headers=dev)).json()["result"]["success"] is True
as_owner = (await client.get(f"/v1/place/{pid}/site", headers=owner)).json()
as_dev = (await client.get(f"/v1/place/{pid}/site", headers=dev)).json()
assert as_dev == as_owner
async def test_일반_사장님은_남의_사업장을_못_연다(auth_headers, client):
owner = await auth_headers("owner2")
other = await auth_headers("other2")
boss = await auth_headers("boss2", role=UserRole.OWNER.value)
pid = await _place(client, owner)
assert (await client.get(f"/v1/place/{pid}", headers=other)).json()["result"]["success"] is False
assert (await client.get(f"/v1/place/{pid}", headers=boss)).json()["result"]["success"] is False
async def test_개발자_자기_목록은_그대로다(auth_headers, client):
owner = await auth_headers("owner3")
dev = await auth_headers("dev3", role=UserRole.DEVELOPER.value)
await _place(client, owner)
listed = (await client.get("/v1/place/list", headers=dev)).json()
assert listed["result"]["success"] is True
assert all(p["name"] != "남의가게" for p in listed["places"])
async def test_사이트관리는_상호_소유자_업종으로_거른다(auth_headers, client):
owner = await auth_headers("owner4", name="김사장")
dev = await auth_headers("dev4", role=UserRole.DEVELOPER.value)
await client.post("/v1/place", headers=owner, json={"name": "검색카페", "category": 2})
await client.post("/v1/place", headers=owner, json={"name": "검색펜션", "category": 1})
def names(r):
return sorted(s["name"] for s in r.json()["sites"])
assert names(await client.get("/v1/ops/sites", headers=dev, params={"search": "검색"})) == ["검색카페", "검색펜션"]
assert names(await client.get("/v1/ops/sites", headers=dev, params={"search": "김사장"})) == ["검색카페", "검색펜션"]
assert names(await client.get("/v1/ops/sites", headers=dev, params={"search": "검색", "category": 2})) == ["검색카페"]
counted = (await client.get("/v1/ops/sites", headers=dev, params={"search": "펜션"})).json()
assert counted["total"] == 1