qe-fe-automation
Version:
FE test automation framework using cypress
296 lines (272 loc) • 11.2 kB
text/typescript
import {
Utility,
Random,
TripTileType,
utilitySelector,
Timeouts
} from '@utility-lib/index';
import { HotelInvoiceValidation } from '@commerce-lib/hotels/invoice_validation';
export const hotelCheckoutSelector = {
hotelBookingPolicyContinue:
'[qaid="hotelCheckoutBookingPolicy"] ta-info-banner [class^="info-banner__right"] [theme="primary"] div.ta-button__content',
phoneNumber: '[class^="hotel-checkout__phone-number"] .ta-button__content',
acceptAcknowledgement: 'ta-hotel-checkout-summary .info-banner__checkbox',
bookNow: '[class^="info-banner__right"] .ta-button__content',
bookingSuccessMsg: '.booking-success .booking-success__left__title',
outOfPolicy: '[qaid="hotelCheckoutOutOfPolicy"]',
outOfPolicyReasonSubmit: '[formcontrolname="reason"]',
outOfPolicyAcknowledgment:
'[qaid="hotelCheckoutOutOfPolicy"] .mat-checkbox-inner-container',
outOfPolicyContinue: '[qaid="hotelCheckoutOutOfPolicy"] .ta-button__content',
numberOfRooms:
'.hotel-in-this-booking__breakdown__room-nums .hotel-in-this-booking__medium',
numberOfGuests:
'.hotel-in-this-booking__breakdown__guests .hotel-in-this-booking__medium',
closeBookingSuccessModel:
'.booking-success [qaid="bookingSuccessClose"] .booking-success__close__icon',
bookCarPopup: 'div.booking-success__close ta-svg-image div',
vaccine: 'ta-vaccination-proof',
vaccineAcknowledgement: '[titleicon = "vaccine"] [class^= "info-banner__left"]',
acceptVaccineAcknowledgement: '[titleicon="vaccine"] [qaid="infoBannerPrimaryButton"]',
hotelCancellationAndChargePolicy:
'[qaid="hotelCheckoutBookingPolicy"] .ta-button__content',
requireDataSection: 'ta-checkout-traveler-require-data',
requireDataEmail: 'ta-checkout-traveler-require-data input[type="email"]',
requireDataSave: 'ta-checkout-traveler-require-data ta-button[theme="primary"]',
paymentMethodCard: '[class^="ta-payment-card__image"]',
paymentDue: '.payment-schedule__item__amount',
paymentDueItem: '[qaid="hotelPaymentScheduleTotalDueNow"]',
paymentDueAdditionalMessage: '.payment-schedule__description',
approvalButton: '.hard-approval-explanation-modal button ',
customFields: '[qaid="tripCheckoutCustomField"]',
yourPolicy: '[headerprimarybuttonlabel="Your policy"] [qaid="infoBannerPrimaryButton"]',
saveTripInfo: '[qaid="tripCheckoutCreateButton"]',
checkoutHeading: '.hotel-checkout__heading'
};
export class HotelCheckout {
static waitToBeLoaded(matchingTrips = true): void {
cy.allure().logStep('wait for hotel checkout page APIs to complete');
cy.wait('@waitForHotelContract');
if (matchingTrips) cy.wait('@waitForMatchingTrips');
}
static checkForHotelCheckoutHeading(): void {
cy.get(hotelCheckoutSelector.checkoutHeading, {
timeout: Timeouts.MEDIUM_TIMEOUT_10_SEC.timeout
}).should('be.visible');
}
static setTripInfo() {
cy.wait(Timeouts.MEDIUM_TIMEOUT_10_SEC.timeout);
cy.get(hotelCheckoutSelector.paymentMethodCard).should('be.visible');
Utility.saveTripInformation();
const maxRetryCount = 3;
let retryCount = 0;
cy.get(utilitySelector.bodySelector).then(($body) => {
if ($body.find(hotelCheckoutSelector.saveTripInfo).length > 0) {
Utility.saveTripInformation();
} else {
retryCount++;
if (retryCount < maxRetryCount) {
cy.wait(Timeouts.SHORT_TIMEOUT_5_SEC.timeout);
Utility.saveTripInformation();
} else {
cy.log('Trip info is not loaded on hotel checkout');
}
}
});
}
static verifyCustomFieldsInTripPurpose() {
cy.allure().logStep('verify custom fields in trip purpose');
cy.get(hotelCheckoutSelector.customFields).should('be.visible');
}
static createNewTripInfo() {
Utility.createNewTrip();
this.setTripInfo();
}
static acceptHotelBookingPolicy() {
cy.get(utilitySelector.bodySelector).then((body) => {
if (body.find(hotelCheckoutSelector.hotelBookingPolicyContinue).length > 0) {
cy.allure().logStep('continue hotel booking policy');
cy.get(
hotelCheckoutSelector.hotelBookingPolicyContinue,
Timeouts.MAX_TIMEOUT_120_SEC
).click();
cy.log('Hotel policy accepted');
} else {
cy.allure().logStep('Hotel policy not required');
cy.log('Hotel policy not required');
}
});
this.acceptYourPolicy();
}
static acceptOutOfPolicyHotelWithReason() {
cy.get(utilitySelector.bodySelector).then((body) => {
if (body.find(hotelCheckoutSelector.hotelBookingPolicyContinue).length > 0) {
cy.allure().logStep('continue hotel booking policy');
cy.get(
hotelCheckoutSelector.hotelBookingPolicyContinue,
Timeouts.MAX_TIMEOUT_120_SEC
).click();
cy.log('Hotel policy accepted');
} else {
cy.allure().logStep('Hotel policy not required');
cy.log('Hotel policy not required');
}
});
HotelCheckout.expectOutOfPolicyReasonIsPresent();
HotelCheckout.setOutOfPolicyReasonIfRequired();
}
static acceptYourPolicy() {
cy.get(utilitySelector.bodySelector).then((body) => {
if (body.find(hotelCheckoutSelector.yourPolicy).length > 0) {
cy.allure().logStep('continue policy is within range');
cy.get(hotelCheckoutSelector.yourPolicy, Timeouts.MAX_TIMEOUT_120_SEC).click();
cy.log('continue policy is within range');
} else {
cy.allure().logStep('continue policy not found');
cy.log('Hotel policy not found');
}
});
}
static hotelCancellationAndChargePolicy() {
cy.wait('@waitForPaymentMethods');
cy.get(utilitySelector.bodySelector).then((body) => {
if (body.find(hotelCheckoutSelector.hotelCancellationAndChargePolicy).length > 0) {
cy.allure().logStep('continue hotel booking policy');
cy.log('Hotel cancellation accepted');
cy.get(
hotelCheckoutSelector.hotelCancellationAndChargePolicy,
Timeouts.MAX_TIMEOUT_120_SEC
)
.contains(' Continue ')
.click();
} else {
cy.allure().logStep('Hotel cancellation policy not required');
cy.log('Hotel cancellation policy not required');
}
});
}
static setPhoneNumber() {
cy.get(utilitySelector.bodySelector).then((phoneNumber) => {
if (phoneNumber.find(hotelCheckoutSelector.phoneNumber).length > 0) {
cy.allure().logStep('Set phone number');
cy.get(hotelCheckoutSelector.phoneNumber, Timeouts.MAX_TIMEOUT_120_SEC).click();
} else {
cy.allure().logStep('Phone number not required');
cy.log('Phone number not required');
}
});
}
static checkIfProofOfVaccineRequired() {
cy.get(utilitySelector.bodySelector).then((vaccine) => {
if (vaccine.find(hotelCheckoutSelector.vaccine).length > 0) {
cy.allure().logStep('vaccine acknowledgement found');
cy.get(
hotelCheckoutSelector.vaccineAcknowledgement,
Timeouts.MAX_TIMEOUT_120_SEC
).click();
cy.get(hotelCheckoutSelector.acceptVaccineAcknowledgement).click();
} else {
cy.allure().logStep('vaccine acknowledgement not required');
cy.log('vaccine acknowledgement not required');
}
});
}
static setOutOfPolicyReasonIfRequired() {
cy.get(utilitySelector.bodySelector).then((outOfPolicyReason) => {
if (outOfPolicyReason.find(hotelCheckoutSelector.outOfPolicy).length > 0) {
cy.allure().logStep('Accept Acknowledgement');
cy.get(
hotelCheckoutSelector.outOfPolicyReasonSubmit,
Timeouts.MAX_TIMEOUT_120_SEC
).then((ele) => {
cy.wrap(ele).type('need to book urgent');
cy.wrap(ele).click();
});
cy.get(hotelCheckoutSelector.outOfPolicyAcknowledgment).click();
cy.get(hotelCheckoutSelector.outOfPolicyContinue).contains(' Continue ').click();
} else {
cy.allure().logStep('Acknowledgement not required');
cy.log('Acknowledgement not required');
}
});
}
static expectOutOfPolicyReasonIsPresent() {
cy.get(hotelCheckoutSelector.outOfPolicyReasonSubmit).should('be.exist');
cy.allure().logStep('Out of policy reason is present');
}
static acceptAcknowledgement() {
cy.allure().logStep('accept acknowledgement');
cy.get(hotelCheckoutSelector.acceptAcknowledgement).click();
}
static bookNow() {
cy.allure().logStep('book hotel');
cy.get(hotelCheckoutSelector.bookNow).last().click();
cy.wait('@waitForCheckout');
}
static expectHotelBookedSuccessfully(successMsg: string) {
cy.get(hotelCheckoutSelector.bookingSuccessMsg, Timeouts.MAX_TIMEOUT_120_SEC).should(
'be.contain',
`${successMsg}`
);
cy.allure().logStep('Hotel booked successfully');
HotelCheckout.closeBookingSuccessModel();
}
static expectNumberOfRooms(numOfRooms: number) {
cy.get(hotelCheckoutSelector.numberOfRooms).contains(numOfRooms);
}
static expectNumberOfGuests(numOfGuests: number) {
cy.get(hotelCheckoutSelector.numberOfGuests).contains(numOfGuests);
}
static closeBookingSuccessModel() {
cy.allure().logStep('close booking success model');
cy.get(
hotelCheckoutSelector.closeBookingSuccessModel,
Timeouts.MAX_TIMEOUT_120_SEC
).click({
force: true
});
}
static expectPrepayHotelRoomDueNowIsNotZero() {
cy.allure().logStep(`expect prepay hotel room due now is not zero`);
cy.get(utilitySelector.bodySelector).then(($body) => {
if ($body.find(hotelCheckoutSelector.paymentDueItem).length) {
cy.get(hotelCheckoutSelector.paymentDueItem).should('not.contain', `$0.0`);
} else {
cy.get(hotelCheckoutSelector.paymentDueAdditionalMessage).contains(
'Payment may be charged at booking or check-in.'
);
}
});
}
static updateEmailDetails(email: string) {
cy.allure().logStep('checking if personal email required');
cy.get(utilitySelector.bodySelector).then(($body) => {
if ($body.find(hotelCheckoutSelector.requireDataSection).length) {
cy.allure().logStep('enter required email details');
cy.get(hotelCheckoutSelector.requireDataEmail).type(email);
cy.get(hotelCheckoutSelector.requireDataSave).click();
}
});
}
static checkoutFLow(tripTileType: TripTileType) {
this.createNewTripInfo();
HotelCheckout.hotelCancellationAndChargePolicy();
HotelCheckout.acceptHotelBookingPolicy();
HotelCheckout.setPhoneNumber();
HotelCheckout.checkIfProofOfVaccineRequired();
if (tripTileType === 'Personal') {
HotelCheckout.updateEmailDetails(
'personal-' + Random.randomString(12) + '@staging-prime.tripactions.xyz'
);
}
HotelCheckout.acceptAcknowledgement();
HotelInvoiceValidation.storeBookingData();
HotelCheckout.bookNow();
}
static bookNowAndAskForApproval() {
cy.allure().logStep('Book now and ask for approval');
cy.get(hotelCheckoutSelector.bookNow).last().click();
cy.get(hotelCheckoutSelector.approvalButton).last().click();
cy.wait('@waitForCheckout');
}
}