fix: select existing tenants by name in the operator portal
Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a07ff8-19d0-7820-b4d0-1353833cb7fc
This commit is contained in:
parent
3758a4bb5e
commit
d177d47975
8 changed files with 127 additions and 13 deletions
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -158,6 +158,13 @@ class _FakePostgresCursor:
|
|||
self._rows = sorted(counts.items())
|
||||
return
|
||||
|
||||
if normalized.startswith("select distinct tenant"):
|
||||
self._rows = [(tenant,) for tenant in sorted({
|
||||
record.tenant for (record_type, _), record in self.connection.records.items()
|
||||
if record_type == values[0] and record.tenant is not None
|
||||
})]
|
||||
return
|
||||
|
||||
record_type = values[0]
|
||||
filter_columns = [
|
||||
column
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue