177 lines
4.4 KiB
Python
177 lines
4.4 KiB
Python
"""Unit tests for project member write logic."""
|
|
|
|
import app.main # noqa: F401 — register routers before submodule imports
|
|
|
|
from app.labor_permissions import evaluate_is_rw_member
|
|
from app.member_roles import is_valid_member_role, list_member_roles
|
|
from app.merakomis_schema import ROLE_MAIN_ENGINEER
|
|
from app.project_members_write import ProjectMemberWrite, upsert_team_member, validate_member_write
|
|
|
|
|
|
class _FakeCursor:
|
|
def __init__(self, fetchone_results: list | None = None):
|
|
self._fetchone = list(fetchone_results or [])
|
|
self.executed: list[tuple] = []
|
|
|
|
def execute(self, sql, params=None):
|
|
self.executed.append((sql, params))
|
|
|
|
def fetchone(self):
|
|
if self._fetchone:
|
|
return self._fetchone.pop(0)
|
|
return None
|
|
|
|
def fetchall(self):
|
|
return []
|
|
|
|
|
|
def test_evaluate_is_rw_member_admin():
|
|
assert evaluate_is_rw_member(
|
|
is_admin_user=True,
|
|
is_rp=False,
|
|
acting_role=0,
|
|
is_dept_director=False,
|
|
is_edit=False,
|
|
target_in_subemps=False,
|
|
)
|
|
|
|
|
|
def test_evaluate_is_rw_member_rp():
|
|
assert evaluate_is_rw_member(
|
|
is_admin_user=False,
|
|
is_rp=True,
|
|
acting_role=0,
|
|
is_dept_director=False,
|
|
is_edit=False,
|
|
target_in_subemps=False,
|
|
)
|
|
|
|
|
|
def test_evaluate_is_rw_member_gip():
|
|
assert evaluate_is_rw_member(
|
|
is_admin_user=False,
|
|
is_rp=False,
|
|
acting_role=ROLE_MAIN_ENGINEER,
|
|
is_dept_director=False,
|
|
is_edit=False,
|
|
target_in_subemps=False,
|
|
)
|
|
|
|
|
|
def test_evaluate_is_rw_member_dept_director_create():
|
|
assert evaluate_is_rw_member(
|
|
is_admin_user=False,
|
|
is_rp=False,
|
|
acting_role=0,
|
|
is_dept_director=True,
|
|
is_edit=False,
|
|
target_in_subemps=False,
|
|
)
|
|
|
|
|
|
def test_evaluate_is_rw_member_dept_edit_subordinate():
|
|
assert evaluate_is_rw_member(
|
|
is_admin_user=False,
|
|
is_rp=False,
|
|
acting_role=0,
|
|
is_dept_director=False,
|
|
is_edit=True,
|
|
target_in_subemps=True,
|
|
)
|
|
|
|
|
|
def test_evaluate_is_rw_member_denied():
|
|
assert not evaluate_is_rw_member(
|
|
is_admin_user=False,
|
|
is_rp=False,
|
|
acting_role=22,
|
|
is_dept_director=False,
|
|
is_edit=True,
|
|
target_in_subemps=False,
|
|
)
|
|
|
|
|
|
def test_member_roles_list():
|
|
roles = list_member_roles()
|
|
assert any(r["id"] == 22 for r in roles)
|
|
assert all(r["id"] != 8 for r in roles)
|
|
|
|
|
|
def test_member_roles_include_archived():
|
|
roles = list_member_roles(include_role=8)
|
|
assert any(r["id"] == 8 for r in roles)
|
|
|
|
|
|
def test_is_valid_member_role():
|
|
assert is_valid_member_role(22)
|
|
assert not is_valid_member_role(999)
|
|
|
|
|
|
def test_validate_member_write_invalid_role():
|
|
cur = _FakeCursor()
|
|
body = ProjectMemberWrite(
|
|
project_id=1, emp_id=2, section_id=3, role=999, active=True
|
|
)
|
|
try:
|
|
validate_member_write(cur, "db", body)
|
|
assert False, "expected HTTPException"
|
|
except Exception as e:
|
|
assert getattr(e, "status_code", None) == 400
|
|
assert e.detail["code"] == "invalid_role"
|
|
|
|
|
|
def test_upsert_paths(monkeypatch):
|
|
cur = _FakeCursor([{"id": 5, "emp": 2, "team": 10}])
|
|
cur.lastrowid = 99
|
|
|
|
def fake_columns(_cur, _db):
|
|
return {
|
|
"table": "tMerakomisTeamMember",
|
|
"id": "id",
|
|
"emp": "emp",
|
|
"team": "team",
|
|
"section": "section",
|
|
"role": "role",
|
|
"active": "active",
|
|
"text": "text",
|
|
"portal": "portal",
|
|
}
|
|
|
|
import app.project_members_write as pmw
|
|
|
|
monkeypatch.setattr(pmw, "_member_columns", fake_columns)
|
|
monkeypatch.setattr(
|
|
pmw,
|
|
"fetch_team_member_row",
|
|
lambda _c, _d, team, emp: {"id": 5, "emp": emp, "team": team},
|
|
)
|
|
|
|
member_id = upsert_team_member(
|
|
cur,
|
|
"db",
|
|
team_id=10,
|
|
emp_id=2,
|
|
section_id=3,
|
|
role=22,
|
|
active=True,
|
|
text="",
|
|
)
|
|
assert member_id == 5
|
|
assert any("UPDATE" in sql for sql, _ in cur.executed)
|
|
|
|
cur2 = _FakeCursor([None])
|
|
cur2.lastrowid = 42
|
|
monkeypatch.setattr(pmw, "fetch_team_member_row", lambda *_a, **_k: None)
|
|
member_id2 = upsert_team_member(
|
|
cur2,
|
|
"db",
|
|
team_id=10,
|
|
emp_id=3,
|
|
section_id=3,
|
|
role=22,
|
|
active=True,
|
|
text="note",
|
|
)
|
|
assert member_id2 == 42
|
|
assert any("INSERT" in sql for sql, _ in cur2.executed)
|