Skip to content

Commit 995adce

Browse files
Add check to resource_modification for orphaned langs/cats (#362)
* Add check to resource_modification for orphaned langs/cats * Add check to resource_modification for orphaned langs/cats * Add check for orphaned categories. This is just a test of the logic * Simplify logic and implement orphaned language check * Remove unused imports for Category and Language classes * test for checking deletion of orphaned langs random name for language use to prevent collision * Cleaning out the lint trap * Fix merge errors on previous commit test for checking deletion of orphaned langs random name for language use to prevent collision * Fix lint errors and some other stuff * Add test for unused categories Co-authored-by: Lakshya Singh <lakshay.singh1108@gmail.com>
1 parent 62effe0 commit 995adce

File tree

2 files changed

+129
-0
lines changed

2 files changed

+129
-0
lines changed

app/api/routes/resource_modification.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,34 @@ def update_resource(id, json, db):
4242
langs, categ = get_attributes(json)
4343
index_object = {'objectID': id}
4444

45+
def get_unique_resource_categories_as_strings():
46+
resources = Resource.query.all()
47+
return {resource.category.name for resource in resources}
48+
49+
def get_unique_resource_languages_as_strings():
50+
resources = Resource.query.all()
51+
return {language.name
52+
for resource in resources
53+
for language in resource.languages}
54+
4555
try:
4656
logger.info(
4757
f"Updating resource. Old data: {json_module.dumps(resource.serialize)}")
4858
if json.get('languages') is not None:
59+
old_languages = resource.languages[:]
4960
resource.languages = langs
5061
index_object['languages'] = resource.serialize['languages']
62+
resource_languages = get_unique_resource_languages_as_strings()
63+
for language in old_languages:
64+
if language.name not in resource_languages:
65+
db.session.delete(language)
5166
if json.get('category'):
67+
old_category = resource.category
5268
resource.category = categ
5369
index_object['category'] = categ.name
70+
resource_categories = get_unique_resource_categories_as_strings()
71+
if old_category.name not in resource_categories:
72+
db.session.delete(old_category)
5473
if json.get('name'):
5574
resource.name = json.get('name')
5675
index_object['name'] = json.get('name')

tests/unit/test_routes/test_resource_update.py

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,3 +282,113 @@ def test_update_votes_authorization_header(
282282
assert (response.status_code == 200)
283283
assert (response.json['resource'].get(f"{UPVOTE}s") == initial_upvotes)
284284
assert (response.json['resource'].get(f"{DOWNVOTE}s") == initial_downvotes + 1)
285+
286+
287+
def test_delete_unused_languages(module_client, module_db,
288+
fake_auth_from_oc, fake_algolia_save):
289+
client = module_client
290+
apikey = get_api_key(client)
291+
292+
# Happy Path
293+
response = update_resource(client, apikey)
294+
assert (response.status_code == 200)
295+
assert (response.json['resource'].get('name') == "New name")
296+
297+
# Initial Data
298+
name = "Language Test"
299+
url = None
300+
category = None
301+
# Random Language DS/AI
302+
languages = ["Python", "DS/AI"]
303+
paid = None
304+
notes = None
305+
306+
# Update response
307+
response = update_resource(client,
308+
apikey,
309+
name,
310+
url,
311+
category,
312+
languages,
313+
paid,
314+
notes)
315+
# Check update
316+
assert (response.status_code == 200)
317+
assert (response.json['resource'].get('name') == "Language Test")
318+
languages_response = response.json['resource'].get('languages')
319+
assert ("Python" in languages_response)
320+
assert ("DS/AI" in languages_response)
321+
322+
# Update Languages remove DS/AI and add JavaScript and HTML
323+
languages.append("JavaScript")
324+
languages.append("HTML")
325+
languages.remove("DS/AI")
326+
response = update_resource(client, apikey, name, url,
327+
category, languages, paid, notes)
328+
329+
# Check Update of Languages
330+
assert (response.status_code == 200)
331+
languages_response = response.json['resource'].get('languages')
332+
assert ("Python" in languages_response)
333+
assert ("JavaScript" in languages_response)
334+
assert ("HTML" in languages_response)
335+
assert ("DS/AI" not in languages_response)
336+
337+
db_languages = client.get('api/v1/languages')
338+
db_languages = [language.get('name') for language in db_languages.json['languages']]
339+
340+
assert ("DS/AI" not in db_languages)
341+
342+
343+
def test_delete_unused_categories(module_client, module_db,
344+
fake_auth_from_oc, fake_algolia_save):
345+
client = module_client
346+
apikey = get_api_key(client)
347+
348+
# Happy Path
349+
response = update_resource(client, apikey)
350+
assert (response.status_code == 200)
351+
assert (response.json['resource'].get('name') == "New name")
352+
353+
# Test Categories
354+
test_cat_1 = 'Holy hand grenades'
355+
test_cat_2 = 'News'
356+
357+
# Initial Data
358+
name = "Category Test"
359+
url = None
360+
category = test_cat_1
361+
languages = None
362+
paid = None
363+
notes = None
364+
365+
# Update response
366+
response = update_resource(client,
367+
apikey,
368+
name,
369+
url,
370+
category,
371+
languages,
372+
paid,
373+
notes)
374+
# Check update
375+
assert (response.status_code == 200)
376+
assert (response.json['resource'].get('name') == "Category Test")
377+
category_response = response.json['resource'].get('category')
378+
assert (category_response == test_cat_1)
379+
380+
# Update category to something else
381+
category = test_cat_2
382+
response = update_resource(client, apikey, name, url,
383+
category, languages, paid, notes)
384+
385+
# Check Update of category
386+
assert (response.status_code == 200)
387+
category_response = response.json['resource'].get('category')
388+
assert (category_response == test_cat_2)
389+
390+
db_categories = client.get('api/v1/categories')
391+
db_categories = [category.get('name')
392+
for category in db_categories.json['categories']]
393+
394+
assert (test_cat_1 not in db_categories)

0 commit comments

Comments
 (0)