Example #1
0
    def test_get_questions_succeeds(self):
        for _ in python_utils.RANGE(0, 4):
            question_id = question_services.get_new_question_id()
            self.save_new_question(question_id, self.admin_id,
                                   self._create_valid_question_data('ABC'),
                                   [self.skill_id, self.skill_id_2])
            question_services.create_new_question_skill_link(
                self.admin_id, question_id, self.skill_id, 0.5)
            question_services.create_new_question_skill_link(
                self.admin_id, question_id, self.skill_id_2, 0.3)

        self.login(self.ADMIN_EMAIL)
        with self.swap(constants, 'NUM_QUESTIONS_PER_PAGE', 2):
            json_response = self.get_json('%s/%s,%s?cursor=' %
                                          (feconf.QUESTIONS_LIST_URL_PREFIX,
                                           self.skill_id, self.skill_id_2))
            question_summary_dicts = json_response['question_summary_dicts']
            self.assertEqual(len(question_summary_dicts), 2)
            next_start_cursor = json_response['next_start_cursor']
            json_response = self.get_json(
                '%s/%s,%s?cursor=%s' %
                (feconf.QUESTIONS_LIST_URL_PREFIX, self.skill_id,
                 self.skill_id_2, next_start_cursor))
            question_summary_dicts_2 = (
                json_response['question_summary_dicts'])
            self.assertEqual(len(question_summary_dicts_2), 2)
            for i in python_utils.RANGE(0, 2):
                self.assertEqual(
                    question_summary_dicts[i]['skill_descriptions'],
                    ['Skill Description 2', 'Skill Description'])
                self.assertEqual(
                    question_summary_dicts_2[i]['skill_descriptions'],
                    ['Skill Description 2', 'Skill Description'])
                self.assertEqual(question_summary_dicts[i]['skill_ids'],
                                 [self.skill_id_2, self.skill_id])
                self.assertEqual(question_summary_dicts_2[i]['skill_ids'],
                                 [self.skill_id_2, self.skill_id])
                self.assertEqual(
                    question_summary_dicts[i]['skill_difficulties'],
                    [0.3, 0.5])
                self.assertEqual(
                    question_summary_dicts_2[i]['skill_difficulties'],
                    [0.3, 0.5])
            json_response = self.get_json(
                '%s/%s?cursor=' %
                (feconf.QUESTIONS_LIST_URL_PREFIX, self.skill_id))
            question_summary_dicts_3 = (
                json_response['question_summary_dicts'])
            self.assertEqual(len(question_summary_dicts_3), 2)
            for i in python_utils.RANGE(0, 2):
                self.assertEqual(
                    question_summary_dicts_3[i]['skill_description'],
                    'Skill Description')
                self.assertEqual(question_summary_dicts_3[i]['skill_id'],
                                 self.skill_id)
                self.assertEqual(
                    question_summary_dicts_3[i]['skill_difficulty'], 0.5)
            self.assertNotEqual(question_summary_dicts[0]['summary']['id'],
                                question_summary_dicts_2[0]['summary']['id'])
        self.logout()
Example #2
0
    def setUp(self):
        super(OpportunityServicesIntegrationTest, self).setUp()
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        self.signup(self.OWNER_EMAIL, self.OWNER_USERNAME)

        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL)

        self.set_admins([self.ADMIN_USERNAME])
        self.admin = user_services.UserActionsInfo(self.admin_id)

        self.TOPIC_ID = 'topic'
        self.STORY_ID = 'story'
        self.USER_ID = 'user'
        self.SKILL_ID = 'skill'
        self.QUESTION_ID = question_services.get_new_question_id()
        explorations = [exp_domain.Exploration.create_default_exploration(
            '%s' % i,
            title='title %d' % i,
            category='category%d' % i,
        ) for i in python_utils.RANGE(5)]

        for exp in explorations:
            exp_services.save_new_exploration(self.owner_id, exp)

        topic = topic_domain.Topic.create_default_topic(
            topic_id=self.TOPIC_ID, name='topic')
        topic_services.save_new_topic(self.owner_id, topic)

        story = story_domain.Story.create_default_story(
            self.STORY_ID, title='A story',
            corresponding_topic_id=self.TOPIC_ID)
        story_services.save_new_story(self.owner_id, story)
        topic_services.add_canonical_story(
            self.owner_id, self.TOPIC_ID, self.STORY_ID)
Example #3
0
    def setUp(self):
        super(SkillOpportunityModelValidatorTests, self).setUp()

        self.job_class = (
            prod_validation_jobs_one_off.SkillOpportunityModelAuditOneOffJob)

        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        self.signup(self.OWNER_EMAIL, self.OWNER_USERNAME)

        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL)

        self.set_admins([self.ADMIN_USERNAME])
        self.admin = user_services.UserActionsInfo(self.admin_id)

        for i in python_utils.RANGE(3):
            skill_id = '%s' % i
            self.save_new_skill(skill_id,
                                self.admin_id,
                                description='description %d' % i)

        self.QUESTION_ID = question_services.get_new_question_id()
        self.save_new_question(self.QUESTION_ID, self.owner_id,
                               self._create_valid_question_data('ABC'), ['0'])
        question_services.create_new_question_skill_link(
            self.owner_id, self.QUESTION_ID, '0', 0.3)

        self.model_instance_0 = (
            opportunity_models.SkillOpportunityModel.get('0'))
        self.model_instance_1 = (
            opportunity_models.SkillOpportunityModel.get('1'))
        self.model_instance_2 = (
            opportunity_models.SkillOpportunityModel.get('2'))
Example #4
0
    def _generate_dummy_skill_and_questions(self):
        """Generate and loads the database with a skill and 15 questions
        linked to the skill.

        Raises:
            Exception. Cannot load new structures data in production mode.
            Exception. User does not have enough rights to generate data.
        """
        if constants.DEV_MODE:
            if self.user.role != feconf.ROLE_ID_ADMIN:
                raise Exception(
                    'User does not have enough rights to generate data.')
            skill_id = skill_services.get_new_skill_id()
            skill_name = 'Dummy Skill %s' % python_utils.UNICODE(
                random.getrandbits(32))
            skill = self._create_dummy_skill(
                skill_id, skill_name, '<p>Dummy Explanation 1</p>')
            skill_services.save_new_skill(self.user_id, skill)
            for i in python_utils.RANGE(15):
                question_id = question_services.get_new_question_id()
                question_name = 'Question number %s %s' % (
                    python_utils.UNICODE(i), skill_name)
                question = self._create_dummy_question(
                    question_id, question_name, [skill_id])
                question_services.add_question(self.user_id, question)
                question_difficulty = list(
                    constants.SKILL_DIFFICULTY_LABEL_TO_FLOAT.values())
                random_difficulty = random.choice(question_difficulty)
                question_services.create_new_question_skill_link(
                    self.user_id, question_id, skill_id, random_difficulty)
        else:
            raise Exception('Cannot generate dummy skills in production.')
Example #5
0
    def setUp(self):
        """Before each individual test, create dummy user."""
        super(QuestionServicesUnitTest, self).setUp()
        self.signup(self.TOPIC_MANAGER_EMAIL, self.TOPIC_MANAGER_USERNAME)
        self.signup(self.NEW_USER_EMAIL, self.NEW_USER_USERNAME)
        self.signup(self.EDITOR_EMAIL, self.EDITOR_USERNAME)
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)

        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.topic_manager_id = self.get_user_id_from_email(
            self.TOPIC_MANAGER_EMAIL)
        self.new_user_id = self.get_user_id_from_email(self.NEW_USER_EMAIL)
        self.editor_id = self.get_user_id_from_email(self.EDITOR_EMAIL)

        self.set_admins([self.ADMIN_USERNAME])
        self.set_topic_managers([self.TOPIC_MANAGER_USERNAME])

        self.topic_manager = user_services.UserActionsInfo(
            self.topic_manager_id)
        self.admin = user_services.UserActionsInfo(self.admin_id)
        self.new_user = user_services.UserActionsInfo(self.new_user_id)
        self.editor = user_services.UserActionsInfo(self.editor_id)

        self.question_id = question_services.get_new_question_id()
        self.question = self.save_new_question(
            self.question_id, self.editor_id,
            self._create_valid_question_data('ABC'))
Example #6
0
    def accept(self, unused_commit_message):
        """Accepts the suggestion.

        Args:
            unused_commit_message: str. This parameter is passed in for
                consistency with the existing suggestions. As a default commit
                message is used in the add_question function, the arg is unused.
        """
        question_dict = self.change.question_dict
        question_dict['version'] = 1
        question_dict['id'] = (question_services.get_new_question_id())
        question_dict['linked_skill_ids'] = [self.change.skill_id]
        question = question_domain.Question.from_dict(question_dict)
        question.validate()

        self._copy_new_images_to_target_entity_storage()

        question_services.add_question(self.author_id, question)

        skill = skill_fetchers.get_skill_by_id(self.change.skill_id,
                                               strict=False)
        if skill is None:
            raise utils.ValidationError(
                'The skill with the given id doesn\'t exist.')
        question_services.create_new_question_skill_link(
            self.author_id, question_dict['id'], self.change.skill_id,
            self._get_skill_difficulty())
Example #7
0
    def accept(self, unused_commit_message):
        """Accepts the suggestion.

        Args:
            unused_commit_message: str. This parameter is passed in for
                consistency with the existing suggestions. As a default commit
                message is used in the add_question function, the arg is unused.
        """
        question_dict = self.change.question_dict
        question_dict['version'] = 1
        question_dict['id'] = (question_services.get_new_question_id())
        html_list = self.get_all_html_content_strings()
        filenames = (
            html_cleaner.get_image_filenames_from_html_strings(html_list))
        image_context = fs_services.get_image_context_for_suggestion_target(
            self.target_type)
        fs_services.copy_images(image_context, self.target_id,
                                feconf.ENTITY_TYPE_QUESTION, self.target_id,
                                filenames)

        question_dict['linked_skill_ids'] = [self.change.skill_id]
        question = question_domain.Question.from_dict(question_dict)
        question.validate()
        question_services.add_question(self.author_id, question)
        skill = skill_fetchers.get_skill_by_id(self.change.skill_id,
                                               strict=False)
        if skill is None:
            raise utils.ValidationError(
                'The skill with the given id doesn\'t exist.')
        question_services.create_new_question_skill_link(
            self.author_id, question_dict['id'], self.change.skill_id,
            self._get_skill_difficulty())
Example #8
0
 def test_linking_same_skill_to_question_twice(self):
     question_id_2 = question_services.get_new_question_id()
     self.save_new_question(question_id_2, self.editor_id,
                            self._create_valid_question_data('ABC'),
                            ['skill_1'])
     skill_ids = [
         skill.id for skill in
         question_services.get_skills_linked_to_question(question_id_2)
     ]
     self.assertEqual(len(skill_ids), 1)
     self.assertEqual(skill_ids[0], 'skill_1')
     question_services.create_new_question_skill_link(
         self.editor_id, question_id_2, 'skill_1', 0.3)
     skill_ids = [
         skill.id for skill in
         question_services.get_skills_linked_to_question(question_id_2)
     ]
     self.assertEqual(len(skill_ids), 1)
     self.assertEqual(skill_ids[0], 'skill_1')
     question_services.create_new_question_skill_link(
         self.editor_id, question_id_2, 'skill_2', 0.3)
     skill_ids = [
         skill.id for skill in
         question_services.get_skills_linked_to_question(question_id_2)
     ]
     self.assertEqual(len(skill_ids), 2)
     self.assertItemsEqual(skill_ids, ['skill_1', 'skill_2'])
Example #9
0
    def test_cannot_get_question_from_model_with_invalid_schema_version(self):
        # Delete all question models.
        all_question_models = question_models.QuestionModel.get_all()
        question_models.QuestionModel.delete_multi(all_question_models)

        all_question_models = question_models.QuestionModel.get_all()
        self.assertEqual(all_question_models.count(), 0)

        question_id = question_services.get_new_question_id()

        question_model = question_models.QuestionModel(
            id=question_id,
            question_state_data=(
                self._create_valid_question_data('ABC').to_dict()),
            language_code='en',
            version=0,
            question_state_data_schema_version=0)

        question_model.commit(self.editor_id, 'question model created',
                              [{
                                  'cmd': question_domain.CMD_CREATE_NEW
                              }])

        all_question_models = question_models.QuestionModel.get_all()
        self.assertEqual(all_question_models.count(), 1)
        question_model = all_question_models.get()

        with self.assertRaisesRegexp(
                Exception,
                'Sorry, we can only process v25-v%d state schemas at present.'
                % feconf.CURRENT_STATE_SCHEMA_VERSION):
            question_services.get_question_from_model(question_model)
Example #10
0
    def post(self, skill_id):
        """Handles POST requests."""
        if not constants.ENABLE_NEW_STRUCTURE_EDITORS:
            raise self.PageNotFoundException

        skill_domain.Skill.require_valid_skill_id(skill_id)
        skill = skill_services.get_skill_by_id(skill_id, strict=False)
        if skill is None:
            raise self.PageNotFoundException(
                'The skill with the given id doesn\'t exist.')

        question_dict = self.payload.get('question_dict')
        if (
                (question_dict['id'] is not None) or
                ('question_state_data' not in question_dict) or
                ('language_code' not in question_dict) or
                (question_dict['version'] != 1) or
                (question_dict['question_state_schema_version'] != (
                    feconf.CURRENT_STATES_SCHEMA_VERSION))):
            raise self.InvalidInputException


        question_dict['id'] = question_services.get_new_question_id()
        question = question_domain.Question.from_dict(question_dict)
        question_services.add_question(self.user_id, question)
        question_services.create_new_question_skill_link(
            question.id, skill_id)
        self.values.update({
            'question_id': question.id
        })
        self.render_json(self.values)
Example #11
0
    def post(self, skill_id):
        """Handles POST requests."""
        skill_domain.Skill.require_valid_skill_id(skill_id)
        skill = skill_services.get_skill_by_id(skill_id, strict=False)
        if skill is None:
            raise self.PageNotFoundException(
                'The skill with the given id doesn\'t exist.')

        question_dict = self.payload.get('question_dict')
        if ((question_dict['id'] is not None)
                or ('question_state_data' not in question_dict)
                or ('language_code' not in question_dict)
                or (question_dict['version'] != 1)):
            raise self.InvalidInputException

        question_dict['question_state_data_schema_version'] = (
            feconf.CURRENT_STATE_SCHEMA_VERSION)
        question_dict['id'] = question_services.get_new_question_id()
        try:
            question = question_domain.Question.from_dict(question_dict)
        except:
            raise self.InvalidInputException
        question_services.add_question(self.user_id, question)
        # TODO(vinitamurthi): Replace DEFAULT_SKILL_DIFFICULTY
        # with a value passed from the frontend.
        question_services.create_new_question_skill_link(
            question.id, skill_id, constants.DEFAULT_SKILL_DIFFICULTY)
        self.values.update({'question_id': question.id})
        self.render_json(self.values)
Example #12
0
    def setUp(self):
        """Completes the sign-up process for the various users."""
        super(BaseQuestionEditorControllerTests, self).setUp()
        self.signup(self.TOPIC_MANAGER_EMAIL, self.TOPIC_MANAGER_USERNAME)
        self.signup(self.NEW_USER_EMAIL, self.NEW_USER_USERNAME)
        self.signup(self.EDITOR_EMAIL, self.EDITOR_USERNAME)
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)

        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.topic_manager_id = self.get_user_id_from_email(
            self.TOPIC_MANAGER_EMAIL)
        self.new_user_id = self.get_user_id_from_email(self.NEW_USER_EMAIL)
        self.editor_id = self.get_user_id_from_email(self.EDITOR_EMAIL)

        self.set_admins([self.ADMIN_USERNAME])
        self.set_topic_managers([self.TOPIC_MANAGER_USERNAME])

        self.topic_manager = user_services.UserActionsInfo(
            self.topic_manager_id)
        self.admin = user_services.UserActionsInfo(self.admin_id)
        self.new_user = user_services.UserActionsInfo(self.new_user_id)
        self.editor = user_services.UserActionsInfo(self.editor_id)

        self.skill_id = skill_services.get_new_skill_id()
        self.save_new_skill(self.skill_id,
                            self.admin_id,
                            description='Skill Description')

        self.question_id = question_services.get_new_question_id()
        self.question = self.save_new_question(
            self.question_id, self.editor_id,
            self._create_valid_question_data('ABC'), [self.skill_id])
Example #13
0
    def setUp(self):
        super(QuestionFetchersUnitTests, self).setUp()
        self.signup(self.EDITOR_EMAIL, self.EDITOR_USERNAME)
        self.signup(self.CURRICULUM_ADMIN_EMAIL,
                    self.CURRICULUM_ADMIN_USERNAME)

        self.admin_id = self.get_user_id_from_email(
            self.CURRICULUM_ADMIN_EMAIL)
        self.editor_id = self.get_user_id_from_email(self.EDITOR_EMAIL)

        self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME])

        self.admin = user_services.get_user_actions_info(self.admin_id)
        self.editor = user_services.get_user_actions_info(self.editor_id)

        self.save_new_skill('skill_1',
                            self.admin_id,
                            description='Skill Description 1')
        self.save_new_skill('skill_2',
                            self.admin_id,
                            description='Skill Description 2')

        self.question_id = question_services.get_new_question_id()
        self.question = self.save_new_question(
            self.question_id, self.editor_id,
            self._create_valid_question_data('ABC'), ['skill_1'])
Example #14
0
    def test_get_question_from_model_with_current_valid_schema_version(self):
        # Delete all question models.
        all_question_models = question_models.QuestionModel.get_all()
        question_models.QuestionModel.delete_multi(
            [question_model.id for question_model in all_question_models],
            feconf.SYSTEM_COMMITTER_ID,
            '',
            force_deletion=True)

        all_question_models = question_models.QuestionModel.get_all()
        self.assertEqual(all_question_models.count(), 0)

        question_id = question_services.get_new_question_id()

        question_model = question_models.QuestionModel(
            id=question_id,
            question_state_data=(
                self._create_valid_question_data('ABC').to_dict()),
            language_code='en',
            version=0,
            question_state_data_schema_version=48)

        question_model.commit(self.editor_id, 'question model created',
                              [{
                                  'cmd': question_domain.CMD_CREATE_NEW
                              }])

        all_question_models = question_models.QuestionModel.get_all()
        self.assertEqual(all_question_models.count(), 1)
        question_model = all_question_models.get()
        updated_question_model = question_fetchers.get_question_from_model(
            question_model)
        self.assertEqual(
            updated_question_model.question_state_data_schema_version,
            feconf.CURRENT_STATE_SCHEMA_VERSION)
Example #15
0
    def test_get_question_skill_links_of_skill(self):
        # If the skill id doesnt exist at all, it returns an empty list.
        question_skill_links = (
            question_services.get_question_skill_links_of_skill(
                'non_existent_skill_id', 'Skill Description'))
        self.assertEqual(len(question_skill_links), 0)

        # If the question ids dont exist for a skill, it returns an empty list.
        question_skill_links = (
            question_services.get_question_skill_links_of_skill(
                'skill_1', 'Skill Description 1'))
        self.assertEqual(len(question_skill_links), 0)

        question_id_2 = question_services.get_new_question_id()
        self.save_new_question(question_id_2, self.editor_id,
                               self._create_valid_question_data('ABC'),
                               ['skill_1'])

        question_id_3 = question_services.get_new_question_id()
        self.save_new_question(question_id_3, self.editor_id,
                               self._create_valid_question_data('ABC'),
                               ['skill_2'])
        # Setting skill difficulty for self.question_id.
        question_services.create_new_question_skill_link(
            self.editor_id, self.question_id, 'skill_1', 0.5)
        question_services.create_new_question_skill_link(
            self.editor_id, question_id_2, 'skill_1', 0.3)
        question_services.create_new_question_skill_link(
            self.editor_id, question_id_3, 'skill_2', 0.1)

        # When question ids exist, it returns a list of questionskilllinks.
        question_skill_links = (
            question_services.get_question_skill_links_of_skill(
                'skill_1', 'Skill Description 1'))

        self.assertEqual(len(question_skill_links), 2)
        self.assertTrue(
            isinstance(question_skill_links[0],
                       question_domain.QuestionSkillLink))
        question_ids = [
            question_skill.question_id
            for question_skill in question_skill_links
        ]
        self.assertItemsEqual(question_ids, [self.question_id, question_id_2])
        for question_skill in question_skill_links:
            if question_skill.question_id == self.question_id:
                self.assertEqual(question_skill.skill_difficulty, 0.5)
Example #16
0
 def setUp(self):
     """Completes the setup for QuestionSkillLinkHandlerTest."""
     super(QuestionSkillLinkHandlerTest, self).setUp()
     self.skill_id = skill_services.get_new_skill_id()
     self.save_new_skill(self.skill_id, self.admin_id, 'Skill Description')
     self.question_id_2 = question_services.get_new_question_id()
     self.save_new_question(self.question_id_2, self.editor_id,
                            self._create_valid_question_data('ABC'))
Example #17
0
    def setUp(self):
        super(VoiceoverApplicationServicesUnitTests, self).setUp()
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        self.signup(self.OWNER_EMAIL, self.OWNER_USERNAME)
        self.signup(self.APPLICANT_EMAIL, self.APPLICANT_USERNAME)

        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL)
        self.applicant_id = self.get_user_id_from_email(self.APPLICANT_EMAIL)

        self.applicant = user_services.UserActionsInfo(self.applicant_id)

        self.set_admins([self.ADMIN_USERNAME])
        self.admin = user_services.UserActionsInfo(self.admin_id)

        self.TOPIC_ID = 'topic'
        self.STORY_ID = 'story'
        self.USER_ID = 'user'
        self.SKILL_ID = 'skill'
        self.QUESTION_ID = question_services.get_new_question_id()
        explorations = [
            self.save_new_valid_exploration('%s' % i,
                                            self.owner_id,
                                            title='title %d' % i,
                                            category='category%d' % i,
                                            end_state_name='End State')
            for i in python_utils.RANGE(2)
        ]

        for exp in explorations:
            self.publish_exploration(self.owner_id, exp.id)

        topic = topic_domain.Topic.create_default_topic(
            self.TOPIC_ID, 'topic', 'abbrev', 'description')
        topic_services.save_new_topic(self.owner_id, topic)

        story = story_domain.Story.create_default_story(
            self.STORY_ID,
            title='A story',
            corresponding_topic_id=self.TOPIC_ID)
        story_services.save_new_story(self.owner_id, story)
        topic_services.add_canonical_story(self.owner_id, self.TOPIC_ID,
                                           self.STORY_ID)
        story_services.update_story(self.owner_id, self.STORY_ID, [
            story_domain.StoryChange({
                'cmd': 'add_story_node',
                'node_id': 'node_1',
                'title': 'Node1',
            }),
            story_domain.StoryChange({
                'cmd': 'update_story_node_property',
                'property_name': 'exploration_id',
                'node_id': 'node_1',
                'old_value': None,
                'new_value': '0'
            })
        ], 'Changes.')
Example #18
0
    def test_create_and_get_question_skill_link(self):
        question_id_2 = question_services.get_new_question_id()
        self.save_new_question(
            question_id_2, self.editor_id,
            self._create_valid_question_data('ABC'))

        question_id_3 = question_services.get_new_question_id()
        self.save_new_question(
            question_id_3, self.editor_id,
            self._create_valid_question_data('ABC'))
        question_services.create_new_question_skill_link(
            self.question_id, 'skill_1')
        question_services.create_new_question_skill_link(
            question_id_2, 'skill_1')
        question_services.create_new_question_skill_link(
            question_id_3, 'skill_2')

        question_summaries, _ = (
            question_services.get_question_summaries_linked_to_skills(
                5, ['skill_1', 'skill_2', 'skill_3'], ''))

        with self.assertRaisesRegexp(
            Exception, 'Querying linked question summaries for more than 3 '
            'skills at a time is not supported currently.'):
            question_services.get_question_summaries_linked_to_skills(
                5, ['skill_1', 'skill_2', 'skill_3', 'skill_4'], '')
        question_ids = [summary.id for summary in question_summaries]
        self.assertEqual(len(question_ids), 3)
        self.assertItemsEqual(
            question_ids, [self.question_id, question_id_2, question_id_3])

        question_summaries, _ = (
            question_services.get_question_summaries_linked_to_skills(
                5, ['skill_1', 'skill_3'], ''))
        question_ids = [summary.id for summary in question_summaries]
        self.assertEqual(len(question_ids), 2)
        self.assertItemsEqual(
            question_ids, [self.question_id, question_id_2])

        with self.assertRaisesRegexp(
            Exception, 'The given question is already linked to given skill'):
            question_services.create_new_question_skill_link(
                self.question_id, 'skill_1')
Example #19
0
    def test_update_skill_ids_of_questions(self):
        question_id_2 = question_services.get_new_question_id()
        self.save_new_question(question_id_2, self.editor_id,
                               self._create_valid_question_data('ABC'))

        question_id_3 = question_services.get_new_question_id()
        self.save_new_question(question_id_3, self.editor_id,
                               self._create_valid_question_data('ABC'))
        question_services.create_new_question_skill_link(
            self.question_id, 'skill_1')
        question_services.create_new_question_skill_link(
            question_id_2, 'skill_1')
        question_services.create_new_question_skill_link(
            question_id_3, 'skill_2')

        question_skill_links = (
            question_services.get_question_skill_links_of_skill(
                'skill_1', 'Skill Description 1'))

        self.assertEqual(len(question_skill_links), 2)
        question_ids = [
            question_skill.question_id
            for question_skill in question_skill_links
        ]
        self.assertItemsEqual(question_ids, [self.question_id, question_id_2])

        question_services.update_skill_ids_of_questions(
            'skill_1', 'Description 1', 'skill_3')

        question_skill_links = (
            question_services.get_question_skill_links_of_skill(
                'skill_1', 'Description 1'))

        self.assertEqual(len(question_skill_links), 0)
        question_skill_links = (
            question_services.get_question_skill_links_of_skill(
                'skill_3', 'Skill Description 3'))

        question_ids = [
            question_skill.question_id
            for question_skill in question_skill_links
        ]
        self.assertItemsEqual(question_ids, [self.question_id, question_id_2])
Example #20
0
    def setUp(self):
        super(MergeSkillHandlerTests, self).setUp()
        self.url = feconf.MERGE_SKILLS_URL

        self.question_id = question_services.get_new_question_id()
        self.question = self.save_new_question(
            self.question_id, self.admin_id,
            self._create_valid_question_data('ABC'), [self.linked_skill_id])
        question_services.create_new_question_skill_link(
            self.admin_id, self.question_id, self.linked_skill_id, 0.5)
Example #21
0
 def test_get_questions_by_ids(self):
     question_id_2 = question_services.get_new_question_id()
     self.save_new_question(question_id_2, self.editor_id,
                            self._create_valid_question_data('DEF'))
     questions = question_services.get_questions_by_ids(
         [self.question_id, 'invalid_question_id', question_id_2])
     self.assertEqual(len(questions), 3)
     self.assertEqual(questions[0].id, self.question_id)
     self.assertIsNone(questions[1])
     self.assertEqual(questions[2].id, question_id_2)
Example #22
0
    def test_get(self):
        # Create 5 questions linked to the same skill.
        for i in range(0, 3):  #pylint: disable=unused-variable
            question_id = question_services.get_new_question_id()
            self.save_new_question(question_id, self.admin_id,
                                   self._create_valid_question_data('ABC'))
            question_services.create_new_question_skill_link(
                question_id, self.skill_id)

        with self.swap(constants, 'ENABLE_NEW_STRUCTURES', True):
            self.login(self.ADMIN_EMAIL)
            with self.swap(constants, 'NUM_QUESTIONS_PER_PAGE', 1):
                json_response = self.get_json(
                    '%s/%s?cursor=' %
                    (feconf.TOPIC_EDITOR_QUESTION_URL, self.topic_id))
                question_summary_dicts = json_response[
                    'question_summary_dicts']
                self.assertEqual(len(question_summary_dicts), 1)
                next_start_cursor = json_response['next_start_cursor']
                json_response = self.get_json(
                    '%s/%s?cursor=%s' % (feconf.TOPIC_EDITOR_QUESTION_URL,
                                         self.topic_id, next_start_cursor))
                question_summary_dicts_2 = (
                    json_response['question_summary_dicts'])
                self.assertEqual(len(question_summary_dicts_2), 1)
                self.assertNotEqual(question_summary_dicts[0]['id'],
                                    question_summary_dicts_2[0]['id'])
            self.logout()

            self.login(self.TOPIC_MANAGER_EMAIL)
            response = self.testapp.get(
                '%s/%s?cursor=' %
                (feconf.TOPIC_EDITOR_QUESTION_URL, self.topic_id))
            self.assertEqual(response.status_int, 200)
            self.logout()

            topic_services.assign_role(self.admin, self.topic_manager,
                                       topic_domain.ROLE_MANAGER,
                                       self.topic_id)

            self.login(self.TOPIC_MANAGER_EMAIL)
            json_response = self.get_json(
                '%s/%s' % (feconf.TOPIC_EDITOR_QUESTION_URL, self.topic_id))
            question_summary_dicts = json_response['question_summary_dicts']
            self.assertEqual(len(question_summary_dicts), 3)
            self.logout()

            self.login(self.NEW_USER_EMAIL)
            response = self.testapp.get(
                '%s/%s?cursor=' %
                (feconf.TOPIC_EDITOR_QUESTION_URL, self.topic_id),
                expect_errors=True)
            self.assertEqual(response.status_int, 401)
            self.logout()
    def test_get_question_count_succeeds(self):
        self.login(self.CURRICULUM_ADMIN_EMAIL)
        question_id = question_services.get_new_question_id()
        question_id_1 = question_services.get_new_question_id()

        self.save_new_question(
            question_id, self.admin_id,
            self._create_valid_question_data('ABC'),
            [self.skill_id])

        self.save_new_question(
            question_id_1, self.admin_id,
            self._create_valid_question_data('ABC2'),
            [self.skill_id_2])

        question_services.create_new_question_skill_link(
            self.admin_id, question_id, self.skill_id, 0.5)
        question_services.create_new_question_skill_link(
            self.admin_id, question_id_1, self.skill_id_2, 0.3)

        json_response = self.get_json(
            '%s/%s,%s' % (
                feconf.QUESTION_COUNT_URL_PREFIX,
                self.skill_id, self.skill_id_2
            ))
        self.assertEqual(json_response['total_question_count'], 2)

        json_response = self.get_json(
            '%s/%s' % (
                feconf.QUESTION_COUNT_URL_PREFIX,
                self.skill_id
            ))
        self.assertEqual(json_response['total_question_count'], 1)

        json_response = self.get_json(
            '%s/%s' % (
                feconf.QUESTION_COUNT_URL_PREFIX,
                self.skill_id_2
            ))
        self.assertEqual(json_response['total_question_count'], 1)
Example #24
0
 def test_get_with_twenty_or_more_questions(self):
     number_of_questions = 50
     self.topic_id = 'new_topic'
     self.skill_id_1 = skill_services.get_new_skill_id()
     self.skill_id_2 = skill_services.get_new_skill_id()
     self.topic = topic_domain.Topic.create_default_topic(
         self.topic_id, 'new_topic', 'new-topic', 'description', 'fragm')
     self.topic.uncategorized_skill_ids.append(self.skill_id_1)
     self.topic.thumbnail_filename = 'Image.svg'
     self.topic.thumbnail_bg_color = (
         constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0])
     self.topic.practice_tab_is_displayed = True
     subtopic_1 = topic_domain.Subtopic.create_default_subtopic(
         1, 'Subtopic Title 1', 'url-frag-one')
     subtopic_1.skill_ids = [self.skill_id_2]
     subtopic_1.url_fragment = 'sub-one-frag'
     self.topic.subtopics = [subtopic_1]
     self.topic.next_subtopic_id = 2
     self.topic.skill_ids_for_diagnostic_test = [self.skill_id_2]
     topic_services.save_new_topic(self.admin_id, self.topic)
     topic_services.publish_topic(self.topic_id, self.admin_id)
     self.save_new_skill(self.skill_id_1,
                         self.admin_id,
                         description='Skill Description 1')
     for index in range(number_of_questions):
         question_id = question_services.get_new_question_id()
         self.save_new_question(question_id, self.admin_id,
                                self._create_valid_question_data(index),
                                [self.skill_id_1])
         question_services.create_new_question_skill_link(
             self.admin_id, question_id, self.skill_id_1, 0.5)
     json_response = self.get_json('%s/staging/%s' %
                                   (feconf.TOPIC_DATA_HANDLER, 'new-topic'))
     expected_dict = {
         'topic_name': 'new_topic',
         'topic_id': self.topic_id,
         'canonical_story_dicts': [],
         'additional_story_dicts': [],
         'uncategorized_skill_ids': [self.skill_id_1],
         'subtopics': [subtopic_1.to_dict()],
         'degrees_of_mastery': {
             self.skill_id_1: None,
             self.skill_id_2: None
         },
         'skill_descriptions': {
             self.skill_id_1: 'Skill Description 1',
             self.skill_id_2: None
         },
         'practice_tab_is_displayed': True
     }
     self.assertDictContainsSubset(expected_dict, json_response)
     self.logout()
Example #25
0
    def test_get_question_skill_links_of_skill(self):
        # If the skill id doesnt exist at all, it returns an empty list.
        question_skill_links = (
            question_services.get_question_skill_links_of_skill(
                'non_existent_skill_id'))
        self.assertEqual(len(question_skill_links), 0)

        # If the question ids dont exist for a skill, it returns an empty list.
        question_skill_links = (
            question_services.get_question_skill_links_of_skill('skill_1'))
        self.assertEqual(len(question_skill_links), 0)

        question_id_2 = question_services.get_new_question_id()
        self.save_new_question(question_id_2, self.editor_id,
                               self._create_valid_question_data('ABC'))

        question_id_3 = question_services.get_new_question_id()
        self.save_new_question(question_id_3, self.editor_id,
                               self._create_valid_question_data('ABC'))
        question_services.create_new_question_skill_link(
            self.question_id, 'skill_1')
        question_services.create_new_question_skill_link(
            question_id_2, 'skill_1')
        question_services.create_new_question_skill_link(
            question_id_3, 'skill_2')

        # When question ids exist, it returns a list of questionskilllinks.
        question_skill_links = (
            question_services.get_question_skill_links_of_skill('skill_1'))

        self.assertEqual(len(question_skill_links), 2)
        self.assertTrue(
            isinstance(question_skill_links[0],
                       question_domain.QuestionSkillLink))
        question_ids = [
            question_skill.question_id
            for question_skill in question_skill_links
        ]
        self.assertItemsEqual(question_ids, [self.question_id, question_id_2])
    def test_get_with_more_questions_with_fifty_or_more_skills(self):
        number_of_skills = 60
        number_of_questions = [0] * 60
        number_of_questions[46] = 2
        number_of_questions[20] = 3
        number_of_questions[29] = 10
        self.topic_id = 'new_topic'
        skill_ids = ([
            skill_services.get_new_skill_id()
            for _ in python_utils.RANGE(number_of_skills)
        ])
        self.topic = topic_domain.Topic.create_default_topic(
            self.topic_id, 'new_topic', 'new-topic', 'description')
        for index in python_utils.RANGE(number_of_skills):
            self.topic.uncategorized_skill_ids.append(skill_ids[index])
        self.topic.thumbnail_filename = 'Image.svg'
        self.topic.thumbnail_bg_color = (
            constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0])
        self.topic.practice_tab_is_displayed = True
        subtopic_1 = topic_domain.Subtopic.create_default_subtopic(
            1, 'Subtopic Title 1')
        subtopic_1.skill_ids = ['skill_id_1']
        subtopic_1.url_fragment = 'sub-one-frag'
        self.topic.subtopics = [subtopic_1]
        self.topic.next_subtopic_id = 2
        topic_services.save_new_topic(self.admin_id, self.topic)
        topic_services.publish_topic(self.topic_id, self.admin_id)
        for i in python_utils.RANGE(number_of_skills):
            self.save_new_skill(skill_ids[i],
                                self.admin_id,
                                description='Skill Description')
        for i in python_utils.RANGE(number_of_skills):
            for j in python_utils.RANGE(number_of_questions[i]):
                question_id = question_services.get_new_question_id()
                self.save_new_question(question_id, self.admin_id,
                                       self._create_valid_question_data(j),
                                       [skill_ids[i]])
                question_services.create_new_question_skill_link(
                    self.admin_id, question_id, skill_ids[i], 0.5)

        json_response = self.get_json('%s/staging/%s' %
                                      (feconf.TOPIC_DATA_HANDLER, 'new-topic'))
        expected_dict = {
            'topic_name': 'new_topic',
            'topic_id': self.topic_id,
            'canonical_story_dicts': [],
            'additional_story_dicts': [],
            'practice_tab_is_displayed': True
        }
        self.assertDictContainsSubset(expected_dict, json_response)
        self.logout()
Example #27
0
 def test_get_questions_with_multi_skill_ids(self):
     question_id_1 = question_services.get_new_question_id()
     question_1 = self.save_new_question(
         question_id_1, self.editor_id,
         self._create_valid_question_data('ABC'), ['skill_1', 'skill_2'])
     question_services.create_new_question_skill_link(
         self.editor_id, question_id_1, 'skill_1', 0.3)
     question_services.create_new_question_skill_link(
         self.editor_id, question_id_1, 'skill_2', 0.5)
     questions, _, _ = (question_services.
                        get_questions_and_skill_descriptions_by_skill_ids(
                            2, ['skill_1', 'skill_2'], ''))
     self.assertEqual(len(questions), 1)
     self.assertEqual(questions[0].to_dict(), question_1.to_dict())
Example #28
0
    def setUp(self):
        """Completes the sign-up process for the various users."""
        super(BaseQuestionEditorControllerTests, self).setUp()
        self.signup(self.TOPIC_MANAGER_EMAIL, self.TOPIC_MANAGER_USERNAME)
        self.signup(self.NEW_USER_EMAIL, self.NEW_USER_USERNAME)
        self.signup(self.EDITOR_EMAIL, self.EDITOR_USERNAME)
        self.signup(self.CURRICULUM_ADMIN_EMAIL,
                    self.CURRICULUM_ADMIN_USERNAME)

        self.admin_id = self.get_user_id_from_email(
            self.CURRICULUM_ADMIN_EMAIL)
        self.topic_manager_id = self.get_user_id_from_email(
            self.TOPIC_MANAGER_EMAIL)
        self.new_user_id = self.get_user_id_from_email(self.NEW_USER_EMAIL)
        self.editor_id = self.get_user_id_from_email(self.EDITOR_EMAIL)

        self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME])

        self.topic_id = topic_fetchers.get_new_topic_id()
        subtopic_1 = topic_domain.Subtopic.create_default_subtopic(
            1, 'Subtopic Title 1')
        subtopic_1.skill_ids = ['skill_id_1']
        subtopic_1.url_fragment = 'sub-one-frag'
        self.save_new_topic(self.topic_id,
                            self.admin_id,
                            name='Name',
                            description='Description',
                            canonical_story_ids=[],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[],
                            subtopics=[subtopic_1],
                            next_subtopic_id=2)
        self.set_topic_managers([self.TOPIC_MANAGER_USERNAME], self.topic_id)

        self.topic_manager = user_services.get_user_actions_info(
            self.topic_manager_id)
        self.admin = user_services.get_user_actions_info(self.admin_id)
        self.new_user = user_services.get_user_actions_info(self.new_user_id)
        self.editor = user_services.get_user_actions_info(self.editor_id)

        self.skill_id = skill_services.get_new_skill_id()
        self.save_new_skill(self.skill_id,
                            self.admin_id,
                            description='Skill Description')

        self.question_id = question_services.get_new_question_id()
        self.question = self.save_new_question(
            self.question_id, self.editor_id,
            self._create_valid_question_data('ABC'), [self.skill_id])
Example #29
0
    def test_get_question_summaries_and_skill_descriptions_with_no_skill_ids(
            self):
        question_id = question_services.get_new_question_id()
        self.save_new_question(question_id, self.editor_id,
                               self._create_valid_question_data('ABC'))

        question_services.create_new_question_skill_link(
            question_id, 'skill_1', 0.5)

        question_summaries, skill_descriptions, _ = (
            question_services.get_question_summaries_and_skill_descriptions(
                2, [], ''))

        self.assertEqual(question_summaries, [])
        self.assertEqual(skill_descriptions, [])
Example #30
0
    def setUp(self):
        super(OpportunityServicesIntegrationTest, self).setUp()
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        self.signup(self.OWNER_EMAIL, self.OWNER_USERNAME)

        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL)

        self.set_admins([self.ADMIN_USERNAME])
        self.admin = user_services.UserActionsInfo(self.admin_id)

        self.TOPIC_ID = 'topic'
        self.STORY_ID = 'story'
        self.USER_ID = 'user'
        self.SKILL_ID = 'skill'
        self.QUESTION_ID = question_services.get_new_question_id()
        self.THREAD_ID = 'exploration.exp1.thread_1'

        # Since a valid exploration is created here, it has EndExploration
        # state as well, so the content in that has to be taken into account as
        # well when checking content_count in the tests.
        explorations = [
            self.save_new_valid_exploration('%s' % i,
                                            self.owner_id,
                                            title='title %d' % i,
                                            category='category%d' % i,
                                            end_state_name='End State')
            for i in python_utils.RANGE(5)
        ]

        for exp in explorations:
            self.publish_exploration(self.owner_id, exp.id)

        topic = topic_domain.Topic.create_default_topic(
            self.TOPIC_ID, 'topic', 'abbrev', 'description')
        topic.thumbnail_filename = 'thumbnail.svg'
        topic.thumbnail_bg_color = '#C6DCDA'
        topic_services.save_new_topic(self.owner_id, topic)
        topic_services.publish_topic(self.TOPIC_ID, self.admin_id)

        story = story_domain.Story.create_default_story(
            self.STORY_ID, 'A story', 'description', self.TOPIC_ID,
            'story-one')
        story_services.save_new_story(self.owner_id, story)
        topic_services.add_canonical_story(self.owner_id, self.TOPIC_ID,
                                           self.STORY_ID)
        topic_services.publish_story(self.TOPIC_ID, self.STORY_ID,
                                     self.admin_id)