Files
tech-service-portal/tests/test_scope.py
T

71 lines
5.4 KiB
Python

"""Закрепление оборудования за отделами и отдельная карта кранов."""
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"]