Adding on_website and preferred part indicators
This commit is contained in:
1 parent
13b64a2d17
commit
4fd2bb1b58
13 files changed
+331
-6
No files matched your search
@@ -0,0 +1,226 @@
|
||||
"""`on_website` and `preferred_part` booleans on AugmentedPart: default to
|
||||
False, settable via create/update (API + admin web UI), and `on_website`
|
||||
is filterable in the admin listing."""
|
||||
|
||||
import pytest
|
||||
|
||||
from app.models.augmented_part import AugmentedPart
|
||||
from app.models.manufacturer import Manufacturer
|
||||
from app.models.part_colour import PartColour
|
||||
from app.models.part_type import PartType
|
||||
|
||||
|
||||
async def _seed_reference_data(db):
|
||||
manufacturer = Manufacturer(name="Acme", url="https://acme.test")
|
||||
colour = PartColour(name="Black")
|
||||
part_type = PartType(name="Scope")
|
||||
db.add_all([manufacturer, colour, part_type])
|
||||
await db.flush()
|
||||
return manufacturer, colour, part_type
|
||||
|
||||
|
||||
async def _token(client, email, password="secret123"):
|
||||
resp = await client.post(
|
||||
"/api/auth/login", data={"username": email, "password": password}
|
||||
)
|
||||
assert resp.status_code == 200, resp.text
|
||||
return resp.json()["access_token"]
|
||||
|
||||
|
||||
async def _superuser_headers(client, make_user, email):
|
||||
await make_user(email, is_superuser=True)
|
||||
return {"Authorization": f"Bearer {await _token(client, email)}"}
|
||||
|
||||
|
||||
async def _web_login(client, email, password="secret123"):
|
||||
resp = await client.post("/login", data={"email": email, "password": password})
|
||||
assert resp.status_code == 303
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_api_create_defaults_both_fields_to_false(
|
||||
client, seeded, make_user, db_sessionmaker
|
||||
):
|
||||
async with db_sessionmaker() as db:
|
||||
manufacturer, colour, part_type = await _seed_reference_data(db)
|
||||
manufacturer_id, colour_id, part_type_id = (
|
||||
manufacturer.id,
|
||||
colour.id,
|
||||
part_type.id,
|
||||
)
|
||||
await db.commit()
|
||||
|
||||
headers = await _superuser_headers(client, make_user, "owp-api1@example.com")
|
||||
resp = await client.post(
|
||||
"/api/augmented-parts",
|
||||
json={
|
||||
"description": "Widget",
|
||||
"colour_id": colour_id,
|
||||
"manufacturer_id": manufacturer_id,
|
||||
"part_type_id": part_type_id,
|
||||
},
|
||||
headers=headers,
|
||||
)
|
||||
assert resp.status_code == 201, resp.text
|
||||
body = resp.json()
|
||||
assert body["on_website"] is False
|
||||
assert body["preferred_part"] is False
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_api_create_and_update_can_set_both_fields(
|
||||
client, seeded, make_user, db_sessionmaker
|
||||
):
|
||||
async with db_sessionmaker() as db:
|
||||
manufacturer, colour, part_type = await _seed_reference_data(db)
|
||||
manufacturer_id, colour_id, part_type_id = (
|
||||
manufacturer.id,
|
||||
colour.id,
|
||||
part_type.id,
|
||||
)
|
||||
await db.commit()
|
||||
|
||||
headers = await _superuser_headers(client, make_user, "owp-api2@example.com")
|
||||
resp = await client.post(
|
||||
"/api/augmented-parts",
|
||||
json={
|
||||
"description": "Widget",
|
||||
"colour_id": colour_id,
|
||||
"manufacturer_id": manufacturer_id,
|
||||
"part_type_id": part_type_id,
|
||||
"on_website": True,
|
||||
"preferred_part": True,
|
||||
},
|
||||
headers=headers,
|
||||
)
|
||||
assert resp.status_code == 201, resp.text
|
||||
body = resp.json()
|
||||
assert body["on_website"] is True
|
||||
assert body["preferred_part"] is True
|
||||
ap_id = body["id"]
|
||||
|
||||
resp = await client.patch(
|
||||
f"/api/augmented-parts/{ap_id}",
|
||||
json={"on_website": False},
|
||||
headers=headers,
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
body = resp.json()
|
||||
assert body["on_website"] is False
|
||||
assert body["preferred_part"] is True # untouched by the partial update
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_web_admin_create_form_sets_both_checkboxes(
|
||||
client, seeded, make_user, db_sessionmaker
|
||||
):
|
||||
async with db_sessionmaker() as db:
|
||||
manufacturer, colour, part_type = await _seed_reference_data(db)
|
||||
manufacturer_id, colour_id, part_type_id = (
|
||||
manufacturer.id,
|
||||
colour.id,
|
||||
part_type.id,
|
||||
)
|
||||
await db.commit()
|
||||
|
||||
await make_user("owp-web1@example.com", role_ids=[seeded["roles"]["admin"].id])
|
||||
await _web_login(client, "owp-web1@example.com")
|
||||
|
||||
resp = await client.post(
|
||||
"/admin/augmented-parts",
|
||||
data={
|
||||
"description": "Web widget",
|
||||
"colour_id": colour_id,
|
||||
"manufacturer_id": manufacturer_id,
|
||||
"part_type_id": part_type_id,
|
||||
"on_website": "true",
|
||||
"preferred_part": "true",
|
||||
},
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert "Web widget" in resp.text
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_web_admin_update_form_toggles_both_fields(
|
||||
client, seeded, make_user, db_sessionmaker
|
||||
):
|
||||
async with db_sessionmaker() as db:
|
||||
manufacturer, colour, part_type = await _seed_reference_data(db)
|
||||
ap = AugmentedPart(
|
||||
description="Togglable widget",
|
||||
colour_id=colour.id,
|
||||
manufacturer_id=manufacturer.id,
|
||||
part_type_id=part_type.id,
|
||||
on_website=False,
|
||||
preferred_part=False,
|
||||
)
|
||||
db.add(ap)
|
||||
await db.commit()
|
||||
ap_id, manufacturer_id, colour_id, part_type_id = (
|
||||
ap.id,
|
||||
manufacturer.id,
|
||||
colour.id,
|
||||
part_type.id,
|
||||
)
|
||||
|
||||
await make_user("owp-web2@example.com", role_ids=[seeded["roles"]["admin"].id])
|
||||
await _web_login(client, "owp-web2@example.com")
|
||||
|
||||
resp = await client.post(
|
||||
f"/admin/augmented-parts/{ap_id}",
|
||||
data={
|
||||
"description": "Togglable widget",
|
||||
"colour_id": colour_id,
|
||||
"manufacturer_id": manufacturer_id,
|
||||
"part_type_id": part_type_id,
|
||||
"on_website": "true",
|
||||
# preferred_part omitted, as an unchecked checkbox would be
|
||||
},
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
|
||||
async with db_sessionmaker() as db:
|
||||
refreshed = await db.get(AugmentedPart, ap_id)
|
||||
assert refreshed.on_website is True
|
||||
assert refreshed.preferred_part is False
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_web_admin_filter_by_on_website(
|
||||
client, seeded, make_user, db_sessionmaker
|
||||
):
|
||||
async with db_sessionmaker() as db:
|
||||
manufacturer, colour, part_type = await _seed_reference_data(db)
|
||||
on_site = AugmentedPart(
|
||||
description="On-site widget",
|
||||
colour_id=colour.id,
|
||||
manufacturer_id=manufacturer.id,
|
||||
part_type_id=part_type.id,
|
||||
on_website=True,
|
||||
)
|
||||
off_site = AugmentedPart(
|
||||
description="Off-site widget",
|
||||
colour_id=colour.id,
|
||||
manufacturer_id=manufacturer.id,
|
||||
part_type_id=part_type.id,
|
||||
on_website=False,
|
||||
)
|
||||
db.add_all([on_site, off_site])
|
||||
await db.commit()
|
||||
|
||||
await make_user("owp-web3@example.com", role_ids=[seeded["roles"]["admin"].id])
|
||||
await _web_login(client, "owp-web3@example.com")
|
||||
|
||||
resp = await client.get("/admin/augmented-parts")
|
||||
assert "On-site widget" in resp.text
|
||||
assert "Off-site widget" in resp.text
|
||||
|
||||
resp = await client.get("/admin/augmented-parts/filter?on_website=true")
|
||||
assert resp.status_code == 200
|
||||
assert "On-site widget" in resp.text
|
||||
assert "Off-site widget" not in resp.text
|
||||
|
||||
resp = await client.get("/admin/augmented-parts/filter")
|
||||
assert "On-site widget" in resp.text
|
||||
assert "Off-site widget" in resp.text
|
||||
Reference in new issue
Block a user