Adding pervasive column sorting
This commit is contained in:
1 parent
34679d53e8
commit
2fb662080b
27 files changed
+614
-111
No files matched your search
@@ -0,0 +1,148 @@
|
||||
import pytest
|
||||
|
||||
from app.crud import augmented_part as augmented_part_crud
|
||||
from app.models.augmented_part import AugmentedPart
|
||||
from app.models.imported_part import ImportedPart
|
||||
from app.models.manufacturer import Manufacturer
|
||||
from app.models.part_colour import PartColour
|
||||
from app.models.part_type import PartType
|
||||
|
||||
|
||||
async def _web_login(client, email, password="secret123"):
|
||||
resp = await client.post("/login", data={"email": email, "password": password})
|
||||
assert resp.status_code == 303
|
||||
|
||||
|
||||
async def _seed_augmented_parts(db):
|
||||
part_t = PartType(name="Scope")
|
||||
db.add(part_t)
|
||||
await db.flush()
|
||||
parts = [
|
||||
AugmentedPart(
|
||||
description=desc,
|
||||
sku=sku,
|
||||
colour_id=1,
|
||||
manufacturer_id=1,
|
||||
part_type_id=part_t.id,
|
||||
)
|
||||
for desc, sku in [
|
||||
("Alpha scope", "SKU-C"),
|
||||
("Bravo scope", "SKU-A"),
|
||||
("Charlie scope", "SKU-B"),
|
||||
]
|
||||
]
|
||||
db.add_all(parts)
|
||||
await db.commit()
|
||||
|
||||
|
||||
async def _seed_imported_parts(db):
|
||||
db.add_all(
|
||||
[
|
||||
ImportedPart(InventoryID="INV-2", Description="Charlie widget"),
|
||||
ImportedPart(InventoryID="INV-1", Description="Alpha widget"),
|
||||
ImportedPart(InventoryID="INV-3", Description="Bravo widget"),
|
||||
]
|
||||
)
|
||||
await db.commit()
|
||||
|
||||
|
||||
def _order_of(body: str, needles: list[str]) -> list[str]:
|
||||
positions = {n: body.find(n) for n in needles}
|
||||
return sorted(positions, key=lambda n: positions[n])
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_augmented_parts_page_sorts_by_description_desc(
|
||||
client, seeded, make_user, db_sessionmaker
|
||||
):
|
||||
async with db_sessionmaker() as db:
|
||||
await _seed_augmented_parts(db)
|
||||
await make_user("reader@example.com", role_ids=[seeded["roles"]["user"].id])
|
||||
await _web_login(client, "reader@example.com")
|
||||
|
||||
resp = await client.get("/admin/augmented-parts?sort=description&dir=desc")
|
||||
assert resp.status_code == 200
|
||||
body = resp.text
|
||||
assert _order_of(body, ["Charlie scope", "Bravo scope", "Alpha scope"]) == [
|
||||
"Charlie scope",
|
||||
"Bravo scope",
|
||||
"Alpha scope",
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_augmented_parts_filter_sorts_by_sku_asc(
|
||||
client, seeded, make_user, db_sessionmaker
|
||||
):
|
||||
async with db_sessionmaker() as db:
|
||||
await _seed_augmented_parts(db)
|
||||
await make_user("reader2@example.com", role_ids=[seeded["roles"]["user"].id])
|
||||
await _web_login(client, "reader2@example.com")
|
||||
|
||||
resp = await client.get("/admin/augmented-parts/filter?sort=sku&dir=asc")
|
||||
assert resp.status_code == 200
|
||||
body = resp.text
|
||||
# SKU-A (Bravo), SKU-B (Charlie), SKU-C (Alpha)
|
||||
assert _order_of(body, ["Bravo scope", "Charlie scope", "Alpha scope"]) == [
|
||||
"Bravo scope",
|
||||
"Charlie scope",
|
||||
"Alpha scope",
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_imported_parts_page_sorts_by_description_desc(
|
||||
client, seeded, make_user, db_sessionmaker
|
||||
):
|
||||
async with db_sessionmaker() as db:
|
||||
await _seed_imported_parts(db)
|
||||
await make_user("reader3@example.com", role_ids=[seeded["roles"]["user"].id])
|
||||
await _web_login(client, "reader3@example.com")
|
||||
|
||||
resp = await client.get("/admin/imported-parts?sort=Description&dir=desc")
|
||||
assert resp.status_code == 200
|
||||
body = resp.text
|
||||
assert _order_of(body, ["Charlie widget", "Bravo widget", "Alpha widget"]) == [
|
||||
"Charlie widget",
|
||||
"Bravo widget",
|
||||
"Alpha widget",
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_list_filtered_sorts_by_joined_colour_name(db_sessionmaker):
|
||||
async with db_sessionmaker() as db:
|
||||
red = PartColour(name="Red")
|
||||
blue = PartColour(name="Blue")
|
||||
manufacturer = Manufacturer(name="Acme", url="https://acme.example")
|
||||
part_t = PartType(name="Scope")
|
||||
db.add_all([red, blue, manufacturer, part_t])
|
||||
await db.flush()
|
||||
|
||||
db.add_all(
|
||||
[
|
||||
AugmentedPart(
|
||||
description="Red one",
|
||||
colour_id=red.id,
|
||||
manufacturer_id=manufacturer.id,
|
||||
part_type_id=part_t.id,
|
||||
),
|
||||
AugmentedPart(
|
||||
description="Blue one",
|
||||
colour_id=blue.id,
|
||||
manufacturer_id=manufacturer.id,
|
||||
part_type_id=part_t.id,
|
||||
),
|
||||
]
|
||||
)
|
||||
await db.commit()
|
||||
|
||||
parts = await augmented_part_crud.list_filtered(
|
||||
db, sort="colour", direction="asc"
|
||||
)
|
||||
assert [p.description for p in parts] == ["Blue one", "Red one"]
|
||||
|
||||
parts_desc = await augmented_part_crud.list_filtered(
|
||||
db, sort="colour", direction="desc"
|
||||
)
|
||||
assert [p.description for p in parts_desc] == ["Red one", "Blue one"]
|
||||
Reference in new issue
Block a user