fix: select existing tenants by name in the operator portal
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 2s
Build and Publish Container Image / build-and-push (push) Successful in 49s

Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a07ff8-19d0-7820-b4d0-1353833cb7fc
This commit is contained in:
tegwick 2026-09-12 00:51:57 +02:00
parent 3758a4bb5e
commit d177d47975
8 changed files with 127 additions and 13 deletions

View file

@ -55,6 +55,40 @@ class PortalNavigationTests(unittest.TestCase):
invalid, _ = self.get('/platform/tenant',query=urlencode({'tenant':'tenant:trial:demo-company','view':'https://evil.test'}))
self.assertEqual('400 Bad Request',invalid['status'])
def add_tenant_user(self, tenant, email):
response, _ = invoke(
self.app, '/admin/'+tenant+'/users', method='POST',
cookie='ue_session=operator', form={
'csrf_token':'operator-csrf', 'display_name':'Demo',
'primary_email':email, 'role':'user',
},
)
self.assertEqual('303 See Other', response['status'])
def test_existing_tenant_is_selectable_and_short_name_resolves(self):
self.add_tenant_user('tenant:trial:demo-company','one@example.test')
self.add_tenant_user('tenant:trial:demo-company','two@example.test')
response, body = self.get('/platform')
self.assertEqual('200 OK', response['status'])
self.assertIn(b'href="/admin/tenant%3Atrial%3Ademo-company">demo-company</a>',body)
self.assertEqual(('tenant:trial:demo-company',),self.app.service.store.membership_tenants())
response, _ = self.get('/platform/tenant',query=urlencode({'tenant':' demo-company ','view':'users'}))
self.assertEqual('/admin/tenant%3Atrial%3Ademo-company',response['headers']['Location'])
denied, _ = self.get('/platform',who='member')
self.assertEqual('403 Forbidden',denied['status'])
def test_ambiguous_or_unknown_short_names_do_not_guess_a_tenant(self):
self.add_tenant_user('tenant:trial:demo-company','one@example.test')
self.add_tenant_user('tenant:friendly:demo-company','two@example.test')
for name, message in [('demo-company',b'Several tenants'),('unknown',b'No tenant with users')]:
response,body=self.get('/platform/tenant',query=urlencode({'tenant':name,'view':'users'}))
self.assertEqual('200 OK',response['status'])
self.assertNotIn('Location',response['headers'])
self.assertIn(message,body)
self.assertIn(b'role="alert"',body)
response,_=self.get('/platform/tenant',query=urlencode({'tenant':'tenant:trial:demo-company','view':'users'}))
self.assertEqual('/admin/tenant%3Atrial%3Ademo-company',response['headers']['Location'])
def test_navigation_does_not_leak_between_operator_member_and_anonymous(self):
self.get('/platform')
_, member = self.get('/onboarding',who='member')