# 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-create.spec.ts >> creates a customer with russian language - Location: src/manager/tests/e2e/customer/customer-create.spec.ts:16: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]: Jenny.Herzog0@yahoo.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 "1307-4581-61 Corwin - Howell Vienna South malvina_kassulke@hotmail.com +43 846 8260427 Lead None 25 May 2026" [ref=e308]: - cell "1307-4581-61" [ref=e309]: - link "1307-4581-61" [ref=e310] [cursor=pointer]: - /url: /customers/1307458161 - generic [ref=e311]: 1307-4581-61 - cell "Corwin - Howell" [ref=e312]: - link "Corwin - Howell" [ref=e313] [cursor=pointer]: - /url: /customers/1307458161 - generic [ref=e314]: Corwin - Howell - cell "Vienna South" [ref=e315]: - link "Vienna South" [ref=e316] [cursor=pointer]: - /url: /customers/1307458161 - generic [ref=e320]: Vienna South - cell "malvina_kassulke@hotmail.com" [ref=e321]: - link "malvina_kassulke@hotmail.com" [ref=e322] [cursor=pointer]: - /url: /customers/1307458161 - generic [ref=e325]: malvina_kassulke@hotmail.com - cell "+43 846 8260427" [ref=e326]: - link "+43 846 8260427" [ref=e327] [cursor=pointer]: - /url: /customers/1307458161 - generic [ref=e330]: +43 846 8260427 - cell "Lead" [ref=e331]: - link "Lead" [ref=e332] [cursor=pointer]: - /url: /customers/1307458161 - generic [ref=e335]: Lead - cell "None" [ref=e336]: - link "None" [ref=e337] [cursor=pointer]: - /url: /customers/1307458161 - generic [ref=e340]: None - cell "25 May 2026" [ref=e341]: - link "25 May 2026" [ref=e342] [cursor=pointer]: - /url: /customers/1307458161 - generic [ref=e343]: 25 May 2026 - row "9989-7623-1 John Farrell Vienna South jenny.herzog0@yahoo.com +43 7982 285712 Lead None 25 May 2026" [ref=e344]: - cell "9989-7623-1" [ref=e345]: - link "9989-7623-1" [ref=e346] [cursor=pointer]: - /url: /customers/998976231 - generic [ref=e347]: 9989-7623-1 - cell "John Farrell" [ref=e348]: - link "John Farrell" [ref=e349] [cursor=pointer]: - /url: /customers/998976231 - generic [ref=e350]: John Farrell - cell "Vienna South" [ref=e351]: - link "Vienna South" [ref=e352] [cursor=pointer]: - /url: /customers/998976231 - generic [ref=e356]: Vienna South - cell "jenny.herzog0@yahoo.com" [ref=e357]: - link "jenny.herzog0@yahoo.com" [ref=e358] [cursor=pointer]: - /url: /customers/998976231 - generic [ref=e361]: jenny.herzog0@yahoo.com - cell "+43 7982 285712" [ref=e362]: - link "+43 7982 285712" [ref=e363] [cursor=pointer]: - /url: /customers/998976231 - generic [ref=e366]: +43 7982 285712 - cell "Lead" [ref=e367]: - link "Lead" [ref=e368] [cursor=pointer]: - /url: /customers/998976231 - generic [ref=e371]: Lead - cell "None" [ref=e372]: - link "None" [ref=e373] [cursor=pointer]: - /url: /customers/998976231 - generic [ref=e376]: None - cell "25 May 2026" [ref=e377]: - link "25 May 2026" [ref=e378] [cursor=pointer]: - /url: /customers/998976231 - generic [ref=e379]: 25 May 2026 - row "1809-9802-48 McKenzie, Marvin and Hansen Vienna South winston.greenfelder@hotmail.com +43 3612 596640 Lead None 25 May 2026" [ref=e380]: - cell "1809-9802-48" [ref=e381]: - link "1809-9802-48" [ref=e382] [cursor=pointer]: - /url: /customers/1809980248 - generic [ref=e383]: 1809-9802-48 - cell "McKenzie, Marvin and Hansen" [ref=e384]: - link "McKenzie, Marvin and Hansen" [ref=e385] [cursor=pointer]: - /url: /customers/1809980248 - generic [ref=e386]: McKenzie, Marvin and Hansen - cell "Vienna South" [ref=e387]: - link "Vienna South" [ref=e388] [cursor=pointer]: - /url: /customers/1809980248 - generic [ref=e392]: Vienna South - cell "winston.greenfelder@hotmail.com" [ref=e393]: - link "winston.greenfelder@hotmail.com" [ref=e394] [cursor=pointer]: - /url: /customers/1809980248 - generic [ref=e397]: winston.greenfelder@hotmail.com - cell "+43 3612 596640" [ref=e398]: - link "+43 3612 596640" [ref=e399] [cursor=pointer]: - /url: /customers/1809980248 - generic [ref=e402]: +43 3612 596640 - cell "Lead" [ref=e403]: - link "Lead" [ref=e404] [cursor=pointer]: - /url: /customers/1809980248 - generic [ref=e407]: Lead - cell "None" [ref=e408]: - link "None" [ref=e409] [cursor=pointer]: - /url: /customers/1809980248 - generic [ref=e412]: None - cell "25 May 2026" [ref=e413]: - link "25 May 2026" [ref=e414] [cursor=pointer]: - /url: /customers/1809980248 - generic [ref=e415]: 25 May 2026 - row "9224-2229-3 Kristen Rau Vienna South domenico64@hotmail.com +43 2337 122220 Lead None 25 May 2026" [ref=e416]: - cell "9224-2229-3" [ref=e417]: - link "9224-2229-3" [ref=e418] [cursor=pointer]: - /url: /customers/922422293 - generic [ref=e419]: 9224-2229-3 - cell "Kristen Rau" [ref=e420]: - link "Kristen Rau" [ref=e421] [cursor=pointer]: - /url: /customers/922422293 - generic [ref=e422]: Kristen Rau - cell "Vienna South" [ref=e423]: - link "Vienna South" [ref=e424] [cursor=pointer]: - /url: /customers/922422293 - generic [ref=e428]: Vienna South - cell "domenico64@hotmail.com" [ref=e429]: - link "domenico64@hotmail.com" [ref=e430] [cursor=pointer]: - /url: /customers/922422293 - generic [ref=e433]: domenico64@hotmail.com - cell "+43 2337 122220" [ref=e434]: - link "+43 2337 122220" [ref=e435] [cursor=pointer]: - /url: /customers/922422293 - generic [ref=e438]: +43 2337 122220 - cell "Lead" [ref=e439]: - link "Lead" [ref=e440] [cursor=pointer]: - /url: /customers/922422293 - generic [ref=e443]: Lead - cell "None" [ref=e444]: - link "None" [ref=e445] [cursor=pointer]: - /url: /customers/922422293 - generic [ref=e448]: None - cell "25 May 2026" [ref=e449]: - link "25 May 2026" [ref=e450] [cursor=pointer]: - /url: /customers/922422293 - generic [ref=e451]: 25 May 2026 - row "2135-1647-18 Dooley, Torp and Yost Vienna South christiansen.jackie@hotmail.com +43 47694572712170347 Lead None 25 May 2026" [ref=e452]: - cell "2135-1647-18" [ref=e453]: - link "2135-1647-18" [ref=e454] [cursor=pointer]: - /url: /customers/2135164718 - generic [ref=e455]: 2135-1647-18 - cell "Dooley, Torp and Yost" [ref=e456]: - link "Dooley, Torp and Yost" [ref=e457] [cursor=pointer]: - /url: /customers/2135164718 - generic [ref=e458]: Dooley, Torp and Yost - cell "Vienna South" [ref=e459]: - link "Vienna South" [ref=e460] [cursor=pointer]: - /url: /customers/2135164718 - generic [ref=e464]: Vienna South - cell "christiansen.jackie@hotmail.com" [ref=e465]: - link "christiansen.jackie@hotmail.com" [ref=e466] [cursor=pointer]: - /url: /customers/2135164718 - generic [ref=e469]: christiansen.jackie@hotmail.com - cell "+43 47694572712170347" [ref=e470]: - link "+43 47694572712170347" [ref=e471] [cursor=pointer]: - /url: /customers/2135164718 - generic [ref=e474]: +43 47694572712170347 - cell "Lead" [ref=e475]: - link "Lead" [ref=e476] [cursor=pointer]: - /url: /customers/2135164718 - generic [ref=e479]: Lead - cell "None" [ref=e480]: - link "None" [ref=e481] [cursor=pointer]: - /url: /customers/2135164718 - generic [ref=e484]: None - cell "25 May 2026" [ref=e485]: - link "25 May 2026" [ref=e486] [cursor=pointer]: - /url: /customers/2135164718 - generic [ref=e487]: 25 May 2026 - row "3398-3092-7 Morar LLC Storeroom Innsbruck City 1030 creola.walsh@gmail.com +43 84391484284694400 Lead None 25 May 2026" [ref=e488]: - cell "3398-3092-7" [ref=e489]: - link "3398-3092-7" [ref=e490] [cursor=pointer]: - /url: /customers/339830927 - generic [ref=e491]: 3398-3092-7 - cell "Morar LLC" [ref=e492]: - link "Morar LLC" [ref=e493] [cursor=pointer]: - /url: /customers/339830927 - generic [ref=e494]: Morar LLC - cell "Storeroom Innsbruck City 1030" [ref=e495]: - link "Storeroom Innsbruck City 1030" [ref=e496] [cursor=pointer]: - /url: /customers/339830927 - generic [ref=e498]: - generic [ref=e500]: Storeroom Innsbruck - generic [ref=e502]: City 1030 - cell "creola.walsh@gmail.com" [ref=e503]: - link "creola.walsh@gmail.com" [ref=e504] [cursor=pointer]: - /url: /customers/339830927 - generic [ref=e507]: creola.walsh@gmail.com - cell "+43 84391484284694400" [ref=e508]: - link "+43 84391484284694400" [ref=e509] [cursor=pointer]: - /url: /customers/339830927 - generic [ref=e512]: +43 84391484284694400 - cell "Lead" [ref=e513]: - link "Lead" [ref=e514] [cursor=pointer]: - /url: /customers/339830927 - generic [ref=e517]: Lead - cell "None" [ref=e518]: - link "None" [ref=e519] [cursor=pointer]: - /url: /customers/339830927 - generic [ref=e522]: None - cell "25 May 2026" [ref=e523]: - link "25 May 2026" [ref=e524] [cursor=pointer]: - /url: /customers/339830927 - generic [ref=e525]: 25 May 2026 - row "1424-5788-77 Blaise Will Vienna South fidel.konopelski@muller.info +43 22177919128708419 Lead None 25 May 2026" [ref=e526]: - cell "1424-5788-77" [ref=e527]: - link "1424-5788-77" [ref=e528] [cursor=pointer]: - /url: /customers/1424578877 - generic [ref=e529]: 1424-5788-77 - cell "Blaise Will" [ref=e530]: - link "Blaise Will" [ref=e531] [cursor=pointer]: - /url: /customers/1424578877 - generic [ref=e532]: Blaise Will - cell "Vienna South" [ref=e533]: - link "Vienna South" [ref=e534] [cursor=pointer]: - /url: /customers/1424578877 - generic [ref=e538]: Vienna South - cell "fidel.konopelski@muller.info" [ref=e539]: - link "fidel.konopelski@muller.info" [ref=e540] [cursor=pointer]: - /url: /customers/1424578877 - generic [ref=e543]: fidel.konopelski@muller.info - cell "+43 22177919128708419" [ref=e544]: - link "+43 22177919128708419" [ref=e545] [cursor=pointer]: - /url: /customers/1424578877 - generic [ref=e548]: +43 22177919128708419 - cell "Lead" [ref=e549]: - link "Lead" [ref=e550] [cursor=pointer]: - /url: /customers/1424578877 - generic [ref=e553]: Lead - cell "None" [ref=e554]: - link "None" [ref=e555] [cursor=pointer]: - /url: /customers/1424578877 - generic [ref=e558]: None - cell "25 May 2026" [ref=e559]: - link "25 May 2026" [ref=e560] [cursor=pointer]: - /url: /customers/1424578877 - generic [ref=e561]: 25 May 2026 - row "3966-8131 Ceasar Howell Vienna North mozelle.davis@kohler.com +43 59356690225574937 Lead None 25 May 2026" [ref=e562]: - cell "3966-8131" [ref=e563]: - link "3966-8131" [ref=e564] [cursor=pointer]: - /url: /customers/39668131 - generic [ref=e565]: 3966-8131 - cell "Ceasar Howell" [ref=e566]: - link "Ceasar Howell" [ref=e567] [cursor=pointer]: - /url: /customers/39668131 - generic [ref=e568]: Ceasar Howell - cell "Vienna North" [ref=e569]: - link "Vienna North" [ref=e570] [cursor=pointer]: - /url: /customers/39668131 - generic [ref=e574]: Vienna North - cell "mozelle.davis@kohler.com" [ref=e575]: - link "mozelle.davis@kohler.com" [ref=e576] [cursor=pointer]: - /url: /customers/39668131 - generic [ref=e579]: mozelle.davis@kohler.com - cell "+43 59356690225574937" [ref=e580]: - link "+43 59356690225574937" [ref=e581] [cursor=pointer]: - /url: /customers/39668131 - generic [ref=e584]: +43 59356690225574937 - cell "Lead" [ref=e585]: - link "Lead" [ref=e586] [cursor=pointer]: - /url: /customers/39668131 - generic [ref=e589]: Lead - cell "None" [ref=e590]: - link "None" [ref=e591] [cursor=pointer]: - /url: /customers/39668131 - generic [ref=e594]: None - cell "25 May 2026" [ref=e595]: - link "25 May 2026" [ref=e596] [cursor=pointer]: - /url: /customers/39668131 - generic [ref=e597]: 25 May 2026 - row "1406-4175-55 Arielle Kohler Storeroom Innsbruck City 1030 idella61@raynor.org +43 15738910694185553 Lead None 25 May 2026" [ref=e598]: - cell "1406-4175-55" [ref=e599]: - link "1406-4175-55" [ref=e600] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e601]: 1406-4175-55 - cell "Arielle Kohler" [ref=e602]: - link "Arielle Kohler" [ref=e603] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e604]: Arielle Kohler - cell "Storeroom Innsbruck City 1030" [ref=e605]: - link "Storeroom Innsbruck City 1030" [ref=e606] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e608]: - generic [ref=e610]: Storeroom Innsbruck - generic [ref=e612]: City 1030 - cell "idella61@raynor.org" [ref=e613]: - link "idella61@raynor.org" [ref=e614] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e617]: idella61@raynor.org - cell "+43 15738910694185553" [ref=e618]: - link "+43 15738910694185553" [ref=e619] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e622]: +43 15738910694185553 - cell "Lead" [ref=e623]: - link "Lead" [ref=e624] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e627]: Lead - cell "None" [ref=e628]: - link "None" [ref=e629] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e632]: None - cell "25 May 2026" [ref=e633]: - link "25 May 2026" [ref=e634] [cursor=pointer]: - /url: /customers/1406417555 - generic [ref=e635]: 25 May 2026 - row "5119-4629 Wisoky Group Vienna South brakus.name@gmail.com +43 87930864946607966 Lead None 25 May 2026" [ref=e636]: - cell "5119-4629" [ref=e637]: - link "5119-4629" [ref=e638] [cursor=pointer]: - /url: /customers/51194629 - generic [ref=e639]: 5119-4629 - cell "Wisoky Group" [ref=e640]: - link "Wisoky Group" [ref=e641] [cursor=pointer]: - /url: /customers/51194629 - generic [ref=e642]: Wisoky Group - cell "Vienna South" [ref=e643]: - link "Vienna South" [ref=e644] [cursor=pointer]: - /url: /customers/51194629 - generic [ref=e648]: Vienna South - cell "brakus.name@gmail.com" [ref=e649]: - link "brakus.name@gmail.com" [ref=e650] [cursor=pointer]: - /url: /customers/51194629 - generic [ref=e653]: brakus.name@gmail.com - cell "+43 87930864946607966" [ref=e654]: - link "+43 87930864946607966" [ref=e655] [cursor=pointer]: - /url: /customers/51194629 - generic [ref=e658]: +43 87930864946607966 - cell "Lead" [ref=e659]: - link "Lead" [ref=e660] [cursor=pointer]: - /url: /customers/51194629 - generic [ref=e663]: Lead - cell "None" [ref=e664]: - link "None" [ref=e665] [cursor=pointer]: - /url: /customers/51194629 - generic [ref=e668]: None - cell "25 May 2026" [ref=e669]: - link "25 May 2026" [ref=e670] [cursor=pointer]: - /url: /customers/51194629 - generic [ref=e671]: 25 May 2026 - generic [ref=e674]: - generic [ref=e675]: - generic [ref=e676]: "Items per page:" - combobox [ref=e679]: - generic [ref=e681] [cursor=pointer]: - generic [ref=e683]: "10" - combobox "Items per page:": "10" - generic [ref=e685]: 󰍝 - generic [ref=e686]: 1-10 of 30 - generic [ref=e687]: - button [disabled]: - generic: - generic: 󰘀 - button [disabled]: - generic: - generic: 󰅁 - button [ref=e688] [cursor=pointer]: - generic [ref=e690]: 󰅂 - button [ref=e691] [cursor=pointer]: - generic [ref=e693]: 󰘁 - 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 { getCustomerCreateData } from '@/manager/modules/customer/customer-factories'; 2 | import { test } from '@/manager/modules/customer/customer-fixtures'; 3 | import { formatCustomerName } from '@/manager/modules/customer/customer-utils'; 4 | import { customerCreateHappyTestCases } from '@/manager/modules/customer/test-cases/customer-create-happy-test-cases'; 5 | import { 6 | expectDataTableChipsColumnToHaveText, 7 | expectDataTableTextColumnToHaveText, 8 | } from '@/manager/modules/ui/data-table/data-table-assertions'; 9 | import { customerTableColumnTestIds } from '@/manager/modules/ui/data-table/data/data-table-column-test-ids'; 10 | import { expectMultiLocatorToHaveText, expectSingleLocatorToHaveText } from '@/manager/shared/utils/expect-utils'; 11 | import { vatTypes } from '@/shared/data/seed-vat-types'; 12 | import { formatAddress, formatCurrency, formatDate, formatPhone } from '@/shared/utils/formatters'; 13 | import { expect } from '@/shared/utils/matchers'; 14 | 15 | for (const tc of customerCreateHappyTestCases) { 16 | test(tc.description, async ({ customerCreateDialog, trackCustomerForTeardown }) => { 17 | const data = getCustomerCreateData(tc.options); 18 | const customerFullName = formatCustomerName(data.firstName, data.lastName); 19 | const customerTitle = data.type === 'business' ? data.companyName : customerFullName; 20 | const customerPhone = formatPhone(data.phone); 21 | const customerAddress = formatAddress(data.street, data.postalCode, data.city, data.country.name); 22 | const customerStatus = 'lead'; 23 | const customerCreatedAt = formatDate(new Date()); 24 | const customerCurrency = data.locations[0].currency; 25 | const customerLocationNames = data.locations.map((l) => l.name); 26 | const zeroAmount = formatCurrency(0, customerCurrency); 27 | 28 | await customerCreateDialog.goto(); 29 | 30 | const detailsPage = await test.step('create customer', () => customerCreateDialog.create(data)); 31 | 32 | trackCustomerForTeardown(detailsPage.getCustomerId()); 33 | 34 | await test.step('verify new customer on details page', async () => { 35 | await expectSingleLocatorToHaveText(detailsPage.title, customerTitle); 36 | await expectSingleLocatorToHaveText(detailsPage.status, customerStatus); 37 | await expectMultiLocatorToHaveText(detailsPage.generalCard.locations, customerLocationNames); 38 | await expectSingleLocatorToHaveText(detailsPage.generalCard.type, data.type); 39 | 40 | if (data.type === 'business') { 41 | await expectSingleLocatorToHaveText(detailsPage.generalCard.companyName, data.companyName); 42 | await expectSingleLocatorToHaveText(detailsPage.generalCard.vatType, data.vatType?.name); 43 | await expectSingleLocatorToHaveText(detailsPage.generalCard.vatNumber, data.vatNumber); 44 | } else { 45 | await expect(detailsPage.generalCard.companyName).toBeHidden(); 46 | await expect(detailsPage.generalCard.vatType).toBeHidden(); 47 | await expect(detailsPage.generalCard.vatNumber).toBeHidden(); 48 | } 49 | 50 | await expectSingleLocatorToHaveText(detailsPage.generalCard.name, customerFullName); 51 | await expectSingleLocatorToHaveText(detailsPage.generalCard.email, data.email); 52 | await expectSingleLocatorToHaveText(detailsPage.generalCard.phoneNumber, customerPhone); 53 | await expectSingleLocatorToHaveText(detailsPage.generalCard.language, data.language.id); 54 | await expectSingleLocatorToHaveText(detailsPage.generalCard.address, customerAddress); 55 | await expectSingleLocatorToHaveText(detailsPage.generalCard.note, data.note); 56 | 57 | await expect(detailsPage.detailsCard.customerId).not.toBeEmpty(); 58 | await expectSingleLocatorToHaveText(detailsPage.detailsCard.createdAt, customerCreatedAt); 59 | await expectSingleLocatorToHaveText(detailsPage.detailsCard.totalSpent, zeroAmount); 60 | await expectSingleLocatorToHaveText(detailsPage.detailsCard.totalPastDueAmount, zeroAmount); 61 | await expect(detailsPage.detailsCard.paymentMethods).toHaveCount(0); 62 | await expectSingleLocatorToHaveText( 63 | detailsPage.detailsCard.accountsReceivableNumber, 64 | data.accountsReceivableNumber 65 | ); 66 | 67 | await expect(detailsPage.bookingsCard.main).toBeHidden(); 68 | await expect(detailsPage.invoicesCard.main).toBeHidden(); 69 | }); 70 | 71 | await test.step('verify new customer on list page', async () => { 72 | const listPage = await detailsPage.returnToCustomerListPage(); 73 | 74 | await listPage.searchTextField.fill(data.email); 75 | > 76 | await expect(listPage.dataTable.getRows()).toHaveCount(1); | ^ Error: expect(locator).toHaveCount(expected) failed 77 | await expect(listPage.dataTable.getRowColumn(0, customerTableColumnTestIds.id)).not.toBeEmpty(); 78 | await expectDataTableTextColumnToHaveText(listPage.dataTable, customerTableColumnTestIds.name, customerTitle); 79 | await expectDataTableChipsColumnToHaveText( 80 | listPage.dataTable, 81 | customerTableColumnTestIds.locations, 82 | customerLocationNames 83 | ); 84 | await expectDataTableTextColumnToHaveText(listPage.dataTable, customerTableColumnTestIds.email, data.email); 85 | await expectDataTableTextColumnToHaveText( 86 | listPage.dataTable, 87 | customerTableColumnTestIds.phoneNumber, 88 | customerPhone 89 | ); 90 | await expectDataTableChipsColumnToHaveText(listPage.dataTable, customerTableColumnTestIds.status, customerStatus); 91 | await expectDataTableChipsColumnToHaveText( 92 | listPage.dataTable, 93 | customerTableColumnTestIds.hasPastDueInvoices, 94 | 'none' 95 | ); 96 | await expectDataTableTextColumnToHaveText( 97 | listPage.dataTable, 98 | customerTableColumnTestIds.createdAt, 99 | customerCreatedAt 100 | ); 101 | }); 102 | }); 103 | } 104 | 105 | test('rejects a private customer without all required fields', async ({ customerCreateDialog }) => { 106 | const data = getCustomerCreateData({ type: 'private', firstName: '', lastName: '' }); 107 | 108 | await customerCreateDialog.goto(); 109 | 110 | await test.step('submit invalid customer create form', async () => { 111 | await customerCreateDialog.fill(data); 112 | await customerCreateDialog.submit(); 113 | }); 114 | 115 | await test.step('verify errors on form', async () => { 116 | await expect(customerCreateDialog.errors).toHaveCountGreaterThan(0); 117 | }); 118 | }); 119 | 120 | test('rejects a business customer without all required fields', async ({ customerCreateDialog }) => { 121 | const data = getCustomerCreateData({ type: 'business', companyName: '' }); 122 | 123 | await customerCreateDialog.goto(); 124 | 125 | await test.step('submit invalid customer create form', async () => { 126 | await customerCreateDialog.fill(data); 127 | await customerCreateDialog.submit(); 128 | }); 129 | 130 | await test.step('verify errors on form', async () => { 131 | await expect(customerCreateDialog.errors).toHaveCountGreaterThan(0); 132 | }); 133 | }); 134 | 135 | test('rejects a customer with a duplicate email', async ({ createCustomer, customerCreateDialog }) => { 136 | const existing = await createCustomer(getCustomerCreateData()); 137 | const data = getCustomerCreateData({ email: existing.email }); 138 | 139 | await customerCreateDialog.goto(); 140 | 141 | await test.step('submit customer create form with duplicate email', async () => { 142 | await customerCreateDialog.fill(data); 143 | await customerCreateDialog.submit(); 144 | }); 145 | 146 | await test.step('verify errors on form', async () => { 147 | await expect(customerCreateDialog.errors).toHaveCountGreaterThan(0); 148 | }); 149 | }); 150 | 151 | test('rejects a customer with a duplicate phone number', async ({ createCustomer, customerCreateDialog }) => { 152 | const existing = await createCustomer(getCustomerCreateData()); 153 | const data = getCustomerCreateData({ phone: existing.phone, country: existing.country }); 154 | 155 | await customerCreateDialog.goto(); 156 | 157 | await test.step('submit customer create form with duplicate phone number', async () => { 158 | await customerCreateDialog.fill(data); 159 | await customerCreateDialog.submit(); 160 | }); 161 | 162 | await test.step('verify errors on form', async () => { 163 | await expect(customerCreateDialog.errors).toHaveCountGreaterThan(0); 164 | }); 165 | }); 166 | 167 | test('rejects a customer with a vat number that does not match the vat type', async ({ customerCreateDialog }) => { 168 | const data = getCustomerCreateData({ 169 | type: 'business', 170 | vatType: vatTypes.eu_vat, 171 | vatNumber: 'INVALID-VAT-1234', 172 | }); 173 | 174 | await customerCreateDialog.goto(); 175 | 176 | await test.step('submit customer create form with mismatched vat type and number', async () => { ```