8
8
9
9
from courseware .models import StudentModule
10
10
11
+ from figures .helpers import is_multisite
11
12
from figures .models import LearnerCourseGradeMetrics
12
-
13
13
from figures .pipeline .enrollment_metrics import (
14
14
calculate_average_progress ,
15
15
bulk_calculate_course_progress_data ,
18
18
_add_enrollment_metrics_record ,
19
19
_collect_progress_data ,
20
20
)
21
+ from figures .sites import UnlinkedCourseError
21
22
22
23
from tests .factories import (
23
24
CourseEnrollmentFactory ,
@@ -49,12 +50,56 @@ def test_bulk_calculate_course_progress_data_happy_path(db, monkeypatch):
49
50
def mock_metrics (course_enrollment , ** _kwargs ):
50
51
return mapping [course_enrollment .course_id ]
51
52
53
+ monkeypatch .setattr ('figures.pipeline.enrollment_metrics.get_site_for_course' ,
54
+ lambda val : SiteFactory ())
52
55
monkeypatch .setattr ('figures.pipeline.enrollment_metrics.collect_metrics_for_enrollment' ,
53
56
mock_metrics )
54
57
data = bulk_calculate_course_progress_data (course_overview .id )
55
58
assert data ['average_progress' ] == 0.5
56
59
57
60
61
+ @pytest .mark .skipif (not is_multisite (),
62
+ reason = 'Standalone always returns a site' )
63
+ @pytest .mark .django_db
64
+ def test_bulk_calculate_course_progress_unlinked_course_error (db , monkeypatch ):
65
+ """Tests 'bulk_calculate_course_progress_data' function
66
+
67
+ The function under test iterates over a set of course enrollment records,
68
+ So we create a couple of records to iterate over and mock the collect
69
+ function
70
+ """
71
+ course_overview = CourseOverviewFactory ()
72
+ course_enrollments = [CourseEnrollmentFactory (
73
+ course_id = course_overview .id ) for i in range (2 )]
74
+ mapping = {ce .course_id : LearnerCourseGradeMetricsFactory (
75
+ course_id = str (ce .course_id ),
76
+ user = ce .user ,
77
+ sections_worked = 1 ,
78
+ sections_possible = 2 ) for ce in course_enrollments
79
+ }
80
+
81
+ def mock_metrics (course_enrollment , ** _kwargs ):
82
+ return mapping [course_enrollment .course_id ]
83
+
84
+ monkeypatch .setattr ('figures.pipeline.enrollment_metrics.collect_metrics_for_enrollment' ,
85
+ mock_metrics )
86
+ with pytest .raises (UnlinkedCourseError ) as e_info :
87
+ data = bulk_calculate_course_progress_data (course_overview .id )
88
+
89
+ # assert data['average_progress'] == 0.5
90
+
91
+
92
+ @pytest .mark .django_db
93
+ def test_bulk_calculate_course_progress_no_enrollments (db , monkeypatch ):
94
+ """This tests when there is a new course with no enrollments
95
+ """
96
+ monkeypatch .setattr ('figures.pipeline.enrollment_metrics.get_site_for_course' ,
97
+ lambda val : SiteFactory ())
98
+ course_overview = CourseOverviewFactory ()
99
+ data = bulk_calculate_course_progress_data (course_overview .id )
100
+ assert data ['average_progress' ] == 0.0
101
+
102
+
58
103
@pytest .mark .parametrize ('progress_percentages, expected_result' , [
59
104
(None , 0.0 ),
60
105
([], 0.0 ),
@@ -88,6 +133,7 @@ class TestCollectMetricsForEnrollment(object):
88
133
"""
89
134
@pytest .fixture (autouse = True )
90
135
def setup (self , db ):
136
+ self .site = SiteFactory ()
91
137
self .date_1 = datetime (2020 , 2 , 2 , tzinfo = utc )
92
138
self .date_2 = self .date_1 + relativedelta (months = 1 ) # future of date_1
93
139
self .course_enrollment = CourseEnrollmentFactory ()
@@ -131,12 +177,14 @@ def test_needs_update_no_lcgm(self, monkeypatch):
131
177
"""
132
178
assert not LearnerCourseGradeMetrics .objects .count ()
133
179
monkeypatch .setattr ('figures.pipeline.enrollment_metrics.get_site_for_course' ,
134
- lambda val : SiteFactory () )
180
+ lambda val : self . site )
135
181
monkeypatch .setattr ('figures.pipeline.enrollment_metrics._collect_progress_data' ,
136
182
lambda val : self .progress_data )
137
- metrics = collect_metrics_for_enrollment (
138
- course_enrollment = self .course_enrollment ,
139
- )
183
+
184
+ course_sm = StudentModule .objects .filter (course_id = self .course_enrollment .course_id )
185
+ metrics = collect_metrics_for_enrollment (site = self .site ,
186
+ course_enrollment = self .course_enrollment ,
187
+ course_sm = course_sm )
140
188
141
189
self .check_response_metrics (metrics , self .progress_data )
142
190
assert LearnerCourseGradeMetrics .objects .count () == 1
@@ -150,12 +198,13 @@ def test_needs_update_has_lcgm(self, monkeypatch):
150
198
"""
151
199
lcgm = self .create_lcgm (date_for = self .date_1 )
152
200
monkeypatch .setattr ('figures.pipeline.enrollment_metrics.get_site_for_course' ,
153
- lambda val : SiteFactory () )
201
+ lambda val : self . site )
154
202
monkeypatch .setattr ('figures.pipeline.enrollment_metrics._collect_progress_data' ,
155
203
lambda val : self .progress_data )
156
- metrics = collect_metrics_for_enrollment (
157
- course_enrollment = self .course_enrollment ,
158
- )
204
+ course_sm = StudentModule .objects .filter (course_id = self .course_enrollment .course_id )
205
+ metrics = collect_metrics_for_enrollment (site = self .site ,
206
+ course_enrollment = self .course_enrollment ,
207
+ course_sm = course_sm )
159
208
160
209
self .check_response_metrics (metrics , self .progress_data )
161
210
assert metrics != lcgm
@@ -173,12 +222,13 @@ def test_does_not_need_update(self, monkeypatch):
173
222
"""
174
223
lcgm = self .create_lcgm (date_for = self .date_2 .date ())
175
224
monkeypatch .setattr ('figures.pipeline.enrollment_metrics.get_site_for_course' ,
176
- lambda val : SiteFactory () )
225
+ lambda val : self . site )
177
226
monkeypatch .setattr ('figures.pipeline.enrollment_metrics._collect_progress_data' ,
178
227
lambda val : self .progress_data )
179
- metrics = collect_metrics_for_enrollment (
180
- course_enrollment = self .course_enrollment ,
181
- )
228
+ course_sm = StudentModule .objects .filter (course_id = self .course_enrollment .course_id )
229
+ metrics = collect_metrics_for_enrollment (site = self .site ,
230
+ course_enrollment = self .course_enrollment ,
231
+ course_sm = course_sm )
182
232
183
233
self .check_response_metrics (metrics , self .progress_data )
184
234
assert metrics == lcgm
@@ -190,13 +240,15 @@ def test_no_update_no_lcgm_no_sm(self, monkeypatch):
190
240
The function under test should return None
191
241
"""
192
242
monkeypatch .setattr ('figures.pipeline.enrollment_metrics.get_site_for_course' ,
193
- lambda val : SiteFactory () )
243
+ lambda val : self . site )
194
244
monkeypatch .setattr ('figures.pipeline.enrollment_metrics._collect_progress_data' ,
195
245
lambda val : self .progress_data )
196
246
# Create a course enrollment for which we won't have student module records
197
- metrics = collect_metrics_for_enrollment (
198
- course_enrollment = CourseEnrollmentFactory (),
199
- )
247
+ ce = CourseEnrollmentFactory ()
248
+ course_sm = StudentModule .objects .filter (course_id = ce .course_id )
249
+ metrics = collect_metrics_for_enrollment (site = self .site ,
250
+ course_enrollment = ce ,
251
+ course_sm = course_sm )
200
252
assert not metrics
201
253
202
254
def test_no_update_has_lcgm_no_sm (self , monkeypatch ):
@@ -205,13 +257,16 @@ def test_no_update_has_lcgm_no_sm(self, monkeypatch):
205
257
The function under test should return the existing LCGM
206
258
"""
207
259
monkeypatch .setattr ('figures.pipeline.enrollment_metrics.get_site_for_course' ,
208
- lambda val : SiteFactory () )
260
+ lambda val : self . site )
209
261
monkeypatch .setattr ('figures.pipeline.enrollment_metrics._collect_progress_data' ,
210
262
lambda val : self .progress_data )
211
263
# Create a course enrollment for which we won't have student module records
212
264
ce = CourseEnrollmentFactory ()
213
265
lcgm = LearnerCourseGradeMetricsFactory (course_id = ce .course_id , user = ce .user )
214
- metrics = collect_metrics_for_enrollment (course_enrollment = ce )
266
+ course_sm = StudentModule .objects .filter (course_id = ce .course_id )
267
+ metrics = collect_metrics_for_enrollment (site = self .site ,
268
+ course_enrollment = ce ,
269
+ course_sm = course_sm )
215
270
assert metrics == lcgm
216
271
assert not StudentModule .objects .filter (course_id = ce .course_id )
217
272
0 commit comments