44 */
55
66import { expect , test } from '@playwright/test'
7- import type { Page } from '@playwright/test'
8- import { login } from '../support/nc-login'
7+ import type { Locator , Page } from '@playwright/test'
8+ import {
9+ bootstrapLibreSignAdmin ,
10+ ensureFooterTemplateEnabled ,
11+ fillTemplateEditor ,
12+ openSystemFooterRuleEditor ,
13+ } from '../support/footer-policy-workbench'
914
1015test . describe . configure ( { mode : 'serial' , retries : 0 , timeout : 90000 } )
1116
1217async function waitForFooterTemplateRequest ( page : Page , action : ( ) => Promise < void > ) {
1318 const requestPromise = page . waitForRequest ( ( request ) => {
14- return request . method ( ) === 'POST'
15- && request . url ( ) . includes ( '/apps/libresign/api/v1/admin/footer-template' )
19+ return request . method ( ) === 'POST' && request . url ( ) . includes ( '/admin/footer-template/preview-pdf' )
1620 } )
1721
1822 await action ( )
@@ -24,65 +28,46 @@ async function waitForFooterTemplateRequest(page: Page, action: () => Promise<vo
2428 }
2529}
2630
27- test ( 'footer template persists after reset and page reload' , async ( { page } ) => {
28- await login (
29- page . request ,
30- process . env . NEXTCLOUD_ADMIN_USER ?? 'admin' ,
31- process . env . NEXTCLOUD_ADMIN_PASSWORD ?? 'admin' ,
32- )
33-
34- await page . goto ( './settings/admin/libresign' )
35-
36- const addFooterSwitch = page . locator ( '.checkbox-radio-switch' ) . filter ( { hasText : / A d d v i s i b l e f o o t e r / i } ) . first ( )
37- await expect ( addFooterSwitch ) . toBeVisible ( { timeout : 20000 } )
38-
39- const customizeSwitch = page . locator ( '.checkbox-radio-switch' ) . filter ( { hasText : / C u s t o m i z e f o o t e r t e m p l a t e / i } ) . first ( )
40-
41- // Make sure customize is available
42- const customizeAvailable = await customizeSwitch . isVisible ( { timeout : 5000 } ) . catch ( ( ) => false )
43- if ( ! customizeAvailable ) {
44- return
45- }
46-
47- // Enable customize
48- const isChecked = await customizeSwitch . evaluate ( el => ( el as HTMLInputElement ) . checked )
49- if ( ! isChecked ) {
50- await customizeSwitch . click ( )
51- }
31+ async function saveRule ( page : Page , ruleDialog : Locator ) : Promise < void > {
32+ const saveButton = ruleDialog . getByRole ( 'button' , { name : / C r e a t e r u l e | 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 | S a v e r u l e c h a n g e s / i } ) . last ( )
33+ await expect ( saveButton ) . toBeVisible ( { timeout : 10000 } )
34+ await expect ( saveButton ) . toBeEnabled ( { timeout : 10000 } )
35+ const saveResponsePromise = page . waitForResponse ( ( response ) => {
36+ return [ 'POST' , 'PUT' , 'PATCH' ] . includes ( response . request ( ) . method ( ) )
37+ && response . url ( ) . includes ( '/apps/libresign/api/v1/policies/system/add_footer' )
38+ } )
39+ await saveButton . click ( )
40+ const saveResponse = await saveResponsePromise
41+ await expect ( saveResponse . status ( ) ) . toBe ( 200 )
42+ }
5243
53- const editorSection = page . locator ( '.footer-template-section' ) . first ( )
54- const templateEditor = editorSection . getByRole ( 'textbox' , { name : 'Footer template' } ) . first ( )
44+ test ( 'footer template persists after reset and page reload' , async ( { page } ) => {
45+ await bootstrapLibreSignAdmin ( page )
46+ let ruleDialog = await openSystemFooterRuleEditor ( page )
47+ await ensureFooterTemplateEnabled ( ruleDialog )
48+ const templateEditor = ruleDialog . locator ( '.code-editor .cm-content[contenteditable="true"]' ) . first ( )
5549
5650 // Save custom template
5751 const customTemplate = `<div>E2E_TEST_${ Date . now ( ) } </div>`
5852 await waitForFooterTemplateRequest ( page , async ( ) => {
59- await templateEditor . click ( )
60- await templateEditor . press ( 'Control+a' )
61- await templateEditor . fill ( customTemplate )
53+ await fillTemplateEditor ( ruleDialog , customTemplate )
6254 } )
55+ await expect ( templateEditor ) . toContainText ( 'E2E_TEST_' )
6356
64- // Click reset
65- const resetButton = editorSection . getByRole ( 'button' , { name : 'Reset to default' } )
66- await resetButton . click ( )
67- await page . waitForRequest ( ( request ) => {
68- return request . method ( ) === 'POST'
69- && request . url ( ) . includes ( '/apps/libresign/api/v1/admin/footer-template' )
57+ // Click reset template to inherited default
58+ const resetButton = ruleDialog . getByRole ( 'button' , { name : / R e s e t t e m p l a t e t o i n h e r i t e d d e f a u l t / i } ) . first ( )
59+ await expect ( resetButton ) . toBeVisible ( { timeout : 10000 } )
60+ await waitForFooterTemplateRequest ( page , async ( ) => {
61+ await resetButton . click ( )
7062 } )
7163
72- // Verify template is empty after reset
73- const resetTemplate = await templateEditor . inputValue ( )
74- await expect ( resetTemplate ) . toBe ( '' )
64+ // Persist rule and verify reset survives reload
65+ await saveRule ( page , ruleDialog )
7566
76- // Reload and verify state persists
7767 await page . reload ( )
78- await expect ( editorSection ) . toBeVisible ( { timeout : 20000 } )
79-
80- // After reload, customize should be OFF
81- const customizeAfterReload = page . locator ( '.checkbox-radio-switch' ) . filter ( { hasText : / C u s t o m i z e f o o t e r t e m p l a t e / i } ) . first ( )
82- const customizeCheckbox = customizeAfterReload . locator ( 'input[type="checkbox"]' ) . first ( )
83- await expect ( customizeCheckbox ) . not . toBeChecked ( )
84-
85- // Template should still be empty
86- const templateAfterReload = await templateEditor . inputValue ( ) . catch ( ( ) => '' )
87- await expect ( templateAfterReload ) . toBe ( '' )
68+ ruleDialog = await openSystemFooterRuleEditor ( page )
69+ await ensureFooterTemplateEnabled ( ruleDialog )
70+ const templateAfterReload = ruleDialog . locator ( '.code-editor .cm-content[contenteditable="true"]' ) . first ( )
71+ await expect ( templateAfterReload ) . toBeVisible ( { timeout : 10000 } )
72+ await expect ( templateAfterReload ) . not . toContainText ( 'E2E_TEST_' )
8873} )
0 commit comments