# Instructions - Following Playwright test failed. - Explain why, be concise, respect Playwright best practices. - Provide a snippet of code with the fix, if possible. # Test info - Name: src/manager/tests/e2e/customer/customer-edit-general.spec.ts >> edits the email - Location: src/manager/tests/e2e/customer/customer-edit-general.spec.ts:103:5 # Error details ``` Error: expect(locator).toHaveCount(expected) failed Locator: getByTestId('app-page').getByTestId('app-page-content').locator('.ui-data-grid').locator('[data-test-id=ui-data-grid-table]:not(.disabled):not(.loading):not(.fetching)').getByTestId('ui-data-grid-table-with-data').locator('tr') Expected: 1 Received: 10 Timeout: 20000ms Call log: - Expect "toHaveCount" with timeout 20000ms - waiting for getByTestId('app-page').getByTestId('app-page-content').locator('.ui-data-grid').locator('[data-test-id=ui-data-grid-table]:not(.disabled):not(.loading):not(.fetching)').getByTestId('ui-data-grid-table-with-data').locator('tr') 2 × locator resolved to 0 elements - unexpected value "0" 22 × locator resolved to 10 elements - unexpected value "10" ``` # Page snapshot ```yaml - generic [ref=e1]: - generic [ref=e6]: - navigation [ref=e7]: - generic [ref=e9]: - link [ref=e10] [cursor=pointer]: - /url: / - generic [ref=e11]: - generic [ref=e12]: KINNOVIS - generic [ref=e13]: Manager - button [ref=e15] [cursor=pointer]: - img [ref=e16] - list [ref=e19]: - generic [ref=e22]: Dashboard - link "Tasks" [ref=e23] [cursor=pointer]: - /url: /tasks - img [ref=e26] - generic [ref=e29]: Tasks - link "Facility maps" [ref=e30] [cursor=pointer]: - /url: /facility-map - generic [ref=e32]: 󰧾 - generic [ref=e34]: Facility maps - link "Analytics" [ref=e35] [cursor=pointer]: - /url: /dashboard - generic [ref=e37]: 󱖶 - generic [ref=e39]: Analytics - generic [ref=e41]: Sales - link "Bookings" [ref=e42] [cursor=pointer]: - /url: /bookings - generic [ref=e44]: 󰇡 - generic [ref=e46]: Bookings - link "Customers" [ref=e47] [cursor=pointer]: - /url: /customers - generic [ref=e49]: 󰀏 - generic [ref=e51]: Customers - link "Invoices" [ref=e52] [cursor=pointer]: - /url: /invoices - generic [ref=e54]: 󰷉 - generic [ref=e56]: Invoices - link "Credit notes" [ref=e57] [cursor=pointer]: - /url: /credit-notes - img [ref=e60] - generic [ref=e63]: Credit notes - link "Units" [ref=e64] [cursor=pointer]: - /url: /units - generic [ref=e66]: 󰍀 - generic [ref=e68]: Units - generic [ref=e70]: Site management - link "Locations" [ref=e71] [cursor=pointer]: - /url: /locations - generic [ref=e73]: 󰟙 - generic [ref=e75]: Locations - link "Unit types" [ref=e76] [cursor=pointer]: - /url: /unit-types - generic [ref=e78]: 󰆧 - generic [ref=e80]: Unit types - link "Protection Plans" [ref=e81] [cursor=pointer]: - /url: /insurances - generic [ref=e83]: 󰳌 - generic [ref=e85]: Protection Plans - link "Deposits" [ref=e86] [cursor=pointer]: - /url: /deposits - generic [ref=e88]: 󱙆 - generic [ref=e90]: Deposits - link "Products" [ref=e91] [cursor=pointer]: - /url: /products - generic [ref=e93]: 󰄑 - generic [ref=e95]: Products - link "Discounts" [ref=e96] [cursor=pointer]: - /url: /discounts - generic [ref=e98]: 󰓼 - generic [ref=e100]: Discounts - generic [ref=e101]: - option "Emails" [ref=e102] [cursor=pointer]: - generic [ref=e104]: 󰻨 - generic [ref=e106]: Emails - generic [ref=e110]: 󰅀 - text: 󱡰 󰁥 - generic [ref=e112]: Admin - link "Integrations" [ref=e113] [cursor=pointer]: - /url: /connected-apps - generic [ref=e115]: 󱘖 - generic [ref=e117]: Integrations - link "User & Roles" [ref=e118] [cursor=pointer]: - /url: /users - generic [ref=e120]: 󰭘 - generic [ref=e122]: User & Roles - generic [ref=e123]: - option "Booking Portal" [ref=e124] [cursor=pointer]: - generic [ref=e126]: 󱃁 - generic [ref=e128]: Booking Portal - generic [ref=e132]: 󰅀 - text: 󰖟 󰟙 - generic [ref=e133]: - option "JaneAI" [ref=e134] [cursor=pointer]: - generic [ref=e136]: 󱙺 - generic [ref=e138]: JaneAI - generic [ref=e142]: 󰅀 - text: 󱜹 - generic [ref=e144]: Feedback - link "Voting Portal" [ref=e145] [cursor=pointer]: - /url: /voting-portal - generic [ref=e147]: 󰔔 - generic [ref=e149]: Voting Portal - generic [ref=e152]: - button "AS Andreas Stadler andreas.stadler@storeroom.at" [ref=e155] [cursor=pointer]: - generic [ref=e158]: AS - generic [ref=e159]: - generic [ref=e160]: Andreas Stadler - generic "andreas.stadler@storeroom.at" [ref=e161] - generic [ref=e162]: 󰇙 - generic: - text: 󰗊 󰅀 - text: 󰷖 󰍃 - button [ref=e163] [cursor=pointer]: - generic [ref=e165]: 󰋽 - main [ref=e166]: - generic [ref=e168]: - generic [ref=e170]: - generic [ref=e172]: Customers - generic [ref=e174]: - link "Create customer" [ref=e175] [cursor=pointer]: - /url: /customers/create - generic [ref=e176]: - generic [ref=e177]: 󰐕 - text: Create customer - button [ref=e178] [cursor=pointer]: - generic [ref=e182]: 󰍝 - generic [ref=e184]: - generic [ref=e186]: - button "Filters Reset filters" [ref=e187] [cursor=pointer]: - generic [ref=e188]: - heading "Filters" [level=3] [ref=e191] - generic [ref=e193]: - button "Reset filters" [ref=e195]: - generic [ref=e196]: - generic [ref=e197]: 󰑐 - text: Reset filters - generic [ref=e201]: 󰅀 - generic [ref=e207]: - generic [ref=e212]: - generic [ref=e214]: 󰍉 - textbox "Search" [active] [ref=e216]: Nicolas3@gmail.com - button "Clear Search" [ref=e218] [cursor=pointer]: 󰅙 - generic: - generic: Search - combobox [ref=e222]: - generic [ref=e223]: - generic: Location - combobox "Location" [ref=e225] - button [ref=e227] [cursor=pointer]: 󰍝 - combobox [ref=e231]: - generic [ref=e232]: - generic: Has past due invoice(s) - combobox "Has past due invoice(s)" [ref=e234] - button [ref=e236] [cursor=pointer]: 󰍝 - combobox [ref=e240]: - generic [ref=e241]: - generic: Status - combobox "Status" [ref=e243] - button [ref=e245] [cursor=pointer]: 󰍝 - generic [ref=e247]: - table [ref=e251]: - rowgroup [ref=e252]: - row "Customer no. Name Location(s) Email address Phone number Status Past due invoice(s) Created at" [ref=e253]: - columnheader "Customer no." [ref=e254]: - button "Customer no." [ref=e255] [cursor=pointer]: - generic [ref=e257]: Customer no. - generic [ref=e260]: 󰁝 - columnheader "Name" [ref=e261]: - button "Name" [ref=e262] [cursor=pointer]: - generic [ref=e264]: Name - generic [ref=e267]: 󰁝 - columnheader "Location(s)" [ref=e268]: - button "Location(s)" [ref=e269] [cursor=pointer]: - generic [ref=e271]: Location(s) - generic [ref=e274]: 󰁝 - columnheader "Email address" [ref=e275]: - button "Email address" [ref=e276] [cursor=pointer]: - generic [ref=e278]: Email address - generic [ref=e281]: 󰁝 - columnheader "Phone number" [ref=e282]: - generic [ref=e285]: Phone number - columnheader "Status" [ref=e286]: - button "Status" [ref=e287] [cursor=pointer]: - generic [ref=e289]: Status - generic [ref=e292]: 󰁝 - columnheader "Past due invoice(s)" [ref=e293]: - button "Past due invoice(s)" [ref=e294] [cursor=pointer]: - generic [ref=e296]: Past due invoice(s) - generic [ref=e299]: 󰁝 - columnheader "Created at" [ref=e300]: - button "Created at" [ref=e301] [cursor=pointer]: - generic [ref=e303]: Created at - generic [ref=e306]: 󰁝 - row [ref=e307]: - columnheader [ref=e308] - rowgroup [ref=e309]: - row "1760-5057-57 Zella Padberg Vienna South gerson_sipes2@hotmail.com +43 6029 603690 Lead None 26 May 2026" [ref=e310]: - cell "1760-5057-57" [ref=e311]: - link "1760-5057-57" [ref=e312] [cursor=pointer]: - /url: /customers/1760505757 - generic [ref=e313]: 1760-5057-57 - cell "Zella Padberg" [ref=e314]: - link "Zella Padberg" [ref=e315] [cursor=pointer]: - /url: /customers/1760505757 - generic [ref=e316]: Zella Padberg - cell "Vienna South" [ref=e317]: - link "Vienna South" [ref=e318] [cursor=pointer]: - /url: /customers/1760505757 - generic [ref=e322]: Vienna South - cell "gerson_sipes2@hotmail.com" [ref=e323]: - link "gerson_sipes2@hotmail.com" [ref=e324] [cursor=pointer]: - /url: /customers/1760505757 - generic [ref=e327]: gerson_sipes2@hotmail.com - cell "+43 6029 603690" [ref=e328]: - link "+43 6029 603690" [ref=e329] [cursor=pointer]: - /url: /customers/1760505757 - generic [ref=e332]: +43 6029 603690 - cell "Lead" [ref=e333]: - link "Lead" [ref=e334] [cursor=pointer]: - /url: /customers/1760505757 - generic [ref=e337]: Lead - cell "None" [ref=e338]: - link "None" [ref=e339] [cursor=pointer]: - /url: /customers/1760505757 - generic [ref=e342]: None - cell "26 May 2026" [ref=e343]: - link "26 May 2026" [ref=e344] [cursor=pointer]: - /url: /customers/1760505757 - generic [ref=e345]: 26 May 2026 - row "1466-3762-43 Cloyd Stanton Vienna South nicolas3@gmail.com +43 7518 517524 Lead None 26 May 2026" [ref=e346]: - cell "1466-3762-43" [ref=e347]: - link "1466-3762-43" [ref=e348] [cursor=pointer]: - /url: /customers/1466376243 - generic [ref=e349]: 1466-3762-43 - cell "Cloyd Stanton" [ref=e350]: - link "Cloyd Stanton" [ref=e351] [cursor=pointer]: - /url: /customers/1466376243 - generic [ref=e352]: Cloyd Stanton - cell "Vienna South" [ref=e353]: - link "Vienna South" [ref=e354] [cursor=pointer]: - /url: /customers/1466376243 - generic [ref=e358]: Vienna South - cell "nicolas3@gmail.com" [ref=e359]: - link "nicolas3@gmail.com" [ref=e360] [cursor=pointer]: - /url: /customers/1466376243 - generic [ref=e363]: nicolas3@gmail.com - cell "+43 7518 517524" [ref=e364]: - link "+43 7518 517524" [ref=e365] [cursor=pointer]: - /url: /customers/1466376243 - generic [ref=e368]: +43 7518 517524 - cell "Lead" [ref=e369]: - link "Lead" [ref=e370] [cursor=pointer]: - /url: /customers/1466376243 - generic [ref=e373]: Lead - cell "None" [ref=e374]: - link "None" [ref=e375] [cursor=pointer]: - /url: /customers/1466376243 - generic [ref=e378]: None - cell "26 May 2026" [ref=e379]: - link "26 May 2026" [ref=e380] [cursor=pointer]: - /url: /customers/1466376243 - generic [ref=e381]: 26 May 2026 - row "9511-2445-7 John Doe Vienna South luther_senger87@yahoo.com +43 6114 514954 Lead None 26 May 2026" [ref=e382]: - cell "9511-2445-7" [ref=e383]: - link "9511-2445-7" [ref=e384] [cursor=pointer]: - /url: /customers/951124457 - generic [ref=e385]: 9511-2445-7 - cell "John Doe" [ref=e386]: - link "John Doe" [ref=e387] [cursor=pointer]: - /url: /customers/951124457 - generic [ref=e388]: John Doe - cell "Vienna South" [ref=e389]: - link "Vienna South" [ref=e390] [cursor=pointer]: - /url: /customers/951124457 - generic [ref=e394]: Vienna South - cell "luther_senger87@yahoo.com" [ref=e395]: - link "luther_senger87@yahoo.com" [ref=e396] [cursor=pointer]: - /url: /customers/951124457 - generic [ref=e399]: luther_senger87@yahoo.com - cell "+43 6114 514954" [ref=e400]: - link "+43 6114 514954" [ref=e401] [cursor=pointer]: - /url: /customers/951124457 - generic [ref=e404]: +43 6114 514954 - cell "Lead" [ref=e405]: - link "Lead" [ref=e406] [cursor=pointer]: - /url: /customers/951124457 - generic [ref=e409]: Lead - cell "None" [ref=e410]: - link "None" [ref=e411] [cursor=pointer]: - /url: /customers/951124457 - generic [ref=e414]: None - cell "26 May 2026" [ref=e415]: - link "26 May 2026" [ref=e416] [cursor=pointer]: - /url: /customers/951124457 - generic [ref=e417]: 26 May 2026 - row "1661-1662-78 Charles Klocko Vienna South lana.kulas35@hotmail.com +43 6544 941052 Lead None 26 May 2026" [ref=e418]: - cell "1661-1662-78" [ref=e419]: - link "1661-1662-78" [ref=e420] [cursor=pointer]: - /url: /customers/1661166278 - generic [ref=e421]: 1661-1662-78 - cell "Charles Klocko" [ref=e422]: - link "Charles Klocko" [ref=e423] [cursor=pointer]: - /url: /customers/1661166278 - generic [ref=e424]: Charles Klocko - cell "Vienna South" [ref=e425]: - link "Vienna South" [ref=e426] [cursor=pointer]: - /url: /customers/1661166278 - generic [ref=e430]: Vienna South - cell "lana.kulas35@hotmail.com" [ref=e431]: - link "lana.kulas35@hotmail.com" [ref=e432] [cursor=pointer]: - /url: /customers/1661166278 - generic [ref=e435]: lana.kulas35@hotmail.com - cell "+43 6544 941052" [ref=e436]: - link "+43 6544 941052" [ref=e437] [cursor=pointer]: - /url: /customers/1661166278 - generic [ref=e440]: +43 6544 941052 - cell "Lead" [ref=e441]: - link "Lead" [ref=e442] [cursor=pointer]: - /url: /customers/1661166278 - generic [ref=e445]: Lead - cell "None" [ref=e446]: - link "None" [ref=e447] [cursor=pointer]: - /url: /customers/1661166278 - generic [ref=e450]: None - cell "26 May 2026" [ref=e451]: - link "26 May 2026" [ref=e452] [cursor=pointer]: - /url: /customers/1661166278 - generic [ref=e453]: 26 May 2026 - row "1931-9532-52 Nancy Barton Vienna North Vienna South ethel6@gmail.com +43 847 1679276 Lead None 26 May 2026" [ref=e454]: - cell "1931-9532-52" [ref=e455]: - link "1931-9532-52" [ref=e456] [cursor=pointer]: - /url: /customers/1931953252 - generic [ref=e457]: 1931-9532-52 - cell "Nancy Barton" [ref=e458]: - link "Nancy Barton" [ref=e459] [cursor=pointer]: - /url: /customers/1931953252 - generic [ref=e460]: Nancy Barton - cell "Vienna North Vienna South" [ref=e461]: - link "Vienna North Vienna South" [ref=e462] [cursor=pointer]: - /url: /customers/1931953252 - generic [ref=e464]: - generic [ref=e466]: Vienna North - generic [ref=e468]: Vienna South - cell "ethel6@gmail.com" [ref=e469]: - link "ethel6@gmail.com" [ref=e470] [cursor=pointer]: - /url: /customers/1931953252 - generic [ref=e473]: ethel6@gmail.com - cell "+43 847 1679276" [ref=e474]: - link "+43 847 1679276" [ref=e475] [cursor=pointer]: - /url: /customers/1931953252 - generic [ref=e478]: +43 847 1679276 - cell "Lead" [ref=e479]: - link "Lead" [ref=e480] [cursor=pointer]: - /url: /customers/1931953252 - generic [ref=e483]: Lead - cell "None" [ref=e484]: - link "None" [ref=e485] [cursor=pointer]: - /url: /customers/1931953252 - generic [ref=e488]: None - cell "26 May 2026" [ref=e489]: - link "26 May 2026" [ref=e490] [cursor=pointer]: - /url: /customers/1931953252 - generic [ref=e491]: 26 May 2026 - row "7813-3370-4 Kayleigh Koch Vienna South concepcion70@yahoo.com +43 6376 073072 Lead None 26 May 2026" [ref=e492]: - cell "7813-3370-4" [ref=e493]: - link "7813-3370-4" [ref=e494] [cursor=pointer]: - /url: /customers/781333704 - generic [ref=e495]: 7813-3370-4 - cell "Kayleigh Koch" [ref=e496]: - link "Kayleigh Koch" [ref=e497] [cursor=pointer]: - /url: /customers/781333704 - generic [ref=e498]: Kayleigh Koch - cell "Vienna South" [ref=e499]: - link "Vienna South" [ref=e500] [cursor=pointer]: - /url: /customers/781333704 - generic [ref=e504]: Vienna South - cell "concepcion70@yahoo.com" [ref=e505]: - link "concepcion70@yahoo.com" [ref=e506] [cursor=pointer]: - /url: /customers/781333704 - generic [ref=e509]: concepcion70@yahoo.com - cell "+43 6376 073072" [ref=e510]: - link "+43 6376 073072" [ref=e511] [cursor=pointer]: - /url: /customers/781333704 - generic [ref=e514]: +43 6376 073072 - cell "Lead" [ref=e515]: - link "Lead" [ref=e516] [cursor=pointer]: - /url: /customers/781333704 - generic [ref=e519]: Lead - cell "None" [ref=e520]: - link "None" [ref=e521] [cursor=pointer]: - /url: /customers/781333704 - generic [ref=e524]: None - cell "26 May 2026" [ref=e525]: - link "26 May 2026" [ref=e526] [cursor=pointer]: - /url: /customers/781333704 - generic [ref=e527]: 26 May 2026 - row "4003-4003-40 Billy Boy Storeroom Innsbruck Vienna North billy.boy@gmail.com +41 12344003 Lead None 26 May 2026" [ref=e528]: - cell "4003-4003-40" [ref=e529]: - link "4003-4003-40" [ref=e530] [cursor=pointer]: - /url: /customers/4003400340 - generic [ref=e531]: 4003-4003-40 - cell "Billy Boy" [ref=e532]: - link "Billy Boy" [ref=e533] [cursor=pointer]: - /url: /customers/4003400340 - generic [ref=e534]: Billy Boy - cell "Storeroom Innsbruck Vienna North" [ref=e535]: - link "Storeroom Innsbruck Vienna North" [ref=e536] [cursor=pointer]: - /url: /customers/4003400340 - generic [ref=e538]: - generic [ref=e540]: Storeroom Innsbruck - generic [ref=e542]: Vienna North - cell "billy.boy@gmail.com" [ref=e543]: - link "billy.boy@gmail.com" [ref=e544] [cursor=pointer]: - /url: /customers/4003400340 - generic [ref=e547]: billy.boy@gmail.com - cell "+41 12344003" [ref=e548]: - link "+41 12344003" [ref=e549] [cursor=pointer]: - /url: /customers/4003400340 - generic [ref=e552]: +41 12344003 - cell "Lead" [ref=e553]: - link "Lead" [ref=e554] [cursor=pointer]: - /url: /customers/4003400340 - generic [ref=e557]: Lead - cell "None" [ref=e558]: - link "None" [ref=e559] [cursor=pointer]: - /url: /customers/4003400340 - generic [ref=e562]: None - cell "26 May 2026" [ref=e563]: - link "26 May 2026" [ref=e564] [cursor=pointer]: - /url: /customers/4003400340 - generic [ref=e565]: 26 May 2026 - row "4002-4002-40 Tyriono Multipiablo AG Storeroom Innsbruck Vienna North tyriono.multipiablo@gmail.com +55 12344002 Lead None 26 May 2026" [ref=e566]: - cell "4002-4002-40" [ref=e567]: - link "4002-4002-40" [ref=e568] [cursor=pointer]: - /url: /customers/4002400240 - generic [ref=e569]: 4002-4002-40 - cell "Tyriono Multipiablo AG" [ref=e570]: - link "Tyriono Multipiablo AG" [ref=e571] [cursor=pointer]: - /url: /customers/4002400240 - generic [ref=e572]: Tyriono Multipiablo AG - cell "Storeroom Innsbruck Vienna North" [ref=e573]: - link "Storeroom Innsbruck Vienna North" [ref=e574] [cursor=pointer]: - /url: /customers/4002400240 - generic [ref=e576]: - generic [ref=e578]: Storeroom Innsbruck - generic [ref=e580]: Vienna North - cell "tyriono.multipiablo@gmail.com" [ref=e581]: - link "tyriono.multipiablo@gmail.com" [ref=e582] [cursor=pointer]: - /url: /customers/4002400240 - generic [ref=e585]: tyriono.multipiablo@gmail.com - cell "+55 12344002" [ref=e586]: - link "+55 12344002" [ref=e587] [cursor=pointer]: - /url: /customers/4002400240 - generic [ref=e590]: +55 12344002 - cell "Lead" [ref=e591]: - link "Lead" [ref=e592] [cursor=pointer]: - /url: /customers/4002400240 - generic [ref=e595]: Lead - cell "None" [ref=e596]: - link "None" [ref=e597] [cursor=pointer]: - /url: /customers/4002400240 - generic [ref=e600]: None - cell "26 May 2026" [ref=e601]: - link "26 May 2026" [ref=e602] [cursor=pointer]: - /url: /customers/4002400240 - generic [ref=e603]: 26 May 2026 - row "4001-4001-40 Cerseio Lannistero AG Vienna North cerseio.lannistero@gmail.com +44 12344001 Lead None 26 May 2026" [ref=e604]: - cell "4001-4001-40" [ref=e605]: - link "4001-4001-40" [ref=e606] [cursor=pointer]: - /url: /customers/4001400140 - generic [ref=e607]: 4001-4001-40 - cell "Cerseio Lannistero AG" [ref=e608]: - link "Cerseio Lannistero AG" [ref=e609] [cursor=pointer]: - /url: /customers/4001400140 - generic [ref=e610]: Cerseio Lannistero AG - cell "Vienna North" [ref=e611]: - link "Vienna North" [ref=e612] [cursor=pointer]: - /url: /customers/4001400140 - generic [ref=e616]: Vienna North - cell "cerseio.lannistero@gmail.com" [ref=e617]: - link "cerseio.lannistero@gmail.com" [ref=e618] [cursor=pointer]: - /url: /customers/4001400140 - generic [ref=e621]: cerseio.lannistero@gmail.com - cell "+44 12344001" [ref=e622]: - link "+44 12344001" [ref=e623] [cursor=pointer]: - /url: /customers/4001400140 - generic [ref=e626]: +44 12344001 - cell "Lead" [ref=e627]: - link "Lead" [ref=e628] [cursor=pointer]: - /url: /customers/4001400140 - generic [ref=e631]: Lead - cell "None" [ref=e632]: - link "None" [ref=e633] [cursor=pointer]: - /url: /customers/4001400140 - generic [ref=e636]: None - cell "26 May 2026" [ref=e637]: - link "26 May 2026" [ref=e638] [cursor=pointer]: - /url: /customers/4001400140 - generic [ref=e639]: 26 May 2026 - row "4000-4000-40 Daeneryso Targaryeno Vienna North daeneryso.targaryeno@gmail.com +49 12344000 Lead None 26 May 2026" [ref=e640]: - cell "4000-4000-40" [ref=e641]: - link "4000-4000-40" [ref=e642] [cursor=pointer]: - /url: /customers/4000400040 - generic [ref=e643]: 4000-4000-40 - cell "Daeneryso Targaryeno" [ref=e644]: - link "Daeneryso Targaryeno" [ref=e645] [cursor=pointer]: - /url: /customers/4000400040 - generic [ref=e646]: Daeneryso Targaryeno - cell "Vienna North" [ref=e647]: - link "Vienna North" [ref=e648] [cursor=pointer]: - /url: /customers/4000400040 - generic [ref=e652]: Vienna North - cell "daeneryso.targaryeno@gmail.com" [ref=e653]: - link "daeneryso.targaryeno@gmail.com" [ref=e654] [cursor=pointer]: - /url: /customers/4000400040 - generic [ref=e657]: daeneryso.targaryeno@gmail.com - cell "+49 12344000" [ref=e658]: - link "+49 12344000" [ref=e659] [cursor=pointer]: - /url: /customers/4000400040 - generic [ref=e662]: +49 12344000 - cell "Lead" [ref=e663]: - link "Lead" [ref=e664] [cursor=pointer]: - /url: /customers/4000400040 - generic [ref=e667]: Lead - cell "None" [ref=e668]: - link "None" [ref=e669] [cursor=pointer]: - /url: /customers/4000400040 - generic [ref=e672]: None - cell "26 May 2026" [ref=e673]: - link "26 May 2026" [ref=e674] [cursor=pointer]: - /url: /customers/4000400040 - generic [ref=e675]: 26 May 2026 - generic [ref=e678]: - generic [ref=e679]: - generic [ref=e680]: "Items per page:" - combobox [ref=e683]: - generic [ref=e685] [cursor=pointer]: - generic [ref=e687]: "10" - combobox "Items per page:": "10" - generic [ref=e689]: 󰍝 - generic [ref=e690]: 1-10 of 48 - generic [ref=e691]: - button [disabled]: - generic: - generic: 󰘀 - button [disabled]: - generic: - generic: 󰅁 - button [ref=e692] [cursor=pointer]: - generic [ref=e694]: 󰅂 - button [ref=e695] [cursor=pointer]: - generic [ref=e697]: 󰘁 - generic: - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip ``` # Test source ```ts 21 | const newCustomer = applyCustomerEditGeneral(customer, tc.changes); 22 | const customerFullName = formatCustomerName(newCustomer.firstName, newCustomer.lastName); 23 | const customerTitle = newCustomer.type === 'business' ? newCustomer.companyName : customerFullName; 24 | const customerPhone = formatPhone(newCustomer.phone); 25 | const customerAddress = formatAddress( 26 | newCustomer.street, 27 | newCustomer.postalCode, 28 | newCustomer.city, 29 | newCustomer.country.name 30 | ); 31 | const customerId = formatId(newCustomer.id, '-', 4); 32 | const customerCreatedAt = formatDate(newCustomer.createdAt); 33 | const customerLocationNames = newCustomer.locations.map((l) => l.name); 34 | 35 | await customerDetailsPage.goto(customer.id); 36 | 37 | const newDetailsPage = await test.step('edit customer general', async () => { 38 | const dialog = await customerDetailsPage.openCustomerEditGeneralDialog(); 39 | return dialog.edit(tc.changes); 40 | }); 41 | 42 | await test.step('verify new customer on details page', async () => { 43 | await expectSingleLocatorToHaveText(newDetailsPage.title, customerTitle); 44 | await expectSingleLocatorToHaveText(newDetailsPage.status, newCustomer.status); 45 | await expectMultiLocatorToHaveText(newDetailsPage.generalCard.locations, customerLocationNames); 46 | await expectSingleLocatorToHaveText(newDetailsPage.generalCard.type, newCustomer.type); 47 | 48 | if (newCustomer.type === 'business') { 49 | await expectSingleLocatorToHaveText(newDetailsPage.generalCard.companyName, newCustomer.companyName); 50 | await expectSingleLocatorToHaveText(newDetailsPage.generalCard.vatType, newCustomer.vatType?.name); 51 | await expectSingleLocatorToHaveText(newDetailsPage.generalCard.vatNumber, newCustomer.vatNumber); 52 | } else { 53 | await expect(newDetailsPage.generalCard.companyName).toBeHidden(); 54 | await expect(newDetailsPage.generalCard.vatType).toBeHidden(); 55 | await expect(newDetailsPage.generalCard.vatNumber).toBeHidden(); 56 | } 57 | 58 | await expectSingleLocatorToHaveText(newDetailsPage.generalCard.name, customerFullName); 59 | await expectSingleLocatorToHaveText(newDetailsPage.generalCard.email, newCustomer.email); 60 | await expectSingleLocatorToHaveText(newDetailsPage.generalCard.phoneNumber, customerPhone); 61 | await expectSingleLocatorToHaveText(newDetailsPage.generalCard.language, newCustomer.language.id); 62 | await expectSingleLocatorToHaveText(newDetailsPage.generalCard.address, customerAddress); 63 | await expectSingleLocatorToHaveText(newDetailsPage.generalCard.note, newCustomer.note); 64 | }); 65 | 66 | await test.step('verify new customer on list page', async () => { 67 | const listPage = await newDetailsPage.returnToCustomerListPage(); 68 | 69 | await listPage.searchTextField.fill(newCustomer.email); 70 | 71 | await expect(listPage.dataTable.getRows()).toHaveCount(1); 72 | await expectDataTableTextColumnToHaveText(listPage.dataTable, customerTableColumnTestIds.id, customerId); 73 | await expectDataTableTextColumnToHaveText(listPage.dataTable, customerTableColumnTestIds.name, customerTitle); 74 | await expectDataTableChipsColumnToHaveText( 75 | listPage.dataTable, 76 | customerTableColumnTestIds.locations, 77 | customerLocationNames 78 | ); 79 | await expectDataTableTextColumnToHaveText( 80 | listPage.dataTable, 81 | customerTableColumnTestIds.email, 82 | newCustomer.email 83 | ); 84 | await expectDataTableTextColumnToHaveText( 85 | listPage.dataTable, 86 | customerTableColumnTestIds.phoneNumber, 87 | customerPhone 88 | ); 89 | await expectDataTableChipsColumnToHaveText( 90 | listPage.dataTable, 91 | customerTableColumnTestIds.status, 92 | newCustomer.status 93 | ); 94 | await expectDataTableTextColumnToHaveText( 95 | listPage.dataTable, 96 | customerTableColumnTestIds.createdAt, 97 | customerCreatedAt 98 | ); 99 | }); 100 | }); 101 | } 102 | 103 | test('edits the email', async ({ createCustomer, customerDetailsPage }) => { 104 | const customer = await createCustomer(getCustomerCreateData()); 105 | const newEmail = faker.internet.email(); 106 | 107 | await customerDetailsPage.goto(customer.id); 108 | 109 | const newDetailsPage = await test.step('edit customer email', async () => { 110 | const dialog = await customerDetailsPage.openCustomerEditGeneralDialog(); 111 | return dialog.edit({ email: newEmail }); 112 | }); 113 | 114 | await test.step('verify new email on details page', async () => { 115 | await expectSingleLocatorToHaveText(newDetailsPage.generalCard.email, newEmail); 116 | }); 117 | 118 | await test.step('verify new email on list page', async () => { 119 | const listPage = await newDetailsPage.returnToCustomerListPage(); 120 | await listPage.searchTextField.fill(newEmail); > 121 | await expect(listPage.dataTable.getRows()).toHaveCount(1); | ^ Error: expect(locator).toHaveCount(expected) failed 122 | }); 123 | }); 124 | 125 | test('edits the phone number', async ({ createCustomer, customerDetailsPage }) => { 126 | const customer = await createCustomer(getCustomerCreateData()); 127 | const newCountry = countries.BR; 128 | const newPhone = getCustomerPhone(newCountry); 129 | const formattedNewPhone = formatPhone(newPhone); 130 | 131 | await customerDetailsPage.goto(customer.id); 132 | 133 | const newDetailsPage = await test.step('edit customer phone number', async () => { 134 | const dialog = await customerDetailsPage.openCustomerEditGeneralDialog(); 135 | return dialog.edit({ phone: newPhone, country: newCountry }); 136 | }); 137 | 138 | await test.step('verify new phone number on details page', async () => { 139 | await expectSingleLocatorToHaveText(newDetailsPage.generalCard.phoneNumber, formattedNewPhone); 140 | }); 141 | 142 | await test.step('verify new phone number on list page', async () => { 143 | const listPage = await newDetailsPage.returnToCustomerListPage(); 144 | await listPage.searchTextField.fill(formattedNewPhone); 145 | await expect(listPage.dataTable.getRows()).toHaveCount(1); 146 | }); 147 | }); 148 | 149 | test('rejects an edit with a duplicate email', async ({ createCustomer, customerDetailsPage }) => { 150 | const existing = await createCustomer(getCustomerCreateData()); 151 | const editing = await createCustomer(getCustomerCreateData()); 152 | 153 | await customerDetailsPage.goto(editing.id); 154 | 155 | const dialog = await test.step('submit edit with duplicate email', async () => { 156 | const editDialog = await customerDetailsPage.openCustomerEditGeneralDialog(); 157 | await editDialog.fill({ email: existing.email }); 158 | await editDialog.submit(); 159 | return editDialog; 160 | }); 161 | 162 | await test.step('verify errors on form', async () => { 163 | await expect(dialog.errors).toHaveCountGreaterThan(0); 164 | }); 165 | }); 166 | 167 | test('rejects an edit with a duplicate phone number', async ({ createCustomer, customerDetailsPage }) => { 168 | const existing = await createCustomer(getCustomerCreateData()); 169 | const editing = await createCustomer(getCustomerCreateData()); 170 | 171 | await customerDetailsPage.goto(editing.id); 172 | 173 | const dialog = await test.step('submit edit with duplicate phone number', async () => { 174 | const editDialog = await customerDetailsPage.openCustomerEditGeneralDialog(); 175 | await editDialog.fill({ phone: existing.phone, country: existing.country }); 176 | await editDialog.submit(); 177 | return editDialog; 178 | }); 179 | 180 | await test.step('verify errors on form', async () => { 181 | await expect(dialog.errors).toHaveCountGreaterThan(0); 182 | }); 183 | }); 184 | 185 | test('rejects an edit with a vat number that does not match the vat type', async ({ 186 | createCustomer, 187 | customerDetailsPage, 188 | }) => { 189 | const customer = await createCustomer(getCustomerCreateData({ type: 'business' })); 190 | 191 | await customerDetailsPage.goto(customer.id); 192 | 193 | const dialog = await test.step('submit edit with mismatched vat type and number', async () => { 194 | const editDialog = await customerDetailsPage.openCustomerEditGeneralDialog(); 195 | await editDialog.fill({ vatType: vatTypes.eu_vat, vatNumber: 'INVALID-VAT-1234' }); 196 | await editDialog.submit(); 197 | return editDialog; 198 | }); 199 | 200 | await test.step('verify errors on form', async () => { 201 | await expect(dialog.errors).toHaveCountGreaterThan(0); 202 | }); 203 | }); 204 | 205 | test('rejects an edit without all required fields', async ({ createCustomer, customerDetailsPage }) => { 206 | const customer = await createCustomer(getCustomerCreateData({ type: 'private' })); 207 | 208 | await customerDetailsPage.goto(customer.id); 209 | 210 | const dialog = await test.step('submit edit clearing required fields', async () => { 211 | const editDialog = await customerDetailsPage.openCustomerEditGeneralDialog(); 212 | await editDialog.fill({ firstName: '', lastName: '' }); 213 | await editDialog.submit(); 214 | return editDialog; 215 | }); 216 | 217 | await test.step('verify errors on form', async () => { 218 | await expect(dialog.errors).toHaveCountGreaterThan(0); 219 | }); 220 | }); 221 | ```