From 58b497fcc4db65fe49c44252e0291f45a0243f29 Mon Sep 17 00:00:00 2001 From: JennyNou Date: Fri, 27 Feb 2026 11:23:52 -0500 Subject: [PATCH] Update locators and logic to validate cart behavior for deductible scenarios --- .../pages/OrderConfirmationPage.ts | 80 ++++++++++++------- 1 file changed, 51 insertions(+), 29 deletions(-) diff --git a/playwright-tests/pages/OrderConfirmationPage.ts b/playwright-tests/pages/OrderConfirmationPage.ts index 8f30ad8c..1c4a5962 100644 --- a/playwright-tests/pages/OrderConfirmationPage.ts +++ b/playwright-tests/pages/OrderConfirmationPage.ts @@ -3,38 +3,56 @@ import { BasePage } from './BasePage'; import { ICustomerDetails, IVehicleDetails } from '@business-logic/types/CustomerDetails'; import { PaymentType, ServicePackage } from '@business-logic/types/Enums'; import { ITestData } from '@business-logic/types/ITestData'; +import { log } from 'console'; export class OrderConfirmationPage extends BasePage { readonly page: Page; + + readonly successCheckmark: Locator; + readonly successHeader: Locator; + readonly serviceText: Locator; + readonly workOrderNumberText: Locator; readonly emailText: Locator; + readonly apptDateText: Locator; - readonly amountDueText: Locator; - readonly viewCartButton: Locator; + //readonly amountDueText: Locator; readonly deductibleText: Locator; readonly subtotalText: Locator; readonly finalAmountDue: Locator; readonly cartServicePackageText: Locator; + readonly VerifiyingCoverageDeductibleText: Locator; + issPageValue = 'order-confirmation'; constructor(page: Page) { super(page); this.page = page; - this.serviceText = this.page.locator('[class="appointment-text text-center lh-base"]'); - this.emailText = this.page.locator('[class="email-confirmation-text"]'); - this.apptDateText = this.page.locator('[class="appointment-date-time text-center mt-4"]'); - this.amountDueText = this.page.getByLabel('expand cart details'); - this.viewCartButton = this.page.locator('#cart-dropdown-head'); - this.deductibleText = this.page.locator('#deductible-value'); + + this.successCheckmark = this.page.locator('img[src*="-checkmark.svg"]'); + this.successHeader = this.page.locator('[class="header-text"]'); + + this.emailText = this.page.locator('[class="subheader-text"]', { hasText: 'Your appointment is on Safelite\'s schedule and your confirmation email is on the way.' }); + this.serviceText = this.page.locator('[class="service-description confirmation-section"]'); + this.workOrderNumberText = this.page.locator('[class="work-order-description"]'); + + this.apptDateText = this.page.locator('[class="appointment-details confirmation-section"]'); + + this.deductibleText = this.page.locator('span#deductible-value, span.deductible-value'); this.subtotalText = this.page.locator("#subtotal-value"); this.finalAmountDue = this.page.locator('#bottom-amount-due-value'); - this.cartServicePackageText = this.page.locator('#cart-service-package'); + this.cartServicePackageText = this.page.locator('.cart-item-list'); + this.VerifiyingCoverageDeductibleText = this.page.locator('span.price cart-item', { hasText: 'Verifying coverage' }); } async validateOrderConfirmationPage(testData: Partial) { // Destructure data we use const { vehicleDetails, customerDetails, servicePackage, isItac, isNoComp, isPolicyFound, claimDetails, paymentDetails, isUseVehicleOnPolicy } = testData; + + await expect.soft(this.successHeader).toBeVisible(); + + await this.serviceText.waitFor({ state: "visible" }); await this.logOrderNumber(); @@ -42,64 +60,68 @@ export class OrderConfirmationPage extends BasePage { const serviceTextValue = await this.serviceText.textContent(); const apptDateValue = await this.apptDateText.textContent(); const emailTextValue = await this.emailText.textContent(); - const servicePackageValue = await this.cartServicePackageText.textContent(); - const amountDueValue = await this.amountDueText.textContent(); + const servicePackageValue = (claimDetails!.policyDeductible >= 0) ? await this.cartServicePackageText.textContent(): null; + //const amountDueValue = await this.amountDueText.textContent(); const deductibleTextValue = (isItac || isNoComp) ? null : await this.deductibleText.textContent(); - const subtotalTextValue = await this.subtotalText.textContent(); - const finalAmountDueValue = await this.finalAmountDue.textContent(); + const subtotalTextValue = (claimDetails!.policyDeductible >= 0) ? await this.subtotalText.textContent() : null; + const finalAmountDueValue = (claimDetails!.policyDeductible >= 0) ? await this.finalAmountDue.textContent() : null; // Extract service package price - const servicePackageAmt = Number.parseFloat(servicePackageValue!.split('$')[1].replaceAll(',', '')); + // const servicePackageAmt = Number.parseFloat(servicePackageValue!.split('$')[1].replaceAll(',', '')); // General Validations expect.soft(serviceTextValue).toContain(`${vehicleDetails!.year} ${vehicleDetails!.make} ${vehicleDetails!.model}`); - expect.soft(apptDateValue).toContain(customerDetails!.apptDate); - expect.soft(emailTextValue).toContain(customerDetails!.email); + //expect.soft(apptDateValue).toContain(customerDetails!.apptDate); + //expect.soft(emailTextValue).toContain(customerDetails!.email); // Service package validations - await expect.soft(this.cartServicePackageText).toContainText(`${servicePackage}`) if ((servicePackage === ServicePackage.Premium && testData.isReplace === true) || servicePackage === ServicePackage.Standard) { - expect.soft(servicePackageValue).toContain('New wiper blades'); + expect.soft(servicePackageValue).toContain('Front advanced beam blades'); } if (servicePackage === ServicePackage.Premium) { - expect.soft(servicePackageValue).toContain('Rain Defenseā„¢ treatment'); + expect.soft(servicePackageValue).toContain('Safelite Rain Repellent Treatment'); } // Price validations - if (servicePackage === ServicePackage.GlassOnly) { + /*if (servicePackage === ServicePackage.GlassOnly) { expect.soft(servicePackageAmt).toEqual(0); } else { expect.soft(servicePackageAmt).toBeGreaterThan(0); - } + }*/ - if (isPolicyFound && (isUseVehicleOnPolicy ?? true)) { + if (isPolicyFound && (claimDetails!.policyDeductible === 0 && (servicePackage === ServicePackage.GlassOnly))) { + const zeroDeductibleText = await this.deductibleText.textContent(); + expect.soft(zeroDeductibleText).toEqual('$0.00'); + } else if (isPolicyFound && (finalAmountDueValue !== null && subtotalTextValue !== null)) { // Extract numbers - const amountDueAmt = Number.parseFloat(amountDueValue!.split('$')[1].replaceAll(',', '')); + //const amountDueAmt = Number.parseFloat(amountDueValue!.split('$')[1].replaceAll(',', '')); const deductibleAmt = deductibleTextValue ? Number.parseFloat(deductibleTextValue.split('$')[1].replaceAll(',', '')) : 0; const subtotalAmt = Number.parseFloat(subtotalTextValue!.split('$')[1].replaceAll(',', '')); subtotalTextValue?.replaceAll(',', '') const finalAmountDueAmt = Number.parseFloat(finalAmountDueValue!.split('$')[1].replaceAll(',', '')); if (!(isItac || isNoComp)) { - expect.soft(subtotalAmt).toEqual(claimDetails!.policyDeductible + servicePackageAmt); + //expect.soft(subtotalAmt).toEqual(claimDetails!.policyDeductible + servicePackageAmt); expect.soft(deductibleAmt).toEqual(claimDetails!.policyDeductible); } else { expect.soft(subtotalAmt).toBeGreaterThan(0); expect.soft(deductibleAmt).toEqual(0); } - if (paymentDetails!.paymentType === PaymentType.PayAtService && (claimDetails!.policyDeductible > 0 || servicePackageAmt > 0)) { + if ((paymentDetails!.paymentType === PaymentType.PayAtService) && (claimDetails!.policyDeductible >= 0 && (servicePackage === ServicePackage.Standard || servicePackage === ServicePackage.Premium))) { // Verify amount due > 0 - expect.soft(amountDueAmt).toBeGreaterThan(0); + //expect.soft(amountDueAmt).toBeGreaterThan(0); expect.soft(finalAmountDueAmt).toBeGreaterThan(0); } else { // Verify amount due 0 - expect.soft(amountDueAmt).toEqual(0); + //expect.soft(amountDueAmt).toEqual(0); expect.soft(finalAmountDueAmt).toEqual(0); } } else { - expect.soft(amountDueValue).toContain('Verifying coverage'); - expect.soft(subtotalTextValue).toEqual('Verifying coverage'); + // essential flows will have deductible and amount due as "Verifying coverage" + const verifyingCoverageText = this.VerifiyingCoverageDeductibleText; + + expect.soft(verifyingCoverageText).toContainText('Verifying coverage'); expect.soft(finalAmountDueValue).toEqual('Verifying coverage'); } }