class UpdateCourseKeySerializerTests(TestCase): serializer_class = UpdateCourseKeySerializer def setUp(self): super(UpdateCourseKeySerializerTests, self).setUp() self.course_run = CourseRunFactory() self.request = RequestFactory() self.user = UserFactory() self.request.user = self.user def get_expected_data(self): return { 'lms_course_id': self.course_run.lms_course_id, 'changed_by': self.user } def test_validation(self): self.course_run.lms_course_id = 'course-v1:edxTest+TC101+2016_Q1' self.course_run.save() # pylint: disable=no-member serializer = self.serializer_class(self.course_run, context={'request': self.request}) expected = serializer.validate(serializer.data) self.assertEqual(self.get_expected_data(), expected) def test_validation_error(self): self.course_run.lms_course_id = 'wrong-course-id' self.course_run.save() # pylint: disable=no-member serializer = self.serializer_class(self.course_run) with self.assertRaises(ValidationError): serializer.validate(serializer.data)
class UpdateCourseKeySerializerTests(TestCase): serializer_class = UpdateCourseKeySerializer def setUp(self): super(UpdateCourseKeySerializerTests, self).setUp() self.course_run = CourseRunFactory() self.request = RequestFactory() self.user = UserFactory() self.request.user = self.user def get_expected_data(self): return { 'lms_course_id': self.course_run.lms_course_id, 'changed_by': self.user } def test_validation(self): self.course_run.lms_course_id = 'course-v1:edxTest+TC101+2016_Q1' self.course_run.save() # pylint: disable=no-member serializer = self.serializer_class(self.course_run) serializer.context['request'] = self.request expected = serializer.validate(serializer.data) self.assertEqual(self.get_expected_data(), expected) def test_validation_error(self): self.course_run.lms_course_id = 'wrong-course-id' self.course_run.save() # pylint: disable=no-member serializer = self.serializer_class(self.course_run) with self.assertRaises(ValidationError): serializer.validate(serializer.data)
class CourseRunSerializerTests(TestCase): serializer_class = CourseRunSerializer def setUp(self): super(CourseRunSerializerTests, self).setUp() self.course_run = CourseRunFactory() self.course_run.lms_course_id = 'course-v1:edX+DemoX+Demo_Course' self.request = RequestFactory() self.user = UserFactory() self.request.user = self.user self.course_state = CourseRunStateFactory(course_run=self.course_run, owner_role=PublisherUserRole.Publisher) def get_expected_data(self): return { 'lms_course_id': self.course_run.lms_course_id, 'changed_by': self.user, 'preview_url': self.course_run.preview_url } def test_validate_lms_course_id(self): """ Verify that serializer raises error if 'lms_course_id' has invalid format. """ self.course_run.lms_course_id = 'invalid-course-id' self.course_run.save() # pylint: disable=no-member serializer = self.serializer_class(self.course_run) with self.assertRaises(ValidationError): serializer.validate_lms_course_id(self.course_run.lms_course_id) def test_validate_preview_url(self): """ Verify that serializer raises error if 'preview_url' has invalid format. """ self.course_run.preview_url = 'invalid-preview-url' self.course_run.save() # pylint: disable=no-member serializer = self.serializer_class(self.course_run) with self.assertRaises(ValidationError): serializer.validate_preview_url(self.course_run.preview_url) def test_serializer_with_valid_data(self): """ Verify that serializer validate course_run object. """ serializer = self.serializer_class(self.course_run, context={'request': self.request}) self.assertEqual(self.get_expected_data(), serializer.validate(serializer.data)) def test_update_preview_url(self): """ Verify that course 'owner_role' will be changed to course_team after updating course run with preview url. """ serializer = self.serializer_class(self.course_run) serializer.update(self.course_run, serializer.data) self.assertEqual(self.course_state.owner_role, PublisherUserRole.CourseTeam) def test_update_lms_course_id(self): """ Verify that 'changed_by' also updated after updating course_run's lms_course_id.""" self.course_run.preview_url = None self.course_run.save() serializer = self.serializer_class(self.course_run, context={'request': self.request}) serializer.update(self.course_run, serializer.validate(serializer.data)) self.assertEqual(self.course_run.lms_course_id, serializer.data['lms_course_id']) self.assertEqual(self.course_run.changed_by, self.user)
class CourseRunSerializerTests(TestCase): serializer_class = CourseRunSerializer def setUp(self): super(CourseRunSerializerTests, self).setUp() self.course_run = CourseRunFactory() self.course_run.lms_course_id = 'course-v1:edX+DemoX+Demo_Course' self.request = RequestFactory() self.user = UserFactory() self.request.user = self.user self.course_state = CourseRunStateFactory( course_run=self.course_run, owner_role=PublisherUserRole.Publisher) def get_expected_data(self): """ Helper method which will return expected serialize data. """ return { 'lms_course_id': self.course_run.lms_course_id, 'changed_by': self.user, 'preview_url': self.course_run.preview_url } def test_validate_lms_course_id(self): """ Verify that serializer raises error if 'lms_course_id' has invalid format. """ self.course_run.lms_course_id = 'invalid-course-id' self.course_run.save() # pylint: disable=no-member serializer = self.serializer_class(self.course_run) with self.assertRaises(ValidationError): serializer.validate_lms_course_id(self.course_run.lms_course_id) def test_validate_preview_url(self): """ Verify that serializer raises error if 'preview_url' has invalid format. """ self.course_run.preview_url = 'invalid-preview-url' self.course_run.save() # pylint: disable=no-member serializer = self.serializer_class(self.course_run) with self.assertRaises(ValidationError): serializer.validate_preview_url(self.course_run.preview_url) def test_serializer_with_valid_data(self): """ Verify that serializer validate course_run object. """ serializer = self.serializer_class(self.course_run, context={'request': self.request}) self.assertEqual(self.get_expected_data(), serializer.validate(serializer.data)) def test_update_preview_url(self): """ Verify that course 'owner_role' will be changed to course_team after updating course run with preview url. """ self.course_run.preview_url = '' self.course_run.save() serializer = self.serializer_class(self.course_run) serializer.update(self.course_run, {'preview_url': 'https://example.com/abc/course'}) self.assertEqual(self.course_state.owner_role, PublisherUserRole.CourseTeam) self.assertEqual(self.course_run.preview_url, serializer.data['preview_url']) def test_update_lms_course_id(self): """ Verify that 'changed_by' also updated after updating course_run's lms_course_id.""" self.course_run.preview_url = None self.course_run.save() serializer = self.serializer_class(self.course_run, context={'request': self.request}) serializer.update(self.course_run, serializer.validate(serializer.data)) self.assertEqual(self.course_run.lms_course_id, serializer.data['lms_course_id']) self.assertEqual(self.course_run.changed_by, self.user) def test_update_with_transaction_rollback(self): """ Verify that transaction roll backed if an error occurred. """ self.course_run.preview_url = '' self.course_run.save() serializer = self.serializer_class(self.course_run) with self.assertRaises(Exception): serializer.update(self.course_run, {'preview_url': 'invalid_url'}) self.assertFalse(self.course_run.preview_url) def test_transaction_roll_back_with_error_on_email(self): """ Verify that transaction is roll backed if error occurred during email sending. """ toggle_switch('enable_publisher_email_notifications', True) self.course_run.preview_url = '' self.course_run.save() serializer = self.serializer_class(self.course_run) self.assertEqual(self.course_run.course_run_state.owner_role, PublisherUserRole.Publisher) with self.assertRaises(Exception): serializer.update( self.course_run, {'preview_url': 'https://example.com/abc/course'}) self.course_run = CourseRun.objects.get(id=self.course_run.id) self.assertFalse(self.course_run.preview_url) # Verify that owner role not changed. self.assertEqual(self.course_run.course_run_state.owner_role, PublisherUserRole.Publisher)
class CourseRunSerializerTests(TestCase): serializer_class = CourseRunSerializer def setUp(self): super(CourseRunSerializerTests, self).setUp() self.course_run = CourseRunFactory() self.course_run.lms_course_id = 'course-v1:edX+DemoX+Demo_Course' self.person = PersonFactory() self.discovery_course_run = DiscoveryCourseRunFactory( key=self.course_run.lms_course_id, staff=[self.person]) self.request = RequestFactory() self.user = UserFactory() self.request.user = self.user self.course_state = CourseRunStateFactory( course_run=self.course_run, owner_role=PublisherUserRole.Publisher) def get_expected_data(self): """ Helper method which will return expected serialize data. """ return { 'lms_course_id': self.course_run.lms_course_id, 'changed_by': self.user, 'preview_url': self.course_run.preview_url } def test_validate_lms_course_id(self): """ Verify that serializer raises error if 'lms_course_id' has invalid format. """ self.course_run.lms_course_id = 'invalid-course-id' self.course_run.save() serializer = self.serializer_class(self.course_run) with self.assertRaises(ValidationError): serializer.validate_lms_course_id(self.course_run.lms_course_id) def test_validate_preview_url(self): """ Verify that serializer raises error if 'preview_url' has invalid format. """ serializer = self.serializer_class(self.course_run, context={'request': self.request}) with self.assertRaises(ValidationError): serializer.validate({'preview_url': 'invalid-url'}) def test_serializer_with_valid_data(self): """ Verify that serializer validate course_run object. """ serializer = self.serializer_class(self.course_run, context={'request': self.request}) self.assertEqual(self.get_expected_data(), serializer.validate(serializer.data)) def test_update_preview_url(self): """ Verify that course 'owner_role' will be changed to course_team after updating course run with preview url. """ self.discovery_course_run.slug = '' self.discovery_course_run.save(suppress_publication=True) serializer = self.serializer_class(self.course_run, context={'request': self.request}) serializer.update(self.course_run, {'preview_url': 'https://example.com/abc/course'}) self.assertEqual(self.course_state.owner_role, PublisherUserRole.CourseTeam) self.assertEqual( self.course_run.preview_url.rsplit('/', 1)[-1], 'course') def test_update_preview_url_no_op(self): """ Verify we don't push to marketing if no change required """ self.discovery_course_run.slug = '' self.discovery_course_run.save(suppress_publication=True) toggle_switch('publish_course_runs_to_marketing_site') serializer = self.serializer_class(self.course_run, context={'request': self.request}) mock_path = 'course_discovery.apps.course_metadata.publishers.CourseRunMarketingSitePublisher.publish_obj' with mock.patch(mock_path) as mock_save: serializer.update( self.course_run, {'preview_url': 'https://example.com/abc/course'}) self.assertEqual(mock_save.call_count, 1) # Now when we update a second time, there should be nothing to do, call count should remain at 1 serializer.update( self.course_run, {'preview_url': 'https://example.com/abc/course'}) self.assertEqual(mock_save.call_count, 1) def test_update_preview_url_slug_exists(self): """ Verify we don't push to marketing if no change required """ DiscoveryCourseRunFactory( title='course') # will create the slug 'course' serializer = self.serializer_class(self.course_run, context={'request': self.request}) with self.assertRaises(Exception) as cm: serializer.update( self.course_run, {'preview_url': 'https://example.com/abc/course'}) self.assertEqual(cm.exception.args[0], 'Preview URL already in use for another course') def test_update_lms_course_id(self): """ Verify that 'changed_by' also updated after updating course_run's lms_course_id.""" serializer = self.serializer_class(self.course_run, context={'request': self.request}) serializer.update(self.course_run, serializer.validate(serializer.data)) self.assertEqual(self.course_run.lms_course_id, serializer.data['lms_course_id']) self.assertEqual(self.course_run.changed_by, self.user) def test_update_with_transaction_rollback(self): """ Verify that transaction roll backed if an error occurred. """ serializer = self.serializer_class(self.course_run) with self.assertRaises(Exception): serializer.update(self.course_run, {'preview_url': 'invalid_url'}) self.assertFalse(self.course_run.preview_url) def test_transaction_roll_back_with_error_on_email(self): """ Verify that transaction is roll backed if error occurred during email sending. """ toggle_switch('enable_publisher_email_notifications', True) serializer = self.serializer_class(self.course_run) self.assertEqual(self.course_run.course_run_state.owner_role, PublisherUserRole.Publisher) with self.assertRaises(Exception): serializer.update( self.course_run, {'preview_url': 'https://example.com/abc/course'}) self.course_run = CourseRun.objects.get(id=self.course_run.id) self.assertFalse(self.course_run.preview_url) # Verify that owner role not changed. self.assertEqual(self.course_run.course_run_state.owner_role, PublisherUserRole.Publisher)