diff --git a/app/api/routes/resource_modification.py b/app/api/routes/resource_modification.py index 501dd561..0f2f7a59 100644 --- a/app/api/routes/resource_modification.py +++ b/app/api/routes/resource_modification.py @@ -42,15 +42,34 @@ def update_resource(id, json, db): langs, categ = get_attributes(json) index_object = {'objectID': id} + def get_unique_resource_categories_as_strings(): + resources = Resource.query.all() + return {resource.category.name for resource in resources} + + def get_unique_resource_languages_as_strings(): + resources = Resource.query.all() + return {language.name + for resource in resources + for language in resource.languages} + try: logger.info( f"Updating resource. Old data: {json_module.dumps(resource.serialize)}") if json.get('languages') is not None: + old_languages = resource.languages[:] resource.languages = langs index_object['languages'] = resource.serialize['languages'] + resource_languages = get_unique_resource_languages_as_strings() + for language in old_languages: + if language.name not in resource_languages: + db.session.delete(language) if json.get('category'): + old_category = resource.category resource.category = categ index_object['category'] = categ.name + resource_categories = get_unique_resource_categories_as_strings() + if old_category.name not in resource_categories: + db.session.delete(old_category) if json.get('name'): resource.name = json.get('name') index_object['name'] = json.get('name') diff --git a/tests/unit/test_routes/test_resource_update.py b/tests/unit/test_routes/test_resource_update.py index 7b169526..ef980b06 100644 --- a/tests/unit/test_routes/test_resource_update.py +++ b/tests/unit/test_routes/test_resource_update.py @@ -282,3 +282,113 @@ def test_update_votes_authorization_header( assert (response.status_code == 200) assert (response.json['resource'].get(f"{UPVOTE}s") == initial_upvotes) assert (response.json['resource'].get(f"{DOWNVOTE}s") == initial_downvotes + 1) + + +def test_delete_unused_languages(module_client, module_db, + fake_auth_from_oc, fake_algolia_save): + client = module_client + apikey = get_api_key(client) + + # Happy Path + response = update_resource(client, apikey) + assert (response.status_code == 200) + assert (response.json['resource'].get('name') == "New name") + + # Initial Data + name = "Language Test" + url = None + category = None + # Random Language DS/AI + languages = ["Python", "DS/AI"] + paid = None + notes = None + + # Update response + response = update_resource(client, + apikey, + name, + url, + category, + languages, + paid, + notes) + # Check update + assert (response.status_code == 200) + assert (response.json['resource'].get('name') == "Language Test") + languages_response = response.json['resource'].get('languages') + assert ("Python" in languages_response) + assert ("DS/AI" in languages_response) + + # Update Languages remove DS/AI and add JavaScript and HTML + languages.append("JavaScript") + languages.append("HTML") + languages.remove("DS/AI") + response = update_resource(client, apikey, name, url, + category, languages, paid, notes) + + # Check Update of Languages + assert (response.status_code == 200) + languages_response = response.json['resource'].get('languages') + assert ("Python" in languages_response) + assert ("JavaScript" in languages_response) + assert ("HTML" in languages_response) + assert ("DS/AI" not in languages_response) + + db_languages = client.get('api/v1/languages') + db_languages = [language.get('name') for language in db_languages.json['languages']] + + assert ("DS/AI" not in db_languages) + + +def test_delete_unused_categories(module_client, module_db, + fake_auth_from_oc, fake_algolia_save): + client = module_client + apikey = get_api_key(client) + + # Happy Path + response = update_resource(client, apikey) + assert (response.status_code == 200) + assert (response.json['resource'].get('name') == "New name") + + # Test Categories + test_cat_1 = 'Holy hand grenades' + test_cat_2 = 'News' + + # Initial Data + name = "Category Test" + url = None + category = test_cat_1 + languages = None + paid = None + notes = None + + # Update response + response = update_resource(client, + apikey, + name, + url, + category, + languages, + paid, + notes) + # Check update + assert (response.status_code == 200) + assert (response.json['resource'].get('name') == "Category Test") + category_response = response.json['resource'].get('category') + assert (category_response == test_cat_1) + + # Update category to something else + category = test_cat_2 + response = update_resource(client, apikey, name, url, + category, languages, paid, notes) + + # Check Update of category + assert (response.status_code == 200) + category_response = response.json['resource'].get('category') + assert (category_response == test_cat_2) + + db_categories = client.get('api/v1/categories') + db_categories = [category.get('name') + for category in db_categories.json['categories']] + + assert (test_cat_1 not in db_categories)