From 415d4192571eb5ea8b6d58726c44842fca82a5d6 Mon Sep 17 00:00:00 2001 From: Benjamin Bertrand <benjamin.bertrand@esss.se> Date: Sun, 5 Aug 2018 16:13:51 +0200 Subject: [PATCH] Update tests for flask >= 1.0 New get_json method on test client response. See http://flask.pocoo.org/docs/1.0/testing/#testing-json-apis --- tests/functional/test_api.py | 188 +++++++++++++++++------------------ tests/functional/test_web.py | 20 ++-- 2 files changed, 97 insertions(+), 111 deletions(-) diff --git a/tests/functional/test_api.py b/tests/functional/test_api.py index f47b8f3..731f62f 100644 --- a/tests/functional/test_api.py +++ b/tests/functional/test_api.py @@ -55,8 +55,6 @@ def get(client, url, token=None): "Authorization": f"Bearer {token}", }, ) - if response.headers["Content-Type"] == "application/json": - response.json = json.loads(response.data) return response @@ -65,8 +63,6 @@ def post(client, url, data, token=None): if token is not None: headers["Authorization"] = f"Bearer {token}" response = client.post(url, data=json.dumps(data), headers=headers) - if response.headers["Content-Type"] == "application/json": - response.json = json.loads(response.data) return response @@ -75,8 +71,6 @@ def patch(client, url, data, token=None): if token is not None: headers["Authorization"] = f"Bearer {token}" response = client.patch(url, data=json.dumps(data), headers=headers) - if response.headers["Content-Type"] == "application/json": - response.json = json.loads(response.data) return response @@ -87,7 +81,7 @@ def login(client, username, password): def get_token(client, username, password): response = login(client, username, password) - return response.json["access_token"] + return response.get_json()["access_token"] @pytest.fixture() @@ -113,7 +107,7 @@ def admin_token(client): def check_response_message(response, msg, status_code=400): assert response.status_code == status_code try: - data = response.json + data = response.get_json() except AttributeError: data = json.loads(response.data) try: @@ -126,13 +120,13 @@ def check_response_message(response, msg, status_code=400): def check_names(response, names): - response_names = set(item["name"] for item in response.json) + response_names = set(item["name"] for item in response.get_json()) assert set(names) == response_names def check_input_is_subset_of_response(response, inputs): # Sort the response by id to match the inputs order - response_elts = sorted(response.json, key=lambda d: d["id"]) + response_elts = sorted(response.get_json(), key=lambda d: d["id"]) for d1, d2 in zip(inputs, response_elts): for key, value in d1.items(): if isinstance(value, datetime.datetime): @@ -153,7 +147,7 @@ def test_login(client): check_response_message(response, "Invalid credentials", 401) response = login(client, "user_ro", "userro") assert response.status_code == 200 - assert "access_token" in response.json + assert "access_token" in response.get_json() @pytest.mark.parametrize("endpoint", GENERIC_GET_ENDPOINTS) @@ -171,7 +165,7 @@ def test_get_generic_model(endpoint, session, client, readonly_token): check_names(response, names) response = get(client, f"{API_URL}/{endpoint}", readonly_token) check_names(response, names) - for item in response.json: + for item in response.get_json(): assert "qrcode" in item @@ -194,8 +188,8 @@ def test_create_generic_model(endpoint, client, user_token): data = {"name": "Foo"} response = post(client, f"{API_URL}/{endpoint}", data=data, token=user_token) assert response.status_code == 201 - assert {"id", "name"} <= set(response.json.keys()) - assert response.json["name"] == "Foo" + assert {"id", "name"} <= set(response.get_json().keys()) + assert response.get_json()["name"] == "Foo" response = post(client, f"{API_URL}/{endpoint}", data=data, token=user_token) check_response_message( response, @@ -221,7 +215,7 @@ def test_create_generic_model(endpoint, client, user_token): data = {"name": "Bar", "description": "Bar description"} response = post(client, f"{API_URL}/{endpoint}", data=data, token=user_token) assert response.status_code == 201 - assert response.json["description"] == "Bar description" + assert response.get_json()["description"] == "Bar description" model = ENDPOINT_MODEL[endpoint] assert model.query.count() == 2 response = get(client, f"{API_URL}/{endpoint}", user_token) @@ -270,8 +264,8 @@ def test_create_item(client, user_token): "created_at", "user", "comments", - } == set(response.json.keys()) - assert response.json["serial_number"] == "123456" + } == set(response.get_json().keys()) + assert response.get_json()["serial_number"] == "123456" # Check that serial_number doesn't have to be unique response = post(client, f"{API_URL}/inventory/items", data=data, token=user_token) @@ -331,17 +325,17 @@ def test_get_item(client, status_factory, item_factory, readonly_token): client, f"{API_URL}/inventory/items/{item1.id}", token=readonly_token ) assert response.status_code == 200 - assert response.json["id"] == item1.id - assert response.json["serial_number"] == item1.serial_number + assert response.get_json()["id"] == item1.id + assert response.get_json()["serial_number"] == item1.serial_number # ...or ics_id response = get( client, f"{API_URL}/inventory/items/{item2.ics_id}", token=readonly_token ) assert response.status_code == 200 - assert response.json["id"] == item2.id - assert response.json["ics_id"] == item2.ics_id - assert response.json["serial_number"] == item2.serial_number - assert response.json["status"] == str(item2.status) + assert response.get_json()["id"] == item2.id + assert response.get_json()["ics_id"] == item2.ics_id + assert response.get_json()["serial_number"] == item2.serial_number + assert response.get_json()["status"] == str(item2.status) def test_patch_item_auth_fail(client, session, readonly_token): @@ -405,19 +399,19 @@ def test_patch_item(client, status, item_factory, user_token): client, f"{API_URL}/inventory/items/{item1.id}", data=data, token=user_token ) assert response.status_code == 200 - assert response.json["id"] == item1.id - assert response.json["serial_number"] == item1.serial_number - assert response.json["ics_id"] == data["ics_id"] + assert response.get_json()["id"] == item1.id + assert response.get_json()["serial_number"] == item1.serial_number + assert response.get_json()["ics_id"] == data["ics_id"] # ...or ics_id data = {"status": status.name} response = patch( client, f"{API_URL}/inventory/items/{item2.ics_id}", data=data, token=user_token ) assert response.status_code == 200 - assert response.json["id"] == item2.id - assert response.json["ics_id"] == item2.ics_id - assert response.json["serial_number"] == item2.serial_number - assert response.json["status"] == data["status"] + assert response.get_json()["id"] == item2.id + assert response.get_json()["ics_id"] == item2.ics_id + assert response.get_json()["serial_number"] == item2.serial_number + assert response.get_json()["status"] == data["status"] def test_patch_item_integrity_error(client, user_token, item_factory): @@ -462,12 +456,12 @@ def test_patch_item_parent( token=user_token, ) assert response.status_code == 200 - assert response.json["id"] == item2.id - assert response.json["ics_id"] == item2.ics_id - assert response.json["serial_number"] == item2.serial_number - assert response.json["parent"] == item1.ics_id - assert response.json["status"] == str(item1.status) - assert response.json["location"] == str(item1.location) + assert response.get_json()["id"] == item2.id + assert response.get_json()["ics_id"] == item2.ics_id + assert response.get_json()["serial_number"] == item2.serial_number + assert response.get_json()["parent"] == item1.ics_id + assert response.get_json()["status"] == str(item1.status) + assert response.get_json()["location"] == str(item1.location) # updating a parent, modifies the status and location of all children # check location @@ -479,15 +473,15 @@ def test_patch_item_parent( token=user_token, ) assert response.status_code == 200 - assert response.json["id"] == item1.id - assert response.json["ics_id"] == item1.ics_id - assert response.json["serial_number"] == item1.serial_number - assert response.json["status"] == str(item1.status) - assert response.json["location"] == data2["location"] + assert response.get_json()["id"] == item1.id + assert response.get_json()["ics_id"] == item1.ics_id + assert response.get_json()["serial_number"] == item1.serial_number + assert response.get_json()["status"] == str(item1.status) + assert response.get_json()["location"] == data2["location"] for ics_id in ("AAA002", "AAA003"): response = get(client, f"{API_URL}/inventory/items/{ics_id}", token=user_token) - assert response.json["location"] == data2["location"] - assert response.json["status"] == "In service" + assert response.get_json()["location"] == data2["location"] + assert response.get_json()["status"] == "In service" # check status data3 = {"status": "Stock"} response = patch( @@ -497,11 +491,11 @@ def test_patch_item_parent( token=user_token, ) assert response.status_code == 200 - assert response.json["status"] == data3["status"] + assert response.get_json()["status"] == data3["status"] for ics_id in ("AAA002", "AAA003"): response = get(client, f"{API_URL}/inventory/items/{ics_id}", token=user_token) - assert response.json["location"] == data2["location"] - assert response.json["status"] == data3["status"] + assert response.get_json()["location"] == data2["location"] + assert response.get_json()["status"] == data3["status"] # manufacturer has no impact on children data4 = {"manufacturer": "HP"} @@ -512,17 +506,17 @@ def test_patch_item_parent( token=user_token, ) assert response.status_code == 200 - assert response.json["manufacturer"] == "HP" + assert response.get_json()["manufacturer"] == "HP" # Manufacturer didn't change on children response = get( client, f"{API_URL}/inventory/items/{item2.ics_id}", token=user_token ) - assert response.json["manufacturer"] == str(item2.manufacturer) + assert response.get_json()["manufacturer"] == str(item2.manufacturer) assert str(item2.manufacturer) != "HP" response = get( client, f"{API_URL}/inventory/items/{item3.ics_id}", token=user_token ) - assert response.json["manufacturer"] == str(item3.manufacturer) + assert response.get_json()["manufacturer"] == str(item3.manufacturer) assert str(item3.manufacturer) != "HP" @@ -535,7 +529,7 @@ def test_get_items(client, location_factory, item_factory, readonly_token): response = get(client, f"{API_URL}/inventory/items", token=readonly_token) assert response.status_code == 200 - assert len(response.json) == 3 + assert len(response.get_json()) == 3 check_input_is_subset_of_response( response, (item1.to_dict(), item2.to_dict(), item3.to_dict()) ) @@ -545,7 +539,7 @@ def test_get_items(client, location_factory, item_factory, readonly_token): client, f"{API_URL}/inventory/items?serial_number=234567", token=readonly_token ) assert response.status_code == 200 - assert len(response.json) == 1 + assert len(response.get_json()) == 1 check_input_is_subset_of_response(response, (item2.to_dict(),)) # filtering on location_id works but not location (might want to change that) response = get( @@ -554,7 +548,7 @@ def test_get_items(client, location_factory, item_factory, readonly_token): token=readonly_token, ) assert response.status_code == 200 - assert len(response.json) == 1 + assert len(response.get_json()) == 1 check_input_is_subset_of_response(response, (item1.to_dict(),)) response = get( client, f"{API_URL}/inventory/items?location=ESS", token=readonly_token @@ -579,7 +573,7 @@ def test_get_networks(client, network_factory, readonly_token): response = get(client, f"{API_URL}/network/networks", token=readonly_token) assert response.status_code == 200 - assert len(response.json) == 3 + assert len(response.get_json()) == 3 check_input_is_subset_of_response( response, (network1.to_dict(), network2.to_dict(), network3.to_dict()) ) @@ -591,7 +585,7 @@ def test_get_networks(client, network_factory, readonly_token): token=readonly_token, ) assert response.status_code == 200 - assert len(response.json) == 1 + assert len(response.get_json()) == 1 check_input_is_subset_of_response(response, (network2.to_dict(),)) @@ -673,13 +667,13 @@ def test_create_network(client, admin_token, network_scope_factory): "created_at", "updated_at", "user", - } == set(response.json.keys()) - assert response.json["vlan_name"] == "network1" - assert response.json["vlan_id"] == 1600 - assert response.json["address"] == "172.16.1.0/24" - assert response.json["first_ip"] == "172.16.1.10" - assert response.json["last_ip"] == "172.16.1.250" - assert response.json["netmask"] == "255.255.255.0" + } == set(response.get_json().keys()) + assert response.get_json()["vlan_name"] == "network1" + assert response.get_json()["vlan_id"] == 1600 + assert response.get_json()["address"] == "172.16.1.0/24" + assert response.get_json()["first_ip"] == "172.16.1.10" + assert response.get_json()["last_ip"] == "172.16.1.250" + assert response.get_json()["netmask"] == "255.255.255.0" # Check that address and name shall be unique response = post(client, f"{API_URL}/network/networks", data=data, token=admin_token) @@ -729,7 +723,7 @@ def test_create_network(client, admin_token, network_scope_factory): client, f"{API_URL}/network/networks", data=data2, token=admin_token ) assert response.status_code == 201 - assert response.json["description"] == "long description" + assert response.get_json()["description"] == "long description" # check all items that were created assert models.Network.query.count() == 2 @@ -852,7 +846,7 @@ def test_get_interfaces(client, network_factory, interface_factory, readonly_tok response = get(client, f"{API_URL}/network/interfaces", token=readonly_token) assert response.status_code == 200 - assert len(response.json) == 3 + assert len(response.get_json()) == 3 check_input_is_subset_of_response( response, (interface1.to_dict(), interface2.to_dict(), interface3.to_dict()) ) @@ -864,7 +858,7 @@ def test_get_interfaces(client, network_factory, interface_factory, readonly_tok token=readonly_token, ) assert response.status_code == 200 - assert len(response.json) == 1 + assert len(response.get_json()) == 1 check_input_is_subset_of_response(response, (interface3.to_dict(),)) @@ -899,7 +893,7 @@ def test_get_interfaces_by_domain( token=readonly_token, ) assert response.status_code == 200 - assert len(response.json) == 2 + assert len(response.get_json()) == 2 check_input_is_subset_of_response( response, (interface1.to_dict(), interface2.to_dict()) ) @@ -910,7 +904,7 @@ def test_get_interfaces_by_domain( token=readonly_token, ) assert response.status_code == 200 - assert len(response.json) == 1 + assert len(response.get_json()) == 1 check_input_is_subset_of_response(response, (interface3.to_dict(),)) @@ -941,7 +935,7 @@ def test_get_interfaces_by_network( client, f"{API_URL}/network/interfaces?network=MyNetwork1", token=readonly_token ) assert response.status_code == 200 - assert len(response.json) == 2 + assert len(response.get_json()) == 2 check_input_is_subset_of_response( response, (interface1.to_dict(), interface2.to_dict()) ) @@ -950,7 +944,7 @@ def test_get_interfaces_by_network( client, f"{API_URL}/network/interfaces?network=MyNetwork2", token=readonly_token ) assert response.status_code == 200 - assert len(response.json) == 1 + assert len(response.get_json()) == 1 check_input_is_subset_of_response(response, (interface3.to_dict(),)) @@ -962,7 +956,7 @@ def test_get_interfaces_with_model( item_factory(model=model1, host_id=host1.id) interface_factory(host_id=host1.id) response = get(client, f"{API_URL}/network/interfaces", token=readonly_token) - assert response.json[0]["model"] == "EX3400" + assert response.get_json()[0]["model"] == "EX3400" def test_create_interface(client, network_factory, user_token): @@ -1007,10 +1001,10 @@ def test_create_interface(client, network_factory, user_token): "created_at", "updated_at", "user", - } == set(response.json.keys()) - assert response.json["network"] == network.vlan_name - assert response.json["ip"] == "192.168.1.20" - assert response.json["name"] == "interface1" + } == set(response.get_json().keys()) + assert response.get_json()["network"] == network.vlan_name + assert response.get_json()["ip"] == "192.168.1.20" + assert response.get_json()["name"] == "interface1" # Check that IP and name shall be unique response = post( @@ -1099,7 +1093,7 @@ def test_get_macs(client, mac_factory, readonly_token): response = get(client, f"{API_URL}/network/macs", token=readonly_token) assert response.status_code == 200 - assert len(response.json) == 2 + assert len(response.get_json()) == 2 check_input_is_subset_of_response(response, (mac1.to_dict(), mac2.to_dict())) @@ -1112,8 +1106,8 @@ def test_create_mac(client, item_factory, user_token): data = {"address": "b5:4b:7d:a4:23:43"} response = post(client, f"{API_URL}/network/macs", data=data, token=user_token) assert response.status_code == 201 - assert {"id", "address", "item", "interfaces"} == set(response.json.keys()) - assert response.json["address"] == data["address"] + assert {"id", "address", "item", "interfaces"} == set(response.get_json().keys()) + assert response.get_json()["address"] == data["address"] # Check that address shall be unique response = post(client, f"{API_URL}/network/macs", data=data, token=user_token) @@ -1147,7 +1141,7 @@ def test_get_ansible_groups(client, ansible_group_factory, readonly_token): group2 = ansible_group_factory() response = get(client, f"{API_URL}/network/groups", token=readonly_token) assert response.status_code == 200 - assert len(response.json) == 2 + assert len(response.get_json()) == 2 check_input_is_subset_of_response(response, (group1.to_dict(), group2.to_dict())) @@ -1169,8 +1163,8 @@ def test_create_ansible_group(client, admin_token): "created_at", "updated_at", "user", - } == set(response.json.keys()) - assert response.json["name"] == data["name"] + } == set(response.get_json().keys()) + assert response.get_json()["name"] == data["name"] # Check that name shall be unique response = post(client, f"{API_URL}/network/groups", data=data, token=admin_token) @@ -1185,7 +1179,7 @@ def test_create_ansible_group_with_vars(client, admin_token): data = {"name": "mygroup", "vars": {"foo": "hello", "mylist": [1, 2, 3]}} response = post(client, f"{API_URL}/network/groups", data=data, token=admin_token) assert response.status_code == 201 - assert response.json["vars"] == data["vars"] + assert response.get_json()["vars"] == data["vars"] group = models.AnsibleGroup.query.filter_by(name="mygroup").first() assert group.vars == data["vars"] @@ -1196,7 +1190,7 @@ def test_get_hosts(client, host_factory, readonly_token): host2 = host_factory() response = get(client, f"{API_URL}/network/hosts", token=readonly_token) assert response.status_code == 200 - assert len(response.json) == 2 + assert len(response.get_json()) == 2 check_input_is_subset_of_response(response, (host1.to_dict(), host2.to_dict())) @@ -1205,7 +1199,7 @@ def test_get_hosts_with_ansible_vars(client, host_factory, readonly_token): host_factory(ansible_vars=vars) response = get(client, f"{API_URL}/network/hosts", token=readonly_token) assert response.status_code == 200 - assert response.json[0]["ansible_vars"] == vars + assert response.get_json()[0]["ansible_vars"] == vars def test_get_hosts_with_model( @@ -1216,14 +1210,14 @@ def test_get_hosts_with_model( item_factory(model=model1, host_id=host1.id) response = get(client, f"{API_URL}/network/hosts", token=readonly_token) assert response.status_code == 200 - assert response.json[0]["model"] == "EX3400" + assert response.get_json()[0]["model"] == "EX3400" def test_get_hosts_with_no_model(client, host_factory, readonly_token): host_factory() response = get(client, f"{API_URL}/network/hosts", token=readonly_token) assert response.status_code == 200 - assert response.json[0]["model"] is None + assert response.get_json()[0]["model"] is None def test_create_host(client, device_type_factory, user_token): @@ -1259,8 +1253,8 @@ def test_create_host(client, device_type_factory, user_token): "created_at", "updated_at", "user", - } == set(response.json.keys()) - assert response.json["name"] == data["name"] + } == set(response.get_json().keys()) + assert response.get_json()["name"] == data["name"] # Check that name shall be unique response = post(client, f"{API_URL}/network/hosts", data=data, token=user_token) @@ -1300,7 +1294,7 @@ def test_create_host_with_ansible_vars(client, device_type_factory, user_token): } response = post(client, f"{API_URL}/network/hosts", data=data, token=user_token) assert response.status_code == 201 - assert response.json["ansible_vars"] == data["ansible_vars"] + assert response.get_json()["ansible_vars"] == data["ansible_vars"] host = models.Host.query.filter_by(name="my-host").first() assert host.ansible_vars == data["ansible_vars"] @@ -1336,7 +1330,7 @@ def test_create_host_as_consultant( def test_get_user_profile(client, readonly_token): response = get(client, f"{API_URL}/user/profile", token=readonly_token) assert response.status_code == 200 - user = response.json + user = response.get_json() assert {"id", "username", "groups", "email", "display_name"} == set(user.keys()) assert user["username"] == "user_ro" assert user["display_name"] == "User RO" @@ -1349,7 +1343,7 @@ def test_get_domains(client, domain_factory, readonly_token): domain2 = domain_factory() response = get(client, f"{API_URL}/network/domains", token=readonly_token) assert response.status_code == 200 - assert len(response.json) == 2 + assert len(response.get_json()) == 2 check_input_is_subset_of_response(response, (domain1.to_dict(), domain2.to_dict())) @@ -1369,8 +1363,8 @@ def test_create_domain(client, admin_token): "created_at", "updated_at", "user", - } == set(response.json.keys()) - assert response.json["name"] == data["name"] + } == set(response.get_json().keys()) + assert response.get_json()["name"] == data["name"] # Check that name shall be unique response = post(client, f"{API_URL}/network/domains", data=data, token=admin_token) @@ -1387,7 +1381,7 @@ def test_get_cnames(client, cname_factory, readonly_token): cname2 = cname_factory() response = get(client, f"{API_URL}/network/cnames", token=readonly_token) assert response.status_code == 200 - assert len(response.json) == 2 + assert len(response.get_json()) == 2 check_input_is_subset_of_response(response, (cname1.to_dict(), cname2.to_dict())) @@ -1414,12 +1408,12 @@ def test_get_cnames_by_domain( cname_b2 = cname_factory(interface=interface_b1) response = get(client, f"{API_URL}/network/cnames", token=readonly_token) assert response.status_code == 200 - assert len(response.json) == 5 + assert len(response.get_json()) == 5 response = get( client, f"{API_URL}/network/cnames?domain=a.esss.lu.se", token=readonly_token ) assert response.status_code == 200 - assert len(response.json) == 3 + assert len(response.get_json()) == 3 check_input_is_subset_of_response( response, (cname_a1.to_dict(), cname_a2.to_dict(), cname_a3.to_dict()) ) @@ -1427,7 +1421,7 @@ def test_get_cnames_by_domain( client, f"{API_URL}/network/cnames?domain=b.esss.lu.se", token=readonly_token ) assert response.status_code == 200 - assert len(response.json) == 2 + assert len(response.get_json()) == 2 check_input_is_subset_of_response( response, (cname_b1.to_dict(), cname_b2.to_dict()) ) @@ -1453,9 +1447,9 @@ def test_create_cname(client, interface, admin_token): response = post(client, f"{API_URL}/network/cnames", data=data, token=admin_token) assert response.status_code == 201 assert {"id", "name", "interface", "created_at", "updated_at", "user"} == set( - response.json.keys() + response.get_json().keys() ) - assert response.json["name"] == data["name"] + assert response.get_json()["name"] == data["name"] # Check that name shall be unique response = post(client, f"{API_URL}/network/cnames", data=data, token=admin_token) diff --git a/tests/functional/test_web.py b/tests/functional/test_web.py index f4bb959..12878b0 100644 --- a/tests/functional/test_web.py +++ b/tests/functional/test_web.py @@ -9,18 +9,10 @@ This module defines basic web tests. :license: BSD 2-Clause, see LICENSE for more details. """ -import json import pytest import re -def get(client, url): - response = client.get(url) - if response.headers["Content-Type"] == "application/json": - response.json = json.loads(response.data) - return response - - def login(client, username, password): data = {"username": username, "password": password} return client.post("/user/login", data=data, follow_redirects=True) @@ -67,19 +59,19 @@ def test_protected_url(url, client): def test_retrieve_items(logged_client, item_factory): - response = get(logged_client, "/inventory/_retrieve_items") - assert response.json["data"] == [] + response = logged_client.get("/inventory/_retrieve_items") + assert response.get_json()["data"] == [] serial_numbers = ("12345", "45678") for sn in serial_numbers: item_factory(serial_number=sn) - response = get(logged_client, "/inventory/_retrieve_items") - items = response.json["data"] + response = logged_client.get("/inventory/_retrieve_items") + items = response.get_json()["data"] assert set(serial_numbers) == set(item[4] for item in items) assert len(items[0]) == 11 def test_generate_random_mac(logged_client): - response = get(logged_client, "/network/_generate_random_mac") - mac = response.json["data"]["mac"] + response = logged_client.get("/network/_generate_random_mac") + mac = response.get_json()["data"]["mac"] assert re.match("^(?:[0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$", mac) is not None assert mac.startswith("02:42:42") -- GitLab