def test_get_subtopic_page_by_id(self): subtopic_page_1 = subtopic_page_services.get_subtopic_page_by_id( self.TOPIC_ID, self.subtopic_id) self.assertEqual( subtopic_page_1.to_dict(), self.subtopic_page.to_dict()) # When the subtopic page with the given subtopic id and topic id # doesn't exist. subtopic_page_2 = subtopic_page_services.get_subtopic_page_by_id( 'topic_id', 1, strict=False) self.assertEqual(subtopic_page_2, None)
def test_delete_subtopic_with_skill_ids(self): changelist = [topic_domain.TopicChange({ 'cmd': topic_domain.CMD_DELETE_SUBTOPIC, 'subtopic_id': self.subtopic_id })] subtopic_page = subtopic_page_services.get_subtopic_page_by_id( self.TOPIC_ID, 1, strict=False) self.assertEqual(subtopic_page.id, self.TOPIC_ID + '-1') topic_services.update_topic_and_subtopic_pages( self.user_id_admin, self.TOPIC_ID, changelist, 'Removed 1 subtopic.') subtopic_page = subtopic_page_services.get_subtopic_page_by_id( self.TOPIC_ID, 1, strict=False) self.assertIsNone(subtopic_page) topic = topic_services.get_topic_by_id(self.TOPIC_ID) self.assertEqual( topic.uncategorized_skill_ids, [self.skill_id_1, self.skill_id_2]) self.assertEqual(topic.subtopics, [])
def test_delete_topic(self): # Test whether an admin can delete a topic. topic_services.delete_topic(self.user_id_admin, self.TOPIC_ID) self.assertIsNone( topic_services.get_topic_by_id(self.TOPIC_ID, strict=False)) self.assertIsNone( topic_services.get_topic_summary_by_id(self.TOPIC_ID, strict=False)) self.assertIsNone( subtopic_page_services.get_subtopic_page_by_id( self.TOPIC_ID, 1, strict=False))
def test_get_subtopic_page_contents_by_id(self): self.subtopic_page = subtopic_page_services.get_subtopic_page_by_id( self.TOPIC_ID, 1) recorded_voiceovers = { 'voiceovers_mapping': { 'content': { 'en': { 'filename': 'test.mp3', 'file_size_bytes': 100, 'needs_update': False, 'duration_secs': 7.213 } } } } expected_page_contents_dict = { 'subtitled_html': { 'content_id': 'content', 'html': '<p>hello world</p>' }, 'recorded_voiceovers': recorded_voiceovers, 'written_translations': { 'translations_mapping': { 'content': {} } } } self.subtopic_page.update_page_contents_html( state_domain.SubtitledHtml.from_dict({ 'html': '<p>hello world</p>', 'content_id': 'content' })) self.subtopic_page.update_page_contents_audio( state_domain.RecordedVoiceovers.from_dict(recorded_voiceovers)) subtopic_page_services.save_subtopic_page( self.user_id, self.subtopic_page, 'Updated page contents', [ subtopic_page_domain.SubtopicPageChange( { 'cmd': subtopic_page_domain.CMD_UPDATE_SUBTOPIC_PAGE_PROPERTY, 'subtopic_id': 1, 'property_name': 'page_contents_html', 'new_value': 'a', 'old_value': 'b' }) ]) subtopic_page_contents = ( subtopic_page_services.get_subtopic_page_contents_by_id( self.TOPIC_ID, 1)) self.assertEqual(subtopic_page_contents.to_dict(), expected_page_contents_dict) subtopic_page_contents = ( subtopic_page_services.get_subtopic_page_contents_by_id( self.TOPIC_ID, 2, strict=False)) self.assertEqual(subtopic_page_contents, None)
def get(self, topic_id, subtopic_id): """Handles GET requests.""" subtopic_page = subtopic_page_services.get_subtopic_page_by_id( topic_id, subtopic_id, strict=False) if subtopic_page is None: raise self.PageNotFoundException( 'The subtopic page with the given id doesn\'t exist.') self.values.update({'subtopic_page': subtopic_page.to_dict()}) self.render_json(self.values)
def test_get_subtopic_page_contents_by_id(self): self.subtopic_page = subtopic_page_services.get_subtopic_page_by_id( self.TOPIC_ID, 1) content_ids_to_audio_translations_dict = { 'content': { 'en': { 'filename': 'test.mp3', 'file_size_bytes': 100, 'needs_update': False } } } expected_page_contents_dict = { 'content_ids_to_audio_translations': content_ids_to_audio_translations_dict, 'subtitled_html': { 'content_id': 'content', 'html': 'hello world' }, 'written_translations': { 'translations_mapping': { 'content': {} } } } self.subtopic_page.update_page_contents_html({ 'html': 'hello world', 'content_id': 'content' }) self.subtopic_page.update_page_contents_audio( content_ids_to_audio_translations_dict) subtopic_page_services.save_subtopic_page( self.user_id, self.subtopic_page, 'Updated page contents', [ subtopic_page_domain.SubtopicPageChange( { 'cmd': subtopic_page_domain.CMD_UPDATE_SUBTOPIC_PAGE_PROPERTY, 'subtopic_id': 1, 'property_name': 'page_contents_html', 'new_value': 'a', 'old_value': 'b' }) ]) subtopic_page_contents = ( subtopic_page_services.get_subtopic_page_contents_by_id( self.TOPIC_ID, 1)) self.assertEqual(subtopic_page_contents.to_dict(), expected_page_contents_dict) subtopic_page_contents = ( subtopic_page_services.get_subtopic_page_contents_by_id( self.TOPIC_ID, 2, strict=False)) self.assertEqual(subtopic_page_contents, None)
def get(self, topic_id, subtopic_id): """Handles GET requests.""" if not feconf.ENABLE_NEW_STRUCTURES: raise self.PageNotFoundException topic_domain.Topic.require_valid_topic_id(topic_id) subtopic_page = subtopic_page_services.get_subtopic_page_by_id( topic_id, subtopic_id, strict=False) if subtopic_page is None: raise self.PageNotFoundException( 'The subtopic page with the given id doesn\'t exist.') self.values.update({'subtopic_page': subtopic_page.to_dict()}) self.render_json(self.values)
def test_update_subtopic_skill_ids(self): # Adds a subtopic and moves skill id from one to another. changelist = [ topic_domain.TopicChange({ 'cmd': topic_domain.CMD_MOVE_SKILL_ID_TO_SUBTOPIC, 'old_subtopic_id': None, 'new_subtopic_id': self.subtopic_id, 'skill_id': self.skill_id_1 }), topic_domain.TopicChange({ 'cmd': topic_domain.CMD_MOVE_SKILL_ID_TO_SUBTOPIC, 'old_subtopic_id': None, 'new_subtopic_id': self.subtopic_id, 'skill_id': self.skill_id_2 }), topic_domain.TopicChange({ 'cmd': topic_domain.CMD_ADD_SUBTOPIC, 'title': 'Title2', 'subtopic_id': 2 }), topic_domain.TopicChange({ 'cmd': topic_domain.CMD_MOVE_SKILL_ID_TO_SUBTOPIC, 'old_subtopic_id': self.subtopic_id, 'new_subtopic_id': 2, 'skill_id': self.skill_id_2 }) ] topic_services.update_topic_and_subtopic_pages( self.user_id_admin, self.TOPIC_ID, changelist, 'Updated subtopic skill ids.') topic = topic_services.get_topic_by_id(self.TOPIC_ID) subtopic_page = subtopic_page_services.get_subtopic_page_by_id( topic.id, 2) self.assertEqual(topic.uncategorized_skill_ids, []) self.assertEqual(topic.subtopics[0].skill_ids, [self.skill_id_1]) self.assertEqual(topic.subtopics[1].skill_ids, [self.skill_id_2]) self.assertEqual(topic.subtopics[1].id, 2) self.assertEqual(topic.next_subtopic_id, 3) self.assertEqual(subtopic_page.topic_id, topic.id) self.assertEqual(subtopic_page.id, self.TOPIC_ID + '-2') # Tests invalid case where skill id is not present in the old subtopic. changelist = [ topic_domain.TopicChange({ 'cmd': topic_domain.CMD_MOVE_SKILL_ID_TO_SUBTOPIC, 'old_subtopic_id': self.subtopic_id, 'new_subtopic_id': 2, 'skill_id': self.skill_id_2 }) ] with self.assertRaisesRegexp( Exception, 'Skill id %s is not present in the given old subtopic' % self.skill_id_2): topic_services.update_topic_and_subtopic_pages( self.user_id_admin, self.TOPIC_ID, changelist, 'Updated subtopic skill ids.') # Tests invalid case where skill id is not an uncategorized skill id. changelist = [ topic_domain.TopicChange({ 'cmd': topic_domain.CMD_MOVE_SKILL_ID_TO_SUBTOPIC, 'old_subtopic_id': None, 'new_subtopic_id': 2, 'skill_id': 'skill_10' }) ] with self.assertRaisesRegexp( Exception, 'Skill id skill_10 is not an uncategorized skill id'): topic_services.update_topic_and_subtopic_pages( self.user_id_admin, self.TOPIC_ID, changelist, 'Updated subtopic skill ids.') # Tests invalid case where target subtopic doesn't exist. changelist = [topic_domain.TopicChange({ 'cmd': topic_domain.CMD_MOVE_SKILL_ID_TO_SUBTOPIC, 'old_subtopic_id': self.subtopic_id, 'new_subtopic_id': None, 'skill_id': self.skill_id_1 })] with self.assertRaisesRegexp( Exception, 'The subtopic with id None does not exist.'): topic_services.update_topic_and_subtopic_pages( self.user_id_admin, self.TOPIC_ID, changelist, 'Updated subtopic skill ids.') # Tests valid case skill id removal case. changelist = [ topic_domain.TopicChange({ 'cmd': topic_domain.CMD_REMOVE_SKILL_ID_FROM_SUBTOPIC, 'subtopic_id': 2, 'skill_id': self.skill_id_2 }), topic_domain.TopicChange({ 'cmd': topic_domain.CMD_REMOVE_SKILL_ID_FROM_SUBTOPIC, 'subtopic_id': self.subtopic_id, 'skill_id': self.skill_id_1 }) ] topic_services.update_topic_and_subtopic_pages( self.user_id_admin, self.TOPIC_ID, changelist, 'Updated subtopic skill ids.') topic = topic_services.get_topic_by_id(self.TOPIC_ID) self.assertEqual( topic.uncategorized_skill_ids, [self.skill_id_2, self.skill_id_1]) self.assertEqual(topic.subtopics[1].skill_ids, []) self.assertEqual(topic.subtopics[0].skill_ids, []) # Tests invalid case where skill id is not present in the subtopic # from which it is to be removed. changelist = [topic_domain.TopicChange({ 'cmd': topic_domain.CMD_REMOVE_SKILL_ID_FROM_SUBTOPIC, 'subtopic_id': self.subtopic_id, 'skill_id': 'skill_10' })] with self.assertRaisesRegexp( Exception, 'Skill id skill_10 is not present in the old subtopic'): topic_services.update_topic_and_subtopic_pages( self.user_id_admin, self.TOPIC_ID, changelist, 'Updated subtopic skill ids.')
def test_update_topic_and_subtopic_page(self): changelist = [topic_domain.TopicChange({ 'cmd': topic_domain.CMD_ADD_SUBTOPIC, 'title': 'Title3', 'subtopic_id': 3 })] with self.assertRaisesRegexp( Exception, 'The given new subtopic id 3 is not equal to ' 'the expected next subtopic id: 2'): topic_services.update_topic_and_subtopic_pages( self.user_id_admin, self.TOPIC_ID, changelist, 'Added subtopic.') # Test whether the subtopic page was created for the above failed # attempt. subtopic_page = subtopic_page_services.get_subtopic_page_by_id( self.TOPIC_ID, 3, strict=False) self.assertIsNone(subtopic_page) # Test exception raised for simultaneous adding and removing of # subtopics. changelist = [ topic_domain.TopicChange({ 'cmd': topic_domain.CMD_ADD_SUBTOPIC, 'title': 'Title2', 'subtopic_id': 2 }), topic_domain.TopicChange({ 'cmd': topic_domain.CMD_DELETE_SUBTOPIC, 'subtopic_id': 2 }) ] with self.assertRaisesRegexp( Exception, 'The incoming changelist had simultaneous' ' creation and deletion of subtopics.'): topic_services.update_topic_and_subtopic_pages( self.user_id_admin, self.TOPIC_ID, changelist, 'Added and deleted a subtopic.') # Test whether a subtopic page already existing in datastore can be # edited. changelist = [subtopic_page_domain.SubtopicPageChange({ 'cmd': subtopic_page_domain.CMD_UPDATE_SUBTOPIC_PAGE_PROPERTY, 'property_name': ( subtopic_page_domain.SUBTOPIC_PAGE_PROPERTY_HTML_DATA), 'old_value': '', 'subtopic_id': 1, 'new_value': '<p>New Value</p>' })] topic_services.update_topic_and_subtopic_pages( self.user_id_admin, self.TOPIC_ID, changelist, 'Updated html data') subtopic_page = subtopic_page_services.get_subtopic_page_by_id( self.TOPIC_ID, 1) self.assertEqual(subtopic_page.html_data, '<p>New Value</p>') # Test a sequence of changes with both topic and subtopic page changes. changelist = [ topic_domain.TopicChange({ 'cmd': topic_domain.CMD_ADD_SUBTOPIC, 'title': 'Title2', 'subtopic_id': 2 }), topic_domain.TopicChange({ 'cmd': topic_domain.CMD_DELETE_SUBTOPIC, 'subtopic_id': 1 }), subtopic_page_domain.SubtopicPageChange({ 'cmd': subtopic_page_domain.CMD_UPDATE_SUBTOPIC_PAGE_PROPERTY, 'property_name': ( subtopic_page_domain.SUBTOPIC_PAGE_PROPERTY_HTML_DATA), 'old_value': '', 'subtopic_id': 2, 'new_value': '<p>New Value</p>' }), topic_domain.TopicChange({ 'cmd': topic_domain.CMD_MOVE_SKILL_ID_TO_SUBTOPIC, 'old_subtopic_id': None, 'new_subtopic_id': 2, 'skill_id': self.skill_id_1 }) ] topic_services.update_topic_and_subtopic_pages( self.user_id_admin, self.TOPIC_ID, changelist, 'Added and removed a subtopic.') topic = topic_services.get_topic_by_id(self.TOPIC_ID) self.assertEqual(len(topic.subtopics), 1) self.assertEqual(topic.next_subtopic_id, 3) self.assertEqual(topic.subtopics[0].title, 'Title2') self.assertEqual(topic.subtopics[0].skill_ids, [self.skill_id_1]) # Test whether the subtopic page corresponding to the deleted subtopic # was also deleted. subtopic_page = subtopic_page_services.get_subtopic_page_by_id( self.TOPIC_ID, 1, strict=False) self.assertIsNone(subtopic_page) # Validate the newly created subtopic page. subtopic_page = subtopic_page_services.get_subtopic_page_by_id( self.TOPIC_ID, 2, strict=False) self.assertEqual(subtopic_page.html_data, '<p>New Value</p>') # Making sure everything resets when an error is encountered anywhere. changelist = [ topic_domain.TopicChange({ 'cmd': topic_domain.CMD_ADD_SUBTOPIC, 'title': 'Title3', 'subtopic_id': 3 }), topic_domain.TopicChange({ 'cmd': topic_domain.CMD_ADD_SUBTOPIC, 'title': 'Title4', 'subtopic_id': 4 }), topic_domain.TopicChange({ 'cmd': topic_domain.CMD_DELETE_SUBTOPIC, 'subtopic_id': 2 }), # The following is an invalid command as subtopic with id 2 was # deleted in previous step. subtopic_page_domain.SubtopicPageChange({ 'cmd': subtopic_page_domain.CMD_UPDATE_SUBTOPIC_PAGE_PROPERTY, 'property_name': ( subtopic_page_domain.SUBTOPIC_PAGE_PROPERTY_HTML_DATA), 'old_value': '', 'subtopic_id': 2, 'new_value': '<p>New Value</p>' }), ] with self.assertRaisesRegexp( Exception, 'The subtopic with id 2 doesn\'t exist'): topic_services.update_topic_and_subtopic_pages( self.user_id_admin, self.TOPIC_ID, changelist, 'Done some changes.') # Make sure the topic object in datastore is not affected. topic = topic_services.get_topic_by_id(self.TOPIC_ID) self.assertEqual(len(topic.subtopics), 1) self.assertEqual(topic.next_subtopic_id, 3) self.assertEqual(topic.subtopics[0].title, 'Title2') self.assertEqual(topic.subtopics[0].skill_ids, [self.skill_id_1]) subtopic_page = subtopic_page_services.get_subtopic_page_by_id( self.TOPIC_ID, 3, strict=False) self.assertIsNone(subtopic_page) subtopic_page = subtopic_page_services.get_subtopic_page_by_id( self.TOPIC_ID, 4, strict=False) self.assertIsNone(subtopic_page) subtopic_page = subtopic_page_services.get_subtopic_page_by_id( self.TOPIC_ID, 2, strict=False) self.assertIsNotNone(subtopic_page)
def test_get_subtopic_page_by_id(self): subtopic_page = subtopic_page_services.get_subtopic_page_by_id( self.TOPIC_ID, self.subtopic_id) self.assertEqual(subtopic_page.to_dict(), self.subtopic_page.to_dict())