117 lines
5.7 KiB
TypeScript
117 lines
5.7 KiB
TypeScript
import { expect, type Locator, type Page } from '@playwright/test';
|
||
import { BasePage } from './BasePage';
|
||
import { IClaimDetails, ICustomerDetails } from '@business-logic/types/CustomerDetails';
|
||
import { defaultTestData, ITestData, VehicleDamage } from 'safelite-playwright-core';
|
||
|
||
export class CoverageStatementPage extends BasePage {
|
||
readonly page: Page;
|
||
readonly cancelMyClaimButton: Locator;
|
||
readonly cancelMyClaimConfirm: Locator;
|
||
readonly deductibleAmount: Locator;
|
||
readonly noDeductibleRepairText: Locator; // For essential flow when there is no deductible and repair is covered
|
||
readonly youPayYourDeductibleText: Locator;
|
||
readonly verifiedCoverageHeader: Locator; // For essential flow when coverage is verified
|
||
readonly headerForITAC: Locator; // For ITAC when coverage is found
|
||
readonly headerForNoComp: Locator; // For NoComp when coverage is found
|
||
readonly unverifiedCoverageHeader: Locator; // For essential flows when verifying deductible
|
||
readonly oemBullet: Locator; // For OEM bullet when OEM endorsement is present
|
||
readonly continueSchedulingButton: Locator; // For ITAC/NoComp
|
||
readonly continueButton: Locator; // For essential flows
|
||
issPageValue = 'coverage-statement';
|
||
|
||
constructor(page: Page) {
|
||
super(page);
|
||
this.page = page;
|
||
|
||
this.cancelMyClaimButton = this.page.getByRole('link', { name: "No, I want to cancel" }); // seen for ITAC/NoComp flows
|
||
this.cancelMyClaimConfirm = this.page.locator('div.text-center', { hasText: "No, I want to cancel" }); // on modal for cancel claim
|
||
|
||
this.deductibleAmount = this.page.locator('.cost-underline');
|
||
this.noDeductibleRepairText = this.page.getByText('According to your policy, there is no deductible for a repair.'); // no deductible for repair text
|
||
this.youPayYourDeductibleText = this.page.getByText('You pay your deductible:'); // no deductible for replacement text
|
||
this.verifiedCoverageHeader = this.page.getByRole('heading', { name: 'We have verified your coverage' });
|
||
this.unverifiedCoverageHeader = this.page.getByRole('heading', { level: 5, name: "We’re verifying your coverage" });
|
||
this.headerForITAC = this.page.getByRole('heading', { name: 'Good news! Safelite\'s price is lower than your deductible' });
|
||
this.headerForNoComp = this.page.getByRole('heading', { name: 'Looks like your policy doesn\'t include comprehensive coverage.\nSafelite can still get you fixed up and safely back on the road.' });
|
||
this.oemBullet = this.page.getByText('OEM (Original Equipment Manufacturer) glass replacement is included under your policy and will be installed in your vehicle.');
|
||
|
||
this.continueSchedulingButton = page.getByRole('button', { name: 'Continue scheduling' }); // continue button for ITAC/NoComp flow
|
||
this.continueButton = page.getByRole('button', { name: 'Continue' }); // continue button for essential flow
|
||
}
|
||
|
||
async scheduleOnline(){
|
||
await this.continueSchedulingButton.click();
|
||
}
|
||
|
||
async cancelMyClaim(){
|
||
await this.cancelMyClaimButton.click();
|
||
await this.cancelMyClaimConfirm.click();
|
||
}
|
||
|
||
async handleRepairWithNoDeductibleFlow() {
|
||
|
||
if (VehicleDamage.WindshieldOneChip || VehicleDamage.WindshieldTwoChips || VehicleDamage.WindshieldThreeChips) {
|
||
await expect(this.verifiedCoverageHeader).toBeVisible();
|
||
await expect(this.noDeductibleRepairText).toBeVisible();
|
||
}
|
||
}
|
||
|
||
async handleReplacementOrRepairWithNoDeductibleFlow(claimDetails: IClaimDetails, VehicleDamage){
|
||
const noDeductibleFlow = claimDetails.policyDeductible === 0;
|
||
|
||
if (noDeductibleFlow && VehicleDamage === VehicleDamage.WindshieldOneChip || VehicleDamage.WindshieldTwoChips || VehicleDamage.WindshieldThreeChips) {
|
||
|
||
// await expect(this.noDeductibleRepairText).toBeVisible();
|
||
await this.continueButton.click();
|
||
|
||
} else {
|
||
await expect(this.youPayYourDeductibleText).toBeVisible();
|
||
await expect(this.deductibleAmount).toContainText(`$0`, {timeout: 60000});
|
||
await this.continueButton.click();
|
||
}
|
||
}
|
||
|
||
async handleReplacementWithDeductibleFlow(claimDetails: IClaimDetails){
|
||
const replaceWithDeductibleFlow = claimDetails.policyDeductible! > 0 && claimDetails.policyDeductible !== 9999;
|
||
|
||
if (replaceWithDeductibleFlow) {
|
||
await expect(this.youPayYourDeductibleText).toBeVisible();
|
||
await expect(this.deductibleAmount).toContainText(`$${claimDetails.policyDeductible?.toLocaleString()}`, {timeout: 60000});
|
||
|
||
await this.continueButton.click();
|
||
}
|
||
}
|
||
|
||
|
||
async handleUnverifiedFlow(claimDetails: IClaimDetails){
|
||
const unVerifiedCustomer = claimDetails.policyDeductible === -1; // if deductible is -1, we treat it as unverified flow
|
||
|
||
if (unVerifiedCustomer) {
|
||
await expect(this.unverifiedCoverageHeader).toBeVisible();
|
||
|
||
await this.continueButton.click();
|
||
}
|
||
}
|
||
|
||
async handleUnverifiedPolicyAfterVehicleLookupFlow(){
|
||
await expect(this.unverifiedCoverageHeader).toBeVisible();
|
||
await this.continueButton.click();
|
||
}
|
||
|
||
async handleITACFlow(){
|
||
await expect(this.headerForITAC).toBeVisible(); // verify ITAC header is visible
|
||
|
||
await this.continueSchedulingButton.click(); // happy path to scheduling for ITAC
|
||
}
|
||
|
||
async handleNoCompFlow(){
|
||
await expect(this.headerForNoComp).toBeVisible(); // verify NoComp header is visible
|
||
|
||
await this.continueSchedulingButton.click(); // happy path to scheduling for NoComp
|
||
}
|
||
|
||
async validateOEMBullet(){
|
||
await expect(this.oemBullet).toBeVisible();
|
||
}
|
||
|
||
}
|