# 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 an accounts receivable number - 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: 6 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 6 elements - unexpected value "6" ``` # 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]: Annetta96@yahoo.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 "1628-3092-14 Moen, Ankunding and Gibson Vienna South vanessa_harber@hotmail.com +43 968 8957209 Lead None 26 May 2026" [ref=e310]: - cell "1628-3092-14" [ref=e311]: - link "1628-3092-14" [ref=e312] [cursor=pointer]: - /url: /customers/1628309214 - generic [ref=e313]: 1628-3092-14 - cell "Moen, Ankunding and Gibson" [ref=e314]: - link "Moen, Ankunding and Gibson" [ref=e315] [cursor=pointer]: - /url: /customers/1628309214 - generic [ref=e316]: Moen, Ankunding and Gibson - cell "Vienna South" [ref=e317]: - link "Vienna South" [ref=e318] [cursor=pointer]: - /url: /customers/1628309214 - generic [ref=e322]: Vienna South - cell "vanessa_harber@hotmail.com" [ref=e323]: - link "vanessa_harber@hotmail.com" [ref=e324] [cursor=pointer]: - /url: /customers/1628309214 - generic [ref=e327]: vanessa_harber@hotmail.com - cell "+43 968 8957209" [ref=e328]: - link "+43 968 8957209" [ref=e329] [cursor=pointer]: - /url: /customers/1628309214 - generic [ref=e332]: +43 968 8957209 - cell "Lead" [ref=e333]: - link "Lead" [ref=e334] [cursor=pointer]: - /url: /customers/1628309214 - generic [ref=e337]: Lead - cell "None" [ref=e338]: - link "None" [ref=e339] [cursor=pointer]: - /url: /customers/1628309214 - generic [ref=e342]: None - cell "26 May 2026" [ref=e343]: - link "26 May 2026" [ref=e344] [cursor=pointer]: - /url: /customers/1628309214 - generic [ref=e345]: 26 May 2026 - row "2043-7707-00 Essie Kuphal Vienna South annetta96@yahoo.com +43 4111 043485 Lead None 26 May 2026" [ref=e346]: - cell "2043-7707-00" [ref=e347]: - link "2043-7707-00" [ref=e348] [cursor=pointer]: - /url: /customers/2043770700 - generic [ref=e349]: 2043-7707-00 - cell "Essie Kuphal" [ref=e350]: - link "Essie Kuphal" [ref=e351] [cursor=pointer]: - /url: /customers/2043770700 - generic [ref=e352]: Essie Kuphal - cell "Vienna South" [ref=e353]: - link "Vienna South" [ref=e354] [cursor=pointer]: - /url: /customers/2043770700 - generic [ref=e358]: Vienna South - cell "annetta96@yahoo.com" [ref=e359]: - link "annetta96@yahoo.com" [ref=e360] [cursor=pointer]: - /url: /customers/2043770700 - generic [ref=e363]: annetta96@yahoo.com - cell "+43 4111 043485" [ref=e364]: - link "+43 4111 043485" [ref=e365] [cursor=pointer]: - /url: /customers/2043770700 - generic [ref=e368]: +43 4111 043485 - cell "Lead" [ref=e369]: - link "Lead" [ref=e370] [cursor=pointer]: - /url: /customers/2043770700 - generic [ref=e373]: Lead - cell "None" [ref=e374]: - link "None" [ref=e375] [cursor=pointer]: - /url: /customers/2043770700 - generic [ref=e378]: None - cell "26 May 2026" [ref=e379]: - link "26 May 2026" [ref=e380] [cursor=pointer]: - /url: /customers/2043770700 - generic [ref=e381]: 26 May 2026 - row "5764-8143-9 Kaitlyn Ruecker Vienna South ymarvin@hessel.com +43 20549629120139716 Active None 26 May 2026" [ref=e382]: - cell "5764-8143-9" [ref=e383]: - link "5764-8143-9" [ref=e384] [cursor=pointer]: - /url: /customers/576481439 - generic [ref=e385]: 5764-8143-9 - cell "Kaitlyn Ruecker" [ref=e386]: - link "Kaitlyn Ruecker" [ref=e387] [cursor=pointer]: - /url: /customers/576481439 - generic [ref=e388]: Kaitlyn Ruecker - cell "Vienna South" [ref=e389]: - link "Vienna South" [ref=e390] [cursor=pointer]: - /url: /customers/576481439 - generic [ref=e394]: Vienna South - cell "ymarvin@hessel.com" [ref=e395]: - link "ymarvin@hessel.com" [ref=e396] [cursor=pointer]: - /url: /customers/576481439 - generic [ref=e399]: ymarvin@hessel.com - cell "+43 20549629120139716" [ref=e400]: - link "+43 20549629120139716" [ref=e401] [cursor=pointer]: - /url: /customers/576481439 - generic [ref=e404]: +43 20549629120139716 - cell "Active" [ref=e405]: - link "Active" [ref=e406] [cursor=pointer]: - /url: /customers/576481439 - generic [ref=e409]: Active - cell "None" [ref=e410]: - link "None" [ref=e411] [cursor=pointer]: - /url: /customers/576481439 - generic [ref=e414]: None - cell "26 May 2026" [ref=e415]: - link "26 May 2026" [ref=e416] [cursor=pointer]: - /url: /customers/576481439 - generic [ref=e417]: 26 May 2026 - row "1715-1629-04 Hane Ltd Vienna South greenfelder.carlie@yahoo.com +43 1852088396978762 Former None 26 May 2026" [ref=e418]: - cell "1715-1629-04" [ref=e419]: - link "1715-1629-04" [ref=e420] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e421]: 1715-1629-04 - cell "Hane Ltd" [ref=e422]: - link "Hane Ltd" [ref=e423] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e424]: Hane Ltd - cell "Vienna South" [ref=e425]: - link "Vienna South" [ref=e426] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e430]: Vienna South - cell "greenfelder.carlie@yahoo.com" [ref=e431]: - link "greenfelder.carlie@yahoo.com" [ref=e432] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e435]: greenfelder.carlie@yahoo.com - cell "+43 1852088396978762" [ref=e436]: - link "+43 1852088396978762" [ref=e437] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e440]: +43 1852088396978762 - cell "Former" [ref=e441]: - link "Former" [ref=e442] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e445]: Former - cell "None" [ref=e446]: - link "None" [ref=e447] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e450]: None - cell "26 May 2026" [ref=e451]: - link "26 May 2026" [ref=e452] [cursor=pointer]: - /url: /customers/1715162904 - generic [ref=e453]: 26 May 2026 - row "9020-5377-3 Hoeger-Lynch Vienna North ericka18@yahoo.com +43 40650968988580147 Former None 26 May 2026" [ref=e454]: - cell "9020-5377-3" [ref=e455]: - link "9020-5377-3" [ref=e456] [cursor=pointer]: - /url: /customers/902053773 - generic [ref=e457]: 9020-5377-3 - cell "Hoeger-Lynch" [ref=e458]: - link "Hoeger-Lynch" [ref=e459] [cursor=pointer]: - /url: /customers/902053773 - generic [ref=e460]: Hoeger-Lynch - cell "Vienna North" [ref=e461]: - link "Vienna North" [ref=e462] [cursor=pointer]: - /url: /customers/902053773 - generic [ref=e466]: Vienna North - cell "ericka18@yahoo.com" [ref=e467]: - link "ericka18@yahoo.com" [ref=e468] [cursor=pointer]: - /url: /customers/902053773 - generic [ref=e471]: ericka18@yahoo.com - cell "+43 40650968988580147" [ref=e472]: - link "+43 40650968988580147" [ref=e473] [cursor=pointer]: - /url: /customers/902053773 - generic [ref=e476]: +43 40650968988580147 - cell "Former" [ref=e477]: - link "Former" [ref=e478] [cursor=pointer]: - /url: /customers/902053773 - generic [ref=e481]: Former - cell "None" [ref=e482]: - link "None" [ref=e483] [cursor=pointer]: - /url: /customers/902053773 - generic [ref=e486]: None - cell "26 May 2026" [ref=e487]: - link "26 May 2026" [ref=e488] [cursor=pointer]: - /url: /customers/902053773 - generic [ref=e489]: 26 May 2026 - row "1970-4832-63 VonRueden-Auer Storeroom Innsbruck City 1030 kaylah27@hotmail.com +43 9296842549458937 Former None 26 May 2026" [ref=e490]: - cell "1970-4832-63" [ref=e491]: - link "1970-4832-63" [ref=e492] [cursor=pointer]: - /url: /customers/1970483263 - generic [ref=e493]: 1970-4832-63 - cell "VonRueden-Auer" [ref=e494]: - link "VonRueden-Auer" [ref=e495] [cursor=pointer]: - /url: /customers/1970483263 - generic [ref=e496]: VonRueden-Auer - cell "Storeroom Innsbruck City 1030" [ref=e497]: - link "Storeroom Innsbruck City 1030" [ref=e498] [cursor=pointer]: - /url: /customers/1970483263 - generic [ref=e500]: - generic [ref=e502]: Storeroom Innsbruck - generic [ref=e504]: City 1030 - cell "kaylah27@hotmail.com" [ref=e505]: - link "kaylah27@hotmail.com" [ref=e506] [cursor=pointer]: - /url: /customers/1970483263 - generic [ref=e509]: kaylah27@hotmail.com - cell "+43 9296842549458937" [ref=e510]: - link "+43 9296842549458937" [ref=e511] [cursor=pointer]: - /url: /customers/1970483263 - generic [ref=e514]: +43 9296842549458937 - cell "Former" [ref=e515]: - link "Former" [ref=e516] [cursor=pointer]: - /url: /customers/1970483263 - generic [ref=e519]: Former - cell "None" [ref=e520]: - link "None" [ref=e521] [cursor=pointer]: - /url: /customers/1970483263 - generic [ref=e524]: None - cell "26 May 2026" [ref=e525]: - link "26 May 2026" [ref=e526] [cursor=pointer]: - /url: /customers/1970483263 - generic [ref=e527]: 26 May 2026 - generic [ref=e530]: - generic [ref=e531]: - generic [ref=e532]: "Items per page:" - combobox [ref=e535]: - generic [ref=e537] [cursor=pointer]: - generic [ref=e539]: "10" - combobox "Items per page:": "10" - generic [ref=e541]: 󰍝 - generic [ref=e542]: 1-6 of 6 - generic [ref=e543]: - button [disabled]: - generic: - generic: 󰘀 - button [disabled]: - generic: - generic: 󰅁 - button [disabled]: - generic: - generic: 󰅂 - button [disabled]: - generic: - generic: 󰘁 - 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 () => { ```