def test_certs_with_modified_date_overrides(self, mock_send): # Set up a time range for the call self.options['start_date'] = '2017-05-01T00:00:00' self.options['end_date'] = '2017-05-04T04:00:00' # First, call the task without adding any overrides to verify that the # certs would not be included because of their modified_date tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert mock_send.called assert self.cert1 not in mock_send.call_args[0][0] assert self.cert2 not in mock_send.call_args[0][0] assert self.cert3 not in mock_send.call_args[0][0] # ADD # cert1 was created January 1, 2017. We add a date override to it on # May 1, 2017. with freeze_time(datetime(2017, 5, 1, 1)): CertificateDateOverrideFactory( generated_certificate=self.cert1, overridden_by=self.user, ) # UPDATE # cert2 was created February 1, 2017. We add a date override to it on # April 1, 2017; but edit the date override on May 2, 2017. with freeze_time(datetime(2017, 4, 1)): cert2_override = CertificateDateOverrideFactory( generated_certificate=self.cert2, overridden_by=self.user, ) with freeze_time(datetime(2017, 5, 2, 1)): cert2_override.date = datetime(2018, 1, 1) cert2_override.save() # DELETE # cert3 was created March 1, 2017. We add a date override to it on April # 2, 2017; but delete the override on May 3, 2017. with freeze_time(datetime(2017, 4, 2)): cert3_override = CertificateDateOverrideFactory( generated_certificate=self.cert3, overridden_by=self.user, ) with freeze_time(datetime(2017, 5, 3, 1)): cert3_override.delete() # None of the certs have modified dates within the time range, but they # each have date overrides that were added, updated, or deleted within # the time range. tasks.handle_notify_credentials(options=self.options, course_keys=[]) # The three certs should now be included in the arguments because of the # the altered date overrides. assert mock_send.called self.assertListEqual(list(mock_send.call_args[0][0]), [self.cert1, self.cert2, self.cert3]) assert self.cert1 in mock_send.call_args[0][0] assert self.cert2 in mock_send.call_args[0][0] assert self.cert3 in mock_send.call_args[0][0]
def test_course_args(self, mock_send): course_keys = ['course-v1:edX+Test+1', 'course-v1:edX+Test+2'] tasks.handle_notify_credentials(options=self.options, course_keys=course_keys) assert mock_send.called assert list(mock_send.call_args[0][0]) == [self.cert1, self.cert2] assert list(mock_send.call_args[0][1]) == [self.grade1, self.grade2]
def test_site(self, mock_grade_interesting): site_config = SiteConfigurationFactory.create( site_values={'course_org_filter': ['testX']}) self.options['start_date'] = '2017-01-01T00:00:00Z' self.options['site'] = site_config.site.domain tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert mock_grade_interesting.call_count == 1
def test_delay(self, mock_time): self.options['start_date'] = '2017-02-01T00:00:00Z' self.options['page_size'] = 2 tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert mock_time.sleep.call_count == 0 mock_time.sleep.reset_mock() self.options['start_date'] = '2017-02-01T00:00:00Z' self.options['page_size'] = 2 self.options['delay'] = 0.2 tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert mock_time.sleep.call_count == 2 # Between each page, twice (2 pages, for certs and grades) assert mock_time.sleep.call_args[0][0] == 0.2
def test_username_arg(self, mock_send): self.options['start_date'] = '2017-02-01T00:00:00Z' self.options['end_date'] = '2017-02-02T00:00:00Z' self.options['user_ids'] = [str(self.user2.id)] tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert mock_send.called self.assertListEqual(list(mock_send.call_args[0][0]), [self.cert4]) self.assertListEqual(list(mock_send.call_args[0][1]), [self.grade4]) mock_send.reset_mock() self.options['start_date'] = None self.options['end_date'] = None self.options['user_ids'] = [str(self.user2.id)] tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert mock_send.called self.assertListEqual(list(mock_send.call_args[0][0]), [self.cert4]) self.assertListEqual(list(mock_send.call_args[0][1]), [self.grade4]) mock_send.reset_mock() self.options['start_date'] = '2017-02-01T00:00:00Z' self.options['end_date'] = '2017-02-02T00:00:00Z' self.options['user_ids'] = [str(self.user.id)] tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert mock_send.called self.assertListEqual(list(mock_send.call_args[0][0]), [self.cert2]) self.assertListEqual(list(mock_send.call_args[0][1]), [self.grade2]) mock_send.reset_mock() self.options['start_date'] = None self.options['end_date'] = None self.options['user_ids'] = [str(self.user.id)] tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert mock_send.called self.assertListEqual(list(mock_send.call_args[0][0]), [self.cert1, self.cert2, self.cert3]) self.assertListEqual(list(mock_send.call_args[0][1]), [self.grade1, self.grade2, self.grade3]) mock_send.reset_mock() self.options['start_date'] = None self.options['end_date'] = None self.options['user_ids'] = [str(self.user.id), str(self.user2.id)] tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert mock_send.called self.assertListEqual(list(mock_send.call_args[0][0]), [self.cert1, self.cert2, self.cert4, self.cert3]) self.assertListEqual( list(mock_send.call_args[0][1]), [self.grade1, self.grade2, self.grade4, self.grade3]) mock_send.reset_mock()
def test_auto_execution(self, mock_send): cert_filter_args = {} with freeze_time(datetime(2017, 5, 1, 0)): cert1 = GeneratedCertificateFactory( user=self.user, course_id='course-v1:edX+Test+11') with freeze_time(datetime(2017, 5, 1, 3)): cert2 = GeneratedCertificateFactory( user=self.user, course_id='course-v1:edX+Test+22') # `auto` execution should include certificates with date overrides # modified within the time range. See the next test # (`test_certs_with_modified_date_overrides`) for more. with freeze_time(datetime(2017, 4, 30, 0)): cert3 = GeneratedCertificateFactory( user=self.user, course_id='course-v1:edX+Test+33') with freeze_time(datetime(2017, 5, 1, 2)): CertificateDateOverrideFactory( generated_certificate=cert3, overridden_by=self.user, ) with freeze_time(datetime(2017, 5, 1, 0)): grade1 = PersistentCourseGrade.objects.create( user_id=self.user.id, course_id='course-v1:edX+Test+11', percent_grade=1) with freeze_time(datetime(2017, 5, 1, 3)): grade2 = PersistentCourseGrade.objects.create( user_id=self.user.id, course_id='course-v1:edX+Test+22', percent_grade=1) total_certificates = GeneratedCertificate.objects.filter( **cert_filter_args).order_by('modified_date') # pylint: disable=no-member total_grades = PersistentCourseGrade.objects.all() self.options['auto'] = True self.options['start_date'] = '2017-05-01T00:00:00' self.options['end_date'] = '2017-05-01T04:00:00' tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert mock_send.called self.assertListEqual(list(mock_send.call_args[0][0]), [cert3, cert1, cert2]) self.assertListEqual(list(mock_send.call_args[0][1]), [grade1, grade2]) assert len(list(mock_send.call_args[0][0])) <= len(total_certificates) assert len(list(mock_send.call_args[0][1])) <= len(total_grades)
def test_hand_off(self, mock_grade_interesting, mock_program_changed, mock_program_awarded): self.options['start_date'] = '2017-02-01T00:00:00Z' tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert mock_grade_interesting.call_count == 3 assert mock_program_changed.call_count == 3 assert mock_program_awarded.call_count == 0 mock_grade_interesting.reset_mock() mock_program_changed.reset_mock() mock_program_awarded.reset_mock() self.options['start_date'] = '2017-02-01T00:00:00Z' self.options['notify_programs'] = True tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert mock_grade_interesting.call_count == 3 assert mock_program_changed.call_count == 3 assert mock_program_awarded.call_count == 1
def test_auto_execution(self, mock_send): cert_filter_args = {} with freeze_time(datetime(2017, 5, 1, 0)): cert1 = GeneratedCertificateFactory( user=self.user, course_id='course-v1:edX+Test+11') with freeze_time(datetime(2017, 5, 1, 3)): cert2 = GeneratedCertificateFactory( user=self.user, course_id='course-v1:edX+Test+22') with freeze_time(datetime(2017, 5, 1, 0)): grade1 = PersistentCourseGrade.objects.create( user_id=self.user.id, course_id='course-v1:edX+Test+11', percent_grade=1) with freeze_time(datetime(2017, 5, 1, 3)): grade2 = PersistentCourseGrade.objects.create( user_id=self.user.id, course_id='course-v1:edX+Test+22', percent_grade=1) total_certificates = GeneratedCertificate.objects.filter( **cert_filter_args).order_by('modified_date') # pylint: disable=no-member total_grades = PersistentCourseGrade.objects.all() self.options['auto'] = True self.options['start_date'] = '2017-05-01T00:00:00' self.options['end_date'] = '2017-05-01T04:00:00' tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert mock_send.called self.assertListEqual(list(mock_send.call_args[0][0]), [cert1, cert2]) self.assertListEqual(list(mock_send.call_args[0][1]), [grade1, grade2]) assert len(list(mock_send.call_args[0][0])) <= len(total_certificates) assert len(list(mock_send.call_args[0][1])) <= len(total_grades)
def test_page_size(self): self.options['start_date'] = '2017-01-01T00:00:00Z' reset_queries() tasks.handle_notify_credentials(options=self.options, course_keys=[]) baseline = len(connection.queries) self.options['start_date'] = '2017-01-01T00:00:00Z' self.options['page_size'] = 1 reset_queries() tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert len(connection.queries) == (baseline + 6) # two extra page queries each for certs & grades self.options['start_date'] = '2017-01-01T00:00:00Z' self.options['page_size'] = 2 reset_queries() tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert len(connection.queries) == (baseline + 2)
def test_send_grade_failure(self, mock_send_grade): self.options['start_date'] = '2017-01-31T00:00:00Z' mock_send_grade.side_effect = boom with pytest.raises(Exception): tasks.handle_notify_credentials(options=self.options, course_keys=[])
def test_dry_run(self, mock_send): self.options['start_date'] = '2017-02-01T00:00:00Z' self.options['dry_run'] = True tasks.handle_notify_credentials(options=self.options, course_keys=[]) assert not mock_send.called