def test_delete_all_helper(client): # starts empty resp = client.get(POTION_TYPE, as_response=True) assert resp.status_code == 200 if resp.json['results']: delete_all() resp = client.get(POTION_TYPE, as_response=True) assert resp.status_code == 200 assert resp.json['results'] == EMPTY # add some potions client.post(POTION_TYPE, headers=valid_token, json=[{ 'related_stat': 'Health', 'color': 'red' }, { 'related_stat': 'Mana', 'color': 'blue' }]) resp = client.get(POTION_TYPE, as_response=True) assert resp.status_code == 200 assert len(resp.json['results']) == 2 # use helper to delete from DB delete_all() # immediately run get again, should be empty resp = client.get(POTION_TYPE, as_response=True) assert resp.status_code == 200 assert resp.json['results'] == EMPTY
def test_delete_foreign_key(client, url, key): prepopulate() # prepopulate should have created the thing response = client.get(url, as_response=True) assert response.status_code == 200 # thing should be referenced as ForeignKey in Potions response = client.get(f'/v1/potions?{key}=1', as_response=True) assert response.status_code == 200 assert len(response.json['results']) >= 1 matched_potions = len(response.json['results']) # if you delete PotionType/Potency with Potion referencing it # should throw an error & not delete response = client.delete(url, headers=valid_token, as_response=True) assert response.status_code == 400 # delete should not have removed the thing response = client.get(url, as_response=True) assert response.status_code == 200 response = client.get(f'/v1/potions?{key}=1', as_response=True) assert response.status_code == 200 assert len(response.json['results']) == matched_potions delete_all()
def test_search_multiple_keys(client): prepopulate() # prepopulate sets all Inventory.price = 15, so these are identical queries inventory1 = client.get(f'{INVENTORY}?price=15&limit=7') inventory2 = client.get(f'{INVENTORY}?limit=7') assert inventory1['results'] == inventory2['results'] delete_all()
def test_describe_empty(client): response = client.get('/v1/potions/describe', as_response=True) assert response.status_code == 200 assert response.json == None response = client.get('/v1/potions/describe/1', as_response=True) assert response.status_code == 404 assert response.json[ 'description'] == 'Unable to find resource with given ID'
def test_search_for_bool(client, search, actual): prepopulate() all_inventory = client.get(INVENTORY) search_on_sale = client.get(f'{INVENTORY}?on_sale={search}') all_on_sale = [{'id':inv['id'] for inv in all_inventory['results'] if inv['on_sale'] == actual}] search_results = [{'id':inv['id'] for inv in search_on_sale['results']}] assert all_on_sale == search_results delete_all()
def test_search_for_number(client): prepopulate() # prepopulate sets all Inventory.price = 15 search_partial = client.get(f'{INVENTORY}?price=1') assert search_partial['results'] == EMPTY search_good = client.get(f'{INVENTORY}?price=15') all_inventory = client.get(INVENTORY) assert search_good['results'] == all_inventory['results'] delete_all()
def test_search_limit(client, limit): prepopulate() max_potions = len(client.get(POTIONS)['results']) if limit >= 0: resp = client.get(f'{POTIONS}?limit={limit}') assert len(resp['results']) == min(limit, max_potions) else: resp = client.get(f'{POTIONS}?limit={limit}', as_response=True) assert resp.status_code == 400 assert resp.json['description'] == "Invalid value for 'limit' parameter." delete_all()
def test_search_for_bool_invalid(client): prepopulate() bad_search = client.get(f'{INVENTORY}?on_sale=badvalue') assert bad_search['results'] == EMPTY delete_all()
def test_valid_no_auth_routes(client, url): delete_all() # valid header response = client.get( url, headers={'Authorization': create_token(token, adjust_times=True)}, as_response=True) assert response.status_code == 200 # invalid header response = client.get(url, headers={'Authorization': 'notvalid'}, as_response=True) assert response.status_code == 200 # no header response = client.get(url, as_response=True) assert response.status_code == 200
def test_search_for_string(client): prepopulate() search_exact = client.get(f'{POTION_TYPE}?color=red') assert len(search_exact['results']) == 1 search_partial = client.get(f'{POTION_TYPE}?color=r') assert search_exact == search_partial # prepopulate colors = red,blue,green = all have 'e' # but none should show up when you search for 'e' because # search is a startswith() based search search_middle = client.get(f'{POTION_TYPE}?color=e') assert search_middle['results'] == EMPTY # search should be case-insensitive search_case = client.get(f'{POTION_TYPE}?color=RED') assert search_case == search_exact delete_all()
def test_put_unknown_foreign_key(client): prepopulate() potion_exists = client.get('/v1/potions/1', as_response=True) assert potion_exists.status_code == 200 response = client.put('/v1/potions/1', headers=valid_token, json={'potency_id':9000, 'type_id':9000}, as_response=True) assert response.status_code == 404 delete_all()
def test_put_multiple(client): # an error in a previous version of the update code in base.py # would cause all items to be updated instead of only the item # with the given id prepopulate() resp = client.get(POTION_TYPE) assert len(resp['results']) == 3 client.put(f'{POTION_TYPE}/1', headers=valid_token, json={'color': 'purple'}) resp = client.get(POTION_TYPE) assert len(resp['results']) == 3 colors = set(r['color'] for r in resp['results']) assert set(['purple', 'blue', 'green']) == colors delete_all()
def value_equals(route, should_equal): response = client.get(route) if len(response['results']) > 0: assert len(response['results']) == 1 results = response['results'][0] # create a copy of should_equal with all fields expected = copy.copy(should_equal) expected['id'] = 1 assert results == expected else: assert should_equal == EMPTY assert response['results'] == EMPTY
def test_prepopulate_helper(client): prepopulate() resp = client.get(POTION_TYPE, as_response=True) assert resp.status_code == 200 assert len(resp.json['results']) == 3 resp = client.get(POTENCY, as_response=True) assert resp.status_code == 200 assert len(resp.json['results']) == 3 resp = client.get(POTIONS, as_response=True) assert resp.status_code == 200 assert len(resp.json['results']) == 9 resp = client.get(INVENTORY, as_response=True) assert resp.status_code == 200 assert len(resp.json['results']) == 9 delete_all() resp = client.get(POTION_TYPE, as_response=True) assert resp.status_code == 200 assert resp.json['results'] == EMPTY resp = client.get(POTENCY, as_response=True) assert resp.status_code == 200 assert resp.json['results'] == EMPTY resp = client.get(POTIONS, as_response=True) assert resp.status_code == 200 assert resp.json['results'] == EMPTY resp = client.get(INVENTORY, as_response=True) assert resp.status_code == 200 assert resp.json['results'] == EMPTY
def test_describe_all(client): prepopulate() response = client.get('/v1/potions/describe') assert response == descriptions delete_all()
def delete(route): client.delete(f'{route}/1', headers=valid_token, expected_statuses=[204]) response = client.get(route) assert len(response['results']) == 0
def test_describe_one(client, index): prepopulate() # index for DB starts with 1, index for python list starts with 0 response = client.get(f'/v1/potions/describe/{index}') assert response == descriptions[index - 1] delete_all()
def test_search_invalid_key(client): prepopulate() resp = client.get(f'{POTIONS}?invalidkey=bad', as_response=True) assert resp.status_code == 400 assert resp.json['description'] == "Unsupported search parameters: {'invalidkey'}" delete_all()