test_permission_matrix.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. def test_fixed_role_permission_matrix_is_monotonic():
  2. from app.core.system.permissions import ROLE_PERMISSIONS
  3. viewer = ROLE_PERMISSIONS["viewer"]
  4. editor = ROLE_PERMISSIONS["editor"]
  5. admin = ROLE_PERMISSIONS["admin"]
  6. assert viewer < editor < admin
  7. assert "governance:read" in viewer
  8. assert "governance:edit" in editor
  9. assert "users:manage" in admin
  10. assert "workflow:activate" in admin
  11. assert "ingestion:run" in editor
  12. assert "data-elements:edit" in editor
  13. assert "ontologies:edit" in editor
  14. assert "ingestion:admin" in admin
  15. assert "evidence:download" in admin
  16. assert "data-elements:publish" in admin
  17. assert "ontologies:publish" in admin
  18. def test_data_development_paths_have_specific_write_policies():
  19. from app.core.system.permissions import permission_for_request
  20. assert permission_for_request(
  21. "/api/development/v1/ingestion-jobs", "POST"
  22. ) == ("ingestion:run",)
  23. assert permission_for_request(
  24. "/api/development/v1/ingestion-jobs/job-1/retry", "POST"
  25. ) == ("ingestion:admin",)
  26. assert permission_for_request(
  27. "/api/development/v1/ingestion-jobs/job-1/cancel", "POST"
  28. ) == ("ingestion:run",)
  29. assert permission_for_request(
  30. "/api/development/v1/data-elements", "POST"
  31. ) == ("data-elements:edit",)
  32. assert permission_for_request(
  33. "/api/development/v1/data-elements/element-1/transitions", "POST"
  34. ) == ("data-elements:edit",)
  35. assert permission_for_request(
  36. "/api/development/v1/candidate-decisions", "POST"
  37. ) == ("data-elements:edit",)
  38. def test_permissions_are_derived_server_side_from_roles():
  39. from app.core.system.permissions import permissions_for_roles
  40. permissions = permissions_for_roles(["viewer", "editor"])
  41. assert "governance:read" in permissions
  42. assert "governance:edit" in permissions
  43. assert "users:manage" not in permissions
  44. def test_every_api_path_has_an_explicit_policy():
  45. from app import create_app
  46. from app.core.system.permissions import permission_for_request
  47. app = create_app()
  48. for rule in app.url_map.iter_rules():
  49. if not rule.rule.startswith("/api/"):
  50. continue
  51. for method in rule.methods - {"HEAD", "OPTIONS"}:
  52. assert permission_for_request(rule.rule, method) is not None, (
  53. method,
  54. rule.rule,
  55. )