Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions app/api/routes/resource_modification.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down
110 changes: 110 additions & 0 deletions tests/unit/test_routes/test_resource_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)