From 706c29c9d3aa08dd75064718a41349e13cdb12ab Mon Sep 17 00:00:00 2001 From: kpatel8hs4io <31411746+kpatel8hs4io@users.noreply.github.com> Date: Tue, 17 Feb 2026 00:09:55 -0500 Subject: [PATCH] fix broken playwright tests. added a new tests --- playwright-tests/framework/TestData.ts | 1 + playwright-tests/pages/BasePage.ts | 58 +++++ playwright-tests/pages/PartQuestionPage.ts | 2 +- playwright-tests/pages/PaypalPage.ts | 6 +- playwright-tests/pages/SchedulePage.ts | 23 +- playwright-tests/pages/ServicePackagesPage.ts | 4 + playwright-tests/tests/0000__M.test.ts | 227 +++++++++--------- .../tests/CashReplaceDynamicRecalMobile.ts | 3 +- .../tests/CashReplaceStaticInshop.ts | 78 ++++++ .../tests/CashReplaceWiperDropoff.ts | 2 +- .../tests/InsuranceNoCompProgressive.ts | 11 +- 11 files changed, 294 insertions(+), 121 deletions(-) create mode 100644 playwright-tests/tests/CashReplaceStaticInshop.ts diff --git a/playwright-tests/framework/TestData.ts b/playwright-tests/framework/TestData.ts index 1af123c41..9148db34e 100644 --- a/playwright-tests/framework/TestData.ts +++ b/playwright-tests/framework/TestData.ts @@ -7,4 +7,5 @@ export interface ITestData extends base { isOptedInForTextMessages: boolean, totalAmount?: number, isForcedOEM?: boolean + mockFirstInshopCallNoSchedule?: boolean } \ No newline at end of file diff --git a/playwright-tests/pages/BasePage.ts b/playwright-tests/pages/BasePage.ts index 1562677a2..4f7f54557 100644 --- a/playwright-tests/pages/BasePage.ts +++ b/playwright-tests/pages/BasePage.ts @@ -18,6 +18,7 @@ export class BasePage { readonly buttonLoadSpin: Locator; readonly hamburgerMenu: Locator; readonly progressBar: Locator; + readonly loaders: Locator; constructor(page: Page) { this.page = page; @@ -27,6 +28,7 @@ export class BasePage { this.buttonLoadSpin = page.getByRole('alert'); this.hamburgerMenu = this.page.getByRole('button', { name: 'Hamburger Menu (modal window)' }); this.progressBar = this.page.locator('.progress-bar-outer .progress-bar-inner'); + this.loaders = this.page.locator('.spinner-border, .loader'); } async nextPage() { @@ -131,6 +133,47 @@ export class BasePage { }); } + + async mockScheduleResponseForFirstInshopCallNoSchedule(customerDetails: ICustomerDetails) { + let fistInshopScheduleCall = true; + + const apiUrl = `https://digitalapi.${process.env['PLAYWRIGHT_ENV']!.replace('sys', 'test').toLowerCase()}.safelite.io/schedule/api/v1/schedule/shop-time-slots`; + await this.page.route(apiUrl, async (route) => { + if (!fistInshopScheduleCall) { + return route.continue(); + } + + // const fmt = (d: Date) => `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,"0")}-${String(d.getDate()).padStart(2,"0")}`; + // const startDate = new Date(); + //const beginningOfWeek = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() - startDate.getDay()); + // const endDate = new Date(beginningOfWeek.getFullYear(), beginningOfWeek.getMonth(), beginningOfWeek.getDate() + 13); + // e.g., "2025-07-23" + /*if (route.request().postDataJSON().startDate === fmt(startDate) && route.request().postDataJSON().endDate === fmt(endDate)) { + const response = await route.fetch(); + const responseBody = await response.json(); + + responseBody.days = []; + // Mock the response + await route.fulfill({ + response, + body: JSON.stringify(responseBody), + }); + }*/ + + const response = await route.fetch(); + const responseBody = await response.json(); + + responseBody.days = []; + + // Mock the response + await route.fulfill({ + response, + body: JSON.stringify(responseBody), + }); + fistInshopScheduleCall = false; + }); + } + async getRepairPartsTotal(testData: Partial) { const apiUrl = `https://digitalapi.${process.env['PLAYWRIGHT_ENV']!.replace('sys', 'test').toLowerCase()}.safelite.io/price/api/v1/price/order-items`; await this.page.on('response', async (response) => { @@ -170,6 +213,21 @@ export class BasePage { console.log(`Progress Bar Percentage: Actual - ${actualProgressPercentage} vs Expected - ${progressPercentage}`); } + async waitForPageOrComponentload(): Promise { + await Promise.all([ + (async () => { + const loaderCount = await this.loaders.count(); + if (loaderCount > 0) { + for (let i = 0; i < loaderCount; i++) { + await this.loaders.nth(i).waitFor({ state: 'hidden' }); + } + } + })(), + this.page.waitForLoadState('load'), + this.page.waitForLoadState('networkidle') + ]); + } + async validateOEMPart( isOEM: boolean): Promise { if (isOEM!) { // Get Vuex state from localStorage diff --git a/playwright-tests/pages/PartQuestionPage.ts b/playwright-tests/pages/PartQuestionPage.ts index a6ecbc0bd..463746d0b 100644 --- a/playwright-tests/pages/PartQuestionPage.ts +++ b/playwright-tests/pages/PartQuestionPage.ts @@ -44,6 +44,7 @@ export class PartQuestionsPage extends BasePage { } else { await expect(partQuestionOptions).not.toBeAttached(); } + await this.selectPartQuestionResponses(partQuestions!); } } @@ -65,7 +66,6 @@ export class PartQuestionsPage extends BasePage { await this.validateProgressBar(ProgressBarPercentages.PartQuestionsPage); await this.validatePartQuestions(partQuestions!); - await this.selectPartQuestionResponses(partQuestions!); await this.nextPage(); } } diff --git a/playwright-tests/pages/PaypalPage.ts b/playwright-tests/pages/PaypalPage.ts index e67e0a57b..d0601ffcb 100644 --- a/playwright-tests/pages/PaypalPage.ts +++ b/playwright-tests/pages/PaypalPage.ts @@ -26,7 +26,7 @@ export class PaypalPage extends BasePage { this.paypalLoginButton = page.getByRole('button', { name: 'Log In', exact: true }); this.completePurchaseButton = page.getByTestId('submit-button-initial') this.payWithRadioButton = page.getByRole('button').filter({ hasText: 'Pay with' }); - this.payButton = page.locator('#one-time-cta'); + this.payButton = page.locator('footer #one-time-cta'); this.tryAnotherWayButton = page.getByRole('button', { name: 'Try another way' }); } @@ -50,8 +50,8 @@ export class PaypalPage extends BasePage { await this.passwordTextBox.fill(paymentDetails.password!); await this.paypalLoginButton.click(); await this.payWithRadioButton.click(); - await this.page.waitForTimeout(2000); // wait for 2 seconds to ensure the Pay button is clickable + await this.page.waitForTimeout(2000); await this.payButton.dblclick(); } } -} +} \ No newline at end of file diff --git a/playwright-tests/pages/SchedulePage.ts b/playwright-tests/pages/SchedulePage.ts index 944b84136..fdd3f30ec 100644 --- a/playwright-tests/pages/SchedulePage.ts +++ b/playwright-tests/pages/SchedulePage.ts @@ -36,6 +36,9 @@ export class SchedulePage extends BasePage { readonly allDayDropOffButton: Locator; readonly pickATimeButton: Locator; readonly mobileFirstModalCloseButton: Locator; + readonly yesButtonRecalAckModal: Locator; + readonly noButtonRecalAckModal: Locator; + readonly continueButtonRecalAckModal: Locator; constructor(page: Page) { super(page); @@ -66,7 +69,10 @@ export class SchedulePage extends BasePage { this.viewMoreDatesLink = this.page.getByText(/View more dates/).first(); this.appointmentDuration = this.page.locator('.duration-text-block'); this.timeSlots = this.page.locator('fieldset:has(>legend#chooseTimeSlot) label').filter({ visible: true}); - this.mobileFirstModalCloseButton = this.page.getByRole('dialog').getByRole('button', { name: 'Close' }); + this.mobileFirstModalCloseButton = this.page.locator('#mobile-first-modal-container .btn-close'); + this.yesButtonRecalAckModal = this.page.locator("label[buttonlabel='Yes']"); + this.noButtonRecalAckModal = this.page.locator("label[buttonlabel='No']"); + this.continueButtonRecalAckModal = this.page.locator("#recal-ack-modal-container .modal-footer button"); } async selectLocation(testData: Partial) { @@ -98,6 +104,7 @@ export class SchedulePage extends BasePage { await this.safeliteShopsList.first().click(); // Click the save location button await this.saveLocationButton.click(); + await this.waitForPageOrComponentload(); } // await this.inShopButton.click(); @@ -229,13 +236,25 @@ export class SchedulePage extends BasePage { @step("SchedulePage >> Schedule appointment: ") async handleSchedulePage(testData: Partial) { - const { appointmentDetails } = testData; + const { appointmentDetails, isCanNotRecal } = testData; + await this.waitForPageOrComponentload(); await this.validateProgressBar(ProgressBarPercentages.SchedulePage); if (await this.mobileFirstModalCloseButton.isVisible()) { await this.mobileFirstModalCloseButton.click(); } await this.selectLocation(testData); + + if (await this.mobileFirstModalCloseButton.isVisible({timeout: 5000})) { + await this.page.waitForTimeout(1000); + await this.mobileFirstModalCloseButton.dblclick(); + } + await this.scheduleFirstAppointment(testData); + await this.nextPage(); + if (isCanNotRecal) { + await this.yesButtonRecalAckModal.click(); + await this.continueButtonRecalAckModal.click(); + } } } diff --git a/playwright-tests/pages/ServicePackagesPage.ts b/playwright-tests/pages/ServicePackagesPage.ts index ba95f67cd..2f16cb7b4 100644 --- a/playwright-tests/pages/ServicePackagesPage.ts +++ b/playwright-tests/pages/ServicePackagesPage.ts @@ -298,6 +298,10 @@ export class ServicePackagesPage extends BasePage { await this.mockScheduleResponseForEarlyBird(customerDetails!); } + if (testData.mockFirstInshopCallNoSchedule) { + await this.mockScheduleResponseForFirstInshopCallNoSchedule(testData.customerDetails!); + } + await this.nextPage(); } } \ No newline at end of file diff --git a/playwright-tests/tests/0000__M.test.ts b/playwright-tests/tests/0000__M.test.ts index cd8270a8a..aebb3b978 100644 --- a/playwright-tests/tests/0000__M.test.ts +++ b/playwright-tests/tests/0000__M.test.ts @@ -1,4 +1,4 @@ -import { Page } from "@playwright/test"; +import { Browser, Page } from "@playwright/test"; import { addSmokeTagToRandomTest, Flow, ServiceLocation } from 'safelite-playwright-core'; import { ValidationOptions } from 'safelite-playwright-core'; import heavyTruckTests from "./alert-validation/alert0001_HeavyTruck"; @@ -18,6 +18,7 @@ import cashReplaceGlassLicensePlateLookupInshopPaypalTests from "./CashReplaceGl import { ApiResponseInterceptUtil } from 'safelite-playwright-core'; import cashReplaceGlassPromoInshopTests from "./CashReplaceGlassPromoInshop"; import cashReplaceMultiGlassPromoInshopTests from "./CashReplaceMultiGlassPromoInshop"; +import cashReplaceStaticInshopTests from "./CashReplaceStaticInshop"; import cashReplaceRainDefensePromoInshopTests from "./CashReplaceRainDefensePromoInshop"; import cashReplaceSafeliteCanNotRecalMobileTests from "./CashReplaceSafeliteCanNotRecalMobile"; import cashReplaceVinMobileTests from "./CashReplaceVinMobile"; @@ -61,33 +62,34 @@ addSmokeTagToRandomTest(splitWindshieldTests); // Standard test scenarios const allStandardTests = [ - {name: "CashRepairMobileCreditCard", tests: cashRepairMobileCCTests}, - {name: "CashRepairInShopAfterPay", tests: cashRepairInShopAfterPayTests}, - {name: "CashRepairInShopPayPal", tests: cashRepairInShopPayPalTests}, - {name: "CashReplaceDynamicRecalMobile", tests: cashReplaceDynamicRecalMobileTests}, - {name: "CashReplaceGlassAddressLookupInshopAfterPay", tests: cashReplaceGlassAddressLookupInshopAfterPayTests}, - {name: "CashReplaceGlassLicensePlateLookupInshopPaypal", tests: cashReplaceGlassLicensePlateLookupInshopPaypalTests}, - {name: "CashReplaceGlassPromoInShop", tests: cashReplaceGlassPromoInshopTests}, - {name: "CashReplaceMultiGlassPromoInShop", tests: cashReplaceMultiGlassPromoInshopTests}, - {name: "CashReplaceMultiSlidingGlassDropoff",tests: cashReplaceMultiSlidingGlassDropoffTests}, - {name: "CashReplaceMultiGlassMobile",tests: cashReplaceMultiGlassMobileTests}, - {name: "CashReplaceRainDefensePromoInshop", tests: cashReplaceRainDefensePromoInshopTests}, - {name: "CashReplaceSafeliteCanNotRecalMobile", tests: cashReplaceSafeliteCanNotRecalMobileTests}, - {name: "CashReplaceVinMobile", tests: cashReplaceVinMobileTests}, - {name: "CashReplaceWiperDropoff", tests: cashReplaceWiperDropoffTests}, - {name: "CashReplaceWiperPromoInshop", tests: cashReplaceWiperPromoInShopTests}, - {name: "CashReplaceSwitchToInsuranceProgressiveNoComp", tests: cashReplaceSwitchToInsuranceProgressiveNoCompTests}, + { name: "CashRepairMobileCreditCard", tests: cashRepairMobileCCTests }, + { name: "CashRepairInShopAfterPay", tests: cashRepairInShopAfterPayTests }, + { name: "CashRepairInShopPayPal", tests: cashRepairInShopPayPalTests }, + { name: "CashReplaceDynamicRecalMobile", tests: cashReplaceDynamicRecalMobileTests }, + { name: "CashReplaceGlassAddressLookupInshopAfterPay", tests: cashReplaceGlassAddressLookupInshopAfterPayTests }, + { name: "CashReplaceGlassLicensePlateLookupInshopPaypal", tests: cashReplaceGlassLicensePlateLookupInshopPaypalTests }, + { name: "CashReplaceGlassPromoInShop", tests: cashReplaceGlassPromoInshopTests }, + { name: "CashReplaceMultiGlassPromoInShop", tests: cashReplaceMultiGlassPromoInshopTests }, + { name: "CashReplaceMultiSlidingGlassDropoff", tests: cashReplaceMultiSlidingGlassDropoffTests }, + { name: "CashReplaceMultiGlassMobile", tests: cashReplaceMultiGlassMobileTests }, + { name: "CashReplaceRainDefensePromoInshop", tests: cashReplaceRainDefensePromoInshopTests }, + { name: "CashReplaceSafeliteCanNotRecalMobile", tests: cashReplaceSafeliteCanNotRecalMobileTests }, + { name: "CashReplaceVinMobile", tests: cashReplaceVinMobileTests }, + { name: "CashReplaceWiperDropoff", tests: cashReplaceWiperDropoffTests }, + { name: "CashReplaceStaticInshop", tests: cashReplaceStaticInshopTests }, + { name: "CashReplaceWiperPromoInshop", tests: cashReplaceWiperPromoInShopTests }, + { name: "CashReplaceSwitchToInsuranceProgressiveNoComp", tests: cashReplaceSwitchToInsuranceProgressiveNoCompTests }, // TODO: Uncomment when QA is ready to run heavy truck tests // {name: "CashReplaceSplitWindshield", tests: CashReplaceSplitWindshieldTests}, - {name: "InsuranceAcuityPaypal", tests: insuranceAcuityPaypalTests}, - {name: "InsuranceITAC21stCentury", tests: insuranceITAC21stCenturyTests}, - {name: "InsuranceNoCompProgressive", tests: insuranceNoCompProgressiveTests}, + { name: "InsuranceAcuityPaypal", tests: insuranceAcuityPaypalTests }, + { name: "InsuranceITAC21stCentury", tests: insuranceITAC21stCenturyTests }, + { name: "InsuranceNoCompProgressive", tests: insuranceNoCompProgressiveTests }, // {name: "InsuranceBigTruckVerified", tests: insuranceBigTruckVerifiedTests}, - {name: "InsuranceOEMAllstate", tests: insuranceOEMAllstateTests}, - {name: "InsuranceUnverified", tests: insuranceUnverifiedTests}, + { name: "InsuranceOEMAllstate", tests: insuranceOEMAllstateTests }, + { name: "InsuranceUnverified", tests: insuranceUnverifiedTests }, // {name: "InsuranceGeico", tests: insuranceGeicoTests}, // {name: "InsuranceITACOptimizedPriceValidationAllState", tests: insuranceITACOptimizedPriceValidationAllStateTests} - {name: "InsuranceMeemicNearSchoolVerified", tests: insuranceMeemicNearSchoolVerifiedTests}, + { name: "InsuranceMeemicNearSchoolVerified", tests: insuranceMeemicNearSchoolVerifiedTests }, ]; @@ -146,7 +148,7 @@ async function run(page: Page, testInfo: TestInfo): Promise { // Catch successful alert tests and log message if (error instanceof TestSuccessAlert) { console.log(error.message); - // Catch and throw other errors + // Catch and throw other errors } else { throw error; } @@ -175,11 +177,11 @@ async function runWorkflow(page: Page, testCase: TestCase) { page.on('response', apiResponseInterceptUtil.handleInterceptResponse); // Destructure test data for easier access - const { - paymentMethod, customerDetails, vehicleDetails, vehicleDamage, - paymentDetails, partQuestions, isEnterFunnelWithZip, capabilityQuestions, + const { + paymentMethod, customerDetails, vehicleDetails, vehicleDamage, + paymentDetails, partQuestions, isEnterFunnelWithZip, capabilityQuestions, vehiclePartQuestions, moldingQuestions, isSkipEstimatePage - } = testCase.testData; + } = testCase.testData; // Check if the vehicle damage includes a windshield crack const hasWindshieldCrack = vehicleDamage!.some(damage => @@ -193,7 +195,7 @@ async function runWorkflow(page: Page, testCase: TestCase) { //============================= TEST WORKFLOW STEPS ============================= // Use Environment Variable to decide whether or not we want to skip content site aka home page - if (process.env.SKIP_CONTENT_SITE == "false") { + if (process.env.SKIP_CONTENT_SITE == "false") { await test.step('HomePage >> Lets Get Started', async () => { let homePage = testCase.pages.homePage; console.log(`Customer for this test: ${customerDetails?.firstName} ${customerDetails?.lastName}`); @@ -211,6 +213,16 @@ async function runWorkflow(page: Page, testCase: TestCase) { console.log(`Customer for this test: ${customerDetails?.firstName} ${customerDetails?.lastName}`); } + if (page.url().includes('ServiceDetails.aspx')) { + // Take a screenshot for diagnostics + await page.screenshot({ path: `test-results\\ortoni-data\\service-details-detected-${Date.now()}.png`, fullPage: true }); + console.log("ServiceDetails.aspx detected"); + await page.goBack(); + await page.reload(); + let homePage = testCase.pages.homePage; + await homePage.letsGetStarted(customerDetails?.address.postalCode!, !!isEnterFunnelWithZip!); + } + // Handle vehicle selection page let vehicleSelectionPage = testCase.pages.vehicleSelectionPage; await vehicleSelectionPage.handleVehicleSelectionPage(testCase.testData); @@ -223,24 +235,24 @@ async function runWorkflow(page: Page, testCase: TestCase) { if (hasWindshieldCrack && !isSkipEstimatePage) { let estimatePage = testCase.pages.estimatePage; await estimatePage.handleEstimatePage(testCase.testData); - + // Handle different vehicle lookup methods switch (vehicleDetails!.vehicleLookupType!) { case VehicleLookupType.Address: let vehicleLookupAddressPage = testCase.pages.vehicleLookupAddressPage; await vehicleLookupAddressPage.handleVehicleLookupAddressPage(testCase.testData); break; - + case VehicleLookupType.LicensePlateNumber: let vehicleLookupLicensePage = testCase.pages.vehicleLookupLicensePage; await vehicleLookupLicensePage.handleVehicleLookupLicensePage(testCase.testData); break; - + case VehicleLookupType.Vin: let vinLookupPage = testCase.pages.vinLookupPage; await vinLookupPage.handleVehicleLookupVinPage(testCase.testData); break; - + case VehicleLookupType.Zip: let serviceZipPage = testCase.pages.serviceZipPage; await serviceZipPage.handleServiceZipPage(testCase.testData); @@ -257,7 +269,7 @@ async function runWorkflow(page: Page, testCase: TestCase) { let partQuestionsPage = testCase.pages.partQuestionsPage; await partQuestionsPage.handlePartQuestionsPage(testCase.testData); } - + // Handle molding questions if applicable if (moldingQuestions && moldingQuestions.length > 0) { let moldingQuestionsPage = testCase.pages.moldingQuestionsPage; @@ -281,14 +293,14 @@ async function runWorkflow(page: Page, testCase: TestCase) { await servicePackagesPage.handleServicePackagePage(testCase.testData); //============================= INSURANCE FLOW =============================` - + // Insurance flow - if user selected Insurance as Payment Method if (paymentMethod == PaymentMethod.Insurance) { await handleInsuranceFlow(testCase); } //============================= SERVICE SCHEDULING ============================= - + // Select service location // let serviceLocationPage = testCase.pages.serviceLocationPage; // await serviceLocationPage.handleServiceLocationPage(testCase.testData); @@ -307,7 +319,7 @@ async function runWorkflow(page: Page, testCase: TestCase) { await contactDetailsPage.handleContactDetailsPage(testCase.testData); //============================= PAYMENT PROCESSING ============================= - + // Handle payment let paymentMethodPage = testCase.pages.paymentMethodPage; await paymentMethodPage.handlePaymentMethodPage(testCase.testData); @@ -318,91 +330,90 @@ async function runWorkflow(page: Page, testCase: TestCase) { } //============================= ORDER CONFIRMATION ============================= - + // Validate order confirmation let orderConfirmationPage = testCase.pages.orderConfirmationPage; await orderConfirmationPage.verifyOrderConfirmationPage(testCase.testData); } -export async function handleInsuranceFlow(testCase: TestCase) { +async function handleInsuranceFlow(testCase: TestCase) { const { isPolicyFound, isPolicyDriver, endorsements, isRecalVehicle, isCashInsuranceFlow, isForcedOEM, flow } = testCase.testData; - - // Check if the insurance policy has endorsements - const hasEndorsements = endorsements && endorsements.length > 0; - // Handle insurance company page - let insuranceCompanyPage = testCase.pages.insuranceCompanyPage; - await insuranceCompanyPage.handleInsuranceCompanyPage(testCase.testData); + // Check if the insurance policy has endorsements + const hasEndorsements = endorsements && endorsements.length > 0; - // Handle OEM scenario - if (isForcedOEM) { - // User should be on heritage problem glass questions page after selecting Allstate on insurance company page - let HeritageProblemGlassQuestionsPage = testCase.pages.heritageProblemGlassQuestionsPage; - await HeritageProblemGlassQuestionsPage.handleHeritageProblemGlassQuestionsPage(testCase.testData); - } - - // Handle ccPolicyInfoPage - let ccPolicyInfoPage = testCase.pages.ccPolicyInfoPage; - await ccPolicyInfoPage.handleCCPolicyInfoPage(testCase.testData); + // Handle insurance company page + let insuranceCompanyPage = testCase.pages.insuranceCompanyPage; + await insuranceCompanyPage.handleInsuranceCompanyPage(testCase.testData); - let duplicateCheckPage = testCase.pages.duplicateCheckPage; - if (duplicateCheckPage.page.url().includes('DuplicateCheck.aspx')) { - await duplicateCheckPage.handleDuplicateCheckPage(testCase.testData); + // Handle OEM scenario + if (isForcedOEM) { + // User should be on heritage problem glass questions page after selecting Allstate on insurance company page + let HeritageProblemGlassQuestionsPage = testCase.pages.heritageProblemGlassQuestionsPage; + await HeritageProblemGlassQuestionsPage.handleHeritageProblemGlassQuestionsPage(testCase.testData); + } + + // Handle ccPolicyInfoPage + let ccPolicyInfoPage = testCase.pages.ccPolicyInfoPage; + await ccPolicyInfoPage.handleCCPolicyInfoPage(testCase.testData); + + let duplicateCheckPage = testCase.pages.duplicateCheckPage; + if (duplicateCheckPage.page.url().includes('DuplicateCheck.aspx')) { + await duplicateCheckPage.handleDuplicateCheckPage(testCase.testData); + } + + if (flow === Flow.Managed) { + let policyVehiclesPage = testCase.pages.policyVehiclesPage; + await policyVehiclesPage.handlePolicyVehiclesPage(testCase.testData); + + // Handle policy driver selection if applicable + if (isPolicyDriver) { + let policyDriverPage = testCase.pages.policyDriverPage; + await policyDriverPage.handlePolicyDriverPage(testCase.testData); } - if ( flow === Flow.Managed ) { - let policyVehiclesPage = testCase.pages.policyVehiclesPage; - await policyVehiclesPage.handlePolicyVehiclesPage(testCase.testData); - - // Handle policy driver selection if applicable - if (isPolicyDriver) { - let policyDriverPage = testCase.pages.policyDriverPage; - await policyDriverPage.handlePolicyDriverPage(testCase.testData); - } - - // Handle endorsements if applicable - if (hasEndorsements) { - let endorsementsPage = testCase.pages.endorsementsPage; - await endorsementsPage.handleEndorsementsPage(testCase.testData); - } - } else { - - //Handle verify details page - let verifyDetailsPage = testCase.pages.verifyDetailsPage; - await verifyDetailsPage.handleVerifyDetailsPage(testCase.testData); + // Handle endorsements if applicable + if (hasEndorsements) { + let endorsementsPage = testCase.pages.endorsementsPage; + await endorsementsPage.handleEndorsementsPage(testCase.testData); } + } else { - // Handle Policy info submitted page - let policyInfoSubmittedPage = testCase.pages.policyInfoSubmittedPage; - await policyInfoSubmittedPage.handlePolicyInfoSubmittedPage(); + //Handle verify details page + let verifyDetailsPage = testCase.pages.verifyDetailsPage; + await verifyDetailsPage.handleVerifyDetailsPage(testCase.testData); + } - if(isRecalVehicle) - { - let recalibrationInfoPage = testCase.pages.recalibrationInfoPage; - await recalibrationInfoPage.handleRecalibrationInfoPage(); + // Handle Policy info submitted page + let policyInfoSubmittedPage = testCase.pages.policyInfoSubmittedPage; + await policyInfoSubmittedPage.handlePolicyInfoSubmittedPage(); + + if (isRecalVehicle) { + let recalibrationInfoPage = testCase.pages.recalibrationInfoPage; + await recalibrationInfoPage.handleRecalibrationInfoPage(); + } + + //handle coveraage statement page + let coverageStatementPage = testCase.pages.coverageStatementPage; + await coverageStatementPage.handleCoverageStatementPage(testCase.testData); + + // Handle scenario where user selected Cash to Insurance and needs to go back through the flow + // right now we are choosing pay at appointment as payment method for this scenario + if (isCashInsuranceFlow) { + // Schedule appointment + let schedulePage = testCase.pages.schedulePage; + await schedulePage.handleSchedulePage(testCase.testData); + + if (testCase.testData.appointmentDetails?.serviceLocation === ServiceLocation.Mobile) { + let mobileDetailsPage = testCase.pages.mobileDetailsPage; + await mobileDetailsPage.handleMobileDetailsPage(testCase.testData); } + //customer dertails + let contactDetailsPage = testCase.pages.contactDetailsPage; + await contactDetailsPage.nextPage(); - //handle coveraage statement page - let coverageStatementPage = testCase.pages.coverageStatementPage; - await coverageStatementPage.handleCoverageStatementPage(testCase.testData); - - // Handle scenario where user selected Cash to Insurance and needs to go back through the flow - // right now we are choosing pay at appointment as payment method for this scenario - if (isCashInsuranceFlow) { - // Schedule appointment - let schedulePage = testCase.pages.schedulePage; - await schedulePage.handleSchedulePage(testCase.testData); - - if (testCase.testData.appointmentDetails?.serviceLocation === ServiceLocation.Mobile) { - let mobileDetailsPage = testCase.pages.mobileDetailsPage; - await mobileDetailsPage.handleMobileDetailsPage(testCase.testData); - } - //customer dertails - let contactDetailsPage = testCase.pages.contactDetailsPage; - await contactDetailsPage.nextPage(); - - //paymentmethods - let paymentMethodPage = testCase.pages.paymentMethodPage; - await paymentMethodPage.nextPage(); - } + //paymentmethods + let paymentMethodPage = testCase.pages.paymentMethodPage; + await paymentMethodPage.nextPage(); + } } \ No newline at end of file diff --git a/playwright-tests/tests/CashReplaceDynamicRecalMobile.ts b/playwright-tests/tests/CashReplaceDynamicRecalMobile.ts index 5705a95a3..ffc2c9264 100644 --- a/playwright-tests/tests/CashReplaceDynamicRecalMobile.ts +++ b/playwright-tests/tests/CashReplaceDynamicRecalMobile.ts @@ -61,7 +61,8 @@ const cashReplaceDynamicRecalMobileData: Partial = { // Override payment details paymentDetails: { paymentType: PaymentType.PayAtService, - promoCode: 'digitalrain' + // promoCode: 'digitalrain' + promoCode: 'rain50' } } diff --git a/playwright-tests/tests/CashReplaceStaticInshop.ts b/playwright-tests/tests/CashReplaceStaticInshop.ts new file mode 100644 index 000000000..ca71b4cde --- /dev/null +++ b/playwright-tests/tests/CashReplaceStaticInshop.ts @@ -0,0 +1,78 @@ +//Imports here +import { ITestData } from 'framework/TestData' +import { ServicePackage, PaymentType, PartQuestionType } from 'safelite-playwright-core'; +import { ITestCase } from '../framework/Typedefs' +import { VehicleLookupType } from 'safelite-playwright-core'; +import { getDefaultTestData, setFakerSeedFromTestName } from 'safelite-playwright-core'; +import { PaymentMethod } from 'framework/localTypes/Enums'; + +// Set the seed before generating any data +setFakerSeedFromTestName("CashReplaceStaticInshop"); + +// Now get the test data with the seeded faker +const CashReplaceStaticInshopData: Partial = { + ...getDefaultTestData(), // Get default data with current seed + + // CASH Client + paymentMethod: PaymentMethod.SelfPay, + + // Key feature: Premium package with Rain Defense + servicePackage: ServicePackage.Standard, + + // Flag for recalibration vehicle + isRecalVehicle: true, + + // Override customer details + customerDetails: { + ...getDefaultTestData().customerDetails!, + address: { + ...getDefaultTestData().customerDetails!.address, + postalCode: '43085' + } + }, + + // override part questions + partQuestions: [ + { + partQuestionType: PartQuestionType.GeneralQuestion1, + isOnPage: true, + optionToSelect: 'Yes' + }, + { + partQuestionType: PartQuestionType.GeneralQuestion2, + isOnPage: true, + optionToSelect: 'Yes' + } + ], + + // Override vehicle details + vehicleDetails: { + ...getDefaultTestData().vehicleDetails!, + year: '2022', + make: 'Mazda', + model: 'CX-9', + style: '4 door utility', + vin: '3FA6P0HD8LR234510', + vehicleLookupType: VehicleLookupType.Zip + }, + + mockFirstInshopCallNoSchedule: true, + + // No need to override vehicleDamage as it already defaults to WindshieldCrack + + // Payment at service + paymentDetails: { + paymentType: PaymentType.PayAtService + }, +} + +const cashReplaceStaticInshopTests: ITestCase[] = []; + +const tc = { + name: `CashReplaceStaticInshop`, + tags: ['@E2E','@CashReplaceStaticInshop', '@test_report', '@CASH'], + testData: CashReplaceStaticInshopData +}; +cashReplaceStaticInshopTests.push(tc); + +export default cashReplaceStaticInshopTests; \ No newline at end of file diff --git a/playwright-tests/tests/CashReplaceWiperDropoff.ts b/playwright-tests/tests/CashReplaceWiperDropoff.ts index 09083fcd2..44a77a531 100644 --- a/playwright-tests/tests/CashReplaceWiperDropoff.ts +++ b/playwright-tests/tests/CashReplaceWiperDropoff.ts @@ -66,7 +66,7 @@ const cashReplaceWiperDropoffData: Partial = { }, { partQuestionType: PartQuestionType.GeneralQuestion2, - isOnPage: false, + isOnPage: true, optionToSelect: 'Yes' }, ] diff --git a/playwright-tests/tests/InsuranceNoCompProgressive.ts b/playwright-tests/tests/InsuranceNoCompProgressive.ts index e609d4120..a0f3a2594 100644 --- a/playwright-tests/tests/InsuranceNoCompProgressive.ts +++ b/playwright-tests/tests/InsuranceNoCompProgressive.ts @@ -32,10 +32,11 @@ const insuranceNoCompProgressiveData: Partial = { lastName: 'SCHATZ', address: { ...getDefaultTestData().customerDetails!.address, - city: 'Slidell', - state: 'Louisiana', - postalCode: '70458' - } + // city: 'Slidell', + // state: 'Louisiana', + // postalCode: '70458' + postalCode: '43085' + }, }, @@ -71,7 +72,7 @@ const insuranceNoCompProgressiveData: Partial = { // Override for in-shop appointment appointmentDetails: { serviceLocation: ServiceLocation.InShop, - shopAddress: '56705 Garrett Road, Slidell, LA 70458', + // shopAddress: '56705 Garrett Road, Slidell, LA 70458', appointmentDate: getDefaultTestData().appointmentDetails?.appointmentDate },