""" Unit tests pentru _company_id() și _server_id() din routers/comanda.py. Acoperă izolarea multi-tenant: - fallback la JWT companies[0] când nu e specificat id_firma - 403 dacă id_firma nu e în JWT companies[] - 400 dacă JWT nu are nicio firmă - extragere server_id din request.state """ from types import SimpleNamespace import pytest from fastapi import HTTPException from backend.modules.service_auto.routers.comanda import _company_id, _server_id def _user(companies, username="MARIUS M", user_id=1): """Construiește un CurrentUser minimal pentru teste (duck typing).""" return SimpleNamespace( username=username, user_id=user_id, companies=companies, permissions=["read", "write"], ) # ---- _company_id ---- def test_company_id_explicit_in_allowed_list_passes(): """id_firma explicit + în JWT → OK.""" user = _user(["110", "167", "169"]) assert _company_id(user, 167) == 167 def test_company_id_explicit_not_in_allowed_raises_403(): """id_firma explicit NU în JWT → 403.""" user = _user(["110", "167"]) with pytest.raises(HTTPException) as exc: _company_id(user, 999) assert exc.value.status_code == 403 assert "neautorizat" in exc.value.detail.lower() def test_company_id_none_falls_back_to_first_company(): """Fără id_firma → prima firmă din JWT companies[].""" user = _user(["167", "110", "169"]) assert _company_id(user, None) == 167 def test_company_id_empty_companies_raises_400(): """JWT fără companies[] → 400 (nu putem alege firmă implicită).""" user = _user([]) with pytest.raises(HTTPException) as exc: _company_id(user, None) assert exc.value.status_code == 400 def test_company_id_string_companies_converted_to_int(): """JWT stochează companies[] ca list[str]; comparația se face pe int.""" user = _user(["110", "167", "169"]) # comparație cu int funcționează assert _company_id(user, 110) == 110 def test_company_id_accepts_string_id_from_first_company(): """Prima firmă e string în JWT → e convertită corect la int.""" user = _user(["42"]) assert _company_id(user, None) == 42 # ---- _server_id ---- def test_server_id_from_request_state(): """Extragere server_id injectat de AuthenticationMiddleware.""" request = SimpleNamespace(state=SimpleNamespace(server_id="mariusm_test")) assert _server_id(request) == "mariusm_test" def test_server_id_none_when_missing(): """request.state fără server_id → None (pool folosește primul server).""" request = SimpleNamespace(state=SimpleNamespace()) assert _server_id(request) is None def test_server_id_none_when_explicit_none(): """server_id explicit None în state → None.""" request = SimpleNamespace(state=SimpleNamespace(server_id=None)) assert _server_id(request) is None