"""Закрепление оборудования за отделами и отдельная карта кранов.""" import os import tempfile os.environ.setdefault("DATABASE_URL", os.environ.get("TEST_DATABASE_URL") or "sqlite:///" + os.path.join(tempfile.mkdtemp(), "sc.db").replace("\\", "/")) os.environ.setdefault("SCHEDULER_INTERVAL", "3600") os.environ.setdefault("SECRET_KEY", "test-secret-key-for-pytest-0123456789abcdef") os.environ.setdefault("DATA_DIR", tempfile.mkdtemp()) from fastapi.testclient import TestClient # noqa: E402 from app.main import app # noqa: E402 V1 = "/api/v1" PW = "Pass1234567" def test_equipment_by_department_and_crane_map(): with TestClient(app) as c: login = lambda u, p=PW: {"Authorization": "Bearer " + c.post(f"{V1}/auth/login", json={"username": u, "password": p}).json()["access_token"]} adm = login("admin", "admin") top = c.post(f"{V1}/departments", headers=adm, json={"name": "SC-Главный механик"}).json() cr = c.post(f"{V1}/departments", headers=adm, json={"name": "SC-Крановая служба", "parent_id": top["id"]}).json() mc = c.post(f"{V1}/departments", headers=adm, json={"name": "SC-Станочный участок", "parent_id": top["id"]}).json() for un, dep in (("sc_crane", cr), ("sc_mach", mc), ("sc_chief", top)): assert c.post(f"{V1}/users", headers=adm, json={"username": un, "full_name": un, "password": PW, "department_id": dep["id"]}).status_code == 201 crane = c.post(f"{V1}/equipment", headers=adm, json={"name": "SC-Кран мостовой", "department_id": cr["id"], "is_crane": True}).json() lathe = c.post(f"{V1}/equipment", headers=adm, json={"name": "SC-Станок", "department_id": mc["id"]}).json() common = c.post(f"{V1}/equipment", headers=adm, json={"name": "SC-Общий щит"}).json() assert crane["is_crane"] and crane["department_id"] == cr["id"] for e, x in ((crane, 10), (lathe, 20), (common, 30)): c.put(f"{V1}/equipment/{e['id']}/map", headers=adm, json={"x": x, "y": x}) tc, tm, tch = login("sc_crane"), login("sc_mach"), login("sc_chief") names = lambda h: {e["name"] for e in c.get(f"{V1}/equipment", headers=h).json() if e["name"].startswith("SC-")} assert names(tc) == {"SC-Кран мостовой", "SC-Общий щит"} assert names(tm) == {"SC-Станок", "SC-Общий щит"} assert names(tch) == names(adm) == {"SC-Кран мостовой", "SC-Станок", "SC-Общий щит"} # вышестоящий отдел видит вложенные # инцидент по станку крановщик не видит ни в списке, ни в состоянии машин c.post(f"{V1}/incidents", headers=tm, json={"equipment_id": lathe["id"], "title": "SC-поломка станка"}) assert "SC-поломка станка" not in [i["title"] for i in c.get(f"{V1}/incidents", headers=tc).json()] assert "SC-поломка станка" in [i["title"] for i in c.get(f"{V1}/incidents", headers=tch).json()] assert str(lathe["id"]) not in c.get(f"{V1}/equipment-health", headers=tc).json() assert c.get(f"{V1}/equipment-health", headers=tm).json()[str(lathe["id"])]["state"] == "alarm" # карта кранов выключена: кран на общей карте, отдельной карты нет plant = lambda h: {e["name"] for e in c.get(f"{V1}/map", headers=h).json()["equipment"] if e["name"].startswith("SC-")} assert plant(adm) == {"SC-Кран мостовой", "SC-Станок", "SC-Общий щит"} assert c.get(f"{V1}/map", headers=adm, params={"kind": "crane"}).status_code == 404 assert c.get(f"{V1}/me", headers=tc).json()["crane_map"] is False # включили: краны уходят на свою карту assert c.put(f"{V1}/settings", headers=adm, json={"crane_map": True}).json()["crane_map"] == "1" assert c.get(f"{V1}/me", headers=tc).json()["crane_map"] is True assert plant(adm) == {"SC-Станок", "SC-Общий щит"} cm = c.get(f"{V1}/map", headers=tc, params={"kind": "crane"}).json() assert [e["name"] for e in cm["equipment"] if e["name"].startswith("SC-")] == ["SC-Кран мостовой"] and cm["own_image"] is False assert c.get(f"{V1}/map", headers=tm, params={"kind": "crane"}).json()["equipment"] == [] assert plant(tm) == {"SC-Станок", "SC-Общий щит"} # инциденты: краны отдельно от остального оборудования c.post(f"{V1}/incidents", headers=tc, json={"equipment_id": crane["id"], "title": "SC-концевик"}) only = lambda **q: {i["title"] for i in c.get(f"{V1}/incidents", headers=adm, params=q).json() if i["title"].startswith("SC-")} assert only(cranes=True) == {"SC-концевик"} and only(cranes=False) == {"SC-поломка станка"} c.put(f"{V1}/settings", headers=adm, json={"crane_map": False}) assert c.get("/presentation.exe").status_code == 404 # удаление отдела: оборудование переходит к вышестоящему отделу assert c.delete(f"{V1}/departments/{cr['id']}", headers=adm).status_code == 204 assert c.get(f"{V1}/equipment/{crane['id']}", headers=adm).json()["department_id"] == top["id"]