M21: add optional organisation identity
This commit is contained in:
@@ -4,6 +4,48 @@ def test_unauthenticated_dashboard_is_rejected(client):
|
||||
assert response.json()["error"]["code"] == "401"
|
||||
|
||||
|
||||
def test_oidc_status_is_disabled_without_configuration(client):
|
||||
assert client.get("/api/v1/auth/oidc/status").json() == {
|
||||
"enabled": False,
|
||||
"provider_name": None,
|
||||
}
|
||||
assert client.get("/api/v1/auth/oidc/login").status_code == 404
|
||||
|
||||
|
||||
def test_oidc_callback_auto_provisions_and_logs_in(client, monkeypatch):
|
||||
import app.api.routers.auth as auth_router
|
||||
|
||||
class FakeClient:
|
||||
async def authorize_access_token(self, _request):
|
||||
return {
|
||||
"userinfo": {
|
||||
"sub": "external-subject-1",
|
||||
"email": "oidc.user@example.test",
|
||||
"email_verified": True,
|
||||
"name": "OIDC User",
|
||||
}
|
||||
}
|
||||
|
||||
class FakeOAuth:
|
||||
def create_client(self, _name):
|
||||
return FakeClient()
|
||||
|
||||
monkeypatch.setattr(auth_router.settings, "oidc_enabled", True)
|
||||
monkeypatch.setattr(auth_router.settings, "oidc_issuer_url", "https://id.example.test")
|
||||
monkeypatch.setattr(auth_router.settings, "oidc_client_id", "client")
|
||||
monkeypatch.setattr(auth_router.settings, "oidc_client_secret", "secret")
|
||||
monkeypatch.setattr(auth_router.settings, "oidc_allowed_email_domains", "example.test")
|
||||
monkeypatch.setattr(auth_router, "oauth", FakeOAuth())
|
||||
|
||||
response = client.get("/api/v1/auth/oidc/callback", follow_redirects=False)
|
||||
assert response.status_code == 307
|
||||
assert response.headers["location"].endswith("/dashboard")
|
||||
session = client.get("/api/v1/auth/session")
|
||||
assert session.status_code == 200
|
||||
assert session.json()["display_name"] == "OIDC User"
|
||||
assert session.json()["role"] == "rental_employee"
|
||||
|
||||
|
||||
def test_demo_login_grants_access(ops_client):
|
||||
response = ops_client.get("/api/v1/dashboard")
|
||||
assert response.status_code == 200
|
||||
@@ -83,9 +125,7 @@ def test_logout_rejects_a_cookie_even_if_the_browser_retains_it(ops_client):
|
||||
ops_client.cookies.clear()
|
||||
|
||||
# A fresh login in the same second receives a distinct signed token and remains valid.
|
||||
fresh_login = ops_client.post(
|
||||
"/api/v1/demo/login", json={"role": "operations_manager"}
|
||||
)
|
||||
fresh_login = ops_client.post("/api/v1/demo/login", json={"role": "operations_manager"})
|
||||
assert fresh_login.status_code == 200
|
||||
assert ops_client.get("/api/v1/auth/session").status_code == 200
|
||||
|
||||
|
||||
Reference in New Issue
Block a user