diff --git a/tests_integration/tests/filament/test_find.py b/tests_integration/tests/filament/test_find.py index 6232ea0..61f1c83 100644 --- a/tests_integration/tests/filament/test_find.py +++ b/tests_integration/tests/filament/test_find.py @@ -10,6 +10,11 @@ import pytest URL = "http://spoolman:8000" +def filament_lists_equal(a: Iterable[dict[str, Any]], b: Iterable[dict[str, Any]]) -> bool: + """Compare two lists of filaments where the order of the filaments is not guaranteed.""" + return sorted(a, key=lambda x: x["id"]) == sorted(b, key=lambda x: x["id"]) + + @dataclass class Fixture: filaments: list[dict[str, Any]] @@ -17,7 +22,7 @@ class Fixture: @pytest.fixture(scope="module") -def filaments(random_vendor_mod: dict[str, Any]) -> Iterable[Fixture]: +def filaments(random_vendor_mod: dict[str, Any], random_empty_vendor_mod: dict[str, Any]) -> Iterable[Fixture]: """Add some filaments to the database.""" result = httpx.post( f"{URL}/api/v1/filament", @@ -58,7 +63,7 @@ def filaments(random_vendor_mod: dict[str, Any]) -> Iterable[Fixture]: result = httpx.post( f"{URL}/api/v1/filament", json={ - "name": "Filament Y", + "name": "Filament Z", "material": "PETG", "price": 200, "density": 1.25, @@ -72,24 +77,48 @@ def filaments(random_vendor_mod: dict[str, Any]) -> Iterable[Fixture]: result.raise_for_status() filament_3 = result.json() + result = httpx.post( + f"{URL}/api/v1/filament", + json={ + "density": 1.25, + "diameter": 1.75, + }, + ) + result.raise_for_status() + filament_4 = result.json() + + result = httpx.post( + f"{URL}/api/v1/filament", + json={ + "vendor_id": random_empty_vendor_mod["id"], + "density": 1.5, + "diameter": 1.75, + }, + ) + result.raise_for_status() + filament_5 = result.json() + added_filaments_by_id = { filament_1["id"]: filament_1, filament_2["id"]: filament_2, filament_3["id"]: filament_3, + filament_4["id"]: filament_4, + filament_5["id"]: filament_5, } yield Fixture( - filaments=[filament_1, filament_2, filament_3], + filaments=[filament_1, filament_2, filament_3, filament_4, filament_5], filaments_by_id=added_filaments_by_id, ) httpx.delete(f"{URL}/api/v1/filament/{filament_1['id']}").raise_for_status() httpx.delete(f"{URL}/api/v1/filament/{filament_2['id']}").raise_for_status() httpx.delete(f"{URL}/api/v1/filament/{filament_3['id']}").raise_for_status() + httpx.delete(f"{URL}/api/v1/filament/{filament_4['id']}").raise_for_status() + httpx.delete(f"{URL}/api/v1/filament/{filament_5['id']}").raise_for_status() def test_find_all_filaments(filaments: Fixture): - """Test finding filaments from the database.""" # Execute result = httpx.get( f"{URL}/api/v1/filament", @@ -98,13 +127,138 @@ def test_find_all_filaments(filaments: Fixture): # Verify filaments_result = result.json() - assert len(filaments_result) == 3 - for filament in filaments_result: - assert filament == filaments.filaments_by_id[filament["id"]] + assert filament_lists_equal(filaments_result, filaments.filaments) + + +def test_find_all_filaments_sort_asc(filaments: Fixture): + # Execute + result = httpx.get(f"{URL}/api/v1/filament?sort=id:asc") + result.raise_for_status() + + # Verify + filaments_result = result.json() + assert len(filaments_result) == len(filaments.filaments) + assert filaments_result[0] == filaments.filaments[0] + + +def test_find_all_filaments_sort_desc(filaments: Fixture): + # Execute + result = httpx.get(f"{URL}/api/v1/filament?sort=id:desc") + result.raise_for_status() + + # Verify + filaments_result = result.json() + assert len(filaments_result) == len(filaments.filaments) + assert filaments_result[-1] == filaments.filaments[0] + + +def test_find_all_filaments_sort_multiple(filaments: Fixture): + # Execute + result = httpx.get(f"{URL}/api/v1/filament?sort=density:desc,id:asc") + result.raise_for_status() + + # Verify + filaments_result = result.json() + assert len(filaments_result) == len(filaments.filaments) + assert filaments_result == [ + filaments.filaments[4], + filaments.filaments[0], + filaments.filaments[1], + filaments.filaments[2], + filaments.filaments[3], + ] + + +def test_find_all_filaments_limit_asc(filaments: Fixture): + # Execute + result = httpx.get(f"{URL}/api/v1/filament?sort=id:asc&limit=2") + result.raise_for_status() + + # Verify + filaments_result = result.json() + assert len(filaments_result) == 2 + assert filaments_result == [filaments.filaments[0], filaments.filaments[1]] + + +def test_find_all_filaments_limit_desc(filaments: Fixture): + # Execute + result = httpx.get(f"{URL}/api/v1/filament?sort=id:desc&limit=2") + result.raise_for_status() + + # Verify + filaments_result = result.json() + assert len(filaments_result) == 2 + assert filaments_result == [filaments.filaments[-1], filaments.filaments[-2]] + + +def test_find_all_filaments_limit_asc_offset(filaments: Fixture): + # Execute + result = httpx.get(f"{URL}/api/v1/filament?sort=id:asc&limit=2&offset=1") + result.raise_for_status() + + # Verify + filaments_result = result.json() + assert len(filaments_result) == 2 + assert filaments_result == [filaments.filaments[1], filaments.filaments[2]] + + +def test_find_all_filaments_limit_desc_offset(filaments: Fixture): + # Execute + result = httpx.get(f"{URL}/api/v1/filament?sort=id:desc&limit=2&offset=1") + result.raise_for_status() + + # Verify + filaments_result = result.json() + assert len(filaments_result) == 2 + assert filaments_result == [filaments.filaments[-2], filaments.filaments[-3]] + + +def test_find_all_filaments_limit_asc_offset_outside_range(filaments: Fixture): # noqa: ARG001 + # Execute + result = httpx.get(f"{URL}/api/v1/filament?sort=id:asc&limit=2&offset=100") + result.raise_for_status() + + # Verify + filaments_result = result.json() + assert len(filaments_result) == 0 + + +@pytest.mark.parametrize( + "field_name", + [ + "id", + "registered", + "name", + "vendor_id", + "material", + "price", + "density", + "diameter", + "weight", + "spool_weight", + "article_number", + "comment", + "settings_extruder_temp", + "settings_bed_temp", + "color_hex", + "vendor.id", + "vendor.registered", + "vendor.name", + "vendor.comment", + ], +) +def test_find_all_filaments_sort_fields(filaments: Fixture, field_name: str): + """Test sorting by all fields.""" + # Execute + result = httpx.get(f"{URL}/api/v1/filament?sort={field_name}:asc") + result.raise_for_status() + + # Verify + filaments_result = result.json() + assert len(filaments_result) == len(filaments.filaments) def test_find_filaments_by_name(filaments: Fixture): - """Test finding filaments from the database.""" # Execute result = httpx.get( f"{URL}/api/v1/filament", @@ -114,12 +268,23 @@ def test_find_filaments_by_name(filaments: Fixture): # Verify filaments_result = result.json() - assert len(filaments_result) == 1 assert filaments_result[0] == filaments.filaments[0] +def test_find_filaments_by_empty_name(filaments: Fixture): + # Execute + result = httpx.get( + f"{URL}/api/v1/filament", + params={"name": ""}, + ) + result.raise_for_status() + + # Verify + filaments_result = result.json() + assert filament_lists_equal(filaments_result, filaments.filaments[3:]) + + def test_find_filaments_by_material(filaments: Fixture): - """Test finding filaments from the database.""" # Execute result = httpx.get( f"{URL}/api/v1/filament", @@ -129,13 +294,24 @@ def test_find_filaments_by_material(filaments: Fixture): # Verify filaments_result = result.json() - assert len(filaments_result) == 1 assert filaments_result[0] == filaments.filaments[1] +def test_find_filaments_by_empty_material(filaments: Fixture): + # Execute + result = httpx.get( + f"{URL}/api/v1/filament", + params={"material": ""}, + ) + result.raise_for_status() + + # Verify + filaments_result = result.json() + assert filament_lists_equal(filaments_result, filaments.filaments[3:]) + + @pytest.mark.parametrize("field_name", ["vendor_id", "vendor.id"]) def test_find_filaments_by_vendor_id(filaments: Fixture, field_name: str): - """Test finding filaments from the database.""" # Execute result = httpx.get( f"{URL}/api/v1/filament", @@ -145,14 +321,24 @@ def test_find_filaments_by_vendor_id(filaments: Fixture, field_name: str): # Verify filaments_result = result.json() - assert len(filaments_result) == 2 - for filament in filaments_result: - assert filament == filaments.filaments_by_id[filament["id"]] + assert filament_lists_equal(filaments_result, filaments.filaments[:2]) + + +def test_find_filaments_by_empty_vendor_id(filaments: Fixture): + # Execute + result = httpx.get( + f"{URL}/api/v1/filament", + params={"vendor.id": -1}, + ) + result.raise_for_status() + + # Verify + filaments_result = result.json() + assert filament_lists_equal(filaments_result, filaments.filaments[2:4]) @pytest.mark.parametrize("field_name", ["vendor_name", "vendor.name"]) def test_find_filaments_by_vendor_name(filaments: Fixture, field_name: str): - """Test finding filaments from the database.""" # Execute result = httpx.get( f"{URL}/api/v1/filament", @@ -162,13 +348,23 @@ def test_find_filaments_by_vendor_name(filaments: Fixture, field_name: str): # Verify filaments_result = result.json() - assert len(filaments_result) == 2 - for filament in filaments_result: - assert filament == filaments.filaments_by_id[filament["id"]] + assert filament_lists_equal(filaments_result, filaments.filaments[:2]) + + +def test_find_filaments_by_empty_vendor_name(filaments: Fixture): + # Execute + result = httpx.get( + f"{URL}/api/v1/filament", + params={"vendor.name": ""}, + ) + result.raise_for_status() + + # Verify + filaments_result = result.json() + assert filaments_result == [filaments.filaments[4]] def test_find_filaments_by_article_number(filaments: Fixture): - """Test finding filaments from the database.""" # Execute result = httpx.get( f"{URL}/api/v1/filament", @@ -178,5 +374,17 @@ def test_find_filaments_by_article_number(filaments: Fixture): # Verify filaments_result = result.json() - assert len(filaments_result) == 1 assert filaments_result[0] == filaments.filaments[1] + + +def test_find_filaments_by_empty_article_number(filaments: Fixture): + # Execute + result = httpx.get( + f"{URL}/api/v1/filament", + params={"article_number": ""}, + ) + result.raise_for_status() + + # Verify + filaments_result = result.json() + assert filament_lists_equal(filaments_result, filaments.filaments[3:]) diff --git a/tests_integration/tests/spool/test_find.py b/tests_integration/tests/spool/test_find.py index 84544df..993a0a2 100644 --- a/tests_integration/tests/spool/test_find.py +++ b/tests_integration/tests/spool/test_find.py @@ -68,6 +68,7 @@ def spools( f"{URL}/api/v1/spool", json={ "filament_id": random_empty_filament_mod["id"], + "used_weight": 1000, }, ) result.raise_for_status() @@ -134,26 +135,37 @@ def test_find_all_spools_including_archived(spools: Fixture): def test_find_all_spools_sort_asc(spools: Fixture): # Execute - result = httpx.get(f"{URL}/api/v1/spool?sort=id:asc") + result = httpx.get(f"{URL}/api/v1/spool?sort=id:asc&allow_archived=true") result.raise_for_status() # Verify spools_result = result.json() - assert len(spools_result) == 4 + assert len(spools_result) == len(spools.spools) assert spools_result[0] == spools.spools[0] def test_find_all_spools_sort_desc(spools: Fixture): # Execute - result = httpx.get(f"{URL}/api/v1/spool?sort=id:desc") + result = httpx.get(f"{URL}/api/v1/spool?sort=id:desc&allow_archived=true") result.raise_for_status() # Verify spools_result = result.json() - assert len(spools_result) == 4 + assert len(spools_result) == len(spools.spools) assert spools_result[-1] == spools.spools[0] +def test_find_all_spools_sort_multiple(spools: Fixture): + # Execute + result = httpx.get(f"{URL}/api/v1/spool?sort=used_weight:desc,id:asc&allow_archived=true") + result.raise_for_status() + + # Verify + spools_result = result.json() + assert len(spools_result) == len(spools.spools) + assert spools_result == [spools.spools[3], spools.spools[0], spools.spools[1], spools.spools[2], spools.spools[4]] + + def test_find_all_spools_limit_asc(spools: Fixture): # Execute result = httpx.get(f"{URL}/api/v1/spool?sort=id:asc&limit=2") @@ -242,15 +254,15 @@ def test_find_all_spools_limit_asc_offset_outside_range(spools: Fixture): # noq "filament.vendor.comment", ], ) -def test_find_all_spools_sort_fields(spools: Fixture, field_name: str): # noqa: ARG001 +def test_find_all_spools_sort_fields(spools: Fixture, field_name: str): """Test sorting by all fields.""" # Execute - result = httpx.get(f"{URL}/api/v1/spool?sort={field_name}:asc") + result = httpx.get(f"{URL}/api/v1/spool?sort={field_name}:asc&allow_archived=true") result.raise_for_status() # Verify spools_result = result.json() - assert len(spools_result) == 4 + assert len(spools_result) == len(spools.spools) @pytest.mark.parametrize("field_name", ["filament_name", "filament.name"])