Ejemplo n.º 1
0
    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]
Ejemplo n.º 2
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]
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
    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()
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
    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)
Ejemplo n.º 10
0
 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=[])
Ejemplo n.º 11
0
 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