def test_permissions(self):
        """ Verify only users with the appropriate permissions can access the endpoint. """
        catalog = CatalogFactory()
        superuser = UserFactory(is_superuser=True)
        url = reverse('api:v1:partners:affiliate_window-detail', kwargs={'pk': catalog.id})

        # Superusers can view all catalogs
        self.client.force_authenticate(superuser)

        with self.assertNumQueries(5):
            response = self.client.get(url)
            self.assertEqual(response.status_code, 200)

        # Regular users can only view catalogs belonging to them
        self.client.force_authenticate(self.user)
        response = self.client.get(url)
        self.assertEqual(response.status_code, 403)

        catalog.viewers = [self.user]
        with self.assertNumQueries(8):
            response = self.client.get(url)
            self.assertEqual(response.status_code, 200)
Exemplo n.º 2
0
    def setUp(self):
        super(ProgramsAffiliateWindowViewSetTests, self).setUp()
        self.user = UserFactory()
        self.client.force_authenticate(self.user)
        self.catalog = CatalogFactory(query='*:*',
                                      program_query='*:*',
                                      viewers=[self.user])

        self.enrollment_end = datetime.datetime.now(
            pytz.UTC) + datetime.timedelta(days=30)
        self.course_end = datetime.datetime.now(
            pytz.UTC) + datetime.timedelta(days=60)
        self.course_run = CourseRunFactory(enrollment_end=self.enrollment_end,
                                           end=self.course_end)
        self.course = self.course_run.course

        # Generate test programs
        self.test_image = make_image_file('test_banner.jpg')
        self.masters_program_type = ProgramType.objects.get(
            slug=ProgramType.MASTERS)
        self.microbachelors_program_type = ProgramType.objects.get(
            slug=ProgramType.MICROBACHELORS)
        self.ms_program = ProgramFactory(
            type=self.masters_program_type,
            courses=[self.course],
            banner_image=self.test_image,
        )
        self.program = ProgramFactory(
            type=self.microbachelors_program_type,
            courses=[self.course],
            banner_image=self.test_image,
        )

        self.affiliate_url = reverse(
            'api:v1:partners:programs_affiliate_window-detail',
            kwargs={'pk': self.catalog.id})
Exemplo n.º 3
0
    def test_courses_with_subjects_and_negative_query(self):
        catalog = CatalogFactory(
            # pylint: disable=line-too-long
            query=
            'subjects:(-"Business & Management" AND -"Economics & Finance" AND -"Data Analysis & Statistics" AND -"Math"  AND -"Engineering") AND org:(-galileox AND -davidsonnext AND -microsoft AND -gtx AND -pekingx AND -asux AND -bux AND -columbiax)'
        )
        Course.objects.all().delete()
        not_included_subject_names = (
            'Business & Management',
            'Economics & Finance',
            'Business & Management',
            'Economics & Finance',
            'Data Analysis & Statistics',
            'math',
            'Engineering',
        )
        for name in not_included_subject_names:
            course_run = CourseRunFactory(
                start=datetime.datetime(2015, 9, 1, tzinfo=pytz.UTC),
                status=CourseRunStatus.Published,
                type__is_marketable=True,
                course__subjects=[SubjectFactory(name=name)],
            )
            SeatFactory.create(course_run=course_run)

        included_subject_names = ('Health & Sport', 'Galaxy')
        desired_courses = []
        for name in included_subject_names:
            course_run = CourseRunFactory(
                start=datetime.datetime(2015, 9, 1, tzinfo=pytz.UTC),
                status=CourseRunStatus.Published,
                type__is_marketable=True,
                course__subjects=[SubjectFactory(name=name)],
            )
            SeatFactory.create(course_run=course_run)
            desired_courses.append(course_run.course)

        not_included_org_names = ('galileox', 'davidsonnext', 'microsoft',
                                  'gtx', 'pekingx', 'asux', 'bux', 'ColumbiaX')
        for name in not_included_org_names:
            course_run = CourseRunFactory(
                start=datetime.datetime(2015, 9, 1, tzinfo=pytz.UTC),
                status=CourseRunStatus.Published,
                type__is_marketable=True,
                key=
                f'{name}/{factory.Faker("word").evaluate(None, None, {"locale":"en"})}/test',
            )
            SeatFactory.create(course_run=course_run)

        included_org_names = ('apple', 'cisco')
        for name in included_org_names:
            course_run = CourseRunFactory(
                start=datetime.datetime(2015, 9, 1, tzinfo=pytz.UTC),
                status=CourseRunStatus.Published,
                type__is_marketable=True,
                key=
                f'{name}/{factory.Faker("word").evaluate(None, None, {"locale":"en"})}/test',
            )
            SeatFactory.create(course_run=course_run)
            desired_courses.append(course_run.course)

        call_command('search_index', '--rebuild', '-f')
        url = reverse('api:v1:catalog-courses', kwargs={'id': catalog.id})
        response = self.client.get(url)

        assert response.status_code == 200
        assert response.data['results'] == self.serialize_catalog_course(
            desired_courses, many=True)