qe-fe-automation
Version:
FE test automation framework using cypress
205 lines (183 loc) • 8.19 kB
text/typescript
import { HotelCheckout, HotelSearchResults } from '@hotel-lib/index';
import { EventDetails } from 'cypress/e2e/gme/group_events/lib/event_details';
import { Timeouts } from '@utility-lib/index';
const homePageSelectors = {
homepageUrl: '/app/user2/home',
navanHome: '.navan-home',
hotelUpsellCard: '.hotel-upsell__info__hotels',
dismissSpecialTrip: '.hotel-upsell__action__cancel span',
expenseSubtab: '[data-testid="expenseSubtab"]',
expenseMenuItem: '[qaid="LIQUID_EXPENSES-menu-item"]',
expenseSubtabActions:
'[qaid="LIQUID_EXPENSES-menu-item"] > .entry-point-container__card__action',
groupTravelSubtab: '[data-testid="groupTravelSubtab"]',
platformDropDown: '[data-qaid="PLATFORM_SWITCHER-button"]',
rewardsSubtab: '[data-testid="rewardsSubtab"]',
rewardsSubtabBalance:
'[data-testid="rewardsSubtab"] > .entry-point-container__card__amount',
searchExpandedForm: '.search-form-container--show',
searchFlightToggle: 'button[aria-label="Flights"]',
searchFlightFromField: 'ta-airport-search-v2 input[aria-label="From"]',
searchMinimizedForm: '.search-form-container-minimized--show',
searchMinimizedText: '.search-form-container-minimized__fake-form__text',
searchBusinessToggle: 'button[aria-label="Business"]',
searchBusinessTheme: '.home-illustration__mask-container__mask-main--flat-business',
searchPersonalToggle: 'button[aria-label="Personal"]',
searchPersonalTheme: '.home-illustration__mask-container__mask-main--flat-personal',
searchRecentEntry: '.ta-recent-search-item',
searchClearHistory: '.ta-recent-search-title__clear',
specialTripImage: '.special-trip-card__trip__img',
upcomingEventDraft: '.upcoming-event-card__info__draft',
upcomingEventInvite: '.upcoming-invitation-card',
upcomingTripCard: '.upcoming-trip-card',
upcomingTripFlightIcon: 'ta-icon[icon="booking-type-flight"]',
upcomingTripHotelIcon: 'ta-icon[icon="booking-type-hotel"]',
userNameNavigation: '.ta-user-menu__name--user-name',
hotelUpselInfo: (index: number) => `.hotel-upsell__info__hotels > :nth-child(${index})`
};
export class HomePage {
static visitHomePage(): void {
cy.allure().logStep('Visit home page');
cy.visit(homePageSelectors.homepageUrl);
}
static verifyHomePage(): void {
cy.allure().logStep('Verify home page');
cy.get(homePageSelectors.navanHome).should('be.visible');
cy.url().then((url) => {
expect(url).to.include(homePageSelectors.homepageUrl);
});
}
static verifyTravelOnly(): void {
cy.visit(homePageSelectors.homepageUrl);
cy.allure().logStep('Visit travel-only home page');
// Checks the home page if the Navan Expense card is present
cy.get(homePageSelectors.expenseSubtab).should('not.exist');
// Checks the plaform dropdown if Expense links are present
cy.get(homePageSelectors.platformDropDown).click();
cy.get(homePageSelectors.expenseMenuItem).should('not.exist');
}
static verifyMinimizedSearch(): void {
cy.visit(homePageSelectors.homepageUrl);
cy.allure().logStep('Verify minimized search form on home page');
cy.get(homePageSelectors.searchMinimizedForm).should('be.visible');
}
static expandSearchForm(): void {
cy.allure().logStep('Open and verify expanded search form on home page');
cy.get(homePageSelectors.searchMinimizedText).click();
cy.get(homePageSelectors.searchExpandedForm).should('exist');
}
static toggleBusinessPersonalSearch(): void {
cy.allure().logStep(
'Confirm inital theme is business, and verify personal/business theme transition'
);
cy.get(homePageSelectors.searchBusinessTheme).should('be.visible');
cy.get(homePageSelectors.searchPersonalToggle).click();
cy.get(homePageSelectors.searchPersonalTheme).should('be.visible');
cy.get(homePageSelectors.searchBusinessToggle).click();
cy.get(homePageSelectors.searchBusinessTheme).should('be.visible');
}
static verifySearchHistory(): void {
cy.allure().logStep('Confirm booking appears in search history');
cy.visit(homePageSelectors.homepageUrl);
cy.get(homePageSelectors.searchMinimizedText).click();
cy.get(homePageSelectors.searchFlightToggle).click();
cy.get(homePageSelectors.searchFlightFromField).click();
cy.get(homePageSelectors.searchRecentEntry).should('be.visible');
}
static clearSearchHistory(): void {
cy.allure().logStep('Confirm search history is cleared');
cy.get(homePageSelectors.searchFlightFromField).click();
cy.wait(Timeouts.SHORT_TIMEOUT_3_SEC.timeout);
cy.get(homePageSelectors.searchClearHistory).should('be.visible').click();
cy.get(homePageSelectors.searchFlightFromField).click();
cy.get(homePageSelectors.searchRecentEntry).should('not.exist');
}
static verifySpecialTripSuggestions(): void {
cy.allure().logStep(
'Confirm special trip card displays relevant booking suggestions'
);
cy.get(homePageSelectors.hotelUpsellCard).should('be.visible');
}
static bookHotelSuggestion(index: number): void {
cy.allure().logStep(`Booking suggestion ${index}`);
cy.get(this.hotelSuggestion(index)).click();
HotelSearchResults.selectHotel(0);
HotelSearchResults.selectRoomOption();
HotelCheckout.waitToBeLoaded(false);
HotelCheckout.acceptHotelBookingPolicy();
HotelCheckout.setPhoneNumber();
HotelCheckout.checkIfProofOfVaccineRequired();
HotelCheckout.acceptAcknowledgement();
HotelCheckout.bookNow();
HotelCheckout.expectHotelBookedSuccessfully('Hotel confirmed!');
}
static dismissSpecialTripCard(): void {
cy.allure().logStep('Dismiss special trip card by tapping Not Now');
cy.get(homePageSelectors.dismissSpecialTrip).click();
}
static verifyNoSpecialTripCard(): void {
cy.allure().logStep('Confirm special trip card no longer present');
cy.get(homePageSelectors.specialTripImage).should('not.exist');
}
static verifyUpcomingTripCardBookings(): void {
cy.allure().logStep('Confirm upcoming trip card displays two booking types');
cy.get(homePageSelectors.upcomingTripCard).should('exist');
cy.get(homePageSelectors.upcomingTripFlightIcon).should('exist');
cy.get(homePageSelectors.upcomingTripHotelIcon).should('exist');
}
static verifyUpcomingEventDraftCard(): void {
cy.allure().logStep('Confirm upcoming event draft card is present');
cy.get(homePageSelectors.upcomingEventDraft).should('exist');
}
static verifyUpcomingEventInviteCard(): void {
cy.allure().logStep('Confirm upcoming event invite card is present');
cy.get(homePageSelectors.upcomingEventInvite).should('exist');
}
static openUpcomingEventDraftCard(): void {
cy.allure().logStep('Open upcoming event draft card');
cy.get(homePageSelectors.upcomingEventDraft).click();
}
static hotelSuggestion(index: number): string {
return homePageSelectors.hotelUpselInfo(index);
}
static inviteSelfToEvent() {
cy.get(homePageSelectors.userNameNavigation)
.invoke('text')
.then((text) => {
EventDetails.openAddParticipantsModal();
EventDetails.typeAndAddOneParticipant(text);
EventDetails.sendInvite();
EventDetails.visitHomePage();
});
}
static verifyRewardsSubtab() {
cy.wait('@userRewards')
.its('response.body')
.then((body) => {
const points = Object.values(body.balanceDollar).toString();
cy.get(homePageSelectors.rewardsSubtabBalance)
.invoke('text')
.then((text) => {
const rewards = text?.toString().replace(/\D/g, '');
expect(rewards).to.equal(points);
});
});
}
static verifyExpenseSubtab() {
cy.wait('@expenseTodos')
.its('response.body')
.then((body: Record<string, number>) => {
const totalNumber = parseInt(
Object.values(body)
.reduce((a, b) => a + b, 0)
.toString()
);
cy.get(homePageSelectors.expenseSubtabActions)
.invoke('text')
.then((text) => {
const actions = text?.toString().replace(/\D/g, '');
expect(actions).to.equal(totalNumber);
});
});
}
}