1+ import sys
12import uuid
2- from datetime import date , timedelta
33from unittest .mock import MagicMock
44
55import pytest
6+ from django .conf import settings
67from django .contrib .admin .sites import AdminSite
78from django .http import HttpRequest
89
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
1723from 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
92131def 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
101177def 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
117191def 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
142236def 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 = {}
0 commit comments