11import type { Page } from "@playwright/test" ;
22import { servingTest as test , expect } from "./helpers/test-fixtures" ;
3- import { editIconButton } from "./helpers/fixtures" ;
43import { login } from "./helpers/auth" ;
54import { navigateToServing } from "./helpers/navigation" ;
65import { STORAGE_STATE_PATH } from "./global-setup" ;
@@ -54,7 +53,7 @@ test.describe("Serving Management - Songs & Tasks", () => {
5453 const saveBtn = page . locator ( '[role="dialog"] button' ) . getByText ( "Save" , { exact : true } ) ;
5554 await saveBtn . click ( ) ;
5655 await page . waitForURL ( / \/ s e r v i n g \/ s o n g s \/ [ ^ / ] + / , { timeout : 20000 } ) ;
57- const validatedSong = page . getByRole ( "heading" , { name : "Frolic" } ) ;
56+ const validatedSong = page . locator ( "#page-header-title" ) ;
5857 await expect ( validatedSong ) . toBeVisible ( { timeout : 10000 } ) ;
5958 } ) ;
6059
@@ -65,7 +64,7 @@ test.describe("Serving Management - Songs & Tasks", () => {
6564 await page . locator ( '[data-testid="add-song-button"]' ) . waitFor ( { state : "visible" , timeout : 10000 } ) ;
6665 const song = page . locator ( "a" ) . getByText ( "Frolic" , { exact : true } ) . first ( ) ;
6766 await song . click ( ) ;
68- await expect ( page . getByRole ( "heading" , { name : "Frolic" } ) ) . toBeVisible ( { timeout : 10000 } ) ;
67+ await expect ( page . locator ( "#page-header-title" ) ) . toBeVisible ( { timeout : 10000 } ) ;
6968
7069 await page . locator ( "button" ) . getByText ( "Add Arrangement" ) . first ( ) . click ( ) ;
7170 await expect ( page . getByText ( "New Arrangement" ) . first ( ) ) . toBeVisible ( { timeout : 10000 } ) ;
@@ -76,7 +75,9 @@ test.describe("Serving Management - Songs & Tasks", () => {
7675 const arrCard = page . locator ( ".MuiCard-root" ) . filter ( { hasText : "Arrangement - New Arrangement" } ) ;
7776 await arrCard . getByRole ( "button" , { name : "Edit" } ) . first ( ) . click ( ) ;
7877 await page . locator ( "button" ) . getByText ( "Delete" ) . last ( ) . click ( ) ;
79- await expect ( page ) . toHaveURL ( / \/ s e r v i n g \/ s o n g s (?: \/ ? $ | \? ) / , { timeout : 10000 } ) ;
78+ // Frolic still has its default arrangement, so we stay on the song detail (SongPage
79+ // only returns to the list when the last arrangement is deleted). Confirm cleanup.
80+ await expect ( arrCard ) . toHaveCount ( 0 , { timeout : 10000 } ) ;
8081 } ) ;
8182
8283 test ( "should add song key" , async ( ) => {
@@ -87,7 +88,7 @@ test.describe("Serving Management - Songs & Tasks", () => {
8788
8889 const song = page . locator ( "a" ) . getByText ( "Frolic" , { exact : true } ) . first ( ) ;
8990 await song . click ( ) ;
90- await expect ( page . getByRole ( "heading" , { name : "Frolic" } ) ) . toBeVisible ( { timeout : 10000 } ) ;
91+ await expect ( page . locator ( "#page-header-title" ) ) . toBeVisible ( { timeout : 10000 } ) ;
9192 const allTabs = page . locator ( '[role="tab"]' ) ;
9293 await expect ( allTabs ) . toHaveCount ( 2 , { timeout : 10000 } ) ;
9394 const addKeyTab = page . getByRole ( "tab" , { name : / A d d / } ) ;
@@ -105,7 +106,7 @@ test.describe("Serving Management - Songs & Tasks", () => {
105106
106107 const song = page . locator ( "a" ) . getByText ( "Frolic" , { exact : true } ) . first ( ) ;
107108 await song . click ( ) ;
108- await expect ( page . getByRole ( "heading" , { name : "Frolic" } ) ) . toBeVisible ( { timeout : 10000 } ) ;
109+ await expect ( page . locator ( "#page-header-title" ) ) . toBeVisible ( { timeout : 10000 } ) ;
109110 const addBtn = page . locator ( '[id="addBtnGroup"]' ) ;
110111 await addBtn . click ( ) ;
111112 const addLinkBtn = page . locator ( "li" ) . getByText ( "Add External Link" ) ;
@@ -128,7 +129,7 @@ test.describe("Serving Management - Songs & Tasks", () => {
128129
129130 const song = page . locator ( "a" ) . getByText ( "Frolic" , { exact : true } ) . first ( ) ;
130131 await song . click ( ) ;
131- await expect ( page . getByRole ( "heading" , { name : "Frolic" } ) ) . toBeVisible ( { timeout : 10000 } ) ;
132+ await expect ( page . locator ( "#page-header-title" ) ) . toBeVisible ( { timeout : 10000 } ) ;
132133 const linkRow = page . locator ( "li" ) . filter ( { hasText : "Frolic on YouTube" } ) ;
133134 const editBtn = linkRow . locator ( 'button:has(svg[data-testid="EditIcon"])' ) . first ( ) ;
134135 await editBtn . click ( ) ;
@@ -149,7 +150,7 @@ test.describe("Serving Management - Songs & Tasks", () => {
149150
150151 const song = page . locator ( "a" ) . getByText ( "Frolic" , { exact : true } ) . first ( ) ;
151152 await song . click ( ) ;
152- await expect ( page . getByRole ( "heading" , { name : "Frolic" } ) ) . toBeVisible ( { timeout : 10000 } ) ;
153+ await expect ( page . locator ( "#page-header-title" ) ) . toBeVisible ( { timeout : 10000 } ) ;
153154 // Link list re-renders mid-load; wait for link to render then dispatch click.
154155 await page . locator ( 'a[href*="youtu.be"]' ) . waitFor ( { state : "visible" , timeout : 10000 } ) ;
155156 const linkRow = page . locator ( "li" ) . filter ( { has : page . locator ( 'a[href*="youtu.be"]' ) } ) ;
@@ -175,7 +176,7 @@ test.describe("Serving Management - Songs & Tasks", () => {
175176
176177 const song = page . locator ( "a" ) . getByText ( "Frolic" , { exact : true } ) . first ( ) ;
177178 await song . click ( ) ;
178- await expect ( page . getByRole ( "heading" , { name : "Frolic" } ) ) . toBeVisible ( { timeout : 10000 } ) ;
179+ await expect ( page . locator ( "#page-header-title" ) ) . toBeVisible ( { timeout : 10000 } ) ;
179180 // Link list re-renders mid-load; wait for link then dispatch click.
180181 await page . locator ( 'a[href*="youtu.be"]' ) . waitFor ( { state : "visible" , timeout : 10000 } ) ;
181182 const linkRow = page . locator ( "li" ) . filter ( { has : page . locator ( 'a[href*="youtu.be"]' ) } ) ;
@@ -194,7 +195,7 @@ test.describe("Serving Management - Songs & Tasks", () => {
194195
195196 const song = page . locator ( "a" ) . getByText ( "Frolic" , { exact : true } ) . first ( ) ;
196197 await song . click ( ) ;
197- await expect ( page . getByRole ( "heading" , { name : "Frolic" } ) ) . toBeVisible ( { timeout : 10000 } ) ;
198+ await expect ( page . locator ( "#page-header-title" ) ) . toBeVisible ( { timeout : 10000 } ) ;
198199 // Scope to Keys card header to disambiguate from other Edit icons.
199200 const editBtn = page . locator ( ".MuiCard-root" ) . filter ( { has : page . getByRole ( "heading" , { name : "Keys" , exact : true } ) } ) . locator ( 'button[aria-label="Edit"]' ) . first ( ) ;
200201 await editBtn . click ( ) ;
@@ -215,7 +216,7 @@ test.describe("Serving Management - Songs & Tasks", () => {
215216
216217 const song = page . locator ( "a" ) . getByText ( "Frolic" , { exact : true } ) . first ( ) ;
217218 await song . click ( ) ;
218- await expect ( page . getByRole ( "heading" , { name : "Frolic" } ) ) . toBeVisible ( { timeout : 10000 } ) ;
219+ await expect ( page . locator ( "#page-header-title" ) ) . toBeVisible ( { timeout : 10000 } ) ;
219220 const editBtn = page . locator ( ".MuiCard-root" ) . filter ( { has : page . getByRole ( "heading" , { name : "Keys" , exact : true } ) } ) . locator ( 'button[aria-label="Edit"]' ) . first ( ) ;
220221 await editBtn . click ( ) ;
221222 const keySignature = page . locator ( '[name="keySignature"]' ) ;
@@ -239,7 +240,7 @@ test.describe("Serving Management - Songs & Tasks", () => {
239240
240241 const song = page . locator ( "a" ) . getByText ( "Frolic" , { exact : true } ) . first ( ) ;
241242 await song . click ( ) ;
242- await expect ( page . getByRole ( "heading" , { name : "Frolic" } ) ) . toBeVisible ( { timeout : 10000 } ) ;
243+ await expect ( page . locator ( "#page-header-title" ) ) . toBeVisible ( { timeout : 10000 } ) ;
243244 await page . locator ( '[role="tab"]' ) . filter ( { hasText : "Zacchaeus Key" } ) . click ( ) ;
244245 const editBtn = page . locator ( ".MuiCard-root" ) . filter ( { has : page . getByRole ( "heading" , { name : "Keys" , exact : true } ) } ) . locator ( 'button[aria-label="Edit"]' ) . first ( ) ;
245246 await editBtn . click ( ) ;
@@ -257,7 +258,7 @@ test.describe("Serving Management - Songs & Tasks", () => {
257258
258259 const song = page . locator ( "a" ) . getByText ( "Frolic" , { exact : true } ) . first ( ) ;
259260 await song . click ( ) ;
260- await expect ( page . getByRole ( "heading" , { name : "Frolic" } ) ) . toBeVisible ( { timeout : 10000 } ) ;
261+ await expect ( page . locator ( "#page-header-title" ) ) . toBeVisible ( { timeout : 10000 } ) ;
261262 const extHeading = page . getByRole ( "heading" , { name : "External Links" } ) ;
262263 const extContainer = extHeading . locator ( "xpath=ancestor::div[1]/.." ) ;
263264 await extContainer . locator ( 'button:has(svg[data-testid="EditIcon"])' ) . first ( ) . click ( ) ;
@@ -282,7 +283,7 @@ test.describe("Serving Management - Songs & Tasks", () => {
282283
283284 const song = page . locator ( "a" ) . getByText ( "Frolic" , { exact : true } ) . first ( ) ;
284285 await song . click ( ) ;
285- await expect ( page . getByRole ( "heading" , { name : "Frolic" } ) ) . toBeVisible ( { timeout : 10000 } ) ;
286+ await expect ( page . locator ( "#page-header-title" ) ) . toBeVisible ( { timeout : 10000 } ) ;
286287 const extHeading = page . getByRole ( "heading" , { name : "External Links" } ) ;
287288 const extContainer = extHeading . locator ( "xpath=ancestor::div[1]/.." ) ;
288289 await extContainer . locator ( 'button:has(svg[data-testid="EditIcon"])' ) . first ( ) . click ( ) ;
@@ -302,8 +303,8 @@ test.describe("Serving Management - Songs & Tasks", () => {
302303
303304 const song = page . locator ( "a" ) . getByText ( "Frolic" , { exact : true } ) . first ( ) ;
304305 await song . click ( ) ;
305- await expect ( page . getByRole ( "heading" , { name : "Frolic" } ) ) . toBeVisible ( { timeout : 10000 } ) ;
306- const editBtn = editIconButton ( page ) . nth ( 2 ) ;
306+ await expect ( page . locator ( "#page-header-title" ) ) . toBeVisible ( { timeout : 10000 } ) ;
307+ const editBtn = page . locator ( ".MuiCard-root" ) . filter ( { has : page . getByRole ( "heading" , { name : / A r r a n g e m e n t - / } ) } ) . getByRole ( "button" , { name : "Edit" } ) . first ( ) ;
307308 await editBtn . click ( ) ;
308309 const lyricBox = page . locator ( '[name="lyrics"]' ) ;
309310 await lyricBox . fill ( "No Lyrics" ) ;
@@ -322,8 +323,8 @@ test.describe("Serving Management - Songs & Tasks", () => {
322323
323324 const song = page . locator ( "a" ) . getByText ( "Frolic" , { exact : true } ) . first ( ) ;
324325 await song . click ( ) ;
325- await expect ( page . getByRole ( "heading" , { name : "Frolic" } ) ) . toBeVisible ( { timeout : 10000 } ) ;
326- const editBtn = editIconButton ( page ) . nth ( 2 ) ;
326+ await expect ( page . locator ( "#page-header-title" ) ) . toBeVisible ( { timeout : 10000 } ) ;
327+ const editBtn = page . locator ( ".MuiCard-root" ) . filter ( { has : page . getByRole ( "heading" , { name : / A r r a n g e m e n t - / } ) } ) . getByRole ( "button" , { name : "Edit" } ) . first ( ) ;
327328 await editBtn . click ( ) ;
328329 const lyricBox = page . locator ( '[name="lyrics"]' ) ;
329330 await expect ( lyricBox ) . toHaveCount ( 1 ) ;
@@ -346,8 +347,8 @@ test.describe("Serving Management - Songs & Tasks", () => {
346347
347348 const song = page . locator ( "a" ) . getByText ( "Frolic" , { exact : true } ) . first ( ) ;
348349 await song . click ( ) ;
349- await expect ( page . getByRole ( "heading" , { name : "Frolic" } ) ) . toBeVisible ( { timeout : 10000 } ) ;
350- const editBtn = editIconButton ( page ) . nth ( 2 ) ;
350+ await expect ( page . locator ( "#page-header-title" ) ) . toBeVisible ( { timeout : 10000 } ) ;
351+ const editBtn = page . locator ( ".MuiCard-root" ) . filter ( { has : page . getByRole ( "heading" , { name : / A r r a n g e m e n t - / } ) } ) . getByRole ( "button" , { name : "Edit" } ) . first ( ) ;
351352 await editBtn . click ( ) ;
352353 const deleteBtn = page . locator ( "button" ) . getByText ( "Delete" ) . last ( ) ;
353354 await deleteBtn . click ( ) ;
@@ -525,7 +526,7 @@ test.describe("Serving Management - Songs & Tasks", () => {
525526
526527 const song = page . locator ( "a" ) . getByText ( "Amazing Grace" , { exact : true } ) . first ( ) ;
527528 await song . click ( ) ;
528- await expect ( page . getByRole ( "heading" , { name : "Amazing Grace" } ) ) . toBeVisible ( { timeout : 10000 } ) ;
529+ await expect ( page . locator ( "#page-header-title" ) ) . toBeVisible ( { timeout : 10000 } ) ;
529530
530531 const arrangementCard = page . locator ( ".MuiCard-root" ) . filter ( { hasText : / ^ A r r a n g e m e n t - / } ) ;
531532 await expect ( arrangementCard ) . toBeVisible ( { timeout : 10000 } ) ;
0 commit comments