Filament/vendor find by ext id + integration tests
This commit is contained in:
@@ -207,6 +207,15 @@ async def find(
|
|||||||
),
|
),
|
||||||
example=20.0,
|
example=20.0,
|
||||||
),
|
),
|
||||||
|
external_id: Optional[str] = Query(
|
||||||
|
default=None,
|
||||||
|
description=(
|
||||||
|
"Find filaments imported by the given external ID. "
|
||||||
|
"Separate multiple IDs with a comma. "
|
||||||
|
"Specify empty string to match filaments with no external ID."
|
||||||
|
),
|
||||||
|
example="polymaker_pla_polysonicblack_1000_175",
|
||||||
|
),
|
||||||
sort: Optional[str] = Query(
|
sort: Optional[str] = Query(
|
||||||
default=None,
|
default=None,
|
||||||
title="Sort",
|
title="Sort",
|
||||||
@@ -259,6 +268,7 @@ async def find(
|
|||||||
name=name,
|
name=name,
|
||||||
material=material,
|
material=material,
|
||||||
article_number=article_number,
|
article_number=article_number,
|
||||||
|
external_id=external_id,
|
||||||
sort_by=sort_by,
|
sort_by=sort_by,
|
||||||
limit=limit,
|
limit=limit,
|
||||||
offset=offset,
|
offset=offset,
|
||||||
|
|||||||
@@ -76,6 +76,15 @@ async def find(
|
|||||||
title="Vendor Name",
|
title="Vendor Name",
|
||||||
description="Partial case-insensitive search term for the vendor name. Separate multiple terms with a comma.",
|
description="Partial case-insensitive search term for the vendor name. Separate multiple terms with a comma.",
|
||||||
),
|
),
|
||||||
|
external_id: Optional[str] = Query(
|
||||||
|
default=None,
|
||||||
|
title="Vendor External ID",
|
||||||
|
description=(
|
||||||
|
"Exact match for the vendor external ID. "
|
||||||
|
"Separate multiple IDs with a comma. "
|
||||||
|
"Specify empty string to match filaments with no external ID."
|
||||||
|
),
|
||||||
|
),
|
||||||
sort: Optional[str] = Query(
|
sort: Optional[str] = Query(
|
||||||
default=None,
|
default=None,
|
||||||
title="Sort",
|
title="Sort",
|
||||||
@@ -104,6 +113,7 @@ async def find(
|
|||||||
db_items, total_count = await vendor.find(
|
db_items, total_count = await vendor.find(
|
||||||
db=db,
|
db=db,
|
||||||
name=name,
|
name=name,
|
||||||
|
external_id=external_id,
|
||||||
sort_by=sort_by,
|
sort_by=sort_by,
|
||||||
limit=limit,
|
limit=limit,
|
||||||
offset=offset,
|
offset=offset,
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ async def find(
|
|||||||
name: Optional[str] = None,
|
name: Optional[str] = None,
|
||||||
material: Optional[str] = None,
|
material: Optional[str] = None,
|
||||||
article_number: Optional[str] = None,
|
article_number: Optional[str] = None,
|
||||||
|
external_id: Optional[str] = None,
|
||||||
sort_by: Optional[dict[str, SortOrder]] = None,
|
sort_by: Optional[dict[str, SortOrder]] = None,
|
||||||
limit: Optional[int] = None,
|
limit: Optional[int] = None,
|
||||||
offset: int = 0,
|
offset: int = 0,
|
||||||
@@ -121,6 +122,7 @@ async def find(
|
|||||||
stmt = add_where_clause_str_opt(stmt, models.Filament.name, name)
|
stmt = add_where_clause_str_opt(stmt, models.Filament.name, name)
|
||||||
stmt = add_where_clause_str_opt(stmt, models.Filament.material, material)
|
stmt = add_where_clause_str_opt(stmt, models.Filament.material, material)
|
||||||
stmt = add_where_clause_str_opt(stmt, models.Filament.article_number, article_number)
|
stmt = add_where_clause_str_opt(stmt, models.Filament.article_number, article_number)
|
||||||
|
stmt = add_where_clause_str_opt(stmt, models.Filament.external_id, external_id)
|
||||||
|
|
||||||
total_count = None
|
total_count = None
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
|||||||
|
|
||||||
from spoolman.api.v1.models import EventType, Vendor, VendorEvent
|
from spoolman.api.v1.models import EventType, Vendor, VendorEvent
|
||||||
from spoolman.database import models
|
from spoolman.database import models
|
||||||
from spoolman.database.utils import SortOrder, add_where_clause_str
|
from spoolman.database.utils import SortOrder, add_where_clause_str, add_where_clause_str_opt
|
||||||
from spoolman.exceptions import ItemNotFoundError
|
from spoolman.exceptions import ItemNotFoundError
|
||||||
from spoolman.ws import websocket_manager
|
from spoolman.ws import websocket_manager
|
||||||
|
|
||||||
@@ -50,6 +50,7 @@ async def find(
|
|||||||
*,
|
*,
|
||||||
db: AsyncSession,
|
db: AsyncSession,
|
||||||
name: Optional[str] = None,
|
name: Optional[str] = None,
|
||||||
|
external_id: Optional[str] = None,
|
||||||
sort_by: Optional[dict[str, SortOrder]] = None,
|
sort_by: Optional[dict[str, SortOrder]] = None,
|
||||||
limit: Optional[int] = None,
|
limit: Optional[int] = None,
|
||||||
offset: int = 0,
|
offset: int = 0,
|
||||||
@@ -61,6 +62,7 @@ async def find(
|
|||||||
stmt = select(models.Vendor)
|
stmt = select(models.Vendor)
|
||||||
|
|
||||||
stmt = add_where_clause_str(stmt, models.Vendor.name, name)
|
stmt = add_where_clause_str(stmt, models.Vendor.name, name)
|
||||||
|
stmt = add_where_clause_str_opt(stmt, models.Vendor.external_id, external_id)
|
||||||
|
|
||||||
total_count = None
|
total_count = None
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ def test_add_filament(random_vendor: dict[str, Any]):
|
|||||||
settings_extruder_temp = 200
|
settings_extruder_temp = 200
|
||||||
settings_bed_temp = 60
|
settings_bed_temp = 60
|
||||||
color_hex = "FF0000"
|
color_hex = "FF0000"
|
||||||
|
external_id = "polymaker_pla_polysonicblack_1000_175"
|
||||||
result = httpx.post(
|
result = httpx.post(
|
||||||
f"{URL}/api/v1/filament",
|
f"{URL}/api/v1/filament",
|
||||||
json={
|
json={
|
||||||
@@ -39,6 +40,7 @@ def test_add_filament(random_vendor: dict[str, Any]):
|
|||||||
"settings_extruder_temp": settings_extruder_temp,
|
"settings_extruder_temp": settings_extruder_temp,
|
||||||
"settings_bed_temp": settings_bed_temp,
|
"settings_bed_temp": settings_bed_temp,
|
||||||
"color_hex": color_hex,
|
"color_hex": color_hex,
|
||||||
|
"external_id": external_id,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
result.raise_for_status()
|
result.raise_for_status()
|
||||||
@@ -63,6 +65,7 @@ def test_add_filament(random_vendor: dict[str, Any]):
|
|||||||
"settings_extruder_temp": settings_extruder_temp,
|
"settings_extruder_temp": settings_extruder_temp,
|
||||||
"settings_bed_temp": settings_bed_temp,
|
"settings_bed_temp": settings_bed_temp,
|
||||||
"color_hex": color_hex,
|
"color_hex": color_hex,
|
||||||
|
"external_id": external_id,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ def filaments(random_vendor_mod: dict[str, Any], random_empty_vendor_mod: dict[s
|
|||||||
"spool_weight": 250,
|
"spool_weight": 250,
|
||||||
"article_number": "987654321",
|
"article_number": "987654321",
|
||||||
"color_hex": "EE0000",
|
"color_hex": "EE0000",
|
||||||
|
"external_id": "some_external_id",
|
||||||
"comment": "abcdefghåäö",
|
"comment": "abcdefghåäö",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
@@ -418,6 +419,35 @@ def test_find_filaments_by_empty_article_number(filaments: Fixture):
|
|||||||
assert_lists_compatible(filaments_result, filaments.filaments[3:])
|
assert_lists_compatible(filaments_result, filaments.filaments[3:])
|
||||||
|
|
||||||
|
|
||||||
|
def test_find_filaments_by_external_id(filaments: Fixture):
|
||||||
|
# Execute
|
||||||
|
result = httpx.get(
|
||||||
|
f"{URL}/api/v1/filament",
|
||||||
|
params={"external_id": "some_external_id"},
|
||||||
|
)
|
||||||
|
result.raise_for_status()
|
||||||
|
|
||||||
|
# Verify
|
||||||
|
filaments_result = result.json()
|
||||||
|
assert filaments_result[0] == filaments.filaments[1]
|
||||||
|
|
||||||
|
|
||||||
|
def test_find_filaments_by_empty_external_id(filaments: Fixture):
|
||||||
|
# Execute
|
||||||
|
result = httpx.get(
|
||||||
|
f"{URL}/api/v1/filament",
|
||||||
|
params={"external_id": ""},
|
||||||
|
)
|
||||||
|
result.raise_for_status()
|
||||||
|
|
||||||
|
# Verify
|
||||||
|
filaments_result = result.json()
|
||||||
|
assert_lists_compatible(
|
||||||
|
filaments_result,
|
||||||
|
[filaments.filaments[0], filaments.filaments[2], filaments.filaments[3], filaments.filaments[4]],
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_find_filaments_by_similar_color(filaments: Fixture):
|
def test_find_filaments_by_similar_color(filaments: Fixture):
|
||||||
# Execute
|
# Execute
|
||||||
result = httpx.get(
|
result = httpx.get(
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ def test_update_filament(random_vendor: dict[str, Any]):
|
|||||||
"settings_extruder_temp": 200,
|
"settings_extruder_temp": 200,
|
||||||
"settings_bed_temp": 60,
|
"settings_bed_temp": 60,
|
||||||
"color_hex": "FF0000",
|
"color_hex": "FF0000",
|
||||||
|
"external_id": "external_id1",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
result.raise_for_status()
|
result.raise_for_status()
|
||||||
@@ -44,6 +45,7 @@ def test_update_filament(random_vendor: dict[str, Any]):
|
|||||||
new_settings_extruder_temp = 210
|
new_settings_extruder_temp = 210
|
||||||
new_settings_bed_temp = 70
|
new_settings_bed_temp = 70
|
||||||
new_color_hex = "00FF00"
|
new_color_hex = "00FF00"
|
||||||
|
new_external_id = "external_id2"
|
||||||
result = httpx.patch(
|
result = httpx.patch(
|
||||||
f"{URL}/api/v1/filament/{added_filament['id']}",
|
f"{URL}/api/v1/filament/{added_filament['id']}",
|
||||||
json={
|
json={
|
||||||
@@ -60,6 +62,7 @@ def test_update_filament(random_vendor: dict[str, Any]):
|
|||||||
"settings_extruder_temp": new_settings_extruder_temp,
|
"settings_extruder_temp": new_settings_extruder_temp,
|
||||||
"settings_bed_temp": new_settings_bed_temp,
|
"settings_bed_temp": new_settings_bed_temp,
|
||||||
"color_hex": new_color_hex,
|
"color_hex": new_color_hex,
|
||||||
|
"external_id": new_external_id,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
result.raise_for_status()
|
result.raise_for_status()
|
||||||
@@ -84,6 +87,7 @@ def test_update_filament(random_vendor: dict[str, Any]):
|
|||||||
"settings_extruder_temp": new_settings_extruder_temp,
|
"settings_extruder_temp": new_settings_extruder_temp,
|
||||||
"settings_bed_temp": new_settings_bed_temp,
|
"settings_bed_temp": new_settings_bed_temp,
|
||||||
"color_hex": new_color_hex,
|
"color_hex": new_color_hex,
|
||||||
|
"external_id": new_external_id,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
8
tests_integration/tests/vendor/test_add.py
vendored
8
tests_integration/tests/vendor/test_add.py
vendored
@@ -12,9 +12,14 @@ def test_add_vendor():
|
|||||||
# Execute
|
# Execute
|
||||||
name = "John"
|
name = "John"
|
||||||
comment = "abcdefghåäö"
|
comment = "abcdefghåäö"
|
||||||
|
external_id = "external_id1"
|
||||||
result = httpx.post(
|
result = httpx.post(
|
||||||
f"{URL}/api/v1/vendor",
|
f"{URL}/api/v1/vendor",
|
||||||
json={"name": name, "comment": comment},
|
json={
|
||||||
|
"name": name,
|
||||||
|
"external_id": external_id,
|
||||||
|
"comment": comment,
|
||||||
|
},
|
||||||
)
|
)
|
||||||
result.raise_for_status()
|
result.raise_for_status()
|
||||||
|
|
||||||
@@ -27,6 +32,7 @@ def test_add_vendor():
|
|||||||
"registered": vendor["registered"],
|
"registered": vendor["registered"],
|
||||||
"name": name,
|
"name": name,
|
||||||
"comment": comment,
|
"comment": comment,
|
||||||
|
"external_id": external_id,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
28
tests_integration/tests/vendor/test_find.py
vendored
28
tests_integration/tests/vendor/test_find.py
vendored
@@ -27,7 +27,7 @@ def vendors() -> Iterable[Fixture]:
|
|||||||
|
|
||||||
result = httpx.post(
|
result = httpx.post(
|
||||||
f"{URL}/api/v1/vendor",
|
f"{URL}/api/v1/vendor",
|
||||||
json={"name": "Stan", "comment": "gfdadfg"},
|
json={"name": "Stan", "comment": "gfdadfg", "external_id": "some_external_id"},
|
||||||
)
|
)
|
||||||
result.raise_for_status()
|
result.raise_for_status()
|
||||||
vendor_2 = result.json()
|
vendor_2 = result.json()
|
||||||
@@ -185,3 +185,29 @@ def test_find_vendors_by_empty_name(vendors: Fixture):
|
|||||||
# Verify
|
# Verify
|
||||||
vendors_result = result.json()
|
vendors_result = result.json()
|
||||||
assert vendors_result == [vendors.vendors[2]]
|
assert vendors_result == [vendors.vendors[2]]
|
||||||
|
|
||||||
|
|
||||||
|
def test_find_vendors_by_external_id(vendors: Fixture):
|
||||||
|
# Execute
|
||||||
|
result = httpx.get(
|
||||||
|
f"{URL}/api/v1/vendor",
|
||||||
|
params={"external_id": "some_external_id"},
|
||||||
|
)
|
||||||
|
result.raise_for_status()
|
||||||
|
|
||||||
|
# Verify
|
||||||
|
vendors_result = result.json()
|
||||||
|
assert vendors_result == [vendors.vendors[1]]
|
||||||
|
|
||||||
|
|
||||||
|
def test_find_vendors_by_empty_external_id(vendors: Fixture):
|
||||||
|
# Execute
|
||||||
|
result = httpx.get(
|
||||||
|
f"{URL}/api/v1/vendor",
|
||||||
|
params={"external_id": ""},
|
||||||
|
)
|
||||||
|
result.raise_for_status()
|
||||||
|
|
||||||
|
# Verify
|
||||||
|
vendors_result = result.json()
|
||||||
|
assert_lists_compatible(vendors_result, [vendors.vendors[0], vendors.vendors[2]])
|
||||||
|
|||||||
Reference in New Issue
Block a user