示例#1
0
    def test_course_revision_serializer_without_subjects(self):
        """ Verify that CourseRevisionSerializer serialize the course revision object
        even if subject fields are not available.
        """

        course = CourseFactory(primary_subject=None,
                               secondary_subject=None,
                               tertiary_subject=None,
                               level_type=None)
        course.title = 'updated title'
        course.save()
        revision = course.history.first()
        serializer = CourseRevisionSerializer(revision)

        expected = {
            'history_id': revision.history_id,
            'title': revision.title,
            'number': revision.number,
            'short_description': revision.short_description,
            'full_description': revision.full_description,
            'expected_learnings': revision.expected_learnings,
            'prerequisites': revision.prerequisites,
            'primary_subject': None,
            'secondary_subject': None,
            'tertiary_subject': None,
            'level_type': None,
            'learner_testimonial': revision.learner_testimonial,
            'faq': revision.faq,
            'video_link': revision.video_link
        }

        self.assertDictEqual(serializer.data, expected)
示例#2
0
    def setUp(self):
        super(OrganizationUserRoleAdminTests, self).setUp()
        self.user = UserFactory(is_staff=True, is_superuser=True)
        self.client.login(username=self.user.username, password=USER_PASSWORD)
        self.admin_page_url = reverse('admin:publisher_organizationuserrole_add')

        self.organization = OrganizationFactory()

        self.course1 = CourseFactory(organizations=[self.organization])
        self.course2 = CourseFactory(organizations=[self.organization])
    def test_save_method_add_course_user_roles(self):
        """
        Verify that save method will not create the duplicate course user roles.
        """
        # for course 3 add course roles
        user = UserFactory()
        course3 = CourseFactory()
        course3.organizations.add(self.organization)
        factories.CourseUserRoleFactory(
            course=course3,
            role=PublisherUserRole.MarketingReviewer,
            user=user)

        # for course 4 add course roles
        project_coordinator = UserFactory()
        course4 = CourseFactory()
        course4.organizations.add(self.organization)
        factories.CourseUserRoleFactory(
            course=course4,
            role=PublisherUserRole.ProjectCoordinator,
            user=project_coordinator)

        test_user = UserFactory()
        post_data = {
            'organization': self.organization.id,
            'user': test_user.id,
            'role': PublisherUserRole.MarketingReviewer
        }
        self.client.post(self.admin_page_url, data=post_data)

        # for course-4 course-user-role does not change
        self.assertTrue(
            course4.course_user_roles.filter(
                role=PublisherUserRole.ProjectCoordinator,
                user=project_coordinator).exists())

        # for course-3 course-user-role also changes to test_user
        self.assertTrue(
            course3.course_user_roles.filter(
                role=PublisherUserRole.MarketingReviewer,
                user=test_user).exists())

        self.assertTrue(
            self.course1.course_user_roles.filter(
                role=PublisherUserRole.MarketingReviewer,
                user=test_user).exists())
        self.assertTrue(
            self.course2.course_user_roles.filter(
                role=PublisherUserRole.MarketingReviewer,
                user=test_user).exists())
示例#4
0
 def setUp(self):
     super(PublisherCustomCourseFormTests, self).setUp()
     self.course_form = CourseForm()
     self.organization = OrganizationFactory()
     self.course = CourseFactory(title='Test',
                                 number='a123',
                                 organizations=[self.organization])
示例#5
0
    def test_create_course_run_in_studio_with_image_failure(self, __):
        organization = OrganizationFactory()
        OrganizationExtensionFactory(organization=organization)
        partner = organization.partner
        start = datetime.datetime.utcnow()
        course_run_key = 'course-v1:TestX+Testing101x+1T2017'

        body = {'id': course_run_key}
        studio_url_root = partner.studio_url.strip('/')
        url = '{}/api/v1/course_runs/'.format(studio_url_root)
        responses.add(responses.POST, url, json=body, status=200)

        course = CourseFactory(organizations=[organization])

        with mock.patch('course_discovery.apps.api.utils.logger.exception'
                        ) as mock_logger:
            publisher_course_run = CourseRunFactory(
                course=course,
                start=start,
                lms_course_id=None,
            )

        assert mock_logger.call_count == 1
        assert mock_logger.call_args_list[0] == mock.call(
            'An error occurred while setting the course run image for [{key}] in studio. All other fields '
            'were successfully saved in Studio.'.format(key=course_run_key))

        publisher_course_run.refresh_from_db()
        assert len(responses.calls) == 2
        assert publisher_course_run.lms_course_id == course_run_key
示例#6
0
    def test_create_course_run_in_studio_with_image_api_failure(
            self, mock_access_token):
        organization = OrganizationFactory()
        partner = organization.partner
        start = datetime.datetime.utcnow()
        course_run_key = 'course-v1:TestX+Testing101x+1T2017'

        body = {'id': course_run_key}
        studio_url_root = partner.studio_url.strip('/')
        url = '{}/api/v1/course_runs/'.format(studio_url_root)
        responses.add(responses.POST, url, json=body, status=200)

        body = {'error': 'Server error'}
        url = '{root}/api/v1/course_runs/{course_run_key}/images/'.format(
            root=studio_url_root, course_run_key=course_run_key)
        responses.add(responses.POST, url, json=body, status=500)

        course = CourseFactory(organizations=[organization])

        with mock.patch(
                'course_discovery.apps.publisher.signals.logger.exception'
        ) as mock_logger:
            with pytest.raises(HttpServerError):
                CourseRunFactory(
                    course=course,
                    start=start,
                    lms_course_id=None,
                )

        assert len(responses.calls) == 2

        mock_logger.assert_called_with(
            'Failed to create course run [%s] on Studio: %s', course.key,
            json.dumps(body).encode('utf8'))
示例#7
0
    def test_create_course_run_in_studio_with_image_failure(self, __, ___):  # pylint: disable=unused-argument
        organization = OrganizationFactory()
        partner = organization.partner
        start = datetime.datetime.utcnow()
        course_run_key = 'course-v1:TestX+Testing101x+1T2017'

        body = {'id': course_run_key}
        studio_url_root = partner.studio_url.strip('/')
        url = '{}/api/v1/course_runs/'.format(studio_url_root)
        responses.add(responses.POST, url, json=body, status=200)

        course = CourseFactory(organizations=[organization])

        with mock.patch(
                'course_discovery.apps.publisher.signals.logger.exception'
        ) as mock_logger:
            with pytest.raises(Exception):
                CourseRunFactory(
                    course=course,
                    start=start,
                    lms_course_id=None,
                )

        assert len(responses.calls) == 1

        mock_logger.assert_called_with(
            'Failed to create course run [%s] on Studio', course.key)
示例#8
0
    def test_load_unpublished_course_runs_with_flag_enabled(self):
        # Set the end date in the future
        data = mock_data.UNIQUE_MARKETING_SITE_API_COURSE_BODIES[0]
        data['field_course_end_date'] = datetime.datetime.max.strftime('%s')
        # Set the status to unpublished
        data['status'] = '0'
        OrganizationFactory.create(
            uuid=data.get('field_course_school_node', {})[0].get('uuid'))

        self.course_run.key = data.get('field_course_id')
        self.course_run.save()

        PublisherCourseFactory.create(
            course_metadata_pk=self.course_run.course.id)

        load_unpublished_course_runs = True

        config = DrupalLoaderConfigFactory.create(
            course_run_ids=data.get('field_course_id'),
            partner_code=self.partner.short_code,
            load_unpublished_course_runs=load_unpublished_course_runs)
        data_loader = DrupalCourseMarketingSiteDataLoader(
            self.partner,
            self.partner.marketing_site_url_root,
            ACCESS_TOKEN,
            'JWT',
            1,  # Make this a constant of 1 for no concurrency
            False,
            set(config.course_run_ids.split(',')),
            load_unpublished_course_runs)

        # Need to mock this method so that the GET isn't sent out to the test data server
        with mock.patch(
                'course_discovery.apps.publisher.dataloader.create_courses.'
                'transfer_course_image'):
            data_loader.process_node(
                mock_data.UNIQUE_MARKETING_SITE_API_COURSE_BODIES[0])

        course_metadata_course_run = CourseMetadataCourseRun.objects.get(
            key=data.get('field_course_id'))
        self.assertIsNotNone(course_metadata_course_run)
        self.assertIsNotNone(course_metadata_course_run.course)
        publisher_course_run = PublisherCourseRun.objects.get(
            lms_course_id=course_metadata_course_run.key)
        self.assertIsNotNone(publisher_course_run)
        self.assertIsNotNone(publisher_course_run.course)
示例#9
0
 def setUp(self):
     super().setUp()
     self.organization = OrganizationFactory()
     self.organization_extension = OrganizationExtensionFactory()
     self.user = UserFactory()
     self.user.groups.add(self.organization_extension.group)
     self.course = CourseFactory(title='Test course')
     assign_perm(OrganizationExtension.VIEW_COURSE,
                 self.organization_extension.group,
                 self.organization_extension)
示例#10
0
 def test_clean_with_valid_owner_role(self):
     """
     Test that 'clean' does not raise 'ValidationError' if the user role that has been assigned owner does exist
     """
     course = CourseFactory()
     user = UserFactory()
     CourseUserRoleFactory(course=course, user=user, role=PublisherUserRole.CourseTeam)
     course_state_form = CourseStateAdminForm()
     course_state_form.cleaned_data = {
         'owner_role': PublisherUserRole.CourseTeam,
         'course': course
     }
     self.assertEqual(course_state_form.clean(), course_state_form.cleaned_data)
示例#11
0
    def test_course_revision_serializer(self):
        """ Verify that CourseRevisionSerializer serialize the course revision object. """

        course = CourseFactory()
        course.title = 'updated title'
        course.save()
        revision = course.history.first()
        serializer = CourseRevisionSerializer(revision)

        expected = {
            'history_id': revision.history_id,
            'title': revision.title,
            'number': revision.number,
            'short_description': revision.short_description,
            'full_description': revision.full_description,
            'expected_learnings': revision.expected_learnings,
            'prerequisites': revision.prerequisites,
            'primary_subject': revision.primary_subject.name,
            'secondary_subject': revision.secondary_subject.name,
            'tertiary_subject': revision.tertiary_subject.name,
            'level_type': revision.level_type.name
        }

        self.assertDictEqual(serializer.data, expected)
示例#12
0
    def setup_course(self, **course_kwargs):
        """
        Creates the course and add organization and admin to this course.

        Returns:
            course: a course object
            course_admin: a user object
        """
        course = CourseFactory(**course_kwargs)
        course_admin = UserFactory(username='******')
        organization_extension = OrganizationExtensionFactory()
        organization = organization_extension.organization

        course_admin.groups.add(organization_extension.group)
        course.organizations.add(organization)
        return course, course_admin
示例#13
0
    def setup_course(self, **course_kwargs):
        """
        Creates the course and add organization and admin to this course.

        Returns:
            course: a course object
            course_admin: a user object
        """
        organization_extension = OrganizationExtensionFactory()
        defaults = {
            'organizations': [organization_extension.organization],
        }
        defaults.update(course_kwargs)
        course = CourseFactory(**defaults)

        course_admin = UserFactory()
        course_admin.groups.add(organization_extension.group)

        return course, course_admin
示例#14
0
 def setUp(self):
     super(PublisherCustomCourseFormTests, self).setUp()
     self.course_form = CustomCourseForm()
     self.course = CourseFactory(title="Test", number="a123")
     self.organization = OrganizationFactory()
     self.course.organizations.add(self.organization)
示例#15
0
def test_calculate_course_run_key_run_value(month, expected):
    course = CourseFactory()
    start = datetime.datetime(2017, month, 1)
    assert StudioAPI.calculate_course_run_key_run_value(
        course.number, start=start) == expected