87 lines
3.6 KiB
Python
87 lines
3.6 KiB
Python
"""작가 단계 테스트 -- 크롤링 본문 + 링크 참조 글 생성."""
|
|
import json
|
|
import pytest
|
|
from unittest.mock import patch
|
|
|
|
|
|
def test_generate_blog_post_includes_crawled_content():
|
|
"""크롤링 본문이 프롬프트에 포함되는지 확인."""
|
|
from app.content_generator import generate_blog_post
|
|
|
|
analysis = {
|
|
"keyword": "무선 이어폰",
|
|
"top_products": [{"title": "에어팟", "lprice": 200000, "mallName": "애플"}],
|
|
"top_blogs": [
|
|
{"title": "에어팟 리뷰", "content": "에어팟을 한 달간 써봤는데 음질이 정말 좋았습니다."},
|
|
],
|
|
}
|
|
|
|
mock_response = json.dumps({
|
|
"title": "무선 이어폰 추천",
|
|
"body": "<p>본문</p>",
|
|
"excerpt": "요약",
|
|
"tags": ["이어폰"],
|
|
})
|
|
|
|
with patch("app.content_generator._call_claude", return_value=mock_response) as mock_call, \
|
|
patch("app.content_generator.get_template", return_value=(
|
|
"키워드: {keyword}\n참고 블로그:\n{reference_blogs}\n상품: {top_products}\n링크 상품: {brand_products}"
|
|
)):
|
|
result = generate_blog_post(analysis, "트렌드 브리프", brand_links=[])
|
|
|
|
prompt_used = mock_call.call_args[0][0]
|
|
assert "에어팟을 한 달간 써봤는데" in prompt_used
|
|
assert result["title"] == "무선 이어폰 추천"
|
|
|
|
|
|
def test_generate_blog_post_includes_brand_links():
|
|
"""브랜드커넥트 링크 정보가 프롬프트에 포함되는지 확인."""
|
|
from app.content_generator import generate_blog_post
|
|
|
|
analysis = {"keyword": "무선 이어폰", "top_products": [], "top_blogs": []}
|
|
brand_links = [
|
|
{"url": "https://link.coupang.com/abc", "product_name": "삼성 버즈3",
|
|
"description": "노이즈캔슬링 지원", "placement_hint": "본문 중간"},
|
|
]
|
|
|
|
mock_response = json.dumps({
|
|
"title": "제목", "body": "<p>본문</p>", "excerpt": "요약", "tags": ["태그"],
|
|
})
|
|
|
|
with patch("app.content_generator._call_claude", return_value=mock_response) as mock_call, \
|
|
patch("app.content_generator.get_template", return_value=(
|
|
"키워드: {keyword}\n참고 블로그:\n{reference_blogs}\n상품: {top_products}\n링크 상품: {brand_products}"
|
|
)):
|
|
result = generate_blog_post(analysis, "트렌드 브리프", brand_links=brand_links)
|
|
|
|
prompt_used = mock_call.call_args[0][0]
|
|
assert "삼성 버즈3" in prompt_used
|
|
assert "노이즈캔슬링 지원" in prompt_used
|
|
|
|
|
|
def test_generate_blog_post_works_without_links():
|
|
"""링크 없이도 정상 동작."""
|
|
from app.content_generator import generate_blog_post
|
|
|
|
analysis = {"keyword": "테스트", "top_products": [], "top_blogs": []}
|
|
mock_response = json.dumps({
|
|
"title": "제목", "body": "<p>본문</p>", "excerpt": "요약", "tags": ["태그"],
|
|
})
|
|
|
|
with patch("app.content_generator._call_claude", return_value=mock_response), \
|
|
patch("app.content_generator.get_template", return_value=(
|
|
"키워드: {keyword}\n참고 블로그:\n{reference_blogs}\n상품: {top_products}\n링크 상품: {brand_products}"
|
|
)):
|
|
result = generate_blog_post(analysis, "브리프")
|
|
|
|
assert result["title"] == "제목"
|
|
|
|
|
|
def test_parse_blog_json_fallback():
|
|
"""JSON 파싱 실패 시 원본 텍스트를 body로 사용."""
|
|
from app.content_generator import _parse_blog_json
|
|
|
|
result = _parse_blog_json("잘못된 JSON", "테스트 키워드")
|
|
assert result["title"] == "테스트 키워드 추천 리뷰"
|
|
assert result["body"] == "잘못된 JSON"
|