o2o-negosium-original/negodata/backend/tests/test_invite_email_preview.py

75 lines
3.7 KiB
Python

"""협상 초청 메일 미리보기(/v1/company/settings/email-preview) 테스트 — 회사 CI 슬롯 렌더 확인.
- 실제 발송(services/quotation/invites.py)과 같은 build_invite_email 을 타므로 미리보기 검증 = 발송물 검증.
- 헤더는 회사 CI(logo_url·service_name)를 그대로 쓰고 색은 솔루션 고정 — 메일 전용 설정은 인사 문구뿐.
- 색은 hex 만 통과한다(이상값이 style 을 깨거나 CSS 주입되는 것 방지).
"""
PREVIEW_URL = "/v1/company/settings/email-preview"
async def test_preview_requires_login(client):
"""검증: 토큰 없이 미리보기 호출.
기대결과: HTTP 401/403 으로 거부(로그인 필수)."""
r = await client.post(PREVIEW_URL, json={"branding": {}})
assert r.status_code in (401, 403)
async def test_preview_default_branding(client, auth_headers):
"""검증: branding 비운 채 미리보기 호출.
기대결과: 헤더는 회사명 텍스트(테스트사, NEGODATA 아님)·기본색(#3182f6)·기본 인사 문구로 렌더되고 제목이 채워진다."""
h = await auth_headers("previewer1")
r = await client.post(PREVIEW_URL, json={"branding": {}}, headers=h)
assert r.status_code == 200
body = r.json()
assert "협상 참여 요청" in body["subject"]
html = body["html"]
assert "테스트사" in html # conftest company_id 픽스처의 회사명
assert "NEGODATA" not in html
assert "#3182f6" in html
assert "아래 견적 건의 협상에 참여해 주세요." in html
assert "negotium B2B 구매협상 솔루션" in html # 발주사 CI 아래 솔루션 태그라인(고정)
async def test_preview_ci_branding(client, auth_headers):
"""검증: 회사 CI(서비스명·로고)와 인사 문구를 채워 미리보기 호출(브랜드 색을 넣어도 무시).
기대결과: 헤더는 로고 이미지(서비스명은 alt), 색은 회사 값과 무관하게 솔루션 기본색으로 렌더."""
h = await auth_headers("previewer2")
branding = {
"service_name": "아이좋아네고",
"logo_url": "https://cdn.example.com/ci.png",
"primary_color": "#f551a0", # 제거된 기능 — 값을 보내도 반영되지 않아야 한다
"email_greeting": "협상에 초대합니다.",
}
r = await client.post(PREVIEW_URL, json={"branding": branding}, headers=h)
assert r.status_code == 200
html = r.json()["html"]
assert '<img src="https://cdn.example.com/ci.png"' in html
assert 'alt="아이좋아네고"' in html
assert "#f551a0" not in html
assert "#3182f6" in html
assert "협상에 초대합니다." in html
async def test_preview_service_name_without_logo(client, auth_headers):
"""검증: 로고 없이 서비스명만 채워 미리보기 호출.
기대결과: 헤더는 서비스명 텍스트로 렌더되고 img 태그는 없다."""
h = await auth_headers("previewer3")
r = await client.post(PREVIEW_URL, json={"branding": {"service_name": "IMK 구매협상"}}, headers=h)
assert r.status_code == 200
html = r.json()["html"]
assert "IMK 구매협상" in html
assert "<img" not in html
async def test_preview_bad_color_falls_back(client, auth_headers):
"""검증: hex 가 아닌 primary_color(CSS 주입 꼴)로 미리보기 호출.
기대결과: 입력값은 HTML 에 실리지 않고 기본색(#3182f6)으로 렌더된다."""
h = await auth_headers("previewer4")
bad = "red;background-image:url(https://evil)"
r = await client.post(PREVIEW_URL, json={"branding": {"primary_color": bad}}, headers=h)
assert r.status_code == 200
html = r.json()["html"]
assert bad not in html
assert "#3182f6" in html