# 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 note - Location: src/manager/tests/e2e/customer/customer-edit-general.spec.ts:19:7 # 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]: - generic [ref=e14]: Manager - button [ref=e15] [cursor=pointer]: - img [ref=e16] - list [ref=e19]: - generic [ref=e21]: Dashboard - link "Tasks" [ref=e22] [cursor=pointer]: - /url: /tasks - img [ref=e25] - generic [ref=e28]: Tasks - link "Facility maps" [ref=e29] [cursor=pointer]: - /url: /facility-map - generic [ref=e31]: 󰧾 - generic [ref=e33]: Facility maps - link "Analytics" [ref=e34] [cursor=pointer]: - /url: /dashboard - generic [ref=e36]: 󱖶 - generic [ref=e38]: Analytics - generic [ref=e40]: Sales - link "Bookings" [ref=e41] [cursor=pointer]: - /url: /bookings - generic [ref=e43]: 󰇡 - generic [ref=e45]: Bookings - link "Customers" [ref=e46] [cursor=pointer]: - /url: /customers - generic [ref=e48]: 󰀏 - generic [ref=e50]: Customers - link "Invoices" [ref=e51] [cursor=pointer]: - /url: /invoices - generic [ref=e53]: 󰷉 - generic [ref=e55]: Invoices - link "Credit notes" [ref=e56] [cursor=pointer]: - /url: /credit-notes - img [ref=e59] - generic [ref=e62]: Credit notes - link "Units" [ref=e63] [cursor=pointer]: - /url: /units - generic [ref=e65]: 󰍀 - generic [ref=e67]: Units - generic [ref=e69]: Site management - link "Locations" [ref=e70] [cursor=pointer]: - /url: /locations - generic [ref=e72]: 󰟙 - generic [ref=e74]: Locations - link "Unit types" [ref=e75] [cursor=pointer]: - /url: /unit-types - generic [ref=e77]: 󰆧 - generic [ref=e79]: Unit types - link "Protection Plans" [ref=e80] [cursor=pointer]: - /url: /insurances - generic [ref=e82]: 󰳌 - generic [ref=e84]: Protection Plans - link "Deposits" [ref=e85] [cursor=pointer]: - /url: /deposits - generic [ref=e87]: 󱙆 - generic [ref=e89]: Deposits - link "Products" [ref=e90] [cursor=pointer]: - /url: /products - generic [ref=e92]: 󰄑 - generic [ref=e94]: Products - link "Discounts" [ref=e95] [cursor=pointer]: - /url: /discounts - generic [ref=e97]: 󰓼 - generic [ref=e99]: Discounts - generic [ref=e100]: - option "Emails" [ref=e101] [cursor=pointer]: - generic [ref=e103]: 󰻨 - generic [ref=e105]: Emails - generic [ref=e109]: 󰅀 - text: 󱡰 󰁥 - generic [ref=e111]: Admin - link "Integrations" [ref=e112] [cursor=pointer]: - /url: /connected-apps - generic [ref=e114]: 󱘖 - generic [ref=e116]: Integrations - link "User & Roles" [ref=e117] [cursor=pointer]: - /url: /users - generic [ref=e119]: 󰭘 - generic [ref=e121]: User & Roles - generic [ref=e122]: - option "Booking Portal" [ref=e123] [cursor=pointer]: - generic [ref=e125]: 󱃁 - generic [ref=e127]: Booking Portal - generic [ref=e131]: 󰅀 - text: 󰖟 󰟙 - generic [ref=e132]: - option "JaneAI" [ref=e133] [cursor=pointer]: - generic [ref=e135]: 󱙺 - generic [ref=e137]: JaneAI - generic [ref=e141]: 󰅀 - text: 󱜹 - generic [ref=e143]: Feedback - link "Voting Portal" [ref=e144] [cursor=pointer]: - /url: /voting-portal - generic [ref=e146]: 󰔔 - generic [ref=e148]: Voting Portal - generic [ref=e150]: - button "AS Andreas Stadler andreas.stadler@storeroom.at" [ref=e153] [cursor=pointer]: - generic [ref=e156]: AS - generic [ref=e157]: - generic [ref=e158]: Andreas Stadler - generic "andreas.stadler@storeroom.at" [ref=e159] - generic [ref=e160]: 󰇙 - generic: - text: 󰗊 󰅀 - text: 󰷖 󰍃 - button [ref=e161] [cursor=pointer]: - generic [ref=e163]: 󰋽 - main [ref=e164]: - generic [ref=e166]: - generic [ref=e168]: - generic [ref=e170]: Customers - generic [ref=e172]: - link "Create customer" [ref=e173] [cursor=pointer]: - /url: /customers/create - generic [ref=e174]: - generic [ref=e175]: 󰐕 - text: Create customer - button [ref=e176] [cursor=pointer]: - generic [ref=e180]: 󰍝 - generic [ref=e182]: - generic [ref=e184]: - button "Filters Reset filters" [ref=e185] [cursor=pointer]: - generic [ref=e186]: - heading "Filters" [level=3] [ref=e189] - generic [ref=e191]: - button "Reset filters" [ref=e193]: - generic [ref=e194]: - generic [ref=e195]: 󰑐 - text: Reset filters - generic [ref=e199]: 󰅀 - generic [ref=e205]: - generic [ref=e210]: - generic [ref=e212]: 󰍉 - textbox "Search" [active] [ref=e214]: Floyd.Halvorson32@hotmail.com - button "Clear Search" [ref=e216] [cursor=pointer]: 󰅙 - generic: - generic: Search - combobox [ref=e220]: - generic [ref=e221]: - generic: Location - combobox "Location" [ref=e223] - button [ref=e225] [cursor=pointer]: 󰍝 - combobox [ref=e229]: - generic [ref=e230]: - generic: Has past due invoice(s) - combobox "Has past due invoice(s)" [ref=e232] - button [ref=e234] [cursor=pointer]: 󰍝 - combobox [ref=e238]: - generic [ref=e239]: - generic: Status - combobox "Status" [ref=e241] - button [ref=e243] [cursor=pointer]: 󰍝 - generic [ref=e245]: - table [ref=e249]: - rowgroup [ref=e250]: - row "Customer no. Name Location(s) Email address Phone number Status Past due invoice(s) Created at" [ref=e251]: - columnheader "Customer no." [ref=e252]: - button "Customer no." [ref=e253] [cursor=pointer]: - generic [ref=e255]: Customer no. - generic [ref=e258]: 󰁝 - columnheader "Name" [ref=e259]: - button "Name" [ref=e260] [cursor=pointer]: - generic [ref=e262]: Name - generic [ref=e265]: 󰁝 - columnheader "Location(s)" [ref=e266]: - button "Location(s)" [ref=e267] [cursor=pointer]: - generic [ref=e269]: Location(s) - generic [ref=e272]: 󰁝 - columnheader "Email address" [ref=e273]: - button "Email address" [ref=e274] [cursor=pointer]: - generic [ref=e276]: Email address - generic [ref=e279]: 󰁝 - columnheader "Phone number" [ref=e280]: - generic [ref=e283]: Phone number - columnheader "Status" [ref=e284]: - button "Status" [ref=e285] [cursor=pointer]: - generic [ref=e287]: Status - generic [ref=e290]: 󰁝 - columnheader "Past due invoice(s)" [ref=e291]: - button "Past due invoice(s)" [ref=e292] [cursor=pointer]: - generic [ref=e294]: Past due invoice(s) - generic [ref=e297]: 󰁝 - columnheader "Created at" [ref=e298]: - button "Created at" [ref=e299] [cursor=pointer]: - generic [ref=e301]: Created at - generic [ref=e304]: 󰁝 - row [ref=e305]: - columnheader [ref=e306] - rowgroup [ref=e307]: - row "1321-0844-10 Melisa Ortiz Vienna South floyd.halvorson32@hotmail.com +43 3201 436245 Lead None 23 May 2026" [ref=e308]: - cell "1321-0844-10" [ref=e309]: - link "1321-0844-10" [ref=e310] [cursor=pointer]: - /url: /customers/1321084410 - generic [ref=e311]: 1321-0844-10 - cell "Melisa Ortiz" [ref=e312]: - link "Melisa Ortiz" [ref=e313] [cursor=pointer]: - /url: /customers/1321084410 - generic [ref=e314]: Melisa Ortiz - cell "Vienna South" [ref=e315]: - link "Vienna South" [ref=e316] [cursor=pointer]: - /url: /customers/1321084410 - generic [ref=e320]: Vienna South - cell "floyd.halvorson32@hotmail.com" [ref=e321]: - link "floyd.halvorson32@hotmail.com" [ref=e322] [cursor=pointer]: - /url: /customers/1321084410 - generic [ref=e325]: floyd.halvorson32@hotmail.com - cell "+43 3201 436245" [ref=e326]: - link "+43 3201 436245" [ref=e327] [cursor=pointer]: - /url: /customers/1321084410 - generic [ref=e330]: +43 3201 436245 - cell "Lead" [ref=e331]: - link "Lead" [ref=e332] [cursor=pointer]: - /url: /customers/1321084410 - generic [ref=e335]: Lead - cell "None" [ref=e336]: - link "None" [ref=e337] [cursor=pointer]: - /url: /customers/1321084410 - generic [ref=e340]: None - cell "23 May 2026" [ref=e341]: - link "23 May 2026" [ref=e342] [cursor=pointer]: - /url: /customers/1321084410 - generic [ref=e343]: 23 May 2026 - row "1406-4175-55 Gladys Jacobi Storeroom Innsbruck City 1030 wpouros@yahoo.com +43 26398474566380394 Lead None 23 May 2026" [ref=e344]: - cell "1406-4175-55" [ref=e345]: - link "1406-4175-55" [ref=e346] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e347]: 1406-4175-55 - cell "Gladys Jacobi" [ref=e348]: - link "Gladys Jacobi" [ref=e349] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e350]: Gladys Jacobi - cell "Storeroom Innsbruck City 1030" [ref=e351]: - link "Storeroom Innsbruck City 1030" [ref=e352] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e354]: - generic [ref=e356]: Storeroom Innsbruck - generic [ref=e358]: City 1030 - cell "wpouros@yahoo.com" [ref=e359]: - link "wpouros@yahoo.com" [ref=e360] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e363]: wpouros@yahoo.com - cell "+43 26398474566380394" [ref=e364]: - link "+43 26398474566380394" [ref=e365] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e368]: +43 26398474566380394 - cell "Lead" [ref=e369]: - link "Lead" [ref=e370] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e373]: Lead - cell "None" [ref=e374]: - link "None" [ref=e375] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e378]: None - cell "23 May 2026" [ref=e379]: - link "23 May 2026" [ref=e380] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e381]: 23 May 2026 - row "1066-2738-76 Kshlerin-McDermott Storeroom Innsbruck City 1030 rippin.elsie@kuphal.org +43 28836632878445898 Lead None 23 May 2026" [ref=e382]: - cell "1066-2738-76" [ref=e383]: - link "1066-2738-76" [ref=e384] [cursor=pointer]: - /url: /customers/1066273876 - generic [ref=e385]: 1066-2738-76 - cell "Kshlerin-McDermott" [ref=e386]: - link "Kshlerin-McDermott" [ref=e387] [cursor=pointer]: - /url: /customers/1066273876 - generic [ref=e388]: Kshlerin-McDermott - cell "Storeroom Innsbruck City 1030" [ref=e389]: - link "Storeroom Innsbruck City 1030" [ref=e390] [cursor=pointer]: - /url: /customers/1066273876 - generic [ref=e392]: - generic [ref=e394]: Storeroom Innsbruck - generic [ref=e396]: City 1030 - cell "rippin.elsie@kuphal.org" [ref=e397]: - link "rippin.elsie@kuphal.org" [ref=e398] [cursor=pointer]: - /url: /customers/1066273876 - generic [ref=e401]: rippin.elsie@kuphal.org - cell "+43 28836632878445898" [ref=e402]: - link "+43 28836632878445898" [ref=e403] [cursor=pointer]: - /url: /customers/1066273876 - generic [ref=e406]: +43 28836632878445898 - cell "Lead" [ref=e407]: - link "Lead" [ref=e408] [cursor=pointer]: - /url: /customers/1066273876 - generic [ref=e411]: Lead - cell "None" [ref=e412]: - link "None" [ref=e413] [cursor=pointer]: - /url: /customers/1066273876 - generic [ref=e416]: None - cell "23 May 2026" [ref=e417]: - link "23 May 2026" [ref=e418] [cursor=pointer]: - /url: /customers/1066273876 - generic [ref=e419]: 23 May 2026 - row "4131-7095-0 Percy Jerde Vienna South langworth.mazie@reichel.biz +43 95373273925109165 Lead None 23 May 2026" [ref=e420]: - cell "4131-7095-0" [ref=e421]: - link "4131-7095-0" [ref=e422] [cursor=pointer]: - /url: /customers/413170950 - generic [ref=e423]: 4131-7095-0 - cell "Percy Jerde" [ref=e424]: - link "Percy Jerde" [ref=e425] [cursor=pointer]: - /url: /customers/413170950 - generic [ref=e426]: Percy Jerde - cell "Vienna South" [ref=e427]: - link "Vienna South" [ref=e428] [cursor=pointer]: - /url: /customers/413170950 - generic [ref=e432]: Vienna South - cell "langworth.mazie@reichel.biz" [ref=e433]: - link "langworth.mazie@reichel.biz" [ref=e434] [cursor=pointer]: - /url: /customers/413170950 - generic [ref=e437]: langworth.mazie@reichel.biz - cell "+43 95373273925109165" [ref=e438]: - link "+43 95373273925109165" [ref=e439] [cursor=pointer]: - /url: /customers/413170950 - generic [ref=e442]: +43 95373273925109165 - cell "Lead" [ref=e443]: - link "Lead" [ref=e444] [cursor=pointer]: - /url: /customers/413170950 - generic [ref=e447]: Lead - cell "None" [ref=e448]: - link "None" [ref=e449] [cursor=pointer]: - /url: /customers/413170950 - generic [ref=e452]: None - cell "23 May 2026" [ref=e453]: - link "23 May 2026" [ref=e454] [cursor=pointer]: - /url: /customers/413170950 - generic [ref=e455]: 23 May 2026 - row "9055-3501-9 Connor Shanahan Storeroom Innsbruck City 1030 norene05@yahoo.com +43 25671431678209516 Lead None 23 May 2026" [ref=e456]: - cell "9055-3501-9" [ref=e457]: - link "9055-3501-9" [ref=e458] [cursor=pointer]: - /url: /customers/905535019 - generic [ref=e459]: 9055-3501-9 - cell "Connor Shanahan" [ref=e460]: - link "Connor Shanahan" [ref=e461] [cursor=pointer]: - /url: /customers/905535019 - generic [ref=e462]: Connor Shanahan - cell "Storeroom Innsbruck City 1030" [ref=e463]: - link "Storeroom Innsbruck City 1030" [ref=e464] [cursor=pointer]: - /url: /customers/905535019 - generic [ref=e466]: - generic [ref=e468]: Storeroom Innsbruck - generic [ref=e470]: City 1030 - cell "norene05@yahoo.com" [ref=e471]: - link "norene05@yahoo.com" [ref=e472] [cursor=pointer]: - /url: /customers/905535019 - generic [ref=e475]: norene05@yahoo.com - cell "+43 25671431678209516" [ref=e476]: - link "+43 25671431678209516" [ref=e477] [cursor=pointer]: - /url: /customers/905535019 - generic [ref=e480]: +43 25671431678209516 - cell "Lead" [ref=e481]: - link "Lead" [ref=e482] [cursor=pointer]: - /url: /customers/905535019 - generic [ref=e485]: Lead - cell "None" [ref=e486]: - link "None" [ref=e487] [cursor=pointer]: - /url: /customers/905535019 - generic [ref=e490]: None - cell "23 May 2026" [ref=e491]: - link "23 May 2026" [ref=e492] [cursor=pointer]: - /url: /customers/905535019 - generic [ref=e493]: 23 May 2026 - row "1715-1629-04 Klocko-Gorczany Vienna South cartwright.ettie@stracke.com +43 93246770072722319 Lead None 23 May 2026" [ref=e494]: - cell "1715-1629-04" [ref=e495]: - link "1715-1629-04" [ref=e496] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e497]: 1715-1629-04 - cell "Klocko-Gorczany" [ref=e498]: - link "Klocko-Gorczany" [ref=e499] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e500]: Klocko-Gorczany - cell "Vienna South" [ref=e501]: - link "Vienna South" [ref=e502] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e506]: Vienna South - cell "cartwright.ettie@stracke.com" [ref=e507]: - link "cartwright.ettie@stracke.com" [ref=e508] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e511]: cartwright.ettie@stracke.com - cell "+43 93246770072722319" [ref=e512]: - link "+43 93246770072722319" [ref=e513] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e516]: +43 93246770072722319 - cell "Lead" [ref=e517]: - link "Lead" [ref=e518] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e521]: Lead - cell "None" [ref=e522]: - link "None" [ref=e523] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e526]: None - cell "23 May 2026" [ref=e527]: - link "23 May 2026" [ref=e528] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e529]: 23 May 2026 - row "1593-8649-55 Ferry, Kassulke and Wehner Vienna South carter01@volkman.org +43 25806394922501132 Lead None 23 May 2026" [ref=e530]: - cell "1593-8649-55" [ref=e531]: - link "1593-8649-55" [ref=e532] [cursor=pointer]: - /url: /customers/1593864955 - generic [ref=e533]: 1593-8649-55 - cell "Ferry, Kassulke and Wehner" [ref=e534]: - link "Ferry, Kassulke and Wehner" [ref=e535] [cursor=pointer]: - /url: /customers/1593864955 - generic [ref=e536]: Ferry, Kassulke and Wehner - cell "Vienna South" [ref=e537]: - link "Vienna South" [ref=e538] [cursor=pointer]: - /url: /customers/1593864955 - generic [ref=e542]: Vienna South - cell "carter01@volkman.org" [ref=e543]: - link "carter01@volkman.org" [ref=e544] [cursor=pointer]: - /url: /customers/1593864955 - generic [ref=e547]: carter01@volkman.org - cell "+43 25806394922501132" [ref=e548]: - link "+43 25806394922501132" [ref=e549] [cursor=pointer]: - /url: /customers/1593864955 - generic [ref=e552]: +43 25806394922501132 - cell "Lead" [ref=e553]: - link "Lead" [ref=e554] [cursor=pointer]: - /url: /customers/1593864955 - generic [ref=e557]: Lead - cell "None" [ref=e558]: - link "None" [ref=e559] [cursor=pointer]: - /url: /customers/1593864955 - generic [ref=e562]: None - cell "23 May 2026" [ref=e563]: - link "23 May 2026" [ref=e564] [cursor=pointer]: - /url: /customers/1593864955 - generic [ref=e565]: 23 May 2026 - row "7924-8283-8 Murphy, Carroll and Kautzer Storeroom Innsbruck City 1030 josiane.mcglynn@schuster.biz +43 28342501769041767 Lead None 23 May 2026" [ref=e566]: - cell "7924-8283-8" [ref=e567]: - link "7924-8283-8" [ref=e568] [cursor=pointer]: - /url: /customers/792482838 - generic [ref=e569]: 7924-8283-8 - cell "Murphy, Carroll and Kautzer" [ref=e570]: - link "Murphy, Carroll and Kautzer" [ref=e571] [cursor=pointer]: - /url: /customers/792482838 - generic [ref=e572]: Murphy, Carroll and Kautzer - cell "Storeroom Innsbruck City 1030" [ref=e573]: - link "Storeroom Innsbruck City 1030" [ref=e574] [cursor=pointer]: - /url: /customers/792482838 - generic [ref=e576]: - generic [ref=e578]: Storeroom Innsbruck - generic [ref=e580]: City 1030 - cell "josiane.mcglynn@schuster.biz" [ref=e581]: - link "josiane.mcglynn@schuster.biz" [ref=e582] [cursor=pointer]: - /url: /customers/792482838 - generic [ref=e585]: josiane.mcglynn@schuster.biz - cell "+43 28342501769041767" [ref=e586]: - link "+43 28342501769041767" [ref=e587] [cursor=pointer]: - /url: /customers/792482838 - generic [ref=e590]: +43 28342501769041767 - cell "Lead" [ref=e591]: - link "Lead" [ref=e592] [cursor=pointer]: - /url: /customers/792482838 - generic [ref=e595]: Lead - cell "None" [ref=e596]: - link "None" [ref=e597] [cursor=pointer]: - /url: /customers/792482838 - generic [ref=e600]: None - cell "23 May 2026" [ref=e601]: - link "23 May 2026" [ref=e602] [cursor=pointer]: - /url: /customers/792482838 - generic [ref=e603]: 23 May 2026 - row "1731-0200-07 Ima Mosciski Vienna South herzog.augustus@hotmail.com +43 28841697832837667 Lead None 23 May 2026" [ref=e604]: - cell "1731-0200-07" [ref=e605]: - link "1731-0200-07" [ref=e606] [cursor=pointer]: - /url: /customers/1731020007 - generic [ref=e607]: 1731-0200-07 - cell "Ima Mosciski" [ref=e608]: - link "Ima Mosciski" [ref=e609] [cursor=pointer]: - /url: /customers/1731020007 - generic [ref=e610]: Ima Mosciski - cell "Vienna South" [ref=e611]: - link "Vienna South" [ref=e612] [cursor=pointer]: - /url: /customers/1731020007 - generic [ref=e616]: Vienna South - cell "herzog.augustus@hotmail.com" [ref=e617]: - link "herzog.augustus@hotmail.com" [ref=e618] [cursor=pointer]: - /url: /customers/1731020007 - generic [ref=e621]: herzog.augustus@hotmail.com - cell "+43 28841697832837667" [ref=e622]: - link "+43 28841697832837667" [ref=e623] [cursor=pointer]: - /url: /customers/1731020007 - generic [ref=e626]: +43 28841697832837667 - cell "Lead" [ref=e627]: - link "Lead" [ref=e628] [cursor=pointer]: - /url: /customers/1731020007 - generic [ref=e631]: Lead - cell "None" [ref=e632]: - link "None" [ref=e633] [cursor=pointer]: - /url: /customers/1731020007 - generic [ref=e636]: None - cell "23 May 2026" [ref=e637]: - link "23 May 2026" [ref=e638] [cursor=pointer]: - /url: /customers/1731020007 - generic [ref=e639]: 23 May 2026 - row "7353-2762-4 Jerome Fahey Vienna North alysha63@yahoo.com +43 96265220813277484 Lead None 23 May 2026" [ref=e640]: - cell "7353-2762-4" [ref=e641]: - link "7353-2762-4" [ref=e642] [cursor=pointer]: - /url: /customers/735327624 - generic [ref=e643]: 7353-2762-4 - cell "Jerome Fahey" [ref=e644]: - link "Jerome Fahey" [ref=e645] [cursor=pointer]: - /url: /customers/735327624 - generic [ref=e646]: Jerome Fahey - cell "Vienna North" [ref=e647]: - link "Vienna North" [ref=e648] [cursor=pointer]: - /url: /customers/735327624 - generic [ref=e652]: Vienna North - cell "alysha63@yahoo.com" [ref=e653]: - link "alysha63@yahoo.com" [ref=e654] [cursor=pointer]: - /url: /customers/735327624 - generic [ref=e657]: alysha63@yahoo.com - cell "+43 96265220813277484" [ref=e658]: - link "+43 96265220813277484" [ref=e659] [cursor=pointer]: - /url: /customers/735327624 - generic [ref=e662]: +43 96265220813277484 - cell "Lead" [ref=e663]: - link "Lead" [ref=e664] [cursor=pointer]: - /url: /customers/735327624 - generic [ref=e667]: Lead - cell "None" [ref=e668]: - link "None" [ref=e669] [cursor=pointer]: - /url: /customers/735327624 - generic [ref=e672]: None - cell "23 May 2026" [ref=e673]: - link "23 May 2026" [ref=e674] [cursor=pointer]: - /url: /customers/735327624 - generic [ref=e675]: 23 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 12 - 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 1 | import { faker } from '@faker-js/faker'; 2 | import { getCustomerCreateData, getCustomerPhone } from '@/manager/modules/customer/customer-factories'; 3 | import { test } from '@/manager/modules/customer/customer-fixtures'; 4 | import { applyCustomerEditGeneral } from '@/manager/modules/customer/customer-mappers'; 5 | import { formatCustomerName } from '@/manager/modules/customer/customer-utils'; 6 | import { customerEditGeneralHappyTestCases } from '@/manager/modules/customer/test-cases/customer-edit-general-happy-test-cases'; 7 | import { 8 | expectDataTableChipsColumnToHaveText, 9 | expectDataTableTextColumnToHaveText, 10 | } from '@/manager/modules/ui/data-table/data-table-assertions'; 11 | import { customerTableColumnTestIds } from '@/manager/modules/ui/data-table/data/data-table-column-test-ids'; 12 | import { expectMultiLocatorToHaveText, expectSingleLocatorToHaveText } from '@/manager/shared/utils/expect-utils'; 13 | import { countries } from '@/shared/data/seed-countries'; 14 | import { vatTypes } from '@/shared/data/seed-vat-types'; 15 | import { formatAddress, formatDate, formatId, formatPhone } from '@/shared/utils/formatters'; 16 | import { expect } from '@/shared/utils/matchers'; 17 | 18 | for (const tc of customerEditGeneralHappyTestCases) { 19 | test(tc.description, async ({ createCustomer, customerDetailsPage }) => { 20 | const customer = await createCustomer(getCustomerCreateData(tc.initialOptions)); 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); | ^ Error: expect(locator).toHaveCount(expected) failed 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); 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); ```