fix: preserve tenant creation metadata and report authority denial
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Build and Publish Container Image / build-and-push (push) Successful in 35s

Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a07ff8-19d0-7820-b4d0-1353833cb7fc
This commit is contained in:
tegwick 2026-09-11 20:52:47 +02:00
parent b9ae48b00c
commit 3c85e563ee
3 changed files with 50 additions and 2 deletions

View file

@ -6,6 +6,10 @@ import unittest
from dataclasses import replace
from datetime import timedelta
from urllib.parse import quote, urlencode
from urllib.error import HTTPError
from unittest.mock import patch
from user_engine.adapters.tenant_management import HTTPTenantManagementAdapter
from user_engine.adapters import InMemoryUserEngineStore, LocalAuthorizationCheckPort
from user_engine.domain import (
@ -898,6 +902,37 @@ class PortalApplicationTests(unittest.TestCase):
)
self.assertIn(b"Manage an existing tenant", html)
def test_platform_tenant_authority_denial_is_redacted_and_creates_no_admin(self):
oidc = OIDCClient(
issuer="https://kc.example", client_id="portal",
redirect_uri="https://users.example/oidc/callback", audience="portal",
)
oidc.sessions["platform"] = BrowserSession(
claims=self.platform_claims(), expires_at=9999999999,
csrf_token="platform-csrf",
)
self.app.oidc_client = oidc
self.app.tenant_management = HTTPTenantManagementAdapter(
base_url="https://tenants.example", bearer_token="test-service-boundary",
)
failure = HTTPError(
"https://tenants.example/tenants", 403, "Forbidden", {},
io.BytesIO(b'{"error_code":"write_denied","detail":"private-policy-detail"}'),
)
with patch("user_engine.adapters.tenant_management.urlopen", side_effect=failure), \
patch.object(self.app.service, "create_user") as create_user:
response, payload = invoke(
self.app, "/platform/tenants", method="POST",
cookie="ue_session=platform", form={
"csrf_token": "platform-csrf", "tenant": "tenant:trial:demo-company",
"admin_display_name": "First Admin", "admin_email": "admin@example.test",
},
)
self.assertEqual("403 Forbidden", response["status"])
self.assertNotIn(b"provisioning_unavailable", payload)
self.assertNotIn(b"private-policy-detail", payload)
create_user.assert_not_called()
def test_platform_browser_tenant_and_first_admin_bootstrap(self):
claims = self.platform_claims()
oidc = OIDCClient(