"""협상 초청 메일 미리보기(/v1/company/settings/email-preview) 테스트 — 회사 CI 슬롯 렌더 확인. - 실제 발송(services/quotation/invites.py)과 같은 build_invite_email 을 타므로 미리보기 검증 = 발송물 검증. - 헤더·색은 회사 CI(logo_url·service_name·primary_color)를 그대로 쓴다 — 메일 전용 설정은 인사 문구뿐. - 색은 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 '