test_auth.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. """Auth: login / current-user / menus / logout / JWT guards."""
  2. def _flatten(nodes):
  3. """Flatten menu tree into a list of nodes."""
  4. out = []
  5. for n in nodes or []:
  6. out.append(n)
  7. out.extend(_flatten(n.get("children") or []))
  8. return out
  9. def test_login_and_menus(client):
  10. r = client.post("/api/web/auth/login", json={"username": "admin", "password": "Admin@123"})
  11. assert r.status_code == 200
  12. token = r.json()["data"]["token"]
  13. assert r.json()["data"]["tokenType"] == "Bearer"
  14. me = client.get("/api/web/auth/current-user", headers={"Authorization": f"Bearer {token}"})
  15. assert me.status_code == 200
  16. assert me.json()["data"]["roleCode"] == "admin"
  17. assert me.json()["data"]["username"] == "admin"
  18. assert "displayName" in me.json()["data"]
  19. menus = client.get("/api/web/auth/menus", headers={"Authorization": f"Bearer {token}"})
  20. assert menus.status_code == 200
  21. data = menus.json()["data"]
  22. # Prefer richer {tree, permCodes}; tree-list alone also OK
  23. if isinstance(data, dict) and "tree" in data:
  24. tree = data["tree"]
  25. assert "feedback:handle" in data["permCodes"]
  26. assert "role:grant" in data["permCodes"]
  27. else:
  28. tree = data
  29. codes = {m["menuCode"] for m in _flatten(tree)}
  30. assert "dashboard" in codes
  31. assert "role" in codes
  32. # Tree must only include M/C pages, not F buttons
  33. assert "feedback:handle" not in codes
  34. def test_login_wrong_password(client):
  35. r = client.post("/api/web/auth/login", json={"username": "admin", "password": "bad"})
  36. assert r.status_code == 401
  37. assert r.json()["code"] == 401
  38. def _assert_error_envelope(body: dict, code: int):
  39. assert body["code"] == code
  40. assert "message" in body
  41. assert "timestamp" in body
  42. assert "detail" not in body
  43. def test_current_user_invalid_token(client):
  44. r = client.get(
  45. "/api/web/auth/current-user",
  46. headers={"Authorization": "Bearer not-a-valid-token"},
  47. )
  48. assert r.status_code == 401
  49. _assert_error_envelope(r.json(), 401)
  50. def test_current_user_missing_token(client):
  51. r = client.get("/api/web/auth/current-user")
  52. assert r.status_code == 401
  53. _assert_error_envelope(r.json(), 401)
  54. def test_logout(client):
  55. r = client.post("/api/web/auth/login", json={"username": "admin", "password": "Admin@123"})
  56. token = r.json()["data"]["token"]
  57. out = client.post(
  58. "/api/web/auth/logout",
  59. headers={"Authorization": f"Bearer {token}"},
  60. )
  61. assert out.status_code == 200
  62. assert out.json()["code"] == 200