66import { expect } from '@playwright/test'
77import { runOcc } from '@nextcloud/e2e-test-server/docker'
88import { test } from '../../support/fixtures/admin-session.ts'
9+ import { createTag , deleteTag , listTags } from '../../support/utils/systemtags.ts'
910
1011const tagName = 'foo'
1112const updatedTagName = 'bar'
1213
1314test . describe ( 'System tags admin settings' , ( ) => {
14- // Tests are sequential: update depends on create, delete depends on update
15- test . describe . configure ( { mode : 'serial' } )
16-
17- test . beforeAll ( async ( ) => {
18- // Delete all existing tags so each test run starts from a clean state
19- const output = await runOcc ( [ 'tag:list' , '--output=json' ] )
20- const tags = JSON . parse ( output ) as Record < string , unknown >
21- await Promise . all ( Object . keys ( tags ) . map ( ( id ) => runOcc ( [ 'tag:delete' , id ] ) . catch ( ( ) => { } ) ) )
15+ test . beforeEach ( async ( ) => {
16+ const tags = await listTags ( )
17+ for ( const tag of tags ) {
18+ await deleteTag ( tag . id )
19+ }
2220 } )
2321
2422 test ( 'Can create a tag' , async ( { page } ) => {
@@ -44,6 +42,8 @@ test.describe('System tags admin settings', () => {
4442 } )
4543
4644 test ( 'Can update a tag' , async ( { page } ) => {
45+ const tag = await createTag ( tagName )
46+
4747 await page . goto ( 'settings/admin/server' )
4848 await page . getByRole ( 'heading' , { name : 'Collaborative tags' } ) . scrollIntoViewIfNeeded ( )
4949
@@ -69,24 +69,25 @@ test.describe('System tags admin settings', () => {
6969 await page . getByRole ( 'button' , { name : 'Update' } ) . click ( )
7070 expect ( ( await updateResponse ) . status ( ) ) . toBe ( 207 )
7171
72+ await page . getByRole ( 'combobox' , { name : 'Search for a tag to edit' } ) . click ( )
7273 // NcEllipsisedOption splits names ≥ 10 chars across two spans, breaking the accessible name.
7374 // "bar (invisible)" (15 chars) splits at position 8 → accessible name "bar (inv isible)".
7475 // Use filter({ hasText }) to match on text content instead of the exact accessible name.
75- await page . getByRole ( 'combobox' , { name : 'Search for a tag to edit' } ) . click ( )
7676 await expect ( page . getByRole ( 'option' ) . filter ( { hasText : updatedTagName } ) ) . toBeVisible ( )
7777 } )
7878
7979 test ( 'Can delete a tag' , async ( { page } ) => {
80+ await createTag ( tagName )
81+
8082 await page . goto ( 'settings/admin/server' )
8183 await page . getByRole ( 'heading' , { name : 'Collaborative tags' } ) . scrollIntoViewIfNeeded ( )
8284
8385 // Select the invisible tag to delete
8486 await page . getByRole ( 'combobox' , { name : 'Search for a tag to edit' } ) . click ( )
85- await page . getByRole ( 'option' ) . filter ( { hasText : updatedTagName } ) . click ( )
87+ await page . getByRole ( 'option' ) . filter ( { hasText : tagName } ) . click ( )
8688
8789 // Verify the form reflects the selected tag
88- await expect ( page . getByLabel ( 'Tag name' ) ) . toHaveValue ( updatedTagName )
89- await expect ( page . locator ( '.system-tag-form__group:has(#system-tag-level) .vs__selected' ) ) . toContainText ( 'Invisible' )
90+ await expect ( page . getByLabel ( 'Tag name' ) ) . toHaveValue ( tagName )
9091
9192 const deleteResponse = page . waitForResponse (
9293 ( r ) => r . url ( ) . includes ( '/remote.php/dav/systemtags/' ) && r . request ( ) . method ( ) === 'DELETE' ,
@@ -96,6 +97,6 @@ test.describe('System tags admin settings', () => {
9697
9798 // Verify the tag is gone from the dropdown
9899 await page . getByRole ( 'combobox' , { name : 'Search for a tag to edit' } ) . click ( )
99- await expect ( page . getByRole ( 'option' ) . filter ( { hasText : updatedTagName } ) ) . not . toBeVisible ( )
100+ await expect ( page . getByRole ( 'option' ) . filter ( { hasText : tagName } ) ) . not . toBeVisible ( )
100101 } )
101102} )
0 commit comments