Public Access
feat: manual match pin/unpin endpoints
This commit is contained in:
@@ -155,6 +155,19 @@ def db(_engine):
|
||||
connection.close()
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def db_session():
|
||||
"""Plain SessionLocal for tests that need to seed data outside the
|
||||
transactional ``db`` fixture (e.g. setting up rows the API will read)."""
|
||||
from app.database import SessionLocal
|
||||
|
||||
s = SessionLocal()
|
||||
try:
|
||||
yield s
|
||||
finally:
|
||||
s.close()
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def client(db):
|
||||
"""TestClient with get_db overridden to yield the test session."""
|
||||
|
||||
@@ -63,6 +63,68 @@ def test_update_ingredient_replaces_aliases(client):
|
||||
assert r.json()["aliases"] == ["yellow onion", "spanish onion"]
|
||||
|
||||
|
||||
def _seed_grocery(db_session, name: str) -> str:
|
||||
from datetime import datetime, timezone
|
||||
from decimal import Decimal
|
||||
from uuid import uuid4
|
||||
|
||||
from app.models import GroceryItem
|
||||
|
||||
gid = uuid4()
|
||||
db_session.add(
|
||||
GroceryItem(
|
||||
id=gid,
|
||||
name=name,
|
||||
source="lucky_california",
|
||||
external_id=f"ext-{gid}",
|
||||
current_price=Decimal("4.99"),
|
||||
regular_price=Decimal("4.99"),
|
||||
is_on_sale=False,
|
||||
scraped_at=datetime.now(timezone.utc),
|
||||
)
|
||||
)
|
||||
db_session.commit()
|
||||
return str(gid)
|
||||
|
||||
|
||||
def test_pin_manual_match(client, db_session):
|
||||
create = client.post(
|
||||
"/api/admin/ingredients",
|
||||
json={"name": "Test Manual Pin Veggie", "aliases": [], "aisle": "produce", "unit": "ea"},
|
||||
headers=_admin_headers(),
|
||||
)
|
||||
iid = create.json()["id"]
|
||||
gid = _seed_grocery(db_session, "Some Other Veggie Brand Test")
|
||||
|
||||
r = client.post(
|
||||
f"/api/admin/ingredients/{iid}/matches",
|
||||
json={"grocery_item_id": gid, "confidence": 1.0},
|
||||
headers=_admin_headers(),
|
||||
)
|
||||
assert r.status_code == 201, r.text
|
||||
body = r.json()
|
||||
assert body["source"] == "manual"
|
||||
assert body["grocery_item_id"] == gid
|
||||
|
||||
|
||||
def test_unpin_manual_match(client, db_session):
|
||||
create = client.post(
|
||||
"/api/admin/ingredients",
|
||||
json={"name": "Test Unpin Test Item", "aliases": [], "aisle": "produce", "unit": "ea"},
|
||||
headers=_admin_headers(),
|
||||
)
|
||||
iid = create.json()["id"]
|
||||
gid = _seed_grocery(db_session, "Brand X Test Product")
|
||||
pin = client.post(
|
||||
f"/api/admin/ingredients/{iid}/matches",
|
||||
json={"grocery_item_id": gid, "confidence": 1.0},
|
||||
headers=_admin_headers(),
|
||||
)
|
||||
match_id = pin.json()["id"]
|
||||
r = client.delete(f"/api/admin/ingredient-matches/{match_id}", headers=_admin_headers())
|
||||
assert r.status_code == 204
|
||||
|
||||
|
||||
def test_delete_ingredient_removes_row(client):
|
||||
create = client.post(
|
||||
"/api/admin/ingredients",
|
||||
|
||||
Reference in New Issue
Block a user