示例#1
0
 def test_queryset_method_returns_all_programs(self):
     """ Verify that all programs pass the filter. """
     verified_seat_type = factories.SeatTypeFactory.verified()
     program_type = factories.ProgramTypeFactory(
         applicable_seat_types=[verified_seat_type])
     program_filter = ProgramEligibilityFilter(None, {}, None, None)
     course_run = factories.CourseRunFactory()
     factories.SeatFactory(course_run=course_run,
                           type=verified_seat_type,
                           upgrade_deadline=None)
     one_click_purchase_eligible_program = factories.ProgramFactory(
         type=program_type,
         courses=[course_run.course],
         one_click_purchase_enabled=True)
     one_click_purchase_ineligible_program = factories.ProgramFactory(
         courses=[course_run.course])
     with self.assertNumQueries(1):
         self.assertEqual(
             list(program_filter.queryset({}, Program.objects.all())), [
                 one_click_purchase_ineligible_program,
                 one_click_purchase_eligible_program
             ])
    def test_normal_case(self):
        """
        Test the case where we have a random mix of creates and updates to several
        different CourseRun records.
        """
        # Induce a few history records:
        # - 2 updates for courserun1
        # - 0 updates for courserun2
        # - 3 updates for courserun3
        self.courserun1.save()
        self.courserun3.save()
        self.courserun1.save()
        self.courserun3.save()
        factories.CourseRunFactory()  # Toss in a fourth create to mix things up.
        self.courserun3.save()

        courserun1_count_initial = len(CourseRun.history.filter(id=self.courserun1.id).all())  # pylint: disable=no-member
        courserun2_count_initial = len(CourseRun.history.filter(id=self.courserun2.id).all())  # pylint: disable=no-member
        courserun3_count_initial = len(CourseRun.history.filter(id=self.courserun3.id).all())  # pylint: disable=no-member

        # Ensure that there are multiple history records for each course run.  For each
        # course run, there should be 2 (baseline) + the amount we added at the
        # beginning of this test.
        assert courserun1_count_initial == (2 + 2)
        assert courserun2_count_initial == (2 + 0)
        assert courserun3_count_initial == (2 + 3)

        self.run_command('course_metadata.CourseRun')

        courserun1_count_final = len(CourseRun.history.filter(id=self.courserun1.id).all())  # pylint: disable=no-member
        courserun2_count_final = len(CourseRun.history.filter(id=self.courserun2.id).all())  # pylint: disable=no-member
        courserun3_count_final = len(CourseRun.history.filter(id=self.courserun3.id).all())  # pylint: disable=no-member

        # Ensure that the only history records left are the 3 original creates.
        assert courserun1_count_final == 1
        assert courserun2_count_final == 1
        assert courserun3_count_final == 1
示例#3
0
    def create_program_with_seats(self):
        currency = Currency.objects.get(code='USD')

        course_run = factories.CourseRunFactory()
        factories.SeatFactory(type='audit',
                              currency=currency,
                              course_run=course_run,
                              price=0)
        factories.SeatFactory(type='credit',
                              currency=currency,
                              course_run=course_run,
                              price=600)
        factories.SeatFactory(type='verified',
                              currency=currency,
                              course_run=course_run,
                              price=100)

        applicable_seat_types = SeatType.objects.filter(
            slug__in=['credit', 'verified'])
        program_type = factories.ProgramTypeFactory(
            applicable_seat_types=applicable_seat_types)

        return factories.ProgramFactory(type=program_type,
                                        courses=[course_run.course])
 def test_queryset_method_returns_eligible_programs(self):
     """ Verify that one click purchase eligible programs pass the filter. """
     verified_seat_type = factories.SeatTypeFactory.verified()
     program_type = factories.ProgramTypeFactory(
         applicable_seat_types=[verified_seat_type])
     program_filter = ProgramEligibilityFilter(None,
                                               {self.parameter_name: 1},
                                               None, None)
     course_run = factories.CourseRunFactory(
         end=None,
         enrollment_end=None,
     )
     factories.SeatFactory(course_run=course_run,
                           type=verified_seat_type,
                           upgrade_deadline=None)
     one_click_purchase_eligible_program = factories.ProgramFactory(
         type=program_type,
         courses=[course_run.course],
         one_click_purchase_enabled=True,
     )
     with self.assertNumQueries(FuzzyInt(11, 2)):
         self.assertEqual(
             list(program_filter.queryset({}, Program.objects.all())),
             [one_click_purchase_eligible_program])
示例#5
0
 def assert_one_click_purchase_ineligible_program(
         self,
         end=None,
         enrollment_start=None,
         enrollment_end=None,
         seat_type=Seat.VERIFIED,
         upgrade_deadline=None,
         one_click_purchase_enabled=True,
         excluded_course_runs=None,
         program_type=None):
     course_run = factories.CourseRunFactory(
         end=end,
         enrollment_start=enrollment_start,
         enrollment_end=enrollment_end)
     factories.SeatFactory(course_run=course_run,
                           type=seat_type,
                           upgrade_deadline=upgrade_deadline)
     program = factories.ProgramFactory(
         courses=[course_run.course],
         excluded_course_runs=excluded_course_runs,
         one_click_purchase_enabled=one_click_purchase_enabled,
         type=program_type,
     )
     self.assertFalse(program.is_program_eligible_for_one_click_purchase)
示例#6
0
 def setUp(self):
     super(CourseSocialNetworkTests, self).setUp()
     self.network = factories.CourseRunSocialNetworkFactory()
     self.course_run = factories.CourseRunFactory()
示例#7
0
 def setUp(self):
     super(CourseRunTests, self).setUp()
     self.course_run = factories.CourseRunFactory()
示例#8
0
 def test_nondraft_does_not_collide_with_draft(self):
     with self.assertNumQueries(80, threshold=0):
         factories.CourseRunFactory(course=self.course_1,
                                    draft=False,
                                    external_key='external-key-drafttest')
示例#9
0
    def setUp(self):
        super().setUp()

        # Disable marketing site password just to save us from having to mock the responses
        self.partner = factories.PartnerFactory(
            marketing_site_api_password=None)

        # Fill out a bunch of types and modes. Exact mode parameters don't matter, just the resulting seat types.
        self.audit_seat_type = factories.SeatTypeFactory.audit()
        self.verified_seat_type = factories.SeatTypeFactory.verified()
        self.audit_mode = Mode.objects.get(slug=Seat.AUDIT)
        self.verified_mode = Mode.objects.get(slug=Seat.VERIFIED)
        self.audit_track = Track.objects.get(seat_type=self.audit_seat_type,
                                             mode=self.audit_mode)
        self.verified_track = Track.objects.get(
            seat_type=self.verified_seat_type, mode=self.verified_mode)
        self.empty_run_type = CourseRunType.objects.get(
            slug=CourseRunType.EMPTY)
        self.audit_run_type = CourseRunType.objects.get(
            slug=CourseRunType.AUDIT)
        self.va_run_type = CourseRunType.objects.get(
            slug=CourseRunType.VERIFIED_AUDIT)
        self.empty_course_type = CourseType.objects.get(slug=CourseType.EMPTY)
        self.va_course_type = CourseType.objects.get(
            slug=CourseType.VERIFIED_AUDIT)
        self.audit_course_type = CourseType.objects.get(slug=CourseType.AUDIT)

        # Now create some courses and orgs that will be found to match the above, in the simple happy path case.
        self.org = factories.OrganizationFactory(partner=self.partner,
                                                 key='Org1')
        self.course = factories.CourseFactory(
            partner=self.partner,
            authoring_organizations=[self.org],
            type=self.empty_course_type,
            key='{org}+Course1'.format(org=self.org.key))
        self.entitlement = factories.CourseEntitlementFactory(
            partner=self.partner,
            course=self.course,
            mode=self.verified_seat_type)
        self.audit_run = factories.CourseRunFactory(
            course=self.course,
            type=self.empty_run_type,
            key='course-v1:Org1+Course1+A')
        self.audit_seat = factories.SeatFactory(course_run=self.audit_run,
                                                type=self.audit_seat_type)
        self.verified_run = factories.CourseRunFactory(
            course=self.course,
            type=self.empty_run_type,
            key='course-v1:Org1+Course1+V')
        self.verified_seat = factories.SeatFactory(
            course_run=self.verified_run, type=self.verified_seat_type)
        self.verified_audit_seat = factories.SeatFactory(
            course_run=self.verified_run, type=self.audit_seat_type)

        # Create parallel obj / course for argument testing
        self.org2 = factories.OrganizationFactory(partner=self.partner,
                                                  key='Org2')
        self.org3 = factories.OrganizationFactory(partner=self.partner,
                                                  key='Org3')
        self.course2 = factories.CourseFactory(
            partner=self.partner,
            authoring_organizations=[self.org2, self.org3],
            type=self.empty_course_type,
            key='{org}+Course1'.format(org=self.org2.key))
        self.c2_audit_run = factories.CourseRunFactory(
            course=self.course2, type=self.empty_run_type)
        self.c2_audit_seat = factories.SeatFactory(
            course_run=self.c2_audit_run, type=self.audit_seat_type)
 def setUp(self):
     super().setUp()
     self.courserun1 = factories.CourseRunFactory(draft=False)
     self.courserun2 = factories.CourseRunFactory(draft=False)
     self.courserun3 = factories.CourseRunFactory(draft=True)
示例#11
0
    def test_one_click_purchase_ineligible(self):
        """ Verify that program is one click purchase ineligible. """
        yesterday = datetime.datetime.utcnow() - datetime.timedelta(days=1)
        tomorrow = datetime.datetime.utcnow() + datetime.timedelta(days=1)
        verified_seat_type, __ = SeatType.objects.get_or_create(
            name=Seat.VERIFIED)
        program_type = factories.ProgramTypeFactory(
            applicable_seat_types=[verified_seat_type])

        # Program has one_click_purchase_enabled set to False and
        # every course has one course run
        self.assert_one_click_purchase_ineligible_program(
            one_click_purchase_enabled=False,
            program_type=program_type,
        )

        # Program has one_click_purchase_enabled set to True and
        # one course has two course runs
        course_run = factories.CourseRunFactory(end=None, enrollment_end=None)
        factories.CourseRunFactory(end=None,
                                   enrollment_end=None,
                                   course=course_run.course)
        factories.SeatFactory(course_run=course_run,
                              type='verified',
                              upgrade_deadline=None)
        program = factories.ProgramFactory(
            courses=[course_run.course],
            one_click_purchase_enabled=True,
            type=program_type,
        )
        self.assertFalse(program.is_program_eligible_for_one_click_purchase)

        # Program has one_click_purchase_enabled set to True and
        # one course with one course run excluded from the program
        course_run = factories.CourseRunFactory(end=None, enrollment_end=None)
        factories.SeatFactory(course_run=course_run,
                              type='verified',
                              upgrade_deadline=None)
        program = factories.ProgramFactory(
            courses=[course_run.course],
            one_click_purchase_enabled=True,
            excluded_course_runs=[course_run],
            type=program_type,
        )
        self.assertFalse(program.is_program_eligible_for_one_click_purchase)

        # Program has one_click_purchase_enabled set to True, one course
        # with one course run, course run end date passed
        self.assert_one_click_purchase_ineligible_program(
            end=yesterday,
            program_type=program_type,
        )

        # Program has one_click_purchase_enabled set to True, one course
        # with one course run, course run enrollment start date not passed
        self.assert_one_click_purchase_ineligible_program(
            enrollment_start=tomorrow,
            program_type=program_type,
        )

        # Program has one_click_purchase_enabled set to True, one course
        # with one course run, course run enrollment end date passed
        self.assert_one_click_purchase_ineligible_program(
            enrollment_end=yesterday,
            program_type=program_type,
        )

        # Program has one_click_purchase_enabled set to True, one course
        # with one course run, seat upgrade deadline passed
        self.assert_one_click_purchase_ineligible_program(
            upgrade_deadline=yesterday,
            program_type=program_type,
        )

        # Program has one_click_purchase_enabled set to True, one course
        # with one course run, seat type is not purchasable
        self.assert_one_click_purchase_ineligible_program(
            seat_type='incorrect',
            program_type=program_type,
        )