import pytest from app.services.vorlagen import erstelle_vorlage from app.schemas.vorlage import VorlagenpositionCreate from tests.conftest import auth_header, login @pytest.mark.asyncio async def test_objekt_aus_vorlage_startet_unkontrolliert( client, db_session, objekttyp_factory, material_factory, standort_factory, admin_user ): objekttyp = await objekttyp_factory("Rucksack Handball") material = await material_factory("Kompresse") standort = await standort_factory("Wache A") vorlage = await erstelle_vorlage( db_session, objekttyp_id=objekttyp.id, name="Rucksack Handball Standard", positionen=[VorlagenpositionCreate(material_id=material.id, sollmenge=10)], ) token = await login(client, "admin1") response = await client.post( "/api/v1/objekte", json={ "code": "RH-01", "name": "Rucksack Handball 1", "objekttyp_id": objekttyp.id, "vorlage_id": vorlage.id, "standort_id": standort.id, }, headers=auth_header(token), ) assert response.status_code == 201 objekt_id = response.json()["id"] positionen_response = await client.get( f"/api/v1/objekte/{objekt_id}/positionen", headers=auth_header(token) ) assert positionen_response.status_code == 200 positionen = positionen_response.json() assert len(positionen) == 1 assert float(positionen[0]["istmenge"]) == 0 assert float(positionen[0]["sollmenge_effektiv"]) == 10 @pytest.mark.asyncio async def test_duplizieren_kopiert_struktur_nicht_zustand( client, db_session, objekttyp_factory, material_factory, standort_factory, admin_user ): """U9: Struktur/Sollmengen ja, Ist-Menge/SN/Ablauf/Charge nein, neuer eindeutiger Code.""" objekttyp = await objekttyp_factory("Rucksack Handball") material = await material_factory("Kompresse") standort = await standort_factory("Wache A") vorlage = await erstelle_vorlage( db_session, objekttyp_id=objekttyp.id, name="Rucksack Handball Standard", positionen=[VorlagenpositionCreate(material_id=material.id, sollmenge=10)], ) token = await login(client, "admin1") create_response = await client.post( "/api/v1/objekte", json={ "code": "RH-02", "name": "Rucksack Handball 2", "objekttyp_id": objekttyp.id, "vorlage_id": vorlage.id, "standort_id": standort.id, }, headers=auth_header(token), ) objekt_id = create_response.json()["id"] positionen = ( await client.get(f"/api/v1/objekte/{objekt_id}/positionen", headers=auth_header(token)) ).json() position_id = positionen[0]["id"] patch_response = await client.patch( f"/api/v1/objekte/{objekt_id}/positionen/{position_id}", json={"istmenge": "8", "seriennummer": "SN-123", "sollmenge_override": "12"}, headers=auth_header(token), ) assert patch_response.status_code == 200 duplicate_response = await client.post( f"/api/v1/objekte/{objekt_id}/duplizieren", json={"neuer_code": "RH-03", "neuer_name": "Rucksack Handball 3", "neuer_standort_id": standort.id}, headers=auth_header(token), ) assert duplicate_response.status_code == 201 neues_objekt_id = duplicate_response.json()["id"] neue_positionen = ( await client.get(f"/api/v1/objekte/{neues_objekt_id}/positionen", headers=auth_header(token)) ).json() assert len(neue_positionen) == 1 kopie = neue_positionen[0] assert float(kopie["sollmenge_override"]) == 12 # Struktur/Override kopiert assert float(kopie["istmenge"]) == 0 # Zustand NICHT kopiert assert kopie["seriennummer"] is None # Zustand NICHT kopiert @pytest.mark.asyncio async def test_duplizieren_mit_vergebenem_code_ist_409( client, db_session, objekttyp_factory, standort_factory, admin_user ): objekttyp = await objekttyp_factory("Fahrzeug") standort = await standort_factory("Wache B") vorlage = await erstelle_vorlage( db_session, objekttyp_id=objekttyp.id, name="Fahrzeug Standard", positionen=[] ) token = await login(client, "admin1") erst = await client.post( "/api/v1/objekte", json={ "code": "FZ-01", "name": "Fahrzeug 1", "objekttyp_id": objekttyp.id, "vorlage_id": vorlage.id, "standort_id": standort.id, }, headers=auth_header(token), ) objekt_id = erst.json()["id"] # zweites Objekt mit Code, den wir gleich für die Duplizierung kollidieren lassen await client.post( "/api/v1/objekte", json={ "code": "FZ-02", "name": "Fahrzeug 2", "objekttyp_id": objekttyp.id, "vorlage_id": vorlage.id, "standort_id": standort.id, }, headers=auth_header(token), ) konflikt_response = await client.post( f"/api/v1/objekte/{objekt_id}/duplizieren", json={"neuer_code": "FZ-02", "neuer_name": "Fahrzeug Kopie", "neuer_standort_id": standort.id}, headers=auth_header(token), ) assert konflikt_response.status_code == 409 @pytest.mark.asyncio async def test_mitarbeiter_kann_objekte_nicht_anlegen( client, objekttyp_factory, standort_factory, mitarbeiter_user ): objekttyp = await objekttyp_factory("Rucksack") standort = await standort_factory("Wache A") token = await login(client, "mitarbeiter1") response = await client.post( "/api/v1/objekte", json={ "code": "X-01", "name": "X", "objekttyp_id": objekttyp.id, "vorlage_id": 999999, "standort_id": standort.id, }, headers=auth_header(token), ) assert response.status_code == 403