Wer nach einem Material sucht (z.B. "Kompresse"), will die Objekte finden,
die es aktiv führen - nicht nur Objekte, deren eigener Name/Code passt.
GIN-Trigram-Index auf material.name (Migration 0025), /suche joint jetzt
zusätzlich über objektposition (nur status=aktiv) auf material.name.
Direkter Objekt-Treffer hat Vorrang vor Material-Treffer für dasselbe
Objekt. Command Palette zeigt bei Material-Treffern einen Hinweis
("führt „Kompresse“") statt nur dem Code.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
60 lines
2.4 KiB
Python
60 lines
2.4 KiB
Python
import pytest
|
|
|
|
from tests.conftest import auth_header, login
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_suche_findet_treffer_ueber_name_und_code(client, objekt_mit_position, mitarbeiter_user):
|
|
"""SEARCH-001: Objekt per (Teil-)Name UND per Code auffindbar."""
|
|
objekt, _ = objekt_mit_position
|
|
token = await login(client, "mitarbeiter1")
|
|
|
|
per_name = await client.get("/api/v1/suche?q=Kontroll-Test", headers=auth_header(token))
|
|
assert per_name.status_code == 200
|
|
treffer_ids = [t["id"] for t in per_name.json()]
|
|
assert objekt.id in treffer_ids
|
|
|
|
per_code = await client.get("/api/v1/suche?q=KT-01", headers=auth_header(token))
|
|
assert objekt.id in [t["id"] for t in per_code.json()]
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_suche_zu_kurze_eingabe_liefert_leer(client, objekt_mit_position, mitarbeiter_user):
|
|
token = await login(client, "mitarbeiter1")
|
|
antwort = await client.get("/api/v1/suche?q=K", headers=auth_header(token))
|
|
assert antwort.status_code == 200
|
|
assert antwort.json() == []
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_suche_ohne_login_abgelehnt(client, objekt_mit_position):
|
|
antwort = await client.get("/api/v1/suche?q=Kontroll")
|
|
assert antwort.status_code == 401
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_suche_findet_objekt_ueber_materialname(client, objekt_mit_position, mitarbeiter_user):
|
|
"""SEARCH-002: Objekt hat keine "Kompresse" im eigenen Namen/Code, führt
|
|
das Material aber - muss trotzdem auffindbar sein, mit ueber_material-Hinweis."""
|
|
objekt, _material = objekt_mit_position
|
|
token = await login(client, "mitarbeiter1")
|
|
|
|
antwort = await client.get("/api/v1/suche?q=Kompresse", headers=auth_header(token))
|
|
assert antwort.status_code == 200
|
|
treffer = [t for t in antwort.json() if t["id"] == objekt.id]
|
|
assert len(treffer) == 1
|
|
assert treffer[0]["ueber_material"] == "Kompresse"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_suche_direkter_objekt_treffer_hat_vorrang_vor_material(client, objekt_mit_position, mitarbeiter_user):
|
|
"""Wenn Objektname/-code selbst passt, kein ueber_material-Hinweis, auch
|
|
wenn zufällig auch ein Material ähnlich heißen würde."""
|
|
objekt, _material = objekt_mit_position
|
|
token = await login(client, "mitarbeiter1")
|
|
|
|
antwort = await client.get("/api/v1/suche?q=Kontroll-Test", headers=auth_header(token))
|
|
treffer = [t for t in antwort.json() if t["id"] == objekt.id]
|
|
assert len(treffer) == 1
|
|
assert treffer[0]["ueber_material"] is None
|