@@ -10,8 +10,23 @@ import { ensureUserExists } from '../support/nc-provisioning'
1010
1111test . describe . configure ( { retries : 0 , timeout : 45000 } )
1212
13+ const openPolicyButtonName = / M a n a g e t h i s s e t t i n g | O p e n p o l i c y | O p e n s e t t i n g p o l i c y / i
14+ const createRuleButtonName = / C r e a t e r u l e | C r e a t e p o l i c y r u l e / i
15+ const saveRuleButtonName = / S a v e r u l e c h a n g e s | S a v e c h a n g e s | S a v e p o l i c y r u l e c h a n g e s / i
16+ const createDefaultButtonName = / C r e a t e d e f a u l t r u l e | C r e a t e g l o b a l d e f a u l t r u l e / i
17+ const editGlobalDefaultButtonName = / E d i t d e f a u l t | E d i t g l o b a l d e f a u l t / i
18+ const resetGlobalDefaultButtonName = / R e s e t d e f a u l t | R e s e t g l o b a l d e f a u l t / i
19+ const editGroupRuleButtonName = / E d i t g r o u p r u l e | E d i t g r o u p o v e r r i d e / i
20+ const deleteGroupRuleButtonName = / D e l e t e g r o u p r u l e | D e l e t e g r o u p o v e r r i d e / i
21+ const editUserRuleButtonName = / E d i t u s e r r u l e | E d i t u s e r o v e r r i d e / i
22+ const deleteUserRuleButtonName = / D e l e t e u s e r r u l e | D e l e t e u s e r o v e r r i d e / i
23+ const groupSectionName = / G r o u p r u l e s | G r o u p o v e r r i d e s / i
24+ const userSectionName = / U s e r r u l e s | U s e r o v e r r i d e s / i
25+ const globalEditorHeadingName = / D e f a u l t r u l e | G l o b a l d e f a u l t r u l e / i
26+ const inheritValueMessage = / L o w e r l a y e r s m u s t i n h e r i t t h i s r u l e | L o w e r l a y e r s m u s t i n h e r i t t h i s v a l u e / i
27+
1328async function openSigningOrderDialog ( page : Page ) {
14- const manageButtons = page . getByRole ( 'button' , { name : 'Manage this setting' } )
29+ const manageButtons = page . getByRole ( 'button' , { name : openPolicyButtonName } )
1530 await expect ( manageButtons . first ( ) ) . toBeVisible ( { timeout : 20000 } )
1631 await manageButtons . first ( ) . click ( )
1732 await expect ( page . getByLabel ( 'Signing order' ) ) . toBeVisible ( )
@@ -51,65 +66,59 @@ async function setAllowOverride(dialog: Locator, enabled: boolean): Promise<bool
5166 return true
5267}
5368
54- async function setDefaultSigningOrder ( dialog : Locator , enabled : boolean ) : Promise < boolean > {
55- const defaultSigningOrderSwitch = dialog . getByLabel ( 'Set default signing order' ) . first ( )
56- const label = dialog . getByText ( 'Set default signing order' ) . first ( )
69+ async function setSigningFlow ( dialog : Locator , flow : 'parallel' | 'ordered_numeric' ) : Promise < boolean > {
70+ const label = flow === 'parallel'
71+ ? / S i m u l t a n e o u s \( P a r a l l e l \) / i
72+ : / S e q u e n t i a l / i
73+ const flowRadio = dialog . getByRole ( 'radio' , { name : label } ) . first ( )
5774
58- if ( ! ( await defaultSigningOrderSwitch . count ( ) ) ) {
75+ if ( ! ( await flowRadio . count ( ) ) ) {
5976 return false
6077 }
6178
62- if ( enabled ) {
63- if ( ! ( await defaultSigningOrderSwitch . isChecked ( ) ) ) {
64- await label . click ( )
65- }
66- await expect ( defaultSigningOrderSwitch ) . toBeChecked ( )
67- return true
68- }
69-
70- if ( await defaultSigningOrderSwitch . isChecked ( ) ) {
71- await label . click ( )
79+ if ( ! ( await flowRadio . isChecked ( ) ) ) {
80+ await flowRadio . check ( { force : true } )
7281 }
73- await expect ( defaultSigningOrderSwitch ) . not . toBeChecked ( )
82+ await expect ( flowRadio ) . toBeChecked ( )
7483 return true
7584}
7685
7786async function submitRule ( dialog : Locator ) {
7887 await waitForEditorIdle ( dialog )
7988
80- const createButton = dialog . getByRole ( 'button' , { name : 'Create rule' } ) . first ( )
89+ const createButton = dialog . getByRole ( 'button' , { name : createRuleButtonName } ) . first ( )
8190 if ( await createButton . isVisible ( ) . catch ( ( ) => false ) ) {
8291 await expect ( createButton ) . toBeEnabled ( { timeout : 8000 } )
8392 await createButton . click ( )
8493 await waitForEditorIdle ( dialog )
8594 return
8695 }
8796
88- const saveButton = dialog . getByRole ( 'button' , { name : 'Save rule changes' } ) . first ( )
97+ const saveButton = dialog . getByRole ( 'button' , { name : saveRuleButtonName } ) . first ( )
8998 await expect ( saveButton ) . toBeVisible ( { timeout : 8000 } )
9099 await expect ( saveButton ) . toBeEnabled ( { timeout : 8000 } )
91100 await saveButton . click ( )
92101 await waitForEditorIdle ( dialog )
93102}
94103
95104async function openGlobalRuleEditor ( dialog : Locator , globalSection : Locator ) {
96- const createDefaultButton = globalSection . getByRole ( 'button' , { name : 'Create default rule' } ) . first ( )
105+ const createDefaultButton = globalSection . getByRole ( 'button' , { name : createDefaultButtonName } ) . first ( )
97106 if ( await createDefaultButton . isVisible ( ) . catch ( ( ) => false ) ) {
98107 await createDefaultButton . click ( )
99108 return
100109 }
101110
102- await globalSection . getByRole ( 'button' , { name : 'Edit default' } ) . first ( ) . click ( )
111+ await globalSection . getByRole ( 'button' , { name : editGlobalDefaultButtonName } ) . first ( ) . click ( )
103112}
104113
105114async function expectGlobalBaselineState ( globalSection : Locator ) {
106- const createDefaultButton = globalSection . getByRole ( 'button' , { name : 'Create default rule' } ) . first ( )
115+ const createDefaultButton = globalSection . getByRole ( 'button' , { name : createDefaultButtonName } ) . first ( )
107116 if ( await createDefaultButton . isVisible ( ) . catch ( ( ) => false ) ) {
108117 await expect ( createDefaultButton ) . toBeVisible ( )
109118 return
110119 }
111120
112- await expect ( globalSection . getByRole ( 'button' , { name : 'Edit default' } ) . first ( ) ) . toBeVisible ( )
121+ await expect ( globalSection . getByRole ( 'button' , { name : editGlobalDefaultButtonName } ) . first ( ) ) . toBeVisible ( )
113122}
114123
115124async function chooseTarget ( dialog : Locator , ariaLabel : 'Target groups' | 'Target users' , optionText : string ) {
@@ -190,15 +199,15 @@ async function removeAllRulesByAction(
190199
191200async function ensureBaselineRulesForAdminTarget ( page : Page , dialog : Locator ) {
192201 const globalSection = dialog . getByRole ( 'region' , { name : 'Global default rules' } )
193- const groupSection = dialog . getByRole ( 'region' , { name : 'Group rules' } )
194- const userSection = dialog . getByRole ( 'region' , { name : 'User rules' } )
202+ const groupSection = dialog . getByRole ( 'region' , { name : groupSectionName } )
203+ const userSection = dialog . getByRole ( 'region' , { name : userSectionName } )
195204
196- await removeAllRulesByAction ( page , dialog , userSection , 'Delete user rule ' )
197- await removeAllRulesByAction ( page , dialog , groupSection , 'Delete group rule ' )
205+ await removeAllRulesByAction ( page , dialog , userSection , 'Delete user override ' )
206+ await removeAllRulesByAction ( page , dialog , groupSection , 'Delete group override ' )
198207
199208 // Normalize global default into a known baseline where lower layers may override.
200- if ( await globalSection . getByRole ( 'button' , { name : 'Edit default' } ) . count ( ) ) {
201- await globalSection . getByRole ( 'button' , { name : 'Edit default' } ) . click ( )
209+ if ( await globalSection . getByRole ( 'button' , { name : editGlobalDefaultButtonName } ) . count ( ) ) {
210+ await globalSection . getByRole ( 'button' , { name : editGlobalDefaultButtonName } ) . click ( )
202211 if ( await setAllowOverride ( dialog , true ) ) {
203212 await submitRule ( dialog )
204213 }
@@ -213,7 +222,7 @@ test('system default persists allow-override changes across edit cycles', async
213222 )
214223
215224 await page . goto ( './settings/admin/libresign' )
216- await expect ( page . getByRole ( 'button' , { name : 'Manage this setting' } ) . first ( ) ) . toBeVisible ( )
225+ await expect ( page . getByRole ( 'button' , { name : openPolicyButtonName } ) . first ( ) ) . toBeVisible ( )
217226
218227 await openSigningOrderDialog ( page )
219228
@@ -222,29 +231,29 @@ test('system default persists allow-override changes across edit cycles', async
222231
223232 const globalSection = signingOrderDialog . getByRole ( 'region' , { name : 'Global default rules' } )
224233 await openGlobalRuleEditor ( signingOrderDialog , globalSection )
225- await expect ( signingOrderDialog . getByRole ( 'heading' , { name : 'Default rule' } ) ) . toBeVisible ( )
234+ await expect ( signingOrderDialog . getByRole ( 'heading' , { name : globalEditorHeadingName } ) . last ( ) ) . toBeVisible ( )
226235 await setAllowOverride ( signingOrderDialog , true )
227236 await submitRule ( signingOrderDialog )
228237
229- await signingOrderDialog . getByRole ( 'button' , { name : 'Edit default' } ) . click ( )
238+ await signingOrderDialog . getByRole ( 'button' , { name : editGlobalDefaultButtonName } ) . click ( )
230239 await setAllowOverride ( signingOrderDialog , true )
231240
232241 await setAllowOverride ( signingOrderDialog , false )
233242 const saveChangesResponsePromise = page . waitForResponse ( ( response ) => {
234243 return response . request ( ) . method ( ) === 'POST'
235244 && response . url ( ) . includes ( '/apps/libresign/api/v1/policies/system/signature_flow' )
236245 } )
237- await signingOrderDialog . getByRole ( 'button' , { name : 'Save rule changes' } ) . click ( )
246+ await signingOrderDialog . getByRole ( 'button' , { name : saveRuleButtonName } ) . first ( ) . click ( )
238247 const saveChangesResponse = await saveChangesResponsePromise
239248 expect ( saveChangesResponse . status ( ) , 'Expected Save changes request to succeed' ) . toBe ( 200 )
240249
241- await signingOrderDialog . getByRole ( 'button' , { name : 'Edit default' } ) . click ( )
250+ await signingOrderDialog . getByRole ( 'button' , { name : editGlobalDefaultButtonName } ) . click ( )
242251 await setAllowOverride ( signingOrderDialog , false )
243252
244- await expect ( signingOrderDialog . getByText ( 'Lower layers must inherit this rule' ) ) . toBeVisible ( )
253+ await expect ( signingOrderDialog . getByText ( inheritValueMessage ) ) . toBeVisible ( )
245254
246255 // Reset should restore inherited baseline behavior.
247- await removeRuleWithConfirmation ( page , signingOrderDialog , globalSection , 'Reset default' )
256+ await removeRuleWithConfirmation ( page , signingOrderDialog , globalSection , 'Reset global default' )
248257 await expectGlobalBaselineState ( globalSection )
249258} )
250259
@@ -264,65 +273,65 @@ test('admin can create, edit, and delete global, group, and user rules from the
264273
265274 const dialog = await getSigningOrderDialog ( page )
266275 const globalSection = dialog . getByRole ( 'region' , { name : 'Global default rules' } )
267- const groupSection = dialog . getByRole ( 'region' , { name : 'Group rules' } )
268- const userSection = dialog . getByRole ( 'region' , { name : 'User rules' } )
276+ const groupSection = dialog . getByRole ( 'region' , { name : groupSectionName } )
277+ const userSection = dialog . getByRole ( 'region' , { name : userSectionName } )
269278
270279 await ensureBaselineRulesForAdminTarget ( page , dialog )
271280
272281 // Global rule: edit
273282 await openGlobalRuleEditor ( dialog , globalSection )
274- await setDefaultSigningOrder ( dialog , true )
283+ expect ( await setSigningFlow ( dialog , 'ordered_numeric' ) , 'Expected signing-flow radios in global editor' ) . toBe ( true )
275284 await setAllowOverride ( dialog , true )
276285 await submitRule ( dialog )
277- await expect ( globalSection . getByRole ( 'button' , { name : 'Edit default' } ) ) . toBeVisible ( )
286+ await expect ( globalSection . getByRole ( 'button' , { name : editGlobalDefaultButtonName } ) ) . toBeVisible ( )
278287
279288 // Global rule: enforce inheritance
280- await globalSection . getByRole ( 'button' , { name : 'Edit default' } ) . click ( )
289+ await globalSection . getByRole ( 'button' , { name : editGlobalDefaultButtonName } ) . click ( )
281290 expect ( await setAllowOverride ( dialog , false ) , 'Expected global allow-override switch in editor' ) . toBe ( true )
282291 await submitRule ( dialog )
283- await expect ( globalSection . getByRole ( 'button' , { name : 'Edit default' } ) ) . toBeVisible ( )
292+ await expect ( globalSection . getByRole ( 'button' , { name : editGlobalDefaultButtonName } ) ) . toBeVisible ( )
284293
285- await globalSection . getByRole ( 'button' , { name : 'Edit default' } ) . click ( )
294+ await globalSection . getByRole ( 'button' , { name : editGlobalDefaultButtonName } ) . click ( )
286295 expect ( await setAllowOverride ( dialog , true ) , 'Expected global allow-override switch in editor' ) . toBe ( true )
287296 await submitRule ( dialog )
288- await expect ( globalSection . getByRole ( 'button' , { name : 'Edit default' } ) ) . toBeVisible ( )
297+ await expect ( globalSection . getByRole ( 'button' , { name : editGlobalDefaultButtonName } ) ) . toBeVisible ( )
289298
290299 // Group rule: create
291300 await dialog . getByRole ( 'button' , { name : 'New group override' } ) . first ( ) . click ( )
292301 await chooseTarget ( dialog , 'Target groups' , 'admin' )
293- await setDefaultSigningOrder ( dialog , true )
302+ expect ( await setSigningFlow ( dialog , 'ordered_numeric' ) , 'Expected signing-flow radios in group editor' ) . toBe ( true )
294303 await setAllowOverride ( dialog , true )
295304 await submitRule ( dialog )
296- await expect ( groupSection . getByRole ( 'button' , { name : 'Edit group rule' } ) . first ( ) ) . toBeVisible ( )
305+ await expect ( groupSection . getByRole ( 'button' , { name : editGroupRuleButtonName } ) . first ( ) ) . toBeVisible ( )
297306
298307 // Group rule: edit
299- await groupSection . getByRole ( 'button' , { name : 'Edit group rule' } ) . first ( ) . click ( )
300- expect ( await setDefaultSigningOrder ( dialog , false ) , 'Expected default- signing-order switch in group editor' ) . toBe ( true )
308+ await groupSection . getByRole ( 'button' , { name : editGroupRuleButtonName } ) . first ( ) . click ( )
309+ expect ( await setSigningFlow ( dialog , 'parallel' ) , 'Expected signing-flow radios in group editor' ) . toBe ( true )
301310 await submitRule ( dialog )
302- await expect ( groupSection . getByRole ( 'button' , { name : 'Edit group rule' } ) . first ( ) ) . toBeVisible ( )
311+ await expect ( groupSection . getByRole ( 'button' , { name : editGroupRuleButtonName } ) . first ( ) ) . toBeVisible ( )
303312
304313 // User rule: create
305314 await dialog . getByRole ( 'button' , { name : 'New user override' } ) . first ( ) . click ( )
306315 await chooseTarget ( dialog , 'Target users' , userTarget )
307- await setDefaultSigningOrder ( dialog , true )
316+ expect ( await setSigningFlow ( dialog , 'ordered_numeric' ) , 'Expected signing-flow radios in user editor' ) . toBe ( true )
308317 await submitRule ( dialog )
309- await expect ( userSection . getByRole ( 'button' , { name : 'Edit user rule' } ) . first ( ) ) . toBeVisible ( )
318+ await expect ( userSection . getByRole ( 'button' , { name : editUserRuleButtonName } ) . first ( ) ) . toBeVisible ( )
310319
311320 // User rule: edit
312- await clickSectionAction ( userSection , 'Edit user rule ' )
313- expect ( await setDefaultSigningOrder ( dialog , false ) , 'Expected default- signing-order switch in user editor' ) . toBe ( true )
321+ await clickSectionAction ( userSection , 'Edit user override ' )
322+ expect ( await setSigningFlow ( dialog , 'parallel' ) , 'Expected signing-flow radios in user editor' ) . toBe ( true )
314323 await submitRule ( dialog )
315- await expect ( userSection . getByRole ( 'button' , { name : 'Edit user rule' } ) . first ( ) ) . toBeVisible ( )
324+ await expect ( userSection . getByRole ( 'button' , { name : editUserRuleButtonName } ) . first ( ) ) . toBeVisible ( )
316325
317326 // User rule: delete
318- await removeAllRulesByAction ( page , dialog , userSection , 'Delete user rule ' )
319- await expect ( userSection . getByRole ( 'button' , { name : 'Delete user rule' } ) ) . toHaveCount ( 0 )
327+ await removeAllRulesByAction ( page , dialog , userSection , 'Delete user override ' )
328+ await expect ( userSection . getByRole ( 'button' , { name : deleteUserRuleButtonName } ) ) . toHaveCount ( 0 )
320329
321330 // Group rule: delete
322- await removeAllRulesByAction ( page , dialog , groupSection , 'Delete group rule ' )
323- await expect ( groupSection . getByRole ( 'button' , { name : 'Delete group rule' } ) ) . toHaveCount ( 0 )
331+ await removeAllRulesByAction ( page , dialog , groupSection , 'Delete group override ' )
332+ await expect ( groupSection . getByRole ( 'button' , { name : deleteGroupRuleButtonName } ) ) . toHaveCount ( 0 )
324333
325334 // Global rule: reset to inherited baseline
326- await removeRuleWithConfirmation ( page , dialog , globalSection , 'Reset default' )
335+ await removeRuleWithConfirmation ( page , dialog , globalSection , 'Reset global default' )
327336 await expectGlobalBaselineState ( globalSection )
328337} )
0 commit comments