Пример #1
0
 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)
Пример #2
0
 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, [])
Пример #3
0
 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))
Пример #4
0
 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)
Пример #5
0
    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)
Пример #7
0
    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)
Пример #8
0
    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.')
Пример #9
0
    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)
Пример #10
0
 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())