Files
spoolman2/tests_integration/tests/vendor/test_find.py
Donkie f8cc9f7eda Updated integration tests to not require exact match
This matches how we want clients to behave, they should ignore any extra fields that are sent in the response.
2024-01-23 18:58:58 +01:00

190 lines
5.0 KiB
Python

"""Integration tests for the Vendor API endpoint."""
from collections.abc import Iterable
from dataclasses import dataclass
from typing import Any
import httpx
import pytest
from ..conftest import assert_lists_compatible
URL = "http://spoolman:8000"
@dataclass
class Fixture:
vendors: list[dict[str, Any]]
@pytest.fixture(scope="module")
def vendors() -> Iterable[Fixture]:
"""Add some vendors to the database."""
result = httpx.post(
f"{URL}/api/v1/vendor",
json={"name": "John", "comment": "abcdefghåäö"},
)
result.raise_for_status()
vendor_1 = result.json()
result = httpx.post(
f"{URL}/api/v1/vendor",
json={"name": "Stan", "comment": "gfdadfg"},
)
result.raise_for_status()
vendor_2 = result.json()
result = httpx.post(
f"{URL}/api/v1/vendor",
json={"name": ""},
)
result.raise_for_status()
vendor_3 = result.json()
yield Fixture(
vendors=[vendor_1, vendor_2, vendor_3],
)
httpx.delete(f"{URL}/api/v1/vendor/{vendor_1['id']}").raise_for_status()
httpx.delete(f"{URL}/api/v1/vendor/{vendor_2['id']}").raise_for_status()
httpx.delete(f"{URL}/api/v1/vendor/{vendor_3['id']}").raise_for_status()
def test_find_all_vendors(vendors: Fixture):
# Execute
result = httpx.get(
f"{URL}/api/v1/vendor",
)
result.raise_for_status()
# Verify
vendors_result = result.json()
assert_lists_compatible(vendors_result, vendors.vendors)
def test_find_all_vendors_sort_asc(vendors: Fixture):
# Execute
result = httpx.get(f"{URL}/api/v1/vendor?sort=id:asc")
result.raise_for_status()
# Verify
vendors_result = result.json()
assert len(vendors_result) == len(vendors.vendors)
assert vendors_result[0] == vendors.vendors[0]
def test_find_all_vendors_sort_desc(vendors: Fixture):
# Execute
result = httpx.get(f"{URL}/api/v1/vendor?sort=id:desc")
result.raise_for_status()
# Verify
vendors_result = result.json()
assert len(vendors_result) == len(vendors.vendors)
assert vendors_result[-1] == vendors.vendors[0]
def test_find_all_vendors_limit_asc(vendors: Fixture):
# Execute
result = httpx.get(f"{URL}/api/v1/vendor?sort=id:asc&limit=2")
result.raise_for_status()
# Verify
assert result.headers["X-Total-Count"] == "3"
vendors_result = result.json()
assert len(vendors_result) == 2
assert vendors_result == [vendors.vendors[0], vendors.vendors[1]]
def test_find_all_vendors_limit_desc(vendors: Fixture):
# Execute
result = httpx.get(f"{URL}/api/v1/vendor?sort=id:desc&limit=2")
result.raise_for_status()
# Verify
assert result.headers["X-Total-Count"] == "3"
vendors_result = result.json()
assert len(vendors_result) == 2
assert vendors_result == [vendors.vendors[-1], vendors.vendors[-2]]
def test_find_all_vendors_limit_asc_offset(vendors: Fixture):
# Execute
result = httpx.get(f"{URL}/api/v1/vendor?sort=id:asc&limit=2&offset=1")
result.raise_for_status()
# Verify
assert result.headers["X-Total-Count"] == "3"
vendors_result = result.json()
assert len(vendors_result) == 2
assert vendors_result == [vendors.vendors[1], vendors.vendors[2]]
def test_find_all_vendors_limit_desc_offset(vendors: Fixture):
# Execute
result = httpx.get(f"{URL}/api/v1/vendor?sort=id:desc&limit=2&offset=1")
result.raise_for_status()
# Verify
assert result.headers["X-Total-Count"] == "3"
vendors_result = result.json()
assert len(vendors_result) == 2
assert vendors_result == [vendors.vendors[-2], vendors.vendors[-3]]
def test_find_all_vendors_limit_asc_offset_outside_range(vendors: Fixture): # noqa: ARG001
# Execute
result = httpx.get(f"{URL}/api/v1/vendor?sort=id:asc&limit=2&offset=100")
result.raise_for_status()
# Verify
assert result.headers["X-Total-Count"] == "3"
vendors_result = result.json()
assert len(vendors_result) == 0
@pytest.mark.parametrize(
"field_name",
[
"id",
"registered",
"name",
"comment",
],
)
def test_find_all_vendors_sort_fields(vendors: Fixture, field_name: str):
"""Test sorting by all fields."""
# Execute
result = httpx.get(f"{URL}/api/v1/vendor?sort={field_name}:asc")
result.raise_for_status()
# Verify
vendors_result = result.json()
assert len(vendors_result) == len(vendors.vendors)
def test_find_vendors_by_name(vendors: Fixture):
# Execute
result = httpx.get(
f"{URL}/api/v1/vendor",
params={"name": vendors.vendors[0]["name"]},
)
result.raise_for_status()
# Verify
vendors_result = result.json()
assert vendors_result == [vendors.vendors[0]]
def test_find_vendors_by_empty_name(vendors: Fixture):
# Execute
result = httpx.get(
f"{URL}/api/v1/vendor",
params={"name": ""},
)
result.raise_for_status()
# Verify
vendors_result = result.json()
assert vendors_result == [vendors.vendors[2]]