diff --git a/azure-pipelines-automated-testing.yml b/azure-pipelines-automated-testing.yml index a44bb192d..caa1b5c8a 100644 --- a/azure-pipelines-automated-testing.yml +++ b/azure-pipelines-automated-testing.yml @@ -33,6 +33,7 @@ stages: # TODO: Change to ADO Playwright template - template: temp/playwright-test.yml parameters: + applicationType: 'vue' totalShards: ${{ variables.totalShards }} targetUrl: $(BASE_URL) dockerFileName: 'Dockerfile.playwright' diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c433fdb17..0a8122121 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -51,19 +51,11 @@ stages: displayName: Run Prettier check - stage: TestPr - displayName: Run Unit Tests For PullRequest - jobs: - - template: templates/digital/vue-jest-run-unit-tests.yml@AzureDevOps - parameters: - nodeContainer: node - npmLocation: $(Build.SourcesDirectory) - testResultsFile: junit.xml - summaryFileLocation: $(Build.SourcesDirectory)/coverage/cobertura-coverage.xml - - stage: TestPrPlaywright - displayName: Run Playwright Tests For PullRequest + displayName: Run Tests For PullRequest jobs: - template: temp/playwright-test.yml parameters: + applicationType: 'vue' totalShards: 2 targetUrl: $(BASE_URL) dockerFileName: 'Dockerfile.playwright' @@ -75,6 +67,12 @@ stages: secrets: CCIS_API_AUTH: $(CCIS_API_AUTH) JIRA_API_KEY: $(JIRA_API_KEY) + - template: templates/digital/vue-jest-run-unit-tests.yml@AzureDevOps + parameters: + nodeContainer: node + npmLocation: $(Build.SourcesDirectory) + testResultsFile: junit.xml + summaryFileLocation: $(Build.SourcesDirectory)/coverage/cobertura-coverage.xml - ${{ else }}: # Dev Build/Deploy - stage: Dev diff --git a/playwright-tests/.env b/playwright-tests/.env index 5f37c7ddf..3429bc864 100644 --- a/playwright-tests/.env +++ b/playwright-tests/.env @@ -2,7 +2,7 @@ # Environment configuration # Environment type -NODE_ENV="qa" +PLAYWRIGHT_ENV="qa" # Skip content site SKIP_CONTENT_SITE=false diff --git a/playwright-tests/.env.dev b/playwright-tests/.env.dev index 00c66dc6c..1dad92994 100644 --- a/playwright-tests/.env.dev +++ b/playwright-tests/.env.dev @@ -2,7 +2,7 @@ # Environment configuration # Environment type -NODE_ENV="qa" +PLAYWRIGHT_ENV="qa" # Skip content site SKIP_CONTENT_SITE=false diff --git a/playwright-tests/.env.example b/playwright-tests/.env.example index 5f37c7ddf..3429bc864 100644 --- a/playwright-tests/.env.example +++ b/playwright-tests/.env.example @@ -2,7 +2,7 @@ # Environment configuration # Environment type -NODE_ENV="qa" +PLAYWRIGHT_ENV="qa" # Skip content site SKIP_CONTENT_SITE=false diff --git a/playwright-tests/README.md b/playwright-tests/README.md index b9124727e..d0ca74081 100644 --- a/playwright-tests/README.md +++ b/playwright-tests/README.md @@ -260,7 +260,6 @@ ADMIN_SERVICE_API_URL=
SAUCE_USERNAME=
SAUCE_ACCESS_KEY=
- ## CI/CD Integration The project uses Azure Pipelines for continuous integration with configurations defined in azure-pipelines.yml. diff --git a/playwright-tests/framework/localTypes/Enums.ts b/playwright-tests/framework/localTypes/Enums.ts index 0ab2796b5..978f92bb2 100644 --- a/playwright-tests/framework/localTypes/Enums.ts +++ b/playwright-tests/framework/localTypes/Enums.ts @@ -5,23 +5,23 @@ export enum PaymentMethod { } export enum ProgressBarPercentages { - VehicleSelectionPage = '4%', - VehicleDamagePage = '16%', - EstimatePage = '28%', - ServiceZipPage = '32%', - VehicleLookupAddressPage = '32%', - VehicleLookupLicensePage = '32%', - VinLookupPage = '32%', - PartQuestionsPage = '40%', - MoldingQuestionsPage = '40%', - CapabilityQuestionsPage = '40%', - VehiclePartsPage = '40%', - ServicePackagePage = '48%', + VehicleSelectionPage = '8%', + VehicleDamagePage = '11%', + EstimatePage = '18%', + ServiceZipPage = '22%', + VehicleLookupAddressPage = '22%', + VehicleLookupLicensePage = '22%', + VinLookupPage = '22%', + PartQuestionsPage = '30%', + MoldingQuestionsPage = '30%', + CapabilityQuestionsPage = '30%', + VehiclePartsPage = '30%', + ServicePackagePage = '62%', InsuranceCompanyPage = '52%', - ServiceLocationPage = '60%', - SchedulePage = '64%', + ServiceLocationPage = '76%', + SchedulePage = '76%', MobileDetailsPage = '76%', ContactDetailsPage = '84%', - PaymentMethodPage = '92%', + PaymentMethodPage = '97%', OrderConfirmationPage = '100%' } \ No newline at end of file diff --git a/playwright-tests/package-lock.json b/playwright-tests/package-lock.json index 72efb6878..588266c72 100644 --- a/playwright-tests/package-lock.json +++ b/playwright-tests/package-lock.json @@ -22,7 +22,7 @@ "eslint": "^9.28.0", "luxon": "^3.6.1", "ortoni-report": "^3.0.2", - "playwright-jira-reporter": "^1.0.4", + "playwright-jira-reporter": "^1.0.9", "safelite-playwright-core": "^1.0.26", "typescript": "^5.8.3" } @@ -3006,9 +3006,9 @@ } }, "node_modules/playwright-jira-reporter": { - "version": "1.0.4", - "resolved": "https://pkgs.dev.azure.com/Safelite/Digital/_packaging/DigitalQA/npm/registry/playwright-jira-reporter/-/playwright-jira-reporter-1.0.4.tgz", - "integrity": "sha1-uwnLFtj3Pnq5XXMFotlfHItucAw=", + "version": "1.0.9", + "resolved": "https://pkgs.dev.azure.com/Safelite/Digital/_packaging/DigitalQA/npm/registry/playwright-jira-reporter/-/playwright-jira-reporter-1.0.9.tgz", + "integrity": "sha1-o6+EHQlQ/jY4BtWKA6gSJ5mwK6A=", "dev": true, "license": "ISC", "dependencies": { diff --git a/playwright-tests/package.json b/playwright-tests/package.json index 2c9c47d00..325c44b2d 100644 --- a/playwright-tests/package.json +++ b/playwright-tests/package.json @@ -30,7 +30,7 @@ "eslint": "^9.28.0", "luxon": "^3.6.1", "ortoni-report": "^3.0.2", - "playwright-jira-reporter": "^1.0.4", + "playwright-jira-reporter": "^1.0.9", "safelite-playwright-core": "^1.0.26", "typescript": "^5.8.3" }, diff --git a/playwright-tests/pages/AfterpayPage.ts b/playwright-tests/pages/AfterpayPage.ts index 7f54fe336..75f0ca352 100644 --- a/playwright-tests/pages/AfterpayPage.ts +++ b/playwright-tests/pages/AfterpayPage.ts @@ -10,6 +10,8 @@ export class AfterpayPage extends BasePage { readonly passwordTextBox: Locator; // Card details + readonly paymentOptionsButton: Locator; + readonly continueButtonAfterpay: Locator; readonly cardholderNameTextBox: Locator; readonly cardNumberTextBox: Locator; readonly expirationDateTextBox: Locator; @@ -23,6 +25,8 @@ export class AfterpayPage extends BasePage { this.passwordTextBox = page.getByTestId('login-password-input'); this.submitButton = page.getByRole('button', { name: 'Continue' }); + this.paymentOptionsButton = page.locator('div:has(>input[id*=\'payment-types\']) label').nth(1); + this.continueButtonAfterpay = page.getByRole('button').filter({hasText: 'Continue'}); this.cardholderNameTextBox = page.getByTestId('payment-method-cardHolderName-input'); this.cardNumberTextBox = page.getByTestId('payment-method-cardNumber-input'); this.expirationDateTextBox = page.getByTestId('payment-method-cardExpiry-input'); @@ -46,7 +50,12 @@ export class AfterpayPage extends BasePage { async executeAfterpayPayment(paymentDetails: IPaymentDetails) { await this.login(paymentDetails.password!); - + await this.page.locator('div[data-testid=\'loading-icon-svg\']').filter({ visible: true}).first().waitFor({ state: 'hidden' }); + if (await this.paymentOptionsButton.isVisible()) + { + await this.paymentOptionsButton.click(); + await this.continueButtonAfterpay.click(); + } await this.confirmButton.click(); } diff --git a/playwright-tests/pages/BasePage.ts b/playwright-tests/pages/BasePage.ts index 30df48447..7c79dfed7 100644 --- a/playwright-tests/pages/BasePage.ts +++ b/playwright-tests/pages/BasePage.ts @@ -25,7 +25,7 @@ export class BasePage { this.pageSpinner = page.getByRole('status'); this.buttonLoadSpin = page.getByRole('alert'); this.hamburgerMenu = this.page.getByRole('button', { name: 'Hamburger Menu (modal window)' }); - this.progressBar = this.page.locator('.progress-bar-inner'); + this.progressBar = this.page.locator('.progress-bar-outer.progress-bar-inner'); } async nextPage() { @@ -104,7 +104,7 @@ export class BasePage { async mockScheduleResponseForEarlyBird(customerDetails: ICustomerDetails) { - const apiUrl = `https://digitalapi.${process.env['NODE_ENV']!.replace('sys', 'test').toLowerCase()}.safelite.io/schedule/api/v1/schedule/mobile-time-slots`; + const apiUrl = `https://digitalapi.${process.env['PLAYWRIGHT_ENV']!.replace('sys', 'test').toLowerCase()}.safelite.io/schedule/api/v1/schedule/mobile-time-slots`; await this.page.route(apiUrl, async (route) => { const currentDate = new Date().toISOString().split('T')[0]; // e.g., "2025-07-23" if(route.request().postDataJSON().startDate === currentDate) { diff --git a/playwright-tests/pages/PaymentMethodPage.ts b/playwright-tests/pages/PaymentMethodPage.ts index 2ba68dcc3..7bb4a6fcc 100644 --- a/playwright-tests/pages/PaymentMethodPage.ts +++ b/playwright-tests/pages/PaymentMethodPage.ts @@ -56,7 +56,7 @@ export class PaymentMethodPage extends BasePage { this.payNowButton = this.page.locator('[buttonlabel="Pay now"]'); this.payInFourButton = this.page.locator('[buttonlabel="Pay in 4 installments"]'); this.submitButton = this.page.locator('[data-test-id="nav-bar-main-button"]'); - this.recalibrationCheckbox = this.page.getByLabel('I understand after windshield'); + this.recalibrationCheckbox = this.page.locator('label:has(>input[name=\'recalAckOptIn\'])'); // this.creditCardButton = page.locator('div').filter({ hasText: /^Credit or Debit$/ }).nth(1); this.paymentPage = new PaymentPage(page); this.paypalPage = new PaypalPage(page); @@ -101,7 +101,7 @@ export class PaymentMethodPage extends BasePage { let expectedAppointmentDetails = new Map(); expectedAppointmentDetails = await this.getExpectedVehicleDetails(testData, expectedAppointmentDetails); expectedAppointmentDetails = await this.getExpectedVehicleDamage(testData, expectedAppointmentDetails); - expectedAppointmentDetails = await this.expectedServicePackageDetails(testData, expectedAppointmentDetails); + // expectedAppointmentDetails = await this.expectedServicePackageDetails(testData, expectedAppointmentDetails); expectedAppointmentDetails = await this.getExpectedServiceLocation(testData, expectedAppointmentDetails); expectedAppointmentDetails = await this.getExpectedAppointmentDate(testData, expectedAppointmentDetails); expectedAppointmentDetails = await this.getExpectedCustomerDetails(testData, expectedAppointmentDetails); @@ -403,7 +403,7 @@ l const { appointmentDetails } = testData; let serviceLocationTitle = appointmentDetails?.serviceLocation == ServiceLocation.Mobile ? "We're coming to you" - : "You're going to a Safelite shop"; + : "You're coming to us"; let serviceLocation: string[] = []; serviceLocation.push( @@ -443,7 +443,7 @@ l customerDetails?.apptDuration ? "Estimated appointment length: " + customerDetails.apptDuration : "" ); - expectedServicePackageDetails["Appointment date + time"] = appointmentDateText; + expectedServicePackageDetails["Appointment Date + Time"] = appointmentDateText; return expectedServicePackageDetails; } @@ -452,7 +452,7 @@ l let customerDetailsText: string[] = []; customerDetailsText.push( - customerDetails?.firstName.toUpperCase() + " " + customerDetails?.lastName.toUpperCase(), + // customerDetails?.firstName.toUpperCase() + " " + customerDetails?.lastName.toUpperCase(), customerDetails?.email ? customerDetails?.email.toUpperCase() : "", customerDetails?.phoneNumber ? customerDetails?.phoneNumber : "", "Opted out of text message updates" diff --git a/playwright-tests/pages/PaypalPage.ts b/playwright-tests/pages/PaypalPage.ts index 07e2cd1e6..ff2bbd548 100644 --- a/playwright-tests/pages/PaypalPage.ts +++ b/playwright-tests/pages/PaypalPage.ts @@ -24,8 +24,8 @@ export class PaypalPage extends BasePage { this.passwordTextBox = page.getByPlaceholder('Password'); this.paypalLoginButton = page.getByRole('button', { name: 'Log In', exact: true }); this.completePurchaseButton = page.getByTestId('submit-button-initial') - this.payWithRadioButton = page.locator('.py-4').first(); - this.payButton = page.getByRole('button', { name: 'Pay $' }); + this.payWithRadioButton = page.getByRole('button').filter({ hasText: 'Pay with' }); + this.payButton = page.locator('#one-time-cta'); } async completePaypalPurchase(paymentDetails: IPaymentDetails){ @@ -45,7 +45,8 @@ export class PaypalPage extends BasePage { await this.passwordTextBox.fill(paymentDetails.password!); await this.paypalLoginButton.click(); await this.payWithRadioButton.click(); - await this.payButton.click(); + await this.page.waitForTimeout(2000); // wait for 2 seconds to ensure the Pay button is clickable + await this.payButton.dblclick(); } } } diff --git a/playwright-tests/pages/SchedulePage.ts b/playwright-tests/pages/SchedulePage.ts index 368993d5f..a8f01b03a 100644 --- a/playwright-tests/pages/SchedulePage.ts +++ b/playwright-tests/pages/SchedulePage.ts @@ -17,8 +17,11 @@ export class SchedulePage extends BasePage { readonly militaryWarningMessage: Locator; readonly changeZipButton: Locator; readonly updateZipTextBox: Locator; + readonly safeliteShopsList: Locator; + readonly searchButton: Locator; + readonly storeAddressText: Locator; readonly saveLocationButton: Locator; - readonly changeShopLocationLink: Locator; + readonly moreLocationsButton: Locator; readonly selectAShopOptions: Locator; readonly yourSafeliteShop: Locator; @@ -44,12 +47,15 @@ export class SchedulePage extends BasePage { this.militaryWarningMessage = this.page.locator('[class*="widget-name-AlertMilitaryBaseZipWidget"]'); this.changeZipButton = this.page.locator('a:has(span.sr-only:has-text("edit zip code"))'); this.updateZipTextBox = this.page.locator('#serviceZipCode').filter({ visible: true }); + this.safeliteShopsList = this.page.locator('fieldset:has(#chooseShop) label'); + this.searchButton = this.page.locator('.search-icon-button'); + this.storeAddressText = this.page.locator('#shop-location label:not(:first-child)'); this.saveLocationButton = this.page.getByText('Save location', { exact: true }); - this.changeShopLocationLink = this.page.locator(".shop-question a").filter({ hasText: "Change shop location " }); + this.moreLocationsButton = this.page.locator(".shop-question a").filter({ hasText: "More locations " }); this.selectAShopOptions = this.page.locator('[class="shop-question"]'); this.yourSafeliteShop = this.page.locator("fieldset:has(#chooseShop) label"); - this.allDayDropOffButton = this.page.locator("label[buttonlabel='Drop off all day']"); + this.allDayDropOffButton = this.page.locator("label[buttonlabel*='Drop']"); this.pickATimeButton = this.page.locator("label[buttonlabel='Pick a time']"); this.firstAvailableDate = this.page.locator('.selectable-day').filter({ visible: true}).locator('nth=0'); this.firstAvailableTime = this.page.locator('label').filter({ hasText: /AM|PM/ }).locator('div').locator('nth=0'); @@ -58,7 +64,7 @@ export class SchedulePage extends BasePage { this.dateText = this.page.locator('label.modal-title'); this.viewMoreDatesLink = this.page.getByText(/View more dates/).first(); this.appointmentDuration = this.page.locator('.duration-text-block'); - this.timeSlots = this.page.locator('fieldset[aria-labelledby=\'chooseTimeSlot\'] label'); + this.timeSlots = this.page.locator('fieldset:has(>legend#chooseTimeSlot) label').filter({ visible: true}); } async selectLocation(testData: Partial) { @@ -76,25 +82,36 @@ export class SchedulePage extends BasePage { } async scheduleInShop(appointmentDetails?: IAppointmentDetails) { - await this.inShopButton.click(); + + await this.inShopButton.isVisible() ? await this.inShopButton.click() : null; if (appointmentDetails && appointmentDetails.shopAddress) { const zipCodeMatch = appointmentDetails.shopAddress.match(/\b\d{5}$/); if (zipCodeMatch) { const zipCode = zipCodeMatch[0]; // Enter the ZIP code into the updateZipTextBox - await this.changeShopLocationLink.click(); + await this.moreLocationsButton.click(); await this.page.waitForTimeout(500); await this.updateZipTextBox.fill(zipCode); + await this.searchButton.click().then( async() => await this.page.locator('loader-wrapper').waitFor({state: 'hidden'})); + await this.safeliteShopsList.first().click(); // Click the save location button await this.saveLocationButton.click(); } - await this.inShopButton.click(); + // await this.inShopButton.click(); // await this.selectAShopOptions.locator(`[buttonbodycopy="${appointmentDetails.shopAddress}"]`).scrollIntoViewIfNeeded().then(() => this.selectAShopOptions.locator(`[buttonbodycopy="${appointmentDetails.shopAddress}"]`).click()); } if (appointmentDetails && (appointmentDetails.shopAddress === "" || appointmentDetails.shopAddress === undefined )) { - appointmentDetails.shopAddress = await this.yourSafeliteShop.getAttribute("buttonbodycopy") || ""; + appointmentDetails.shopAddress = ''; + await this.storeAddressText.first().waitFor({ state: 'visible' }); + const elements = await this.storeAddressText.all(); + + for (let element of elements) { + let addressLine = await element.textContent() || ""; + appointmentDetails.shopAddress += addressLine + ", " + }; + appointmentDetails.shopAddress = appointmentDetails.shopAddress?.slice(0, -2); } } @@ -146,6 +163,7 @@ export class SchedulePage extends BasePage { const inshopAvailableDates = this.page.locator('.selectable-day').filter({ visible: true}).all(); for (const inshopAvailableDate of await inshopAvailableDates) { await inshopAvailableDate.click(); + await this.page.waitForTimeout(500); if (await this.allDayDropOffButton.isVisible()) { customerDetails!.apptDate = `${await inshopAvailableDate.getAttribute("id")}`; break; @@ -186,13 +204,13 @@ export class SchedulePage extends BasePage { } // appointmentmentDetails.serviceLocation === ServiceLocation.DropOff ? await this.dropOffButton.click() : await this.firstAvailableTime.click(); - customerDetails!.apptDuration = (await this.appointmentDuration.innerText()).replace("Duration: ", ""); + customerDetails!.apptDuration = (await this.appointmentDuration.innerText()).replace("Your service will take approximately ", "").replace("Duration: ", ""); } - async getFormattedTimeSlot(timeSlot: Locator) { + async getFormattedTimeSlot(timeSlot: Locator) { const selectedTimeSlot = await timeSlot.innerText(); let formattedTimeSlot: string = ""; - if (selectedTimeSlot.toLowerCase().includes("drop off")) + if (selectedTimeSlot.toLowerCase().includes("drop")) { formattedTimeSlot = selectedTimeSlot.includes("overnight") ? "drop off by 5:30 pm on the night of your scheduled appointment. Pick-up time dependent on shop schedule" : "drop off before 9:30 AM"; } diff --git a/playwright-tests/pages/ServicePackagesPage.ts b/playwright-tests/pages/ServicePackagesPage.ts index 34818f285..95e31a746 100644 --- a/playwright-tests/pages/ServicePackagesPage.ts +++ b/playwright-tests/pages/ServicePackagesPage.ts @@ -37,7 +37,7 @@ export class ServicePackagesPage extends BasePage { this.iHavePromoCodeButton = this.page.getByRole('link', { name: 'I have a promo code' }); this.skipQuoteEmailButton = this.page.getByRole('button', { name: 'Skip' }); this.emailInput = this.page.getByRole('textbox', { name: 'Enter your email address' }); - this.getMyQuoteButton = this.page.getByRole('button', { name: 'Get my quote' }); + this.getMyQuoteButton = this.page.getByRole('button', { name: 'Send' }); this.closeButton = this.page. getByRole('dialog').locator('button').filter({ hasText: 'Close' }); this.promoCodeTextbox = this.page.getByLabel('Enter a promo code'); this.applyPromoButton = this.page.getByRole('button', { name: 'Apply promo code' }); diff --git a/playwright-tests/pages/VehicleDamagePage.ts b/playwright-tests/pages/VehicleDamagePage.ts index 5de6cb1d4..465df289d 100644 --- a/playwright-tests/pages/VehicleDamagePage.ts +++ b/playwright-tests/pages/VehicleDamagePage.ts @@ -39,9 +39,9 @@ export class VehicleDamagePage extends BasePage { super(page); this.page = page; this.windshieldChkBox = this.page.locator('[buttonlabel="Windshield"]'); - this.crackButton = this.page.locator('[buttonlabel="Crack"]'); - this.chipButton = this.page.locator('[buttonlabel="Chip(s)"]'); - this.sideDoorButton = this.page.locator('[buttonlabel="Side door"]'); + this.crackButton = this.page.locator('[buttonlabelsubcopy="Replace my windshield"]'); + this.chipButton = this.page.locator('[buttonlabelsubcopy="Repair my windshield"]'); + this.sideDoorButton = this.page.locator('[buttonlabel="Side window"]'); this.driverSideButton = this.page.locator('[buttonlabel="Driver side"]'); this.passengerSideButton = this.page.locator('[buttonlabel="Passenger side"]'); this.driverQuarterPanelChkBox = this.page.locator('[aria-labelledby="driverSideOptions"]').locator('[buttonlabel="Quarter panel"]'); diff --git a/playwright-tests/playwright.config.ts b/playwright-tests/playwright.config.ts index 2fe027426..40b1ddb01 100644 --- a/playwright-tests/playwright.config.ts +++ b/playwright-tests/playwright.config.ts @@ -9,7 +9,7 @@ if (!process.env.CI) { // Environment variables are present in CI environment, no need to read from file const basePath = __dirname; // This gets the directory where the config file is located - if (process.env.NODE_ENV == 'undefined' || process.env.NODE_ENV == null) { + if (process.env.PLAYWRIGHT_ENV == 'undefined' || process.env.PLAYWRIGHT_ENV == null) { dotenv.config({ path: path.join(basePath, '.env.dev'), example: path.join(basePath, '.env.example') @@ -17,7 +17,7 @@ if (!process.env.CI) { } else { dotenv.config({ - path: path.join(basePath, `.env.${process.env.NODE_ENV}`), + path: path.join(basePath, `.env.${process.env.PLAYWRIGHT_ENV}`), example: path.join(basePath, '.env.example') }); } @@ -42,7 +42,7 @@ const ortoniReportConfig: OrtoniReportConfig = { filename: `ortoni_report_${formatDateForFilename(new Date())}.html`, showProject: false, projectName: "FMG-Nextgen-Playwright-Report", - testType: `E2E- Environment: ${process.env.NODE_ENV} `, + testType: `E2E- Environment: ${process.env.PLAYWRIGHT_ENV} `, preferredTheme: "light", base64Image: true, } diff --git a/playwright-tests/tests/0000__M.test.ts b/playwright-tests/tests/0000__M.test.ts index 204648276..c8788b04a 100644 --- a/playwright-tests/tests/0000__M.test.ts +++ b/playwright-tests/tests/0000__M.test.ts @@ -291,7 +291,6 @@ async function runWorkflow(page: Page, testCase: TestCase) { // let serviceLocationPage = testCase.pages.serviceLocationPage; // await serviceLocationPage.handleServiceLocationPage(testCase.testData); - // Schedule appointment let schedulePage = testCase.pages.schedulePage; await schedulePage.handleSchedulePage(testCase.testData); diff --git a/playwright-tests/tests/CashRepairMobileCreditCard.ts b/playwright-tests/tests/CashRepairMobileCreditCard.ts index b776f7fa5..8e38129e8 100644 --- a/playwright-tests/tests/CashRepairMobileCreditCard.ts +++ b/playwright-tests/tests/CashRepairMobileCreditCard.ts @@ -55,7 +55,7 @@ const cashRepairMobileCCTests: ITestCase[] = []; const tc = { name: `CashRepairMobileCreditCard`, - tags: ['@E2E','@CashRepairMobileCreditCard', '@test_report', '@CASH'], + tags: ['@E2E','@CashRepairMobileCreditCard', '@test_report', '@CASH', '@CASH-848'], testData: cashRepairMobileCCData }; cashRepairMobileCCTests.push(tc); diff --git a/playwright-tests/tests/CashReplaceGlassAddressLookupInshopAfterPay.ts b/playwright-tests/tests/CashReplaceGlassAddressLookupInshopAfterPay.ts index cfc273c1b..43660fe21 100644 --- a/playwright-tests/tests/CashReplaceGlassAddressLookupInshopAfterPay.ts +++ b/playwright-tests/tests/CashReplaceGlassAddressLookupInshopAfterPay.ts @@ -42,14 +42,6 @@ const cashReplaceGlassAddressLookupInshopAfterPayData: Partial = { vehicleLookupType: VehicleLookupType.Address }, - // No need to override vehicleDamage as it already defaults to WindshieldCrack - - // Override appointment details - appointmentDetails: { - ...getDefaultTestData().appointmentDetails!, - shopAddress: "6826 Sawmill Rd, Columbus, OH 43235" - }, - // Override payment details paymentDetails: ClientData.getDefaultAfterpayDetails() } @@ -58,7 +50,7 @@ const cashReplaceGlassAddressLookupInshopAfterPayTests: ITestCase[] = []; const tc = { name: `CashReplaceGlassAddressLookupInshopAfterPay`, - tags: ['@E2E','@CashReplaceGlassAddressLookupInshopAfterPay', '@test_report', '@CASH'], + tags: ['@E2E','@CashReplaceGlassAddressLookupInshopAfterPay', '@test_report', '@CASH', '@CASH-848'], testData: cashReplaceGlassAddressLookupInshopAfterPayData }; cashReplaceGlassAddressLookupInshopAfterPayTests.push(tc); diff --git a/playwright-tests/tests/CashReplaceMultiSlidingGlassDropoff.ts b/playwright-tests/tests/CashReplaceMultiSlidingGlassDropoff.ts index 2da4c6f5e..f488a3555 100644 --- a/playwright-tests/tests/CashReplaceMultiSlidingGlassDropoff.ts +++ b/playwright-tests/tests/CashReplaceMultiSlidingGlassDropoff.ts @@ -35,7 +35,7 @@ const cashReplaceMultiSlidingGlassDropoffData: Partial = { appointmentDetails: { serviceLocation: ServiceLocation.DropOff, appointmentDate: getDefaultTestData().appointmentDetails?.appointmentDate, - shopAddress: "6826 Sawmill Rd, Columbus, OH 43235" + shopAddress: "6826 sawmill rd, Columbus, OH 43235" }, // Override vehicle details diff --git a/playwright-tests/tests/CashReplaceSplitWindshield.ts b/playwright-tests/tests/CashReplaceSplitWindshield.ts index d1f12fef4..4a8d72509 100644 --- a/playwright-tests/tests/CashReplaceSplitWindshield.ts +++ b/playwright-tests/tests/CashReplaceSplitWindshield.ts @@ -66,7 +66,7 @@ const CashReplaceSplitWindshieldTests: ITestCase[] = []; const tc = { name: `CashReplaceSplitWindshield`, - tags: ['@E2E','@CashReplaceSplitWindshield', '@test_report', '@CASH'], + tags: ['@E2E','@CashReplaceSplitWindshield', '@test_report', '@CASH', '@CASH-848'], testData: CashReplaceSplitWindshieldData }; CashReplaceSplitWindshieldTests.push(tc); diff --git a/playwright-tests/tests/CashReplaceWiperDropoff.ts b/playwright-tests/tests/CashReplaceWiperDropoff.ts index 8080603f6..09083fcd2 100644 --- a/playwright-tests/tests/CashReplaceWiperDropoff.ts +++ b/playwright-tests/tests/CashReplaceWiperDropoff.ts @@ -20,7 +20,7 @@ const cashReplaceWiperDropoffData: Partial = { servicePackage: ServicePackage.Standard, // Special flags - isSkipEstimatePage: true, + isSkipEstimatePage: false, isRecalVehicle: true, // Override customer postal code @@ -28,7 +28,7 @@ const cashReplaceWiperDropoffData: Partial = { ...getDefaultTestData().customerDetails!, address: { ...getDefaultTestData().customerDetails!.address, - postalCode: '43085' + postalCode: '43235' } }, diff --git a/playwright-tests/tests/InsuranceAcuityPaypal.ts b/playwright-tests/tests/InsuranceAcuityPaypal.ts index 0a97fc794..5cd3c0a40 100644 --- a/playwright-tests/tests/InsuranceAcuityPaypal.ts +++ b/playwright-tests/tests/InsuranceAcuityPaypal.ts @@ -90,7 +90,7 @@ const insuranceAcuityPaypalTests: ITestCase[] = []; const tc = { name: `InsuranceAcuityPaypal`, - tags: ['@E2E','@InsuranceAcuityPaypal', '@test_report', '@Insurance', '@CASH-1187'], + tags: ['@E2E','@InsuranceAcuityPaypal', '@test_report', '@Insurance', '@CASH-1187', '@CASH-848'], testData: insuranceAcuityPaypalData }; insuranceAcuityPaypalTests.push(tc); diff --git a/public/css/hop-styling.css b/public/css/hop-styling.css index da2f3ef22..d46039051 100644 --- a/public/css/hop-styling.css +++ b/public/css/hop-styling.css @@ -53,6 +53,7 @@ body select { background-color: #fff; font-family: Urbanist, Arial, Helvetica, sans-serif; font-weight: 400; + box-shadow: 0 1px 5px 0 rgba(0, 0, 0, 0.2); } body input:focus, body input:focus-visible, body select:focus, diff --git a/public/scss/hop-styling.scss b/public/scss/hop-styling.scss index d3afaf985..9f6711f1c 100644 --- a/public/scss/hop-styling.scss +++ b/public/scss/hop-styling.scss @@ -63,6 +63,7 @@ body { background-color: #fff; font-family: Urbanist, Arial, Helvetica, sans-serif; font-weight: 400; + box-shadow: 0 1px 5px 0 rgba(0, 0, 0, 0.2); &:focus, &:focus-visible { box-shadow: 0 0 0 2.5px #1574a1; diff --git a/src/constants/damage-locations-selected.js b/src/constants/damage-locations-selected.js index 7ede615cb..848491223 100644 --- a/src/constants/damage-locations-selected.js +++ b/src/constants/damage-locations-selected.js @@ -16,6 +16,8 @@ const damageLocationsSelected = { PASSENGERSIDE: "PassengerSide", STATIONARY: "Stationary", SLIDER: "Slider", + DOOR: "Door", + GLASS: "Glass", }; export { damageLocationsSelected }; diff --git a/src/digital-components/date-picker/date-picker.vue b/src/digital-components/date-picker/date-picker.vue index 1a3080286..cbaba9193 100644 --- a/src/digital-components/date-picker/date-picker.vue +++ b/src/digital-components/date-picker/date-picker.vue @@ -2,16 +2,6 @@
-
- - -
-
Select a day and time
View more dates -
@@ -1028,14 +866,6 @@ export default { align-items: flex-start; text-align: left; - .duration-text-block { - text-align: left; - } - - .date-picker-header { - margin-bottom: 1.5rem; - } - fieldset { flex-grow: 1; position: relative; diff --git a/src/digital-components/modal/modal.vue b/src/digital-components/modal/modal.vue index f0d546782..9167c03b3 100644 --- a/src/digital-components/modal/modal.vue +++ b/src/digital-components/modal/modal.vue @@ -2,7 +2,7 @@