def test_can_see_topics_to_learn(self): self.login(self.VIEWER_EMAIL) response = self.get_json(feconf.LEARNER_DASHBOARD_DATA_URL) self.assertEqual(len(response['topics_to_learn_list']), 0) self.save_new_topic(self.TOPIC_ID_1, self.owner_id, name=self.TOPIC_NAME_1, url_fragment='topic-one', description='A new topic', canonical_story_ids=[], additional_story_ids=[], uncategorized_skill_ids=[], subtopics=[self.subtopic_0], next_subtopic_id=1) topic_services.publish_topic(self.TOPIC_ID_1, self.admin_id) self.save_new_story(self.STORY_ID_2, self.owner_id, self.TOPIC_ID_1) topic_services.add_canonical_story(self.owner_id, self.TOPIC_ID_1, self.STORY_ID_2) topic_services.publish_story(self.TOPIC_ID_1, self.STORY_ID_2, self.admin_id) learner_progress_services.validate_and_add_topic_to_learn_goal( self.viewer_id, self.TOPIC_ID_1) response = self.get_json(feconf.LEARNER_DASHBOARD_DATA_URL) self.assertEqual(len(response['topics_to_learn_list']), 1) self.assertEqual(response['topics_to_learn_list'][0]['id'], self.TOPIC_ID_1) self.logout()
def setUp(self): """Completes the sign-up process for the various users.""" super(BasePracticeSessionsControllerTests, self).setUp() self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME) self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL) self.set_admins([self.ADMIN_USERNAME]) self.admin = user_services.UserActionsInfo(self.admin_id) self.topic_id = 'topic' self.topic_id_1 = 'topic1' self.skill_id1 = 'skill_id_1' self.skill_id2 = 'skill_id_2' self.save_new_skill(self.skill_id1, self.admin_id, description='Skill 1') self.save_new_skill(self.skill_id2, self.admin_id, description='Skill 2') self.topic = topic_domain.Topic.create_default_topic( self.topic_id, 'public_topic_name', 'abbrev') self.topic.uncategorized_skill_ids.append(self.skill_id1) self.topic.subtopics.append( topic_domain.Subtopic(1, 'subtopic_name', [self.skill_id2])) self.topic.next_subtopic_id = 2 topic_services.save_new_topic(self.admin_id, self.topic) self.topic = topic_domain.Topic.create_default_topic( self.topic_id_1, 'private_topic_name', 'abbrev') topic_services.save_new_topic(self.admin_id, self.topic) topic_services.publish_topic(self.topic_id, self.admin_id)
def test_get_all_topic_names(self): response = self.get_json('/getalltopicnames') self.assertEqual( response, {'topic_names': []} ) topic_id = '0' topic = topic_domain.Topic.create_default_topic( topic_id, 'topic', 'abbrev', 'description') topic.thumbnail_filename = 'thumbnail.svg' topic.thumbnail_bg_color = '#C6DCDA' topic.subtopics = [ topic_domain.Subtopic( 1, 'Title', ['skill_id_3'], 'image.svg', constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131, 'dummy-subtopic-three')] topic.next_subtopic_id = 2 topic_services.save_new_topic(self.owner_id, topic) topic_services.publish_topic(topic_id, self.admin_id) response = self.get_json('/getalltopicnames') self.assertEqual( response, {'topic_names': ['topic']} )
def setUp(self): """Completes the sign-up process for the various users.""" super(BaseTopicViewerControllerTests, self).setUp() self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME) self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL) self.set_admins([self.ADMIN_USERNAME]) self.admin = user_services.UserActionsInfo(self.admin_id) self.topic_id = 'topic' self.story_id = 'story' self.topic_id_1 = 'topic1' self.story = story_domain.Story.create_default_story( self.story_id, 'story_title') self.story.description = 'story_description' story_services.save_new_story(self.admin_id, self.story) self.topic = topic_domain.Topic.create_default_topic( self.topic_id, 'public_topic_name') self.topic.canonical_story_ids.append(self.story_id) topic_services.save_new_topic(self.admin_id, self.topic) self.topic = topic_domain.Topic.create_default_topic( self.topic_id_1, 'private_topic_name') topic_services.save_new_topic(self.admin_id, self.topic) topic_services.publish_topic(self.topic_id, self.admin_id)
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.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, 'a-story') 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) 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.')
def test_get_published_summaries(self): # Unpublished topics should not be returned. topic_summaries = topic_fetchers.get_published_topic_summaries() self.assertEqual(len(topic_summaries), 0) # Publish the topic. 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_services.update_topic_and_subtopic_pages( self.user_id_admin, self.TOPIC_ID, changelist, 'Updated subtopic skill ids.') topic_services.publish_topic(self.TOPIC_ID, self.user_id_admin) topic_summaries = topic_fetchers.get_published_topic_summaries() self.assertEqual(len(topic_summaries), 1) self.assertEqual(topic_summaries[0].name, 'Name') self.assertEqual(topic_summaries[0].canonical_story_count, 0) self.assertEqual(topic_summaries[0].additional_story_count, 0) self.assertEqual(topic_summaries[0].total_skill_count, 2) self.assertEqual(topic_summaries[0].uncategorized_skill_count, 1) self.assertEqual(topic_summaries[0].subtopic_count, 1)
def setUp(self): """Completes the sign-up process for the various users.""" super(BaseReviewTestsControllerTests, self).setUp() self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME) self.signup(self.OWNER_EMAIL, self.OWNER_USERNAME) self.signup(self.VIEWER_EMAIL, self.VIEWER_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.viewer_id = self.get_user_id_from_email(self.VIEWER_EMAIL) self.set_admins([self.ADMIN_USERNAME]) self.admin = user_services.UserActionsInfo(self.admin_id) self.topic_id = 'topic_id' self.story_id_1 = 'story_id_1' self.story_id_2 = 'story_id_2' self.story_id_3 = 'story_id_3' self.node_id = 'node_1' self.node_id_2 = 'node_2' self.exp_id = 'exp_id' self.save_new_valid_exploration(self.exp_id, self.owner_id) self.publish_exploration(self.owner_id, self.exp_id) self.node_1 = { 'id': self.node_id, 'title': 'Title 1', 'destination_node_ids': [], 'acquired_skill_ids': ['skill_id_1', 'skill_id_2'], 'prerequisite_skill_ids': [], 'outline': '', 'outline_is_finalized': False, 'exploration_id': self.exp_id } self.save_new_skill('skill_id_1', self.admin_id, 'Skill 1') self.save_new_skill('skill_id_2', self.admin_id, 'Skill 2') self.story = story_domain.Story.create_default_story( self.story_id_1, 'Public Story Title', self.topic_id) self.story.story_contents.nodes = [ story_domain.StoryNode.from_dict(self.node_1) ] self.story.story_contents.initial_node_id = self.node_id self.story.story_contents.next_node_id = self.node_id_2 story_services.save_new_story(self.admin_id, self.story) self.story_2 = story_domain.Story.create_default_story( self.story_id_2, 'Private Story Title', self.topic_id) story_services.save_new_story(self.admin_id, self.story_2) self.save_new_topic( self.topic_id, 'user', 'Topic', 'A new topic', [self.story_id_1, self.story_id_3], [], [], [], 0) topic_services.publish_topic(self.topic_id, self.admin_id) topic_services.publish_story( self.topic_id, self.story_id_1, self.admin_id) self.login(self.VIEWER_EMAIL)
def test_get(self): self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME) admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL) self.set_admins([self.ADMIN_USERNAME]) self.login(self.ADMIN_EMAIL, is_super_admin=True) topic_id_1 = topic_services.get_new_topic_id() topic_id_2 = topic_services.get_new_topic_id() private_topic = topic_domain.Topic.create_default_topic( topic_id_1, 'private_topic_name', 'private-topic-name', 'description') topic_services.save_new_topic(admin_id, private_topic) public_topic = topic_domain.Topic.create_default_topic( topic_id_2, 'public_topic_name', 'public-topic-name', 'description') public_topic.thumbnail_filename = 'Topic.svg' public_topic.thumbnail_bg_color = ( constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0]) public_topic.subtopics = [ topic_domain.Subtopic( 1, 'Title', ['skill_id_1', 'skill_id_2', 'skill_id_3'], 'image.svg', constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 'dummy-subtopic-three')] public_topic.next_subtopic_id = 2 topic_services.save_new_topic(admin_id, public_topic) topic_services.publish_topic(topic_id_2, admin_id) csrf_token = self.get_new_csrf_token() new_config_value = [{ 'name': 'math', 'topic_ids': [topic_id_1, topic_id_2], 'course_details': 'Course details for classroom.', 'topic_list_intro': 'Topics covered for classroom', 'url_fragment': 'math', }] payload = { 'action': 'save_config_properties', 'new_config_property_values': { config_domain.CLASSROOM_PAGES_DATA.name: ( new_config_value), } } self.post_json('/adminhandler', payload, csrf_token=csrf_token) self.logout() json_response = self.get_json( '%s/%s' % (feconf.CLASSROOM_DATA_HANDLER, 'math')) topic_summary_dict = ( topic_services.get_topic_summary_by_id(topic_id_2).to_dict()) expected_dict = { 'name': 'math', 'topic_summary_dicts': [topic_summary_dict], 'course_details': 'Course details for classroom.', 'topic_list_intro': 'Topics covered for classroom' } self.assertDictContainsSubset(expected_dict, json_response)
def setUp(self): super(OpportunityServicesUnitTest, self).setUp() self.signup(self.OWNER_EMAIL, self.OWNER_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.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL) self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME]) self.TOPIC_ID = 'topic' self.STORY_ID = 'story' explorations = [self.save_new_valid_exploration( '%s' % i, self.owner_id, title='title %d' % i, category='category%d' % i, end_state_name='End State', correctness_feedback_enabled=True ) 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.subtopics = [ topic_domain.Subtopic( 1, 'Title', ['skill_id_1'], 'image.svg', constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131, 'dummy-subtopic-url')] topic.next_subtopic_id = 2 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-two') 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) 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.')
def setUp(self): super(TranslatableTextHandlerTest, 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]) 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( '0', '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(topic.id, self.admin_id) stories = [ story_domain.Story.create_default_story('%s' % i, 'title %d' % i, 'description %d' % i, '0', 'title-%s' % chr(97 + i)) for i in python_utils.RANGE(2) ] for index, story in enumerate(stories): story.language_code = 'en' story_services.save_new_story(self.owner_id, story) topic_services.add_canonical_story(self.owner_id, topic.id, story.id) topic_services.publish_story(topic.id, story.id, self.admin_id) story_services.update_story(self.owner_id, 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': explorations[index].id }) ], 'Changes.')
def test_get_fails_when_skill_ids_dont_exist(self): topic = topic_domain.Topic.create_default_topic( 'topic_id_3', 'topic_without_skills', 'abbrev') topic.uncategorized_skill_ids.append('non_existent_skill') topic_services.save_new_topic(self.admin_id, topic) topic_services.publish_topic('topic_id_3', self.admin_id) with self.swap(constants, 'ENABLE_NEW_STRUCTURE_PLAYERS', True): self.get_json('%s/%s' % (feconf.PRACTICE_SESSION_DATA_URL_PREFIX, 'topic_without_skills'), expected_status_int=404)
def test_get_with_meta_tag_content(self): self.topic = topic_domain.Topic.create_default_topic( self.topic_id, 'topic_with_meta', 'topic-with-meta', 'description') self.topic.meta_tag_content = 'meta content' topic_services.save_new_topic(self.admin_id, self.topic) topic_services.publish_topic(self.topic_id, self.admin_id) json_response = self.get_json( '%s/staging/%s' % (feconf.TOPIC_DATA_HANDLER, 'topic-with-meta')) expected_meta_tag_content = 'meta content' self.assertEqual(expected_meta_tag_content, json_response['meta_tag_content'])
def test_cannot_publish_a_published_topic(self): topic_rights = topic_services.get_topic_rights(self.TOPIC_ID) self.assertFalse(topic_rights.topic_is_published) topic_services.publish_topic(self.TOPIC_ID, self.user_id_admin) topic_rights = topic_services.get_topic_rights(self.TOPIC_ID) self.assertTrue(topic_rights.topic_is_published) with self.assertRaisesRegexp( Exception, 'The topic is already published.'): topic_services.publish_topic(self.TOPIC_ID, self.user_id_admin)
def test_get_with_page_title_fragment_for_web(self): self.topic = topic_domain.Topic.create_default_topic( self.topic_id, 'topic_with_page_title_fragment_for_web', 'topic-page-title', 'description', 'topic page title') topic_services.save_new_topic(self.admin_id, self.topic) topic_services.publish_topic(self.topic_id, self.admin_id) json_response = self.get_json( '%s/staging/%s' % (feconf.TOPIC_DATA_HANDLER, 'topic-page-title')) expected_page_title_fragment_for_web = 'topic page title' self.assertEqual(expected_page_title_fragment_for_web, json_response['page_title_fragment_for_web'])
def setUp(self): """Completes the sign-up process for the various users.""" super(BaseTopicViewerControllerTests, self).setUp() self.signup(self.NEW_USER_EMAIL, self.NEW_USER_USERNAME) self.user_id = self.get_user_id_from_email(self.NEW_USER_EMAIL) self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME) self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL) self.set_admins([self.ADMIN_USERNAME]) self.admin = user_services.UserActionsInfo(self.admin_id) self.topic_id = 'topic' self.story_id = 'story' self.topic_id_1 = 'topic1' self.skill_id_1 = skill_services.get_new_skill_id() self.skill_id_2 = skill_services.get_new_skill_id() self.story = story_domain.Story.create_default_story( self.story_id, 'story_title', self.topic_id_1) self.story.description = 'story_description' self.topic = topic_domain.Topic.create_default_topic( self.topic_id, 'public_topic_name', 'abbrev') self.topic.uncategorized_skill_ids.append(self.skill_id_1) self.topic.subtopics.append( topic_domain.Subtopic(1, 'subtopic_name', [self.skill_id_2])) self.topic.next_subtopic_id = 2 self.topic.thumbnail_filename = 'Image.png' self.topic.canonical_story_references.append( topic_domain.StoryReference.create_default_story_reference( self.story_id)) topic_services.save_new_topic(self.admin_id, self.topic) story_services.save_new_story(self.admin_id, self.story) self.topic = topic_domain.Topic.create_default_topic( self.topic_id_1, 'private_topic_name', 'abbrev') self.topic.thumbnail_filename = 'Image.png' topic_services.save_new_topic(self.admin_id, self.topic) topic_services.publish_topic(self.topic_id, self.admin_id) topic_services.publish_story(self.topic_id, self.story_id, self.admin_id) self.save_new_skill(self.skill_id_1, self.user_id, description='Skill Description 1') self.save_new_skill(self.skill_id_2, self.user_id, description='Skill Description 2') skill_services.create_user_skill_mastery(self.user_id, self.skill_id_1, 0.3) skill_services.create_user_skill_mastery(self.user_id, self.skill_id_2, 0.5)
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()
def test_publish_topic_creates_exploration_opportunity(self): self.add_exploration_0_to_story() # Topic is already published, so unpublish first. topic_services.unpublish_topic(self.TOPIC_ID, self.admin_id) translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 0) topic_services.publish_topic(self.TOPIC_ID, self.admin_id) translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1)
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()
def setUp(self) -> None: super(SubtopicPageServicesUnitTests, self).setUp() self.signup(self.CURRICULUM_ADMIN_EMAIL, self.CURRICULUM_ADMIN_USERNAME) self.admin_id = self.get_user_id_from_email( # type: ignore[no-untyped-call] self.CURRICULUM_ADMIN_EMAIL) self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME ]) # type: ignore[no-untyped-call] self.TOPIC_ID = topic_fetchers.get_new_topic_id() self.subtopic_page = ( subtopic_page_domain.SubtopicPage.create_default_subtopic_page( self.subtopic_id, self.TOPIC_ID)) subtopic_page_services.save_subtopic_page( self.user_id, self.subtopic_page, 'Added subtopic', [ topic_domain.TopicChange({ 'cmd': topic_domain.CMD_ADD_SUBTOPIC, 'subtopic_id': 1, 'title': 'Sample', 'url_fragment': 'sample-fragment' }) ]) self.subtopic_page_id = ( subtopic_page_domain.SubtopicPage.get_subtopic_page_id( self.TOPIC_ID, 1)) self.TOPIC_ID_1 = topic_fetchers.get_new_topic_id() # Set up topic and subtopic. topic = topic_domain.Topic.create_default_topic( self.TOPIC_ID_1, 'Place Values', 'abbrev', 'description', 'fragm') topic.thumbnail_filename = 'thumbnail.svg' topic.thumbnail_bg_color = '#C6DCDA' topic.subtopics = [ topic_domain.Subtopic( 1, 'Naming Numbers', ['skill_id_1'], 'image.svg', constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131, 'dummy-subtopic-url'), topic_domain.Subtopic( 2, 'Subtopic Name', ['skill_id_2'], 'image.svg', constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131, 'other-subtopic-url') ] topic.next_subtopic_id = 3 topic.skill_ids_for_diagnostic_test = ['skill_id_1'] topic_services.save_new_topic(self.admin_id, topic) # type: ignore[no-untyped-call] # Publish the topic and its stories. topic_services.publish_topic( self.TOPIC_ID_1, self.admin_id) # type: ignore[no-untyped-call]
def setUp(self): """Completes the sign-up process for the various users.""" super(BasePracticeSessionsControllerTests, self).setUp() self.signup(self.CURRICULUM_ADMIN_EMAIL, self.CURRICULUM_ADMIN_USERNAME) self.admin_id = self.get_user_id_from_email( self.CURRICULUM_ADMIN_EMAIL) self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME]) self.admin = user_services.get_user_actions_info(self.admin_id) self.topic_id = 'topic' self.topic_id_1 = 'topic1' self.skill_id1 = 'skill_id_1' self.skill_id2 = 'skill_id_2' self.save_new_skill(self.skill_id1, self.admin_id, description='Skill 1') self.save_new_skill(self.skill_id2, self.admin_id, description='Skill 2') self.topic = topic_domain.Topic.create_default_topic( self.topic_id, 'public_topic_name', 'public-topic-name', 'description', 'fragm') self.topic.subtopics.append( topic_domain.Subtopic( 1, 'subtopic_name', [self.skill_id1], 'image.svg', constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131, 'subtopic-name-one')) self.topic.subtopics.append( topic_domain.Subtopic( 2, 'subtopic_name_2', [self.skill_id2], 'image.svg', constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131, 'subtopic-name-two')) self.topic.next_subtopic_id = 3 self.topic.skill_ids_for_diagnostic_test = [self.skill_id1] self.topic.thumbnail_filename = 'Topic.svg' self.topic.thumbnail_bg_color = ( constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0]) topic_services.save_new_topic(self.admin_id, self.topic) self.topic = topic_domain.Topic.create_default_topic( self.topic_id_1, 'private_topic_name', 'private-topic-name', 'description', 'fragm') self.topic.thumbnail_filename = 'Topic.svg' self.topic.thumbnail_bg_color = ( constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0]) topic_services.save_new_topic(self.admin_id, self.topic) topic_services.publish_topic(self.topic_id, self.admin_id)
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)
def setUp(self): super(LearnerGoalsTests, self).setUp() self.signup(self.OWNER_EMAIL, self.OWNER_USERNAME) self.signup(self.VIEWER_EMAIL, self.VIEWER_USERNAME) self.signup(self.CURRICULUM_ADMIN_EMAIL, self.CURRICULUM_ADMIN_USERNAME) self.viewer_id = self.get_user_id_from_email(self.VIEWER_EMAIL) self.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL) self.curriculum_admin_id = self.get_user_id_from_email( self.CURRICULUM_ADMIN_EMAIL) self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME]) # Save the topics. self.save_new_topic(self.TOPIC_ID_1, self.owner_id, name=self.TOPIC_NAME_1, url_fragment='topic-one', description='A new topic', canonical_story_ids=[], additional_story_ids=[], uncategorized_skill_ids=[], subtopics=[self.subtopic_1], next_subtopic_id=1) topic_services.publish_topic(self.TOPIC_ID_1, self.curriculum_admin_id) self.save_new_topic(self.TOPIC_ID_2, self.owner_id, name=self.TOPIC_NAME_2, url_fragment='topic-two', description='A new topic', canonical_story_ids=[], additional_story_ids=[], uncategorized_skill_ids=[], subtopics=[self.subtopic_2], next_subtopic_id=1) topic_services.publish_topic(self.TOPIC_ID_2, self.curriculum_admin_id) self.save_new_topic(self.TOPIC_ID_3, self.owner_id, name=self.TOPIC_NAME_3, url_fragment='topic-three', description='A new topic', canonical_story_ids=[], additional_story_ids=[], uncategorized_skill_ids=[], subtopics=[self.subtopic_3], next_subtopic_id=1) topic_services.publish_topic(self.TOPIC_ID_3, self.curriculum_admin_id) self.save_new_topic(self.TOPIC_ID_4, self.owner_id, name=self.TOPIC_NAME_4, url_fragment='topic-four', description='A new topic', canonical_story_ids=[], additional_story_ids=[], uncategorized_skill_ids=[], subtopics=[self.subtopic_4], next_subtopic_id=1) topic_services.publish_topic(self.TOPIC_ID_4, self.curriculum_admin_id)
def test_publish_topic_does_not_create_exploration_opportunity_if_story_is_not_published( # pylint: disable=line-too-long self): self.add_exploration_0_to_story() # Story and topic are already published, so unpublish first. topic_services.unpublish_story(self.TOPIC_ID, self.STORY_ID, self.admin_id) topic_services.unpublish_topic(self.TOPIC_ID, self.admin_id) translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 0) topic_services.publish_topic(self.TOPIC_ID, self.admin_id) translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 0)
def test_can_see_all_topics(self): self.login(self.CURRICULUM_ADMIN_EMAIL, is_super_admin=True) response = self.get_json( feconf.LEARNER_DASHBOARD_TOPIC_AND_STORY_DATA_URL) self.assertEqual(len(response['all_topics_list']), 0) self.save_new_topic(self.TOPIC_ID_1, self.owner_id, name=self.TOPIC_NAME_1, url_fragment='topic-one', description='A new topic', canonical_story_ids=[], additional_story_ids=[], uncategorized_skill_ids=[], subtopics=[self.subtopic_0], next_subtopic_id=1) topic_services.publish_topic(self.TOPIC_ID_1, self.admin_id) self.save_new_story(self.STORY_ID_2, self.owner_id, self.TOPIC_ID_1) topic_services.add_canonical_story(self.owner_id, self.TOPIC_ID_1, self.STORY_ID_2) topic_services.publish_story(self.TOPIC_ID_1, self.STORY_ID_2, self.admin_id) csrf_token = self.get_new_csrf_token() new_config_value = [{ 'name': 'math', 'url_fragment': 'math', 'topic_ids': [self.TOPIC_ID_1], 'course_details': '', 'topic_list_intro': '' }] payload = { 'action': 'save_config_properties', 'new_config_property_values': { config_domain.CLASSROOM_PAGES_DATA.name: (new_config_value), } } self.post_json('/adminhandler', payload, csrf_token=csrf_token) self.logout() self.login(self.VIEWER_EMAIL) response = self.get_json( feconf.LEARNER_DASHBOARD_TOPIC_AND_STORY_DATA_URL) self.assertEqual(len(response['all_topics_list']), 1) self.assertEqual(response['all_topics_list'][0]['id'], self.TOPIC_ID_1) self.logout()
def test_get_fails_when_skill_ids_dont_exist(self): topic = topic_domain.Topic.create_default_topic( 'topic_id_3', 'topic_without_skills', 'noskills', 'description') topic.thumbnail_filename = 'Topic.svg' topic.thumbnail_bg_color = ( constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0]) topic.subtopics.append( topic_domain.Subtopic( 1, 'subtopic_name', ['non_existent_skill'], 'image.svg', constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131, 'subtopic-name-three')) topic.next_subtopic_id = 2 topic_services.save_new_topic(self.admin_id, topic) topic_services.publish_topic('topic_id_3', self.admin_id) self.get_json('%s/staging/%s?selected_subtopic_ids=[1]' % (feconf.PRACTICE_SESSION_DATA_URL_PREFIX, 'noskills'), expected_status_int=404)
def put(self, topic_id): """Publishes or unpublishes a topic.""" topic = topic_fetchers.get_topic_by_id(topic_id, strict=False) if topic is None: raise self.PageNotFoundException publish_status = self.normalized_payload.get('publish_status') try: if publish_status: topic_services.publish_topic(topic_id, self.user_id) else: topic_services.unpublish_topic(topic_id, self.user_id) except Exception as e: raise self.UnauthorizedUserException(e) self.render_json(self.values)
def test_get(self): self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME) admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL) self.set_admins([self.ADMIN_USERNAME]) self.login(self.ADMIN_EMAIL, is_super_admin=True) topic_id_1 = topic_services.get_new_topic_id() topic_id_2 = topic_services.get_new_topic_id() private_topic = topic_domain.Topic.create_default_topic( topic_id_1, 'private_topic_name', 'abbrev', 'description') topic_services.save_new_topic(admin_id, private_topic) public_topic = topic_domain.Topic.create_default_topic( topic_id_2, 'public_topic_name', 'abbrev', 'description') public_topic.thumbnail_filename = 'Topic.svg' public_topic.thumbnail_bg_color = ( constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0]) topic_services.save_new_topic(admin_id, public_topic) topic_services.publish_topic(topic_id_2, admin_id) csrf_token = self.get_new_csrf_token() new_config_value = [{ 'name': 'math', 'topic_ids': [topic_id_1, topic_id_2] }] payload = { 'action': 'save_config_properties', 'new_config_property_values': { config_domain.TOPIC_IDS_FOR_CLASSROOM_PAGES.name: ( new_config_value), } } self.post_json('/adminhandler', payload, csrf_token=csrf_token) self.logout() with self.swap(constants, 'ENABLE_NEW_STRUCTURE_PLAYERS', True): json_response = self.get_json( '%s/%s' % (feconf.CLASSROOM_DATA_HANDLER, 'math')) topic_summary_dict = ( topic_services.get_topic_summary_by_id(topic_id_2).to_dict()) expected_dict = { 'topic_summary_dicts': [topic_summary_dict] } self.assertDictContainsSubset(expected_dict, json_response)
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]) 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) with self.swap(constants, 'ENABLE_NEW_STRUCTURE_PLAYERS', True): 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': [], 'train_tab_should_be_displayed': True } self.assertDictContainsSubset(expected_dict, json_response) self.logout()
def test_get_fails_when_skill_ids_dont_exist(self): topic = topic_domain.Topic.create_default_topic( 'topic_id_3', 'topic_without_skills', 'abbrev') topic.thumbnail_filename = 'Topic.svg' topic.thumbnail_bg_color = ( constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0]) topic.subtopics.append(topic_domain.Subtopic( 1, 'subtopic_name', ['non_existent_skill'], 'image.svg', constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0])) topic.next_subtopic_id = 2 topic_services.save_new_topic(self.admin_id, topic) topic_services.publish_topic('topic_id_3', self.admin_id) with self.swap(constants, 'ENABLE_NEW_STRUCTURE_PLAYERS', True): self.get_json( '%s/%s?selected_subtopic_ids=1' % ( feconf.PRACTICE_SESSION_DATA_URL_PREFIX, 'topic_without_skills'), expected_status_int=404)
def put(self, topic_id): """Publishes or unpublishes a topic.""" topic_domain.Topic.require_valid_topic_id(topic_id) publish_status = self.payload.get('publish_status') if not isinstance(publish_status, bool): raise self.InvalidInputException( 'Publish status should only be true or false.') try: if publish_status: topic_services.publish_topic(topic_id, self.user_id) else: topic_services.unpublish_topic(topic_id, self.user_id) except Exception as e: raise self.UnauthorizedUserException(e) self.render_json(self.values)