Skip to content

Commit ed03ddc

Browse files
authored
[25.07.18 / TASK-225] Test - 주간 뉴스레터 배치 단위 테스트 추가 (#37)
* test: 주간 뉴스레터 배치 단위 테스트 추가 * modify: 코드래빗 리뷰 반영 * modify: logger 모킹 추가 및 리팩토링 * modify: setup django 모킹 방식, date 관련 fixture 수정 * test: delete_old_maillogs 통합 테스트 추가 * test: 템플릿 렌더링 output 테스트 추가 * modify: sent_at 필터 조건 주석 추가
1 parent d816074 commit ed03ddc

File tree

5 files changed

+715
-14
lines changed

5 files changed

+715
-14
lines changed

insight/tasks/weekly_newsletter_batch.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,11 @@ def __init__(
7171
self.today = get_local_date()
7272

7373
def _delete_old_maillogs(self) -> None:
74-
"""7일 이전의 성공한 메일 발송 로그 삭제"""
74+
"""이전 뉴스레터의 성공한 메일 발송 로그 삭제"""
7575
try:
7676
deleted_count = NotiMailLog.objects.filter(
77-
created_at__lt=self.before_a_week,
77+
# 느슨한 시간 적용
78+
sent_at__lt=self.before_a_week + timedelta(days=1),
7879
is_success=True,
7980
).delete()[0]
8081

insight/tests/conftest.py

Lines changed: 104 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import sys
12
import uuid
2-
from datetime import date, timedelta
33
from unittest.mock import MagicMock
44

55
import pytest
6+
from django.conf import settings
67
from django.contrib.admin.sites import AdminSite
78
from django.http import HttpRequest
89

@@ -13,8 +14,25 @@
1314
UserWeeklyTrend,
1415
WeeklyTrend,
1516
WeeklyTrendInsight,
17+
WeeklyUserReminder,
18+
WeeklyUserStats,
19+
WeeklyUserTrendInsight,
1620
)
21+
from insight.schemas import Newsletter
22+
from modules.mail.schemas import EmailMessage
1723
from users.models import User
24+
from utils.utils import get_previous_week_range
25+
26+
27+
@pytest.fixture
28+
def mock_setup_django():
29+
"""setup_django 모듈 모킹"""
30+
sys.modules["setup_django"] = MagicMock()
31+
try:
32+
yield sys.modules["setup_django"]
33+
finally:
34+
# 테스트 후 정리
35+
del sys.modules["setup_django"]
1836

1937

2038
@pytest.fixture
@@ -26,6 +44,7 @@ def user(db):
2644
refresh_token="test-refresh-token",
2745
group_id=1,
2846
email="test@example.com",
47+
username="test_user",
2948
is_active=True,
3049
)
3150

@@ -88,6 +107,26 @@ def sample_trending_items():
88107
]
89108

90109

110+
@pytest.fixture
111+
def sample_weekly_user_stats():
112+
"""테스트용 주간 사용자 통계 데이터"""
113+
return WeeklyUserStats(
114+
posts=20,
115+
new_posts=3,
116+
views=100,
117+
likes=10,
118+
)
119+
120+
121+
@pytest.fixture
122+
def sample_weekly_user_reminder():
123+
"""테스트용 주간 사용자 리마인더 데이터"""
124+
return WeeklyUserReminder(
125+
title="Django 20주년 축하하기",
126+
days_ago=12,
127+
)
128+
129+
91130
@pytest.fixture
92131
def sample_weekly_trend_insight(sample_trend_analysis, sample_trending_items):
93132
"""테스트용 주간 트렌드 인사이트 데이터"""
@@ -97,14 +136,49 @@ def sample_weekly_trend_insight(sample_trend_analysis, sample_trending_items):
97136
)
98137

99138

139+
@pytest.fixture
140+
def sample_weekly_user_trend_insight(
141+
sample_trend_analysis,
142+
sample_trending_items,
143+
sample_weekly_user_stats,
144+
sample_weekly_user_reminder,
145+
):
146+
"""테스트용 사용자 주간 트렌드 인사이트 데이터"""
147+
return WeeklyUserTrendInsight(
148+
trending_summary=sample_trending_items,
149+
trend_analysis=sample_trend_analysis,
150+
user_weekly_stats=sample_weekly_user_stats,
151+
user_weekly_reminder=sample_weekly_user_reminder,
152+
)
153+
154+
155+
@pytest.fixture
156+
def sample_newsletter(user):
157+
"""테스트용 뉴스레터 객체 생성"""
158+
return Newsletter(
159+
user_id=user.id,
160+
email_message=EmailMessage(
161+
to=[user.email],
162+
from_email=settings.DEFAULT_FROM_EMAIL,
163+
subject="Test Newsletter",
164+
text_body="Test content",
165+
html_body="<div>Test content</div>",
166+
),
167+
)
168+
169+
170+
@pytest.fixture
171+
def sample_newsletters(sample_newsletter):
172+
"""테스트용 뉴스레터 리스트 생성"""
173+
return [sample_newsletter]
174+
175+
100176
@pytest.fixture
101177
def weekly_trend(
102178
db, sample_weekly_trend_insight: WeeklyTrendInsight
103179
) -> WeeklyTrend:
104180
"""주간 트렌드 생성"""
105-
today = date.today()
106-
week_start = today - timedelta(days=today.weekday())
107-
week_end = week_start + timedelta(days=6)
181+
week_start, week_end = get_previous_week_range()
108182

109183
return WeeklyTrend.objects.create(
110184
week_start_date=week_start,
@@ -115,14 +189,14 @@ def weekly_trend(
115189

116190
@pytest.fixture
117191
def user_weekly_trend(
118-
db, user, sample_weekly_trend_insight: WeeklyTrendInsight
192+
db, user, sample_weekly_user_trend_insight: WeeklyUserTrendInsight
119193
) -> UserWeeklyTrend:
120194
"""사용자 주간 트렌드 생성"""
121-
today = date.today()
122-
week_start = today - timedelta(days=today.weekday())
123-
week_end = week_start + timedelta(days=6)
195+
week_start, week_end = get_previous_week_range()
196+
197+
insight_dict = sample_weekly_user_trend_insight.to_json_dict()
198+
insight_dict["user_weekly_reminder"] = {} # 주간 글 작성 사용자
124199

125-
insight_dict = sample_weekly_trend_insight.to_json_dict()
126200
# 사용자 인사이트는 제목을 조금 다르게 설정
127201
if insight_dict["trending_summary"]:
128202
insight_dict["trending_summary"][0]["title"] = "Django 모델 최적화하기"
@@ -138,12 +212,30 @@ def user_weekly_trend(
138212
)
139213

140214

215+
@pytest.fixture
216+
def inactive_user_weekly_trend(
217+
db, user, sample_weekly_user_trend_insight: WeeklyUserTrendInsight
218+
):
219+
"""주간 글 미작성 사용자 주간 트렌드 생성"""
220+
week_start, week_end = get_previous_week_range()
221+
222+
insight_dict = sample_weekly_user_trend_insight.to_json_dict()
223+
insight_dict["trending_summary"] = []
224+
insight_dict["trend_analysis"] = {}
225+
insight_dict["user_weekly_stats"]["new_posts"] = 0
226+
227+
return UserWeeklyTrend.objects.create(
228+
user=user,
229+
week_start_date=week_start,
230+
week_end_date=week_end,
231+
insight=insight_dict,
232+
)
233+
234+
141235
@pytest.fixture
142236
def empty_insight_weekly_trend(db):
143237
"""빈 인사이트를 가진 주간 트렌드"""
144-
today = date.today()
145-
week_start = today - timedelta(days=today.weekday())
146-
week_end = week_start + timedelta(days=6)
238+
week_start, week_end = get_previous_week_range()
147239

148240
return WeeklyTrend.objects.create(
149241
week_start_date=week_start, week_end_date=week_end, insight={}

insight/tests/tasks/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)