Merge pull request #1185 from Safelite/feature/jnou/add-adyen-experiment
Feature/jnou/add adyen experiment
This commit is contained in:
commit
065eb7753a
40 changed files with 312 additions and 146 deletions
|
|
@ -1,5 +1,5 @@
|
|||
import { IClient } from "@business-logic/types/Client";
|
||||
import { IPaymentDetails } from "@business-logic/types/CustomerDetails";
|
||||
import { IPaymentDetails, IPaymentDetailsAdyen } from "@business-logic/types/CustomerDetails";
|
||||
import { PaymentType } from "@business-logic/types/Enums";
|
||||
|
||||
const essentialClients: IClient[] = [
|
||||
|
|
@ -223,6 +223,19 @@ const defaultCreditCardDetails: IPaymentDetails = {
|
|||
}
|
||||
}
|
||||
|
||||
const creditCardDetailsAdyen: IPaymentDetailsAdyen = {
|
||||
paymentType: PaymentType.Credit,
|
||||
cardNumber: '4151500000000008',
|
||||
expirationDate: '03/30',
|
||||
cvv: '737',
|
||||
billingAddress: {
|
||||
street: '123 Test Road',
|
||||
city: 'Columbus',
|
||||
state: 'Ohio',
|
||||
postalCode: '43028',
|
||||
}
|
||||
}
|
||||
|
||||
const defaultAfterpayDetails: IPaymentDetails = {
|
||||
paymentType: PaymentType.AfterPay,
|
||||
username: 'itqatest@safelite.com',
|
||||
|
|
@ -233,12 +246,24 @@ const defaultAfterpayDetails: IPaymentDetails = {
|
|||
cvv: '000'
|
||||
}
|
||||
|
||||
const afterpayDetailsAdyen: IPaymentDetailsAdyen = {
|
||||
paymentType: PaymentType.AfterPay,
|
||||
username: 'itqatest@safelite.com',
|
||||
password: 'Safelite1',
|
||||
}
|
||||
|
||||
const defaultPaypalDetails: IPaymentDetails = {
|
||||
paymentType: PaymentType.Paypal,
|
||||
username:'Itqatest@safelite.com',
|
||||
password: 'Safelite1'
|
||||
}
|
||||
|
||||
const paypalDetailsAdyen: IPaymentDetailsAdyen = {
|
||||
paymentType: PaymentType.Paypal,
|
||||
username: 'Itqatest@safelite.com',
|
||||
password: 'Safelite1'
|
||||
}
|
||||
|
||||
export default class ClientData {
|
||||
static getEssentialClients() {
|
||||
return essentialClients;
|
||||
|
|
@ -264,10 +289,22 @@ export default class ClientData {
|
|||
return defaultCreditCardDetails;
|
||||
}
|
||||
|
||||
static getCreditCardDetailsAdyen() {
|
||||
return creditCardDetailsAdyen;
|
||||
}
|
||||
|
||||
static getDefaultAfterpayDetails() {
|
||||
return defaultAfterpayDetails;
|
||||
}
|
||||
|
||||
static getAfterpayDetailsAdyen() {
|
||||
return afterpayDetailsAdyen;
|
||||
}
|
||||
|
||||
static getPaypalDetailsAdyen() {
|
||||
return paypalDetailsAdyen;
|
||||
}
|
||||
|
||||
static getDefaultPaypalDetails() {
|
||||
return defaultPaypalDetails;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -72,6 +72,16 @@ export interface IPaymentDetails {
|
|||
billingAddress?: IAddress,
|
||||
}
|
||||
|
||||
export interface IPaymentDetailsAdyen {
|
||||
paymentType: PaymentType,
|
||||
username?: string,
|
||||
password?: string,
|
||||
cardNumber?: string,
|
||||
expirationDate?: string,
|
||||
cvv?: string,
|
||||
billingAddress?: IAddress,
|
||||
}
|
||||
|
||||
// export interface IVehicleDamage {
|
||||
// isRearWindowDamage?: boolean,
|
||||
// windshieldDamage?: WindshieldDamage,
|
||||
|
|
|
|||
|
|
@ -68,7 +68,8 @@ export enum VehicleDamage {
|
|||
export enum VehicleLookupType {
|
||||
Vin,
|
||||
Address,
|
||||
LicensePlateNumber
|
||||
LicensePlateNumber,
|
||||
RatherNotShareVin
|
||||
}
|
||||
|
||||
export enum ServiceLocation {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { ServicePackage, VehicleDamage } from "./Enums"
|
||||
import { IAppointmentDetails, IClaimDetails, ICustomerDetails, IEndorsementDetails, IPartQuestion, IPaymentDetails, IVehicleDetails, IAddressVehicleDetails } from "./CustomerDetails"
|
||||
import { IAppointmentDetails, IClaimDetails, ICustomerDetails, IEndorsementDetails, IPartQuestion, IPaymentDetails, IPaymentDetailsAdyen, IVehicleDetails, IAddressVehicleDetails } from "./CustomerDetails"
|
||||
import IBailoutFlags from "./IBailoutFlags"
|
||||
|
||||
export interface ITestData {
|
||||
|
|
@ -35,13 +35,16 @@ export interface ITestData {
|
|||
otherVehiclesOnPolicy: IVehicleDetails[], // IF defined, we validate that the vehicles are present.
|
||||
vehicleDamage: VehicleDamage[], // Array of vehicle damage
|
||||
appointmentDetails: IAppointmentDetails,
|
||||
paymentDetails: IPaymentDetails // Payment information
|
||||
paymentDetails: IPaymentDetails, // Payment information
|
||||
paymentDetailsAdyen: IPaymentDetailsAdyen, // Adyen Payment information
|
||||
isRecalNotification: boolean,
|
||||
isRecalWarning: boolean,
|
||||
isRecalVehicle: boolean,
|
||||
isCanSafeliteRecalibrate: boolean, // Can Safelite recalibrate the vehicle? If no, modal displays after clicking time slot and continue
|
||||
isSeparateApptsWarning: boolean, // IF true, check for the separate appts warning on VehicleDamagePage
|
||||
isAuthenticationRequired: boolean,
|
||||
isMoldingQuestion: boolean,
|
||||
isNonServiceable: boolean, // For the flow where a a non-serviceable vehicle is selected on lookup
|
||||
isNonServiceableVin: boolean, // For the flow where a serviceable vehicle is selected on lookup, but then the VIN of a non-serviceable vehicle is entered
|
||||
isRepairTPA: boolean,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { Locator, Page } from "@playwright/test";
|
||||
import { BasePage } from "./BasePage";
|
||||
import { IClaimDetails, IPaymentDetails } from "@business-logic/types/CustomerDetails";
|
||||
import { IClaimDetails, IPaymentDetails, IPaymentDetailsAdyen } from "@business-logic/types/CustomerDetails";
|
||||
import { ServicePackage } from "@business-logic/types/Enums";
|
||||
|
||||
export class AfterpayPage extends BasePage {
|
||||
|
|
@ -33,11 +33,11 @@ export class AfterpayPage extends BasePage {
|
|||
await this.submitButton.click();
|
||||
}
|
||||
|
||||
async executeAfterpayPayment(paymentDetails: IPaymentDetails, claimDetails: IClaimDetails, servicePackage: ServicePackage) {
|
||||
async executeAfterpayPayment(paymentDetailsAdyen: IPaymentDetailsAdyen, claimDetails: IClaimDetails, servicePackage: ServicePackage) {
|
||||
|
||||
const confirmButtonOrPaymentOptions = this.confirmButton.or(this.selectAfterpayWithoutInterestButton);
|
||||
|
||||
await this.login(paymentDetails.password!);
|
||||
await this.login(paymentDetailsAdyen.password!);
|
||||
|
||||
await this.page.locator('div[data-testid=\'loading-icon-svg\']').filter({ visible: true}).first().waitFor({ state: 'hidden' });
|
||||
await confirmButtonOrPaymentOptions.waitFor({ state: 'visible' });
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ export class BasePage {
|
|||
await expect(async () => {
|
||||
const currentUrl = this.page.url();
|
||||
if (currentUrl === startingUrl) {
|
||||
await this.continueButton.click({ timeout: 1000 });
|
||||
await this.continueButton.click({ timeout: 5_000 });
|
||||
}
|
||||
//this causes the schedule page to fail
|
||||
//await expect(this.buttonLoadSpin).toHaveCount(0, {timeout: 180000});
|
||||
|
|
@ -96,24 +96,23 @@ export class BasePage {
|
|||
}
|
||||
|
||||
async logReferralNumber() {
|
||||
let mainSessionStorage = JSON.parse(await this.page.evaluate('sessionStorage.getItem(\'main\')'));
|
||||
let referralNumber = mainSessionStorage.order.referralNumber as number;
|
||||
let referralSequenceNumber = mainSessionStorage.order.referralSequenceNumber as number;
|
||||
if (referralNumber == null) {
|
||||
for (let i = 1; i <= 20; i++) {
|
||||
if (!referralNumber == null) break;
|
||||
await this.page.waitForTimeout(500);
|
||||
mainSessionStorage = JSON.parse(await this.page.evaluate('localStorage.getItem(\'main\')'));
|
||||
referralNumber = mainSessionStorage.order.referralNumber as number;
|
||||
referralSequenceNumber = mainSessionStorage.order.referralSequenceNumber as number;
|
||||
}
|
||||
let referralNumber: number | null = null;
|
||||
let referralSequenceNumber: number | null = null;
|
||||
for (let i = 0; i < 3; i++) {
|
||||
const main = JSON.parse(await this.page.evaluate(() => sessionStorage.getItem('main')) ?? 'null');
|
||||
referralNumber = main?.order?.referralNumber ?? null;
|
||||
referralSequenceNumber = main?.order?.referralSequenceNumber ?? null;
|
||||
if (referralNumber !== null) break;
|
||||
await this.page.waitForTimeout(500);
|
||||
}
|
||||
if (referralNumber === null) {
|
||||
console.warn('Referral Number could not be retrieved after retries.');
|
||||
return;
|
||||
}
|
||||
|
||||
await test.step(`Referral Number:${referralNumber} Referral Sequence Number:${referralSequenceNumber}`, async () => {
|
||||
console.log(`Referral Number:${referralNumber}`);
|
||||
console.log(`Referral Sequence Number:${referralSequenceNumber}`);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
async validateURL(issPageValue: string) {
|
||||
|
|
@ -132,6 +131,6 @@ export class BasePage {
|
|||
await expect(async () => {
|
||||
const currentUrl = this.page.url();
|
||||
expect(currentUrl).not.toEqual(startingUrl);
|
||||
}).toPass({ timeout: 70_000 });
|
||||
}).toPass({ timeout: 90_000 });
|
||||
}
|
||||
}
|
||||
|
|
@ -11,17 +11,6 @@ export class PartQuestionsPage extends BasePage {
|
|||
this.page = page;
|
||||
}
|
||||
|
||||
async validatePartQuestions(partQuestions: IPartQuestion[]) {
|
||||
for (const pq of partQuestions) {
|
||||
const partQuestionOptions = this.page.locator(`fieldset[aria-labelledby="${pq.partQuestionType}"]`);
|
||||
if (pq.isOnPage) {
|
||||
await expect(partQuestionOptions).toBeAttached();
|
||||
} else {
|
||||
await expect(partQuestionOptions).not.toBeAttached();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async selectPartQuestionResponses(partQuestions: IPartQuestion[]) {
|
||||
for (const pq of partQuestions) {
|
||||
const parentobject=this.page.locator(`fieldset[aria-labelledby="${pq.partQuestionType}"]`);
|
||||
|
|
|
|||
46
playwright-tests/pages/PaymentAdyenPage.ts
Normal file
46
playwright-tests/pages/PaymentAdyenPage.ts
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
import { type Locator, type Page } from '@playwright/test';
|
||||
import { BasePage } from './BasePage';
|
||||
import { IPaymentDetailsAdyen } from '@business-logic/types/CustomerDetails';
|
||||
|
||||
export class PaymentAdyenPage extends BasePage {
|
||||
readonly page: Page;
|
||||
|
||||
readonly cardNumberTextField: Locator;
|
||||
readonly expiryDateTextField: Locator;
|
||||
readonly securityCodeTextField: Locator;
|
||||
readonly billingAddressTextField: Locator;
|
||||
readonly cityTextField: Locator;
|
||||
readonly stateDropDown: Locator;
|
||||
readonly payButton: Locator;
|
||||
|
||||
readonly afterPayButton: Locator;
|
||||
readonly afterPayLaunchButton: Locator;
|
||||
readonly applePayButton: Locator;
|
||||
|
||||
issPageValue = 'payment-page-adyen';
|
||||
|
||||
constructor(page: Page) {
|
||||
super(page);
|
||||
this.page = page;
|
||||
|
||||
//Credit Card Fields
|
||||
this.cardNumberTextField = this.page.locator('iframe[title="Iframe for card number"]').contentFrame().getByRole('textbox', { name: 'Card number' });
|
||||
this.expiryDateTextField = this.page.locator('iframe[title="Iframe for expiry date"]').contentFrame().getByRole('textbox', { name: 'Expiry date' });
|
||||
this.securityCodeTextField = this.page.locator('iframe[title="Iframe for security code"]').contentFrame().getByRole('textbox', { name: 'CVV/CVC' });
|
||||
this.billingAddressTextField = this.page.getByRole('textbox', { name: 'Address' });
|
||||
this.cityTextField = this.page.getByRole('textbox', { name: 'City' });
|
||||
this.stateDropDown = this.page.getByRole('combobox', { name: 'State' });
|
||||
this.payButton = this.page.getByRole('button', { name: 'Pay $' });
|
||||
}
|
||||
|
||||
async populateCreditCardDetails(paymentDetailsAdyen: IPaymentDetailsAdyen){
|
||||
await this.cardNumberTextField.fill(paymentDetailsAdyen.cardNumber!);
|
||||
await this.expiryDateTextField.fill(paymentDetailsAdyen.expirationDate!);
|
||||
await this.securityCodeTextField.fill(paymentDetailsAdyen.cvv!);
|
||||
await this.billingAddressTextField.fill(paymentDetailsAdyen.billingAddress!.street);
|
||||
await this.cityTextField.fill(paymentDetailsAdyen.billingAddress!.city);
|
||||
await this.stateDropDown.fill(paymentDetailsAdyen.billingAddress!.state);
|
||||
await this.stateDropDown.press('Enter');
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,18 +1,24 @@
|
|||
import { expect, type Locator, type Page } from '@playwright/test';
|
||||
import { BasePage } from './BasePage';
|
||||
import { IClaimDetails, IPaymentDetails } from '@business-logic/types/CustomerDetails';
|
||||
import { IClaimDetails, IPaymentDetails, IPaymentDetailsAdyen } from '@business-logic/types/CustomerDetails';
|
||||
import { PaymentType, ServicePackage } from '@business-logic/types/Enums';
|
||||
import { PaymentPage } from './PaymentPage';
|
||||
import { AfterpayPage } from './AfterpayPage';
|
||||
import { PaypalPage } from './PaypalPage';
|
||||
import { PaymentAdyenPage } from './PaymentAdyenPage';
|
||||
|
||||
export class PaymentMethodPage extends BasePage {
|
||||
readonly page: Page;
|
||||
readonly paypalPage: PaypalPage;
|
||||
readonly paymentPage: PaymentPage;
|
||||
readonly paymentAdyenPage: PaymentAdyenPage;
|
||||
|
||||
readonly payNowButton: Locator;
|
||||
readonly paypalButton: Locator;
|
||||
readonly payPalAdyenButton: Locator;
|
||||
readonly payPalLaunchAdyenButton: Locator;
|
||||
readonly afterpayAdyenButton: Locator;
|
||||
readonly afterpayLaunchAdyenButton: Locator;
|
||||
readonly payInFourButton: Locator;
|
||||
readonly payAtAppointmentButton: Locator;
|
||||
|
||||
|
|
@ -28,9 +34,20 @@ export class PaymentMethodPage extends BasePage {
|
|||
this.page = page;
|
||||
this.paypalPage = new PaypalPage(page);
|
||||
this.paymentPage = new PaymentPage(page);
|
||||
this.paymentAdyenPage = new PaymentAdyenPage(page);
|
||||
|
||||
this.payNowButton = this.page.locator('[buttonlabel="Pay now"]'); // credit and paypal options behind this button
|
||||
this.paypalButton = this.page.frameLocator('iframe[name="card-frame"]').locator('div[id="paypalParentDiv"]');
|
||||
|
||||
// Ayden Paypal button
|
||||
this.payPalAdyenButton = this.page.getByRole('radio', { name: 'PayPal' });
|
||||
this.payPalLaunchAdyenButton = this.page.frameLocator('iframe[title="PayPal-paypal"]:first-of-type').locator('div[role="link"][class*="paypal-button"]');
|
||||
|
||||
// Ayden Afterpay buttons
|
||||
this.afterpayAdyenButton = this.page.getByRole('radio', { name: 'Afterpay' });
|
||||
this.afterpayLaunchAdyenButton = this.page.getByRole('button', { name: 'Continue to Afterpay' });
|
||||
|
||||
|
||||
this.payInFourButton = this.page.locator('[buttonlabel="Pay in 4 installments"]'); // Afterpay
|
||||
this.payAtAppointmentButton = this.page.locator('[buttonlabel="Pay at my appointment"]');
|
||||
|
||||
|
|
@ -40,22 +57,24 @@ export class PaymentMethodPage extends BasePage {
|
|||
this.submitButton = this.page.getByRole('button', { name: 'Submit' });
|
||||
}
|
||||
|
||||
async executePayment(paymentDetails: IPaymentDetails, claimDetails: IClaimDetails, servicePackage: ServicePackage) {
|
||||
async executePayment(paymentDetails: IPaymentDetails, paymentDetailsAdyen: IPaymentDetailsAdyen, claimDetails: IClaimDetails, servicePackage: ServicePackage) {
|
||||
const browserContext = this.page.context();
|
||||
|
||||
switch (paymentDetails.paymentType) {
|
||||
case PaymentType.Credit:
|
||||
switch (paymentDetailsAdyen?.paymentType ?? paymentDetails?.paymentType) { case PaymentType.Credit:
|
||||
await this.payNowButton.click();
|
||||
await this.textReminderNoButton.click();
|
||||
await this.continueToCheckoutButton.click();
|
||||
await this.selectCreditCard(paymentDetails);
|
||||
await this.selectCreditCard(paymentDetailsAdyen);
|
||||
break;
|
||||
case PaymentType.Paypal:
|
||||
await this.payNowButton.click();
|
||||
await this.textReminderNoButton.click();
|
||||
await this.continueToCheckoutButton.click();
|
||||
await this.selectPaypal();
|
||||
await this.paypalPage.completePaypalPurchase(paymentDetails);
|
||||
|
||||
const paypalPopup = await this.selectPaypal();
|
||||
const paypalPage = new PaypalPage(paypalPopup);
|
||||
|
||||
await paypalPage.completePaypalPurchase(paymentDetailsAdyen);
|
||||
break;
|
||||
case PaymentType.AfterPay:
|
||||
await this.payInFourButton.click();
|
||||
|
|
@ -63,11 +82,11 @@ export class PaymentMethodPage extends BasePage {
|
|||
await this.continueToCheckoutButton.click();
|
||||
|
||||
// Capture popup
|
||||
const afterpayPopup = await browserContext.waitForEvent('page');
|
||||
const afterpayPage = new AfterpayPage(afterpayPopup);
|
||||
const afterpayPage = await this.selectAfterpayAdyen();
|
||||
const afterpayAdyenPage = new AfterpayPage(afterpayPage);
|
||||
|
||||
// Execute payment
|
||||
await afterpayPage.executeAfterpayPayment(paymentDetails, claimDetails, servicePackage);
|
||||
await afterpayAdyenPage.executeAfterpayPayment(paymentDetailsAdyen, claimDetails, servicePackage);
|
||||
break;
|
||||
|
||||
case PaymentType.PayAtService:
|
||||
|
|
@ -80,13 +99,25 @@ export class PaymentMethodPage extends BasePage {
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
async selectPaypal() {
|
||||
await this.paypalButton.click();
|
||||
async selectAfterpayAdyen(): Promise<Page> {
|
||||
await this.afterpayAdyenButton.click();
|
||||
await this.afterpayLaunchAdyenButton.click();
|
||||
//await this.page.waitForLoadState('networkidle');
|
||||
return this.page;
|
||||
}
|
||||
|
||||
async selectCreditCard(paymentDetails: IPaymentDetails) {
|
||||
await this.paymentPage.populateCreditCardDetails(paymentDetails);
|
||||
async selectPaypal(): Promise<Page> {
|
||||
await this.payPalAdyenButton.click();
|
||||
const paypalPage = this.page.waitForEvent('popup');
|
||||
await this.payPalLaunchAdyenButton.click();
|
||||
const paypalPopup = await paypalPage;
|
||||
await paypalPopup.waitForLoadState();
|
||||
return paypalPopup;
|
||||
}
|
||||
|
||||
async selectCreditCard(paymentDetailsAdyen: IPaymentDetailsAdyen) {
|
||||
await this.paymentAdyenPage.populateCreditCardDetails(paymentDetailsAdyen);
|
||||
await this.paymentAdyenPage.payButton.click();
|
||||
}
|
||||
|
||||
async selectPayAtAppointment() {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
import { type Locator, type Page } from '@playwright/test';
|
||||
import { BasePage } from './BasePage';
|
||||
import { AfterpayPage } from './AfterpayPage';
|
||||
import { IPaymentDetails } from '@business-logic/types/CustomerDetails';
|
||||
|
||||
export class PaymentPage extends BasePage {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { expect, type Locator, type Page } from "@playwright/test";
|
||||
import { BasePage } from "./BasePage";
|
||||
import { IPaymentDetails } from "@business-logic/types/CustomerDetails";
|
||||
import { IPaymentDetailsAdyen } from "@business-logic/types/CustomerDetails";
|
||||
|
||||
export class PaypalPage extends BasePage {
|
||||
readonly page: Page;
|
||||
|
|
@ -13,7 +13,7 @@ export class PaypalPage extends BasePage {
|
|||
constructor(page: Page) {
|
||||
super(page);
|
||||
this.page = page;
|
||||
this.usernameTextBox = page.locator("#email");
|
||||
this.usernameTextBox = page.getByRole("textbox", { name: "Email or mobile number" });
|
||||
this.nextButton = page.getByRole("button", { name: "Next" });
|
||||
this.passwordTextBox = page.getByRole("textbox", { name: "Password" });
|
||||
this.paypalLoginButton = page.getByRole("button", {
|
||||
|
|
@ -23,16 +23,16 @@ export class PaypalPage extends BasePage {
|
|||
this.payButton = page.getByRole("button", { name: "Pay $" });
|
||||
}
|
||||
|
||||
async completePaypalPurchase(paymentDetails: IPaymentDetails) {
|
||||
async completePaypalPurchase(paymentDetailsAdyen: IPaymentDetailsAdyen) {
|
||||
|
||||
await expect(async () => {
|
||||
await this.usernameTextBox.fill(paymentDetails.username!);
|
||||
await this.usernameTextBox.fill(paymentDetailsAdyen.username!);
|
||||
await this.nextButton.waitFor({ state: 'visible', timeout: 5000 });
|
||||
await this.nextButton.click();
|
||||
await expect(this.passwordTextBox).toBeVisible({ timeout: 5000 });
|
||||
}).toPass({ timeout: 30000 });
|
||||
|
||||
await this.passwordTextBox.fill(paymentDetails.password!);
|
||||
await this.passwordTextBox.fill(paymentDetailsAdyen.password!);
|
||||
await this.paypalLoginButton.click();
|
||||
await this.payButton.click();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,11 +45,11 @@ export class PolicyHolderDetailsPage extends BasePage {
|
|||
// For essential flows, when address fields are not pre-filled
|
||||
if (!addressValue || addressValue.trim() === '') {
|
||||
await this.addressInputBox.click();
|
||||
await this.addressInputBox.fill(customerDetails.address.street);
|
||||
await this.addressInputBox.pressSequentially(customerDetails.address.street);
|
||||
|
||||
// Wait for suggestions to load (Google Places has a slight delay)
|
||||
await this.page.locator('.pac-item').first().waitFor({ state: 'visible', timeout: 6000 });
|
||||
|
||||
await this.page.locator('.pac-item').first().waitFor({ state: 'attached', timeout: 6000 });
|
||||
await this.page.locator('.pac-item').first().isVisible();
|
||||
// Click the first result
|
||||
await this.page.locator('.pac-item').first().click();
|
||||
|
||||
|
|
|
|||
|
|
@ -42,6 +42,8 @@ export class ProviderPreferencePage extends BasePage {
|
|||
|
||||
async selectProvider(isSafelite: boolean) {
|
||||
if (isSafelite) {
|
||||
await expect(this.scheduleNowButton).toBeVisible();
|
||||
await expect(this.scheduleNowButton).toBeEnabled();
|
||||
await this.scheduleNowButton.click();
|
||||
await this.nextPage();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,14 +25,19 @@ export class SchedulePage extends BasePage {
|
|||
readonly dateText: Locator;
|
||||
readonly viewMoreDatesLink: Locator;
|
||||
|
||||
readonly recalAcknowledgementModal: Locator;
|
||||
readonly learnMoreLinkRecalAcknowledgementModal: Locator;
|
||||
readonly recalAcknowledgementCheckBox: Locator;
|
||||
readonly continueButtonRecalAcknowledgementModal: Locator;
|
||||
|
||||
readonly continueButton: Locator;
|
||||
|
||||
constructor(page: Page) {
|
||||
super(page);
|
||||
this.page = page;
|
||||
|
||||
this.inShopButton = this.page.locator('[buttonlabel="At a Safelite shop"]');
|
||||
this.mobileButton = this.page.locator('[buttonlabel="Have Safelite come to me"]');
|
||||
this.inShopButton = this.page.getByText('At a Safelite shop');
|
||||
this.mobileButton = this.page.getByText('Have Safelite come to me');
|
||||
// For in shop
|
||||
this.moreLocationsButton = this.page.getByRole('button', { name: 'More Locations' });
|
||||
// For mobile
|
||||
|
|
@ -50,6 +55,12 @@ export class SchedulePage extends BasePage {
|
|||
this.dateText = this.page.locator('[class="modal-header mb-2 mt-2"]');
|
||||
this.viewMoreDatesLink = this.page.getByRole('button', { name: 'More Right arrow icon' });
|
||||
|
||||
// Recal acknowledgement modal when Safelite cannot recalibrate the vehicle
|
||||
this.recalAcknowledgementModal = this.page.getByLabel('ModalComponentLabel');
|
||||
this.learnMoreLinkRecalAcknowledgementModal = this.page.getByRole('link', { name: 'Learn more' });
|
||||
this.recalAcknowledgementCheckBox = this.page.getByRole('checkbox', { name: /I acknowledge/i });
|
||||
this.continueButtonRecalAcknowledgementModal = this.page.locator('#RecalAckModalWidget').getByRole('button', { name: 'Continue' });
|
||||
|
||||
this.continueButton = this.page.locator('#stacked').locator('button:has-text("Continue")');
|
||||
}
|
||||
|
||||
|
|
@ -77,6 +88,7 @@ export class SchedulePage extends BasePage {
|
|||
await (await this.getFirstNonDropOffTimeSlot()).click();
|
||||
}
|
||||
} else {
|
||||
await this.inShopButton.click();
|
||||
await (await this.getFirstNonDropOffTimeSlot()).click();
|
||||
}
|
||||
} else {
|
||||
|
|
@ -110,4 +122,10 @@ export class SchedulePage extends BasePage {
|
|||
const nonDropOff = timeSlots.filter({ hasNotText: /Drop & Go/i });
|
||||
return nonDropOff.first();
|
||||
}
|
||||
|
||||
async validateRecalAcknowledgementModal() {
|
||||
await this.learnMoreLinkRecalAcknowledgementModal.click();
|
||||
await this.recalAcknowledgementCheckBox.click();
|
||||
await this.continueButtonRecalAcknowledgementModal.click();
|
||||
}
|
||||
}
|
||||
|
|
@ -32,7 +32,7 @@ export class ServicePackagesPage extends BasePage {
|
|||
try {await this.wiperModal.waitFor({ state: 'visible', timeout: 5000 });
|
||||
await this.wiperModalCloseButton.click();
|
||||
} catch {
|
||||
await this.continueButton.click();
|
||||
console.log('Wiper modal not displayed');
|
||||
}
|
||||
} else if (servicePackage === ServicePackage.GlassOnly) {
|
||||
await this.glassOnlyPackageButton.check();
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@ export class TpaSubmitPage extends BasePage {
|
|||
async validateDeductible(claimDetails: IClaimDetails, isUnverifiedPolicyAfterVehicleLookup: boolean, isPolicyFound: boolean) {
|
||||
const deductibleTextValue = await this.deductible.textContent();
|
||||
|
||||
await expect(this.deductible).toBeVisible();
|
||||
|
||||
if (claimDetails.policyDeductible !== -1 && !isUnverifiedPolicyAfterVehicleLookup) {
|
||||
expect.soft(deductibleTextValue).toContain(claimDetails.policyDeductible.toLocaleString());
|
||||
} else
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ export class VehicleLookupPage extends BasePage {
|
|||
readonly addressLookupButton: Locator;
|
||||
readonly licenseLookupButton: Locator;
|
||||
readonly vinLookupPage: VinLookupPage;
|
||||
readonly ratherNotShareVinButton: Locator;
|
||||
readonly vehicleLookupAddressPage: VehicleLookupAddressPage;
|
||||
readonly vehicleLookupLicensePage: VehicleLookupLicensePage;
|
||||
issPageValue = 'vehicle-lookup';
|
||||
|
|
@ -22,6 +23,7 @@ export class VehicleLookupPage extends BasePage {
|
|||
this.vinLookupButton = page.getByLabel('Provide my VIN', { exact: true });
|
||||
this.addressLookupButton = page.getByLabel('Provide my home address', { exact: true });
|
||||
this.licenseLookupButton = page.getByLabel('Provide my license plate #', { exact: true });
|
||||
this.ratherNotShareVinButton = page.getByText(/rather not share my vin/i);
|
||||
this.vinLookupPage = new VinLookupPage(page);
|
||||
|
||||
// this.validateURL(this.url);
|
||||
|
|
@ -41,6 +43,10 @@ export class VehicleLookupPage extends BasePage {
|
|||
await this.selectVinLookup();
|
||||
await this.nextPage();
|
||||
break;
|
||||
case VehicleLookupType.RatherNotShareVin:
|
||||
await this.selectRatherNotShareVin();
|
||||
await this.nextPage();
|
||||
break;
|
||||
default:
|
||||
console.error('VehicleLookupPage >> DATA ISSUE: VehicleLookupType not provided');
|
||||
break;
|
||||
|
|
@ -58,4 +64,8 @@ export class VehicleLookupPage extends BasePage {
|
|||
async selectLicenseLookup(){
|
||||
await this.licenseLookupButton.click();
|
||||
}
|
||||
|
||||
async selectRatherNotShareVin(){
|
||||
await this.ratherNotShareVinButton.click();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ export class VehicleSelectionPage extends BasePage {
|
|||
await this.yearDropdown.selectOption(vehicleDetails.year);
|
||||
await this.yearDropdown.press('Tab');
|
||||
await this.makeDropdown.selectOption(vehicleDetails.make);
|
||||
await expect(this.modelDropdown).toBeEditable({ timeout: 5000 });
|
||||
await expect(this.modelDropdown).toBeEditable({ timeout: 6000 });
|
||||
await this.makeDropdown.press('Tab');
|
||||
await this.modelDropdown.selectOption(vehicleDetails.model);
|
||||
await expect(this.styleDropdown).toBeEditable({ timeout: 2000 });
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ export class VinLookupPage extends BasePage {
|
|||
}
|
||||
}
|
||||
|
||||
async triggerBailout() {
|
||||
async returnToVehicleLookupPage() {
|
||||
await this.continueButton.click();
|
||||
await this.lookupVinForMe.click();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,9 +68,9 @@ export default defineConfig({
|
|||
/* Fail the build on CI if you accidentally left test.only in the source code. */
|
||||
forbidOnly: !!process.env.CI,
|
||||
/* Retry on CI only */
|
||||
retries: process.env.CI ? 1 : 0,
|
||||
retries: process.env.CI ? 2 : 0,
|
||||
/* Opt out of parallel tests on CI. */
|
||||
workers: process.env.CI ? 4 : 5,
|
||||
workers: process.env.CI ? 1 : 5,
|
||||
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
||||
reporter: process.env.CI? [
|
||||
['junit'],
|
||||
|
|
@ -91,9 +91,11 @@ export default defineConfig({
|
|||
baseURL: process.env.BASE_URL || 'https://selfservice.test.glassclaim.com',
|
||||
trace: 'on-first-retry',
|
||||
headless: process.env.CI ? true : false,
|
||||
video: 'off',
|
||||
viewport: { width: 1920, height: 1080 },
|
||||
screenshot: "only-on-failure",
|
||||
actionTimeout: 60_000,
|
||||
navigationTimeout: 60_000
|
||||
actionTimeout: process.env.CI ? 90_000 : 60_000,
|
||||
navigationTimeout: process.env.CI ? 90_000 : 60_000
|
||||
},
|
||||
|
||||
/* Configure projects for major browsers */
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ import advancedScenario0001TestCases from "./advanced/0001a_ReplaceInShopCredit"
|
|||
import advancedScenario0003TestCases from "./advanced/0003a_MobileAfterpay";
|
||||
import essentialReplaceDynamicAdasTests from "./0005_EssentialReplaceDynamicAdas";
|
||||
import essentialReplaceStaticAdasTests from "./0001_EssentialReplaceStatisAdas";
|
||||
import essentialVehicleLookupBailoutTests from "./0020_EssentialVehicleLookupBailout";
|
||||
import essentialPartQuestionsAndNotShareVinTests from "./0020_EssentialPartQuestionsAndNotShareVin";
|
||||
import essentialServiceableBigTruckTestCases from "./0022_EssentialServiceableBigTruck";
|
||||
import essentialNonServiceableBigTruckTestCases from "./0023_EssentialNonServiceableBigTruck";
|
||||
import essentialNonServiceableBigTruckVinTestCases from "./0024_EssentialNonServiceableBigTruckVin";
|
||||
|
|
@ -85,7 +85,7 @@ test.describe.parallel('ISS QA Automation Regression', () => {
|
|||
addSmokeTagToRandomTest(essentialTpaNotEnabledReplace_0017);
|
||||
addSmokeTagToRandomTest(essentialTpaEnabledReplace_0018);
|
||||
addSmokeTagToRandomTest(essentialTpaEnabledReplaceRecal_0019);
|
||||
addSmokeTagToRandomTest(essentialVehicleLookupBailoutTests);
|
||||
addSmokeTagToRandomTest(essentialPartQuestionsAndNotShareVinTests);
|
||||
addSmokeTagToRandomTest(essentialServiceableBigTruckTestCases);
|
||||
addSmokeTagToRandomTest(essentialNonServiceableBigTruckTestCases);
|
||||
addSmokeTagToRandomTest(essentialNonServiceableBigTruckVinTestCases);
|
||||
|
|
@ -131,7 +131,7 @@ test.describe.parallel('ISS QA Automation Regression', () => {
|
|||
for (const testCase of essentialUniqueGlassTests) {
|
||||
test(...prepareTest(testCase, run, options, ruleEngine));
|
||||
}
|
||||
//Scenario 13 //defect# SSR-2009
|
||||
//Scenario 13
|
||||
for (const testCase of essentialReplaceTestCases) {
|
||||
test(...prepareTest(testCase, run, options, ruleEngine));
|
||||
}
|
||||
|
|
@ -160,8 +160,8 @@ test.describe.parallel('ISS QA Automation Regression', () => {
|
|||
test(...prepareTest(testCase, run, options, ruleEngine));
|
||||
}
|
||||
//Scenario 20
|
||||
for (const testCase of essentialVehicleLookupBailoutTests) {
|
||||
test(...prepareTest(testCase, run, options, ruleEngine)); //skipping this until SSR-2004 is fixed
|
||||
for (const testCase of essentialPartQuestionsAndNotShareVinTests) {
|
||||
test(...prepareTest(testCase, run, options, ruleEngine));
|
||||
}
|
||||
// Scenario 22
|
||||
for (const testCase of essentialServiceableBigTruckTestCases) {
|
||||
|
|
@ -191,7 +191,6 @@ test.describe.parallel('ISS QA Automation Regression', () => {
|
|||
}
|
||||
|
||||
// Scenario 0003a
|
||||
// Note: payment will fail in dev. Payment (PIA) works fine in SYS
|
||||
for (const testCase of advancedScenario0003TestCases) {
|
||||
test(...prepareTest(testCase, run, options, ruleEngine));
|
||||
}
|
||||
|
|
@ -256,7 +255,6 @@ test.describe.parallel('ISS QA Automation Regression', () => {
|
|||
}
|
||||
|
||||
// Scenario 0016a
|
||||
// FIXME: Defect was created INSR-2138
|
||||
for (const testCase of advancedScenario0016TestCases) {
|
||||
test(...prepareTest(testCase, run, options, ruleEngine));
|
||||
}
|
||||
|
|
@ -276,7 +274,7 @@ test.describe.parallel('ISS QA Automation Regression', () => {
|
|||
test(...prepareTest(testCase, run, options, ruleEngine));
|
||||
}
|
||||
|
||||
// Scenario 0020a : There's a defect open INSR-2149
|
||||
// Scenario 0020a
|
||||
for (const testCase of advancedScenario0020TestCases) {
|
||||
test(...prepareTest(testCase, run, options, ruleEngine));
|
||||
}
|
||||
|
|
@ -377,11 +375,11 @@ async function runWorkflow(page: Page, testCase: TestCase) {
|
|||
// Destructure data for easy access
|
||||
const { customerDetails, claimDetails, vehicleDetails, addressVehicleDetails, vehicleDamage,
|
||||
appointmentDetails, isSafelite, endorsements,
|
||||
partQuestions, paymentDetails, isNoComp, isItac, isRecalNotification, isUnverifiedPolicyAfterVehicleLookup,
|
||||
partQuestions, paymentDetails, paymentDetailsAdyen, isNoComp, isItac, isRecalNotification, isUnverifiedPolicyAfterVehicleLookup,
|
||||
isRecalWarning, servicePackage, hasOemEndorsement, hasStateLawPopup, otherVehiclesOnPolicy, isUseVehicleFromAddressLookup,
|
||||
isSeparateApptsWarning, vehiclePartQuestions, editVehicleDetails, isAddressLookupValidations,
|
||||
hasMilitaryWarning, capabilityQuestions, isUseVehicleOnPolicy,
|
||||
isVehicleLookupValidations, isMoldingQuestion, isNonServiceable, isNonServiceableVin, isRecalVehicle } = testCase.testData;
|
||||
isVehicleLookupValidations, isMoldingQuestion, isNonServiceable, isNonServiceableVin, isRecalVehicle, isCanSafeliteRecalibrate, isRepairTPA } = testCase.testData;
|
||||
|
||||
let { isPolicyFound } = testCase.testData; // Allow isPolicyFound to be re-assigned
|
||||
|
||||
|
|
@ -573,11 +571,7 @@ async function runWorkflow(page: Page, testCase: TestCase) {
|
|||
});
|
||||
|
||||
await test.step('Click Invalid vin Link', async () => {
|
||||
await vinLookupPage.triggerBailout();
|
||||
});
|
||||
|
||||
await test.step('BailoutPage >> Validate Bailout-' + BailoutCode.VehicleNotFound, async () => {
|
||||
await bailoutPage.validateBailoutDetails(customerDetails!, BailoutCode.VehicleNotFound);
|
||||
await vinLookupPage.returnToVehicleLookupPage();
|
||||
});
|
||||
|
||||
return;
|
||||
|
|
@ -649,14 +643,12 @@ async function runWorkflow(page: Page, testCase: TestCase) {
|
|||
|
||||
if (capabilityQuestions && capabilityQuestions.length > 0) {
|
||||
await capabilityQuestionsPage.validateURL(capabilityQuestionsPage.issPageValue);
|
||||
await capabilityQuestionsPage.validatePartQuestions(capabilityQuestions);
|
||||
await capabilityQuestionsPage.selectPartQuestionResponses(capabilityQuestions);
|
||||
await capabilityQuestionsPage.nextPage();
|
||||
}
|
||||
|
||||
if (partQuestions && partQuestions.length > 0) {
|
||||
await partQuestionsPage.validateURL(partQuestionsPage.issPageValue);
|
||||
await partQuestionsPage.validatePartQuestions(partQuestions);
|
||||
await partQuestionsPage.selectPartQuestionResponses(partQuestions);
|
||||
await partQuestionsPage.nextPage();
|
||||
}
|
||||
|
|
@ -740,7 +732,7 @@ async function runWorkflow(page: Page, testCase: TestCase) {
|
|||
await expect(async () => {
|
||||
await providerPreferencePage.stateLawModalOkayButton.waitFor({ state: 'visible' });
|
||||
await providerPreferencePage.stateLawModalOkayButton.click();
|
||||
}).toPass({ timeout: 30000 });
|
||||
}).toPass({ timeout: 60_000 });
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -796,6 +788,13 @@ async function runWorkflow(page: Page, testCase: TestCase) {
|
|||
await providerPreferencePage.scheduleTPAWithoutAdas();
|
||||
});
|
||||
}
|
||||
|
||||
if (!isSafelite && isRepairTPA) {
|
||||
await test.step('ProviderPreferencePage >> Schedule repair with TPA without Adas', async () => {
|
||||
await providerPreferencePage.validateURL(providerPreferencePage.issPageValue);
|
||||
await providerPreferencePage.scheduleTPAWithoutAdas();
|
||||
});
|
||||
}
|
||||
}
|
||||
// TPA Flow
|
||||
if (!isPolicyFound || !(isItac || isNoComp) || isUnverifiedPolicyAfterVehicleLookup) {
|
||||
|
|
@ -837,13 +836,15 @@ async function runWorkflow(page: Page, testCase: TestCase) {
|
|||
await test.step('SchedulePage >> Select day and time', async () => {
|
||||
await schedulePage.validateURL(schedulePage.issPageValue);
|
||||
|
||||
if (appointmentDetails?.serviceLocation === ServiceLocation.Mobile) {
|
||||
await schedulePage.scheduleMobile(appointmentDetails);
|
||||
if (isCanSafeliteRecalibrate === false) {
|
||||
await schedulePage.validateRecalAcknowledgementModal();
|
||||
await schedulePage.scheduleInShop(appointmentDetails!);
|
||||
} else if (appointmentDetails?.serviceLocation === ServiceLocation.InShop || appointmentDetails?.serviceLocation === ServiceLocation.DropOff) {
|
||||
await schedulePage.scheduleInShop(appointmentDetails!);
|
||||
} else {
|
||||
await schedulePage.scheduleMobile(appointmentDetails!);
|
||||
}
|
||||
|
||||
if (appointmentDetails?.serviceLocation === ServiceLocation.InShop || appointmentDetails?.serviceLocation === ServiceLocation.DropOff) {
|
||||
await schedulePage.scheduleInShop(appointmentDetails);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
|
@ -878,7 +879,7 @@ async function runWorkflow(page: Page, testCase: TestCase) {
|
|||
if (isPolicyFound && (isUseVehicleOnPolicy ?? true) && claimDetails!.policyDeductible > 0) {
|
||||
await test.step('PaymentMethodPage >> Execute Payment', async () => {
|
||||
await paymentMethodPage.validateURL(paymentMethodPage.issPageValue);
|
||||
await paymentMethodPage.executePayment(paymentDetails!, claimDetails!, servicePackage!);
|
||||
await paymentMethodPage.executePayment(paymentDetails!, paymentDetailsAdyen!, claimDetails!, servicePackage!);
|
||||
await paymentMethodPage.nextPage();
|
||||
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,23 +1,31 @@
|
|||
import ClientData from "@business-logic/data/ClientData";
|
||||
import TestCase from "@business-logic/types/TestCase";
|
||||
import { DamageType, ServiceLocation, ServicePackage, VehicleDamage, VehicleLookupType } from "@business-logic/types/Enums";
|
||||
import { DamageType, ServiceLocation, ServicePackage, VehicleDamage, VehicleLookupType, PartQuestionType } from "@business-logic/types/Enums";
|
||||
import { ITestData } from "@business-logic/types/ITestData"
|
||||
import { faker } from "@faker-js/faker";
|
||||
import { getNextWeekday } from "@impl/utils/DateUtils";
|
||||
|
||||
const nextWeekday = getNextWeekday();
|
||||
|
||||
const essentialVehicleLookupBailoutData: Partial<ITestData> = {
|
||||
const essentialPartQuestionsAndNotShareVinData: Partial<ITestData> = {
|
||||
clientTag: 'ALL_ESSENTIAL',
|
||||
isDuplicateClaim: false,
|
||||
isPolicyFound: false,
|
||||
endorsements: [],
|
||||
isReplace: false,
|
||||
partQuestions: undefined,
|
||||
partQuestions: [
|
||||
{
|
||||
partQuestionType: PartQuestionType.GeneralQuestion1,
|
||||
isOnPage: true,
|
||||
optionToSelect: 'Yes'
|
||||
},
|
||||
{
|
||||
partQuestionType: PartQuestionType.GeneralQuestion2,
|
||||
isOnPage: true,
|
||||
optionToSelect: 'Yes'
|
||||
}
|
||||
],
|
||||
isSafelite: true,
|
||||
bailoutFlags: {
|
||||
isVehicleLookupBailout: true
|
||||
},
|
||||
servicePackage: faker.helpers.enumValue(ServicePackage),
|
||||
customerDetails: {
|
||||
firstName: faker.person.firstName(),
|
||||
|
|
@ -43,19 +51,10 @@ const essentialVehicleLookupBailoutData: Partial<ITestData> = {
|
|||
year: '2020',
|
||||
make: 'BMW',
|
||||
model: '740',
|
||||
style: '4 door sedan' // TODO: Check correctness of vehicle style
|
||||
style: '4 door sedan',
|
||||
vehicleLookupType: VehicleLookupType.RatherNotShareVin,
|
||||
},
|
||||
vehicleDamage: [
|
||||
// VehicleDamage.WindshieldThreeChips,
|
||||
VehicleDamage.WindshieldCrack,
|
||||
// VehicleDamage.DriverFrontDoor,
|
||||
// VehicleDamage.DriverQuarterPanel,
|
||||
// VehicleDamage.DriverRearDoor,
|
||||
// VehicleDamage.PassengerFrontDoor,
|
||||
// VehicleDamage.PassengerQuarterPanel,
|
||||
// VehicleDamage.PassengerRearDoor,
|
||||
// VehicleDamage.RearWindow
|
||||
],
|
||||
vehicleDamage: [VehicleDamage.WindshieldCrack],
|
||||
appointmentDetails: {
|
||||
serviceLocation: ServiceLocation.InShop,
|
||||
shopAddress: '6826 Sawmill Rd, Columbus, OH 43235',
|
||||
|
|
@ -65,17 +64,17 @@ const essentialVehicleLookupBailoutData: Partial<ITestData> = {
|
|||
}
|
||||
|
||||
const essentialClients = ClientData.getEssentialClients();
|
||||
const essentialVehicleLookupBailoutTests: TestCase[] = [];
|
||||
const essentialPartQuestionsAndNotShareVinTests: TestCase[] = [];
|
||||
for (const client of essentialClients) {
|
||||
const data = {...essentialVehicleLookupBailoutData};
|
||||
const data = {...essentialPartQuestionsAndNotShareVinData};
|
||||
data.clientTag = client.clientTag;
|
||||
data.isAuthenticationRequired = client.clientFlags.isAuthenticationEnabled ?? false
|
||||
const tc = new TestCase({
|
||||
name: `0020 Essential Vehicle Lookup Bailout Client: "${client.accountName}"`,
|
||||
tags: [`@${client.clientTag}`, `@${client.accountName}`, '@Bailout', '@VehicleLookup', '@Essentials'],
|
||||
name: `0020 Essential Part Questions and Not Share Vin Client: "${client.accountName}"`,
|
||||
tags: [`@${client.clientTag}`, `@${client.accountName}`, '@VehicleLookup', '@Essentials'],
|
||||
testData: data
|
||||
}, undefined, '0020');
|
||||
essentialVehicleLookupBailoutTests.push(tc);
|
||||
essentialPartQuestionsAndNotShareVinTests.push(tc);
|
||||
}
|
||||
|
||||
export default essentialVehicleLookupBailoutTests;
|
||||
export default essentialPartQuestionsAndNotShareVinTests;
|
||||
|
|
@ -13,9 +13,6 @@ const essentialServiceableBigTruckData: Partial<ITestData> = {
|
|||
isPolicyFound: false,
|
||||
endorsements: [],
|
||||
isReplace: true,
|
||||
bailoutFlags: {
|
||||
isHeavyTruckVehicleBailout: true,
|
||||
},
|
||||
vehiclePartQuestions: [
|
||||
{
|
||||
partQuestionType: PartQuestionType.WindshieldColor,
|
||||
|
|
@ -24,6 +21,7 @@ const essentialServiceableBigTruckData: Partial<ITestData> = {
|
|||
},
|
||||
],
|
||||
isSafelite: true,
|
||||
isCanSafeliteRecalibrate: false,
|
||||
servicePackage: faker.helpers.enumValue(ServicePackage),
|
||||
customerDetails: {
|
||||
firstName: faker.person.firstName(),
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ const advancedScenario0001Data: Partial<ITestData> = {
|
|||
shopAddress: undefined,
|
||||
appointmentDate: nextWeekday
|
||||
},
|
||||
paymentDetails: ClientData.getDefaultCreditCardDetails()
|
||||
paymentDetailsAdyen: ClientData.getCreditCardDetailsAdyen()
|
||||
}
|
||||
|
||||
// TODO: Add validation for deductible/covered amount
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ const advancedScenario0002Data: Partial<ITestData> = {
|
|||
shopAddress: undefined,
|
||||
appointmentDate: nextWeekday
|
||||
},
|
||||
paymentDetails: ClientData.getDefaultPaypalDetails()
|
||||
paymentDetailsAdyen: ClientData.getPaypalDetailsAdyen()
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ const advancedScenario0003Data: Partial<ITestData> = {
|
|||
serviceAddress: customerAddress,
|
||||
appointmentDate: nextWeekday
|
||||
},
|
||||
paymentDetails: ClientData.getDefaultAfterpayDetails()
|
||||
paymentDetailsAdyen: ClientData.getAfterpayDetailsAdyen()
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,20 +33,8 @@ const advancedScenario0008Data: Partial<ITestData> = {
|
|||
isDuplicateClaim: false,
|
||||
isPolicyFound: true,
|
||||
isNoComp: false,
|
||||
hasStateLawPopup: true,
|
||||
endorsements: undefined,
|
||||
vehiclePartQuestions: [
|
||||
// {
|
||||
// partQuestionType: PartQuestionType.WindshieldColor,
|
||||
// isOnPage: true,
|
||||
// optionToSelect: 'Green Tint'
|
||||
// },
|
||||
// {
|
||||
// partQuestionType: PartQuestionType.PassengerRearColor,
|
||||
// isOnPage: true,
|
||||
// optionToSelect: 'Green Tint'
|
||||
// },
|
||||
],
|
||||
hasStateLawPopup: false,
|
||||
isRepairTPA: true,
|
||||
isSafelite: false,
|
||||
servicePackage: faker.helpers.enumValue(ServicePackage),
|
||||
customerDetails: customerDetails,
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ const advancedScenario0010Data: Partial<ITestData> = {
|
|||
// },
|
||||
],
|
||||
isSafelite: true,
|
||||
servicePackage: faker.helpers.enumValue(ServicePackage),
|
||||
servicePackage: ServicePackage.Premium,
|
||||
customerDetails: customerDetails,
|
||||
claimDetails: {
|
||||
policyNumber: policyNumber,
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ const advancedScenario0011Data: Partial<ITestData> = {
|
|||
shopAddress: undefined,
|
||||
appointmentDate: nextWeekday
|
||||
},
|
||||
paymentDetails: ClientData.getDefaultPaypalDetails()
|
||||
paymentDetailsAdyen: ClientData.getPaypalDetailsAdyen()
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ const advancedScenario0012Data: Partial<ITestData> = {
|
|||
],
|
||||
partQuestions: undefined,
|
||||
isSafelite: true,
|
||||
servicePackage: faker.helpers.enumValue(ServicePackage),
|
||||
servicePackage: ServicePackage.GlassOnly,
|
||||
customerDetails: customerDetails,
|
||||
claimDetails: {
|
||||
policyNumber: policyNumber,
|
||||
|
|
@ -68,7 +68,7 @@ const advancedScenario0012Data: Partial<ITestData> = {
|
|||
shopAddress: undefined,
|
||||
appointmentDate: nextWeekday
|
||||
},
|
||||
paymentDetails: ClientData.getDefaultAfterpayDetails()
|
||||
paymentDetailsAdyen: ClientData.getAfterpayDetailsAdyen()
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ const advancedScenario0014Data: Partial<ITestData> = {
|
|||
alternateServiceZip: '43016',
|
||||
appointmentDate: nextWeekday
|
||||
},
|
||||
paymentDetails: ClientData.getDefaultAfterpayDetails()
|
||||
paymentDetailsAdyen: ClientData.getAfterpayDetailsAdyen()
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ const advancedScenario0016Data: Partial<ITestData> = {
|
|||
serviceAddress: undefined,
|
||||
appointmentDate: nextWeekday
|
||||
},
|
||||
paymentDetails: ClientData.getDefaultPaypalDetails()
|
||||
paymentDetailsAdyen: ClientData.getPaypalDetailsAdyen()
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ const advancedScenario0018Data: Partial<ITestData> = {
|
|||
shopAddress: undefined,
|
||||
appointmentDate: nextWeekday
|
||||
},
|
||||
paymentDetails: ClientData.getDefaultAfterpayDetails()
|
||||
paymentDetailsAdyen: ClientData.getAfterpayDetailsAdyen()
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ const advancedScenario0019Data: Partial<ITestData> = {
|
|||
serviceAddress: customerAddress,
|
||||
appointmentDate: nextWeekday
|
||||
},
|
||||
paymentDetails: ClientData.getDefaultPaypalDetails()
|
||||
paymentDetailsAdyen: ClientData.getPaypalDetailsAdyen()
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ const advancedScenario0028aData: Partial<ITestData> = {
|
|||
serviceAddress: customerAddress,
|
||||
appointmentDate: nextWeekday
|
||||
},
|
||||
paymentDetails: ClientData.getDefaultCreditCardDetails()
|
||||
paymentDetailsAdyen: ClientData.getCreditCardDetailsAdyen()
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ const advancedScenario0030aData: Partial<ITestData> = {
|
|||
serviceAddress: customerAddress,
|
||||
appointmentDate: nextWeekday
|
||||
},
|
||||
paymentDetails: ClientData.getDefaultCreditCardDetails()
|
||||
paymentDetailsAdyen: ClientData.getCreditCardDetailsAdyen()
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ const advancedScenario0031Data: Partial<ITestData> = {
|
|||
isDuplicateClaim: false,
|
||||
isPolicyFound: true,
|
||||
isNoComp: false,
|
||||
isCanSafeliteRecalibrate: false,
|
||||
hasStateLawPopup: false,
|
||||
endorsements: undefined,
|
||||
vehiclePartQuestions: [
|
||||
|
|
@ -65,7 +66,7 @@ const advancedScenario0031Data: Partial<ITestData> = {
|
|||
shopAddress: undefined,
|
||||
appointmentDate: nextWeekday
|
||||
},
|
||||
paymentDetails: ClientData.getDefaultPaypalDetails()//ClientData.getDefaultCreditCardDetails()
|
||||
paymentDetailsAdyen: ClientData.getPaypalDetailsAdyen()
|
||||
}
|
||||
|
||||
// TODO: Add validation for deductible/covered amount
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ const advancedScenario0032Data: Partial<ITestData> = {
|
|||
shopAddress: undefined,
|
||||
appointmentDate: nextWeekday
|
||||
},
|
||||
paymentDetails: ClientData.getDefaultPaypalDetails(),//ClientData.getDefaultCreditCardDetails()
|
||||
paymentDetailsAdyen: ClientData.getPaypalDetailsAdyen(),
|
||||
isNonServiceable: true,
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,21 @@
|
|||
"settings": {
|
||||
"DisplayPIAInsurance": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"universeName": "NextGenAdyenPaymentTest",
|
||||
"universeId": 848,
|
||||
"testName": "NextGenAdyenPaymentIntegration_V1",
|
||||
"testId": 727,
|
||||
"variationName": "YesShowAdyenPaymentIntergration_V1_TEST",
|
||||
"variationId": 1855,
|
||||
"isActive": true,
|
||||
"isExposed": true,
|
||||
"userPartitionNumber": 26,
|
||||
"assignmentId": 16698635,
|
||||
"settings": {
|
||||
"ISS_Enable_Adyen_V1": "true"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -14,6 +14,21 @@
|
|||
"settings": {
|
||||
"DisplayPIAInsurance": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"universeName": "NextGenAdyenPaymentTest",
|
||||
"universeId": 848,
|
||||
"testName": "NextGenAdyenPaymentIntegration_V1",
|
||||
"testId": 727,
|
||||
"variationName": "YesShowAdyenPaymentIntergration_V1_TEST",
|
||||
"variationId": 1855,
|
||||
"isActive": true,
|
||||
"isExposed": true,
|
||||
"userPartitionNumber": 26,
|
||||
"assignmentId": 16698635,
|
||||
"settings": {
|
||||
"ISS_Enable_Adyen_V1": "true"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
Loading…
Reference in a new issue