def test_delete(self): question_services.create_new_question_skill_link( self.question_id, self.skill_id) question_services.create_new_question_skill_link( self.question_id_2, self.skill_id) with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True): self.login(self.NEW_USER_EMAIL) self.delete_json('%s/%s/%s' % (feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id, self.skill_id), expected_status_int=401) self.logout() self.login(self.ADMIN_EMAIL) self.delete_json('%s/%s/%s' % (feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id, self.skill_id)) question_summaries, _ = ( question_services.get_question_summaries_linked_to_skills( 5, [self.skill_id], '')) self.assertEqual(len(question_summaries), 1) self.assertEqual(question_summaries[0].id, self.question_id_2) self.logout() self.login(self.TOPIC_MANAGER_EMAIL) self.delete_json('%s/%s/%s' % (feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id_2, self.skill_id)) question_summaries, _ = ( question_services.get_question_summaries_linked_to_skills( 5, [self.skill_id], '')) self.assertEqual(len(question_summaries), 0) self.logout()
def test_post(self): with self.swap(feconf, 'ENABLE_NEW_STRUCTURES', True): self.login(self.NEW_USER_EMAIL) response = self.testapp.get(feconf.CREATOR_DASHBOARD_URL) csrf_token = self.get_csrf_token_from_response(response) response = self.testapp.post( '%s/%s/%s' % ( feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id, self.skill_id ), expect_errors=True) self.assertEqual(response.status_int, 401) self.logout() self.login(self.ADMIN_EMAIL) response = self.testapp.get(feconf.CREATOR_DASHBOARD_URL) csrf_token = self.get_csrf_token_from_response(response) self.post_json( '%s/%s/%s' % ( feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id, self.skill_id ), {}, csrf_token=csrf_token, expect_errors=False, expected_status_int=200) question_summaries, _ = ( question_services.get_question_summaries_linked_to_skills( 5, [self.skill_id], '')) self.assertEqual(len(question_summaries), 1) self.assertEqual(question_summaries[0].id, self.question_id) self.logout() self.login(self.TOPIC_MANAGER_EMAIL) response = self.testapp.get(feconf.CREATOR_DASHBOARD_URL) csrf_token = self.get_csrf_token_from_response(response) self.post_json( '%s/%s/%s' % ( feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id_2, self.skill_id ), {}, csrf_token=csrf_token, expect_errors=False, expected_status_int=200) question_summaries, _ = ( question_services.get_question_summaries_linked_to_skills( 5, [self.skill_id], '')) self.assertEqual(len(question_summaries), 2) question_ids = [summary.id for summary in question_summaries] self.assertItemsEqual( question_ids, [self.question_id, self.question_id_2]) self.logout()
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')
def test_delete(self): question_services.create_new_question_skill_link( self.question_id, self.skill_id) question_services.create_new_question_skill_link( self.question_id_2, self.skill_id) with self.swap(feconf, 'ENABLE_NEW_STRUCTURES', True): self.login(self.NEW_USER_EMAIL) response = self.testapp.delete( '%s/%s/%s' % ( feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id, self.skill_id ), expect_errors=True) self.assertEqual(response.status_int, 401) self.logout() self.login(self.ADMIN_EMAIL) self.testapp.delete( '%s/%s/%s' % ( feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id, self.skill_id ), expect_errors=False) question_summaries, _ = ( question_services.get_question_summaries_linked_to_skills( 5, [self.skill_id], '')) self.assertEqual(len(question_summaries), 1) self.assertEqual(question_summaries[0].id, self.question_id_2) self.logout() self.login(self.TOPIC_MANAGER_EMAIL) self.testapp.delete( '%s/%s/%s' % ( feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id_2, self.skill_id ), expect_errors=False) question_summaries, _ = ( question_services.get_question_summaries_linked_to_skills( 5, [self.skill_id], '')) self.assertEqual(len(question_summaries), 0) self.logout()
def test_accept_question_suggestion(self): with self.swap(constants, 'USE_NEW_SUGGESTION_FRAMEWORK', True): with self.swap(feconf, 'ENABLE_GENERALIZED_FEEDBACK_THREADS', True): suggestion_to_accept = self.get_json( '%s?suggestion_type=%s' % (feconf.GENERAL_SUGGESTION_LIST_URL_PREFIX, suggestion_models.SUGGESTION_TYPE_ADD_QUESTION) )['suggestions'][0] self.login(self.ADMIN_EMAIL) response = self.testapp.get(feconf.CREATOR_DASHBOARD_URL) csrf_token = self.get_csrf_token_from_response(response) with self.swap(feconf, 'ENABLE_NEW_STRUCTURES', True): self.put_json('%s/topic/%s/%s' % (feconf.GENERAL_SUGGESTION_ACTION_URL_PREFIX, suggestion_to_accept['target_id'], suggestion_to_accept['suggestion_id']), { 'action': u'accept', 'commit_message': u'commit message', 'review_message': u'This looks good!' }, csrf_token=csrf_token) suggestion_post_accept = self.get_json( '%s?suggestion_type=%s' % (feconf.GENERAL_SUGGESTION_LIST_URL_PREFIX, suggestion_models.SUGGESTION_TYPE_ADD_QUESTION) )['suggestions'][0] self.assertEqual(suggestion_post_accept['status'], suggestion_models.STATUS_ACCEPTED) questions, _ = ( question_services.get_question_summaries_linked_to_skills( 1, [self.SKILL_ID], '')) self.assertEqual(len(questions), 1) self.assertEqual(questions[0].creator_id, self.author_id) self.assertEqual( questions[0].question_content, self.question_dict['question_state_data']['content'] ['html']) thread_messages = feedback_services.get_messages( suggestion_to_accept['suggestion_id']) last_message = thread_messages[len(thread_messages) - 1] self.assertEqual(last_message.text, 'This looks good!')
def get(self, skill_id): """Handles GET requests.""" if not constants.ENABLE_NEW_STRUCTURES: raise self.PageNotFoundException skill_domain.Skill.require_valid_skill_id(skill_id) start_cursor = self.request.get('cursor') question_summaries, next_start_cursor = ( question_services.get_question_summaries_linked_to_skills( constants.NUM_QUESTIONS_PER_PAGE, [skill_id], start_cursor) ) question_summary_dicts = [ summary.to_dict() for summary in question_summaries] self.values.update({ 'question_summary_dicts': question_summary_dicts, 'next_start_cursor': next_start_cursor }) self.render_json(self.values)
def get(self, topic_id): """Handles GET requests.""" if not feconf.ENABLE_NEW_STRUCTURES: raise self.PageNotFoundException topic_domain.Topic.require_valid_topic_id(topic_id) start_cursor = self.request.get('cursor') topic = topic_services.get_topic_by_id(topic_id) skill_ids = topic.get_all_skill_ids() question_summaries, next_start_cursor = ( question_services.get_question_summaries_linked_to_skills( feconf.NUM_QUESTIONS_PER_PAGE, skill_ids, start_cursor)) question_summary_dicts = [ summary.to_dict() for summary in question_summaries ] self.values.update({ 'question_summary_dicts': question_summary_dicts, 'next_start_cursor': next_start_cursor }) self.render_json(self.values)