def test_for_featured_explorations(self): """Note that both EXP_ID_1 and EXP_ID_2 are public. However, only EXP_ID_2 is featured, so the call to get_featured_explorations() should only return [EXP_ID_2]. """ activity_services.update_featured_activity_references([ activity_domain.ActivityReference( feconf.ACTIVITY_TYPE_EXPLORATION, self.EXP_ID_2) ]) featured_activity_summaries = ( summary_services.get_featured_activity_summary_dicts([ feconf.DEFAULT_LANGUAGE_CODE])) self.assertEqual(len(featured_activity_summaries), 1) self.assertDictContainsSubset({ 'status': 'public', 'thumbnail_bg_color': '#a33f40', 'community_owned': False, 'tags': [], 'thumbnail_icon_url': self.get_static_asset_url( '/images/subjects/Lightbulb.svg'), 'language_code': feconf.DEFAULT_LANGUAGE_CODE, 'id': self.EXP_ID_2, 'category': 'A category', 'ratings': feconf.get_empty_ratings(), 'title': 'A title', 'num_views': 0, 'objective': 'An objective' }, featured_activity_summaries[0])
def test_unpublished_activity_is_removed_from_featured_list(self) -> None: rights_manager.publish_exploration(self.owner, self.EXP_ID_0) # type: ignore[no-untyped-call] rights_manager.publish_exploration(self.owner, self.EXP_ID_1) # type: ignore[no-untyped-call] rights_manager.publish_collection(self.owner, self.COL_ID_2) # type: ignore[no-untyped-call] activity_services.update_featured_activity_references([ self._create_exploration_reference(self.EXP_ID_0), self._create_collection_reference(self.COL_ID_2)]) self._compare_lists( activity_services.get_featured_activity_references(), [ self._create_exploration_reference(self.EXP_ID_0), self._create_collection_reference(self.COL_ID_2)]) # Unpublishing an unfeatured activity does not affect the featured # list. rights_manager.unpublish_exploration(self.moderator, self.EXP_ID_1) # type: ignore[no-untyped-call] self._compare_lists( activity_services.get_featured_activity_references(), [ self._create_exploration_reference(self.EXP_ID_0), self._create_collection_reference(self.COL_ID_2)]) # Unpublishing a featured activity removes it from the featured list. rights_manager.unpublish_collection(self.moderator, self.COL_ID_2) # type: ignore[no-untyped-call] self._compare_lists( activity_services.get_featured_activity_references(), [ self._create_exploration_reference(self.EXP_ID_0)]) rights_manager.unpublish_exploration(self.moderator, self.EXP_ID_0) # type: ignore[no-untyped-call] self._compare_lists( activity_services.get_featured_activity_references(), [])
def test_deleted_activity_is_removed_from_featured_list(self): rights_manager.publish_exploration(self.owner_id, self.EXP_ID_0) rights_manager.publish_exploration(self.owner_id, self.EXP_ID_1) rights_manager.publish_collection(self.owner_id, self.COL_ID_2) activity_services.update_featured_activity_references([ self._create_exploration_reference(self.EXP_ID_0), self._create_collection_reference(self.COL_ID_2)]) self._compare_lists( activity_services.get_featured_activity_references(), [ self._create_exploration_reference(self.EXP_ID_0), self._create_collection_reference(self.COL_ID_2)]) # Deleting an unfeatured activity does not affect the featured list. exp_services.delete_exploration(self.owner_id, self.EXP_ID_1) self._compare_lists( activity_services.get_featured_activity_references(), [ self._create_exploration_reference(self.EXP_ID_0), self._create_collection_reference(self.COL_ID_2)]) # Deleting a featured activity removes it from the featured list. collection_services.delete_collection(self.owner_id, self.COL_ID_2) self._compare_lists( activity_services.get_featured_activity_references(), [ self._create_exploration_reference(self.EXP_ID_0)]) exp_services.delete_exploration(self.owner_id, self.EXP_ID_0) self._compare_lists( activity_services.get_featured_activity_references(), [])
def test_for_featured_explorations(self): """Note that both EXP_ID_1 and EXP_ID_2 are public. However, only EXP_ID_2 is featured, so the call to get_featured_explorations() should only return [EXP_ID_2]. """ activity_services.update_featured_activity_references([ activity_domain.ActivityReference( constants.ACTIVITY_TYPE_EXPLORATION, self.EXP_ID_2) ]) featured_activity_summaries = ( summary_services.get_featured_activity_summary_dicts([ constants.DEFAULT_LANGUAGE_CODE])) self.assertEqual(len(featured_activity_summaries), 1) self.assertDictContainsSubset({ 'status': 'public', 'thumbnail_bg_color': '#a33f40', 'community_owned': False, 'tags': [], 'thumbnail_icon_url': '/subjects/Lightbulb.svg', 'language_code': constants.DEFAULT_LANGUAGE_CODE, 'id': self.EXP_ID_2, 'category': 'A category', 'ratings': feconf.get_empty_ratings(), 'title': 'A title', 'num_views': 0, 'objective': 'An objective' }, featured_activity_summaries[0])
def test_updating_with_duplicate_refs_raises_exception(self): rights_manager.publish_exploration(self.owner_id, self.EXP_ID_0) rights_manager.publish_collection(self.owner_id, self.COL_ID_2) self._compare_lists( activity_services.get_featured_activity_references(), []) with self.assertRaisesRegexp(Exception, 'should not have duplicates'): activity_services.update_featured_activity_references([ self._create_exploration_reference(self.EXP_ID_0), self._create_exploration_reference(self.EXP_ID_0)])
def test_updating_with_duplicate_refs_raises_exception(self) -> None: rights_manager.publish_exploration(self.owner, self.EXP_ID_0) # type: ignore[no-untyped-call] rights_manager.publish_collection(self.owner, self.COL_ID_2) # type: ignore[no-untyped-call] self._compare_lists( activity_services.get_featured_activity_references(), []) with self.assertRaisesRegex(Exception, 'should not have duplicates'): # type: ignore[no-untyped-call] activity_services.update_featured_activity_references([ self._create_exploration_reference(self.EXP_ID_0), self._create_exploration_reference(self.EXP_ID_0)])
def test_update_featured_refs_clears_existing_featured_activities(self): rights_manager.publish_exploration(self.owner_id, self.EXP_ID_0) activity_services.update_featured_activity_references([ self._create_exploration_reference(self.EXP_ID_0)]) self._compare_lists( activity_services.get_featured_activity_references(), [ self._create_exploration_reference(self.EXP_ID_0)]) activity_services.update_featured_activity_references([]) self._compare_lists( activity_services.get_featured_activity_references(), [])
def test_language_code_filter(self): """Note that both EXP_ID_1 is in Spanish and EXP_ID_2 is in English.""" activity_services.update_featured_activity_references([ activity_domain.ActivityReference( constants.ACTIVITY_TYPE_EXPLORATION, self.EXP_ID_1), activity_domain.ActivityReference( constants.ACTIVITY_TYPE_EXPLORATION, self.EXP_ID_2) ]) featured_activity_summaries = ( summary_services.get_featured_activity_summary_dicts( [constants.DEFAULT_LANGUAGE_CODE])) self.assertEqual(len(featured_activity_summaries), 1) self.assertDictContainsSubset( { 'language_code': constants.DEFAULT_LANGUAGE_CODE, 'id': self.EXP_ID_2, }, featured_activity_summaries[0]) featured_activity_summaries = ( summary_services.get_featured_activity_summary_dicts( [self.LANGUAGE_CODE_ES])) self.assertEqual(len(featured_activity_summaries), 1) self.assertDictContainsSubset( { 'language_code': self.LANGUAGE_CODE_ES, 'id': self.EXP_ID_1, }, featured_activity_summaries[0]) featured_activity_summaries = ( summary_services.get_featured_activity_summary_dicts( [constants.DEFAULT_LANGUAGE_CODE, self.LANGUAGE_CODE_ES])) self.assertEqual(len(featured_activity_summaries), 2) self.assertDictContainsSubset( { 'language_code': self.LANGUAGE_CODE_ES, 'id': self.EXP_ID_1, }, featured_activity_summaries[0]) self.assertDictContainsSubset( { 'language_code': constants.DEFAULT_LANGUAGE_CODE, 'id': self.EXP_ID_2, }, featured_activity_summaries[1]) featured_activity_summaries = ( summary_services.get_featured_activity_summary_dicts( ['nonexistent_language_code'])) self.assertEqual(len(featured_activity_summaries), 0) featured_activity_summaries = ( summary_services.get_featured_activity_summary_dicts([])) self.assertEqual(len(featured_activity_summaries), 0)
def test_update_featured_refs_correctly_promotes_activities(self): rights_manager.publish_exploration(self.owner_id, self.EXP_ID_0) rights_manager.publish_collection(self.owner_id, self.COL_ID_2) self._compare_lists( activity_services.get_featured_activity_references(), []) activity_services.update_featured_activity_references([ self._create_exploration_reference(self.EXP_ID_0), self._create_collection_reference(self.COL_ID_2)]) self._compare_lists( activity_services.get_featured_activity_references(), [ self._create_exploration_reference(self.EXP_ID_0), self._create_collection_reference(self.COL_ID_2)])
def test_update_featured_refs_correctly_promotes_activities(self) -> None: rights_manager.publish_exploration(self.owner, self.EXP_ID_0) # type: ignore[no-untyped-call] rights_manager.publish_collection(self.owner, self.COL_ID_2) # type: ignore[no-untyped-call] self._compare_lists( activity_services.get_featured_activity_references(), []) activity_services.update_featured_activity_references([ self._create_exploration_reference(self.EXP_ID_0), self._create_collection_reference(self.COL_ID_2)]) self._compare_lists( activity_services.get_featured_activity_references(), [ self._create_exploration_reference(self.EXP_ID_0), self._create_collection_reference(self.COL_ID_2)])
def test_update_featured_refs_clears_existing_featured_activities( self) -> None: rights_manager.publish_exploration( self.owner, self.EXP_ID_0) # type: ignore[no-untyped-call] activity_services.update_featured_activity_references( [self._create_exploration_reference(self.EXP_ID_0)]) self._compare_lists( activity_services.get_featured_activity_references(), [self._create_exploration_reference(self.EXP_ID_0)]) activity_services.update_featured_activity_references([]) self._compare_lists( activity_services.get_featured_activity_references(), [])
def test_library_index_handler_updates_featured_activity_summary_dict( self): """Test the handler for featured explorations.""" response_dict = self.get_json(feconf.LIBRARY_INDEX_DATA_URL) self.assertDictContainsSubset( { 'activity_summary_dicts_by_category': [], 'preferred_language_codes': ['en'], }, response_dict) # Load a demo. exp_services.load_demo('0') exploration_ref = activity_domain.ActivityReference( constants.ACTIVITY_TYPE_EXPLORATION, '0') activity_services.update_featured_activity_references( [exploration_ref]) response_dict = self.get_json(feconf.LIBRARY_INDEX_DATA_URL) self.assertEqual( len(response_dict['activity_summary_dicts_by_category']), 1) self.assertDictContainsSubset({ 'preferred_language_codes': ['en'], }, response_dict) activity_summary_dicts_by_category = ( response_dict['activity_summary_dicts_by_category'][0]) self.assertDictContainsSubset( { 'categories': [], 'header_i18n_id': (feconf.LIBRARY_CATEGORY_FEATURED_ACTIVITIES), 'has_full_results_page': False, 'full_results_url': None, }, activity_summary_dicts_by_category) activity_summary_dicts = ( activity_summary_dicts_by_category['activity_summary_dicts']) self.assertEqual(len(activity_summary_dicts), 1) self.assertDictContainsSubset( { 'id': '0', 'category': 'Welcome', 'title': 'Welcome to Oppia!', 'language_code': 'en', 'objective': 'become familiar with Oppia\'s capabilities', 'status': rights_domain.ACTIVITY_STATUS_PUBLIC, }, activity_summary_dicts[0])
def post(self): """Handles POST requests.""" featured_activity_references = self.normalized_payload.get( 'featured_activity_reference_dicts') try: summary_services.require_activities_to_be_public( featured_activity_references) except Exception as e: raise self.InvalidInputException(e) activity_services.update_featured_activity_references( featured_activity_references) self.render_json({})
def test_language_code_filter(self): """Note that both EXP_ID_1 is in Spanish and EXP_ID_2 is in English.""" activity_services.update_featured_activity_references([ activity_domain.ActivityReference( feconf.ACTIVITY_TYPE_EXPLORATION, self.EXP_ID_1), activity_domain.ActivityReference( feconf.ACTIVITY_TYPE_EXPLORATION, self.EXP_ID_2) ]) featured_activity_summaries = ( summary_services.get_featured_activity_summary_dicts([ feconf.DEFAULT_LANGUAGE_CODE])) self.assertEqual(len(featured_activity_summaries), 1) self.assertDictContainsSubset({ 'language_code': feconf.DEFAULT_LANGUAGE_CODE, 'id': self.EXP_ID_2, }, featured_activity_summaries[0]) featured_activity_summaries = ( summary_services.get_featured_activity_summary_dicts([ self.LANGUAGE_CODE_ES])) self.assertEqual(len(featured_activity_summaries), 1) self.assertDictContainsSubset({ 'language_code': self.LANGUAGE_CODE_ES, 'id': self.EXP_ID_1, }, featured_activity_summaries[0]) featured_activity_summaries = ( summary_services.get_featured_activity_summary_dicts([ feconf.DEFAULT_LANGUAGE_CODE, self.LANGUAGE_CODE_ES])) self.assertEqual(len(featured_activity_summaries), 2) self.assertDictContainsSubset({ 'language_code': self.LANGUAGE_CODE_ES, 'id': self.EXP_ID_1, }, featured_activity_summaries[0]) self.assertDictContainsSubset({ 'language_code': feconf.DEFAULT_LANGUAGE_CODE, 'id': self.EXP_ID_2, }, featured_activity_summaries[1]) featured_activity_summaries = ( summary_services.get_featured_activity_summary_dicts([ 'nonexistent_language_code'])) self.assertEqual(len(featured_activity_summaries), 0) featured_activity_summaries = ( summary_services.get_featured_activity_summary_dicts([])) self.assertEqual(len(featured_activity_summaries), 0)
def test_deleted_activity_is_removed_from_featured_list_multiple(self): rights_manager.publish_exploration(self.owner, self.EXP_ID_0) rights_manager.publish_exploration(self.owner, self.EXP_ID_1) exploration_references = [ self._create_exploration_reference(self.EXP_ID_0), self._create_exploration_reference(self.EXP_ID_1)] activity_services.update_featured_activity_references( exploration_references) self._compare_lists( activity_services.get_featured_activity_references(), exploration_references) exp_services.delete_explorations( self.owner_id, [self.EXP_ID_0, self.EXP_ID_1]) self._compare_lists( activity_services.get_featured_activity_references(), [])
def post(self): """Handles POST requests.""" featured_activity_reference_dicts = self.payload.get( 'featured_activity_reference_dicts') featured_activity_references = [ activity_domain.ActivityReference( reference_dict['type'], reference_dict['id']) for reference_dict in featured_activity_reference_dicts] try: summary_services.require_activities_to_be_public( featured_activity_references) except Exception as e: raise self.InvalidInputException(e) activity_services.update_featured_activity_references( featured_activity_references) self.render_json({})