Skip to content

Commit 7d38c4f

Browse files
Bill Leoutsakoscursoragent
authored andcommitted
test(e2e): cover session policy settings
Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 72b749b commit 7d38c4f

6 files changed

Lines changed: 92 additions & 14 deletions

File tree

apps/sim/app/workspace/[workspaceId]/settings/[section]/page.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ const ORGANIZATION_SECTION_MAP: Partial<Record<SettingsSection, OrganizationSett
6363
'access-control': 'access-control',
6464
'audit-logs': 'audit-logs',
6565
sso: 'sso',
66+
sessions: 'sessions',
6667
'data-retention': 'data-retention',
6768
'data-drains': 'data-drains',
6869
whitelabeling: 'whitelabeling',

apps/sim/e2e/README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -408,9 +408,11 @@ contracts before the isolation project opens its two-worker pool.
408408

409409
## Stability gate and required CI
410410

411-
The Step 7 source discovers 256 tests: 131 navigation/foundation, 84
412-
authorization, 13 credentials, 11 workflows, 15 persona contracts, and 2
413-
two-worker isolation tests.
411+
The current integrated source discovers 262 tests: 133 navigation/foundation,
412+
88 authorization, 13 credentials, 11 workflows, 15 persona contracts, and 2
413+
two-worker isolation tests. The six tests added after the frozen Step 7 gate
414+
cover the organization/workspace Session policies routes and their direct
415+
authorization/entitlement negatives.
414416

415417
Retries remain fixed at zero while the suite is stabilized. The final gate is
416418
five Playwright executions per test against one healthy production stack, not

apps/sim/e2e/STABILIZATION.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ billing-enabled Chromium milestone. It complements the operational runbook in
1212
deletions. Generated Drizzle snapshots are classified as generated review
1313
material; migration SQL, schema declarations, and preflight code remain
1414
hand-reviewed.
15-
- Current Step 7 source discovers 256 tests: 131 navigation/foundation, 84
15+
- Current integrated source discovers 262 tests: 133 navigation/foundation, 88
1616
authorization, 13 credentials, 11 workflows, 15 persona contracts, and 2
17-
isolation tests. The pre-Step-7 baseline was 254; Step 7 adds two foundation
18-
safety policies for selective trace suppression and auth-screenshot clearing.
17+
isolation tests. The pre-Step-7 baseline was 254; Step 7 added two foundation
18+
safety policies, and the later session-policy setting added two canonical
19+
navigation contracts plus four direct authorization/entitlement negatives.
1920
- Regenerate the exact inventory instead of copying a stale list:
2021

2122
```bash
@@ -53,7 +54,7 @@ are never committed.
5354
## Navigation contract
5455

5556
The explicit datasets in `e2e/settings/navigation/contracts.ts` are independent
56-
of `SETTINGS_SECTION_REGISTRY`: 37 canonical sections, 21 special route cases,
57+
of `SETTINGS_SECTION_REGISTRY`: 39 canonical sections, 21 special route cases,
5758
and 11 representative visibility cases.
5859

5960
- `canonical-navigation.spec.ts` iterates every literal account, organization,
@@ -79,7 +80,7 @@ an explicit product decision and a paired update to the independent contract.
7980
## Authorization and entitlement contract
8081

8182
`e2e/settings/authorization/contracts.ts` owns literal access outcomes and
82-
semantic mutation probes: 47 direct access cases and 31 mutation-control cases.
83+
semantic mutation probes: 51 direct access cases and 31 mutation-control cases.
8384
Its integrity spec requires every declared gate axis.
8485

8586
- Read, write, and admin workspace personas cover view/mutation boundaries for

apps/sim/e2e/settings/authorization/contract-integrity.spec.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,30 @@ test('Step 3 proof references resolve without rerunning their cases', () => {
109109
test('access contracts declare every required Step 4 gate axis', () => {
110110
expectSections(
111111
accessGateCases.filter(({ caseId }) => caseId.startsWith('organization-read-member-')),
112-
['access-control', 'audit-logs', 'sso', 'data-retention', 'data-drains', 'whitelabeling']
112+
[
113+
'access-control',
114+
'audit-logs',
115+
'sso',
116+
'sessions',
117+
'data-retention',
118+
'data-drains',
119+
'whitelabeling',
120+
]
113121
)
114122
expectSections(
115123
accessGateCases.filter(
116124
({ caseId }) =>
117125
caseId.startsWith('organization-lapsed-admin-') && caseId.endsWith('-plan-denied')
118126
),
119-
['access-control', 'audit-logs', 'sso', 'data-retention', 'data-drains', 'whitelabeling']
127+
[
128+
'access-control',
129+
'audit-logs',
130+
'sso',
131+
'sessions',
132+
'data-retention',
133+
'data-drains',
134+
'whitelabeling',
135+
]
120136
)
121137
expectSections(
122138
accessGateCases.filter(({ caseId }) => caseId.startsWith('workspace-member-')),
@@ -126,6 +142,7 @@ test('access contracts declare every required Step 4 gate axis', () => {
126142
'access-control',
127143
'audit-logs',
128144
'sso',
145+
'sessions',
129146
'data-retention',
130147
'data-drains',
131148
'whitelabeling',
@@ -137,6 +154,7 @@ test('access contracts declare every required Step 4 gate axis', () => {
137154
'access-control',
138155
'audit-logs',
139156
'sso',
157+
'sessions',
140158
'data-retention',
141159
'data-drains',
142160
'whitelabeling',

apps/sim/e2e/settings/authorization/contracts.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,21 @@ export const accessGateCases: readonly AccessGateCase[] = [
214214
sidebar: { state: 'hidden', label: 'Single sign-on' },
215215
outcome: { kind: 'organization-unavailable', title: 'Settings unavailable' },
216216
},
217+
{
218+
caseId: 'organization-read-member-sessions-denied',
219+
plane: 'organization',
220+
pathTemplate: '/organization/{organizationId}/settings/sessions',
221+
driver: {
222+
personaKey: 'workspaceReadMember',
223+
binding: {
224+
worldKey: 'settings-primary',
225+
resourceKind: 'organization',
226+
resourceKey: 'team-organization',
227+
},
228+
},
229+
sidebar: { state: 'hidden', label: 'Session policies' },
230+
outcome: { kind: 'organization-unavailable', title: 'Settings unavailable' },
231+
},
217232
{
218233
caseId: 'organization-read-member-data-retention-denied',
219234
plane: 'organization',
@@ -324,6 +339,7 @@ export const accessGateCases: readonly AccessGateCase[] = [
324339
['access-control', 'Access control'],
325340
['audit-logs', 'Audit logs'],
326341
['sso', 'Single sign-on'],
342+
['sessions', 'Session policies'],
327343
['data-retention', 'Data retention'],
328344
['data-drains', 'Data drains'],
329345
['whitelabeling', 'Whitelabeling'],
@@ -366,6 +382,7 @@ export const accessGateCases: readonly AccessGateCase[] = [
366382
['access-control', 'Access control'],
367383
['audit-logs', 'Audit logs'],
368384
['sso', 'Single sign-on'],
385+
['sessions', 'Session policies'],
369386
['data-retention', 'Data retention'],
370387
['data-drains', 'Data drains'],
371388
['whitelabeling', 'Whitelabeling'],
@@ -442,6 +459,7 @@ export const accessGateCases: readonly AccessGateCase[] = [
442459
['access-control', 'Access control'],
443460
['audit-logs', 'Audit logs'],
444461
['sso', 'Single sign-on'],
462+
['sessions', 'Session policies'],
445463
['data-retention', 'Data retention'],
446464
['data-drains', 'Data drains'],
447465
['whitelabeling', 'Whitelabeling'],

apps/sim/e2e/settings/navigation/contracts.ts

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,19 @@ export const sectionContracts = [
268268
driver: enterpriseOrganization,
269269
activeSidebarItem: true,
270270
},
271+
{
272+
contractId: 'organization-sessions',
273+
plane: 'organization',
274+
sectionId: 'sessions',
275+
group: 'security',
276+
label: 'Session policies',
277+
pathTemplate: '/organization/{organizationId}/settings/sessions',
278+
heading: 'Session policies',
279+
description: 'Limit session lifetimes and sign out members org-wide.',
280+
readiness: { kind: 'button', name: 'Sign out all members' },
281+
driver: enterpriseOrganization,
282+
activeSidebarItem: true,
283+
},
271284
{
272285
contractId: 'organization-data-retention',
273286
plane: 'organization',
@@ -412,6 +425,15 @@ export const sectionContracts = [
412425
{ kind: 'text', value: 'Provider Type' },
413426
enterpriseWorkspace,
414427
],
428+
[
429+
'workspace-sessions',
430+
'sessions',
431+
'enterprise',
432+
'Session policies',
433+
'Limit session lifetimes and sign out members org-wide.',
434+
{ kind: 'button', name: 'Sign out all members' },
435+
enterpriseWorkspace,
436+
],
415437
[
416438
'workspace-whitelabeling',
417439
'whitelabeling',
@@ -782,6 +804,7 @@ export const personaVisibilityCases = [
782804
'access-control',
783805
'audit-logs',
784806
'sso',
807+
'sessions',
785808
'data-retention',
786809
'data-drains',
787810
'whitelabeling',
@@ -792,6 +815,7 @@ export const personaVisibilityCases = [
792815
'Access control',
793816
'Audit logs',
794817
'Single sign-on',
818+
'Session policies',
795819
'Data retention',
796820
'Data drains',
797821
'Whitelabeling',
@@ -807,8 +831,20 @@ export const personaVisibilityCases = [
807831
driver: lapsedOrganization,
808832
expectedVisibleSectionIds: ['members', 'billing'],
809833
expectedVisibleLabels: ['Members', 'Billing'],
810-
importantHiddenSectionIds: ['access-control', 'audit-logs', 'sso', 'data-retention'],
811-
importantHiddenLabels: ['Access control', 'Audit logs', 'Single sign-on', 'Data retention'],
834+
importantHiddenSectionIds: [
835+
'access-control',
836+
'audit-logs',
837+
'sso',
838+
'sessions',
839+
'data-retention',
840+
],
841+
importantHiddenLabels: [
842+
'Access control',
843+
'Audit logs',
844+
'Single sign-on',
845+
'Session policies',
846+
'Data retention',
847+
],
812848
representativeSectionId: 'members',
813849
representativeLabel: 'Members',
814850
},
@@ -818,8 +854,8 @@ export const personaVisibilityCases = [
818854
driver: teamOrganizationMember,
819855
expectedVisibleSectionIds: ['members'],
820856
expectedVisibleLabels: ['Members'],
821-
importantHiddenSectionIds: ['billing', 'access-control', 'audit-logs'],
822-
importantHiddenLabels: ['Billing', 'Access control', 'Audit logs'],
857+
importantHiddenSectionIds: ['billing', 'access-control', 'audit-logs', 'sessions'],
858+
importantHiddenLabels: ['Billing', 'Access control', 'Audit logs', 'Session policies'],
823859
representativeSectionId: 'members',
824860
representativeLabel: 'Members',
825861
},
@@ -882,6 +918,7 @@ export const personaVisibilityCases = [
882918
'audit-logs',
883919
'forks',
884920
'sso',
921+
'sessions',
885922
'data-retention',
886923
'data-drains',
887924
'whitelabeling',
@@ -905,6 +942,7 @@ export const personaVisibilityCases = [
905942
'Audit logs',
906943
'Workspace Forks',
907944
'Single sign-on',
945+
'Session policies',
908946
'Data retention',
909947
'Data drains',
910948
'Whitelabeling',

0 commit comments

Comments
 (0)