[CYS - E2E tests] Add E2E tests for the loading screen (#45804)
* CYS: initial E2E tests loading page * add more cases * Add changefile(s) from automation for the following project(s): woocommerce --------- Co-authored-by: github-actions <github-actions@github.com>
This commit is contained in:
parent
b8bd480faf
commit
c2a3abae51
|
@ -0,0 +1,4 @@
|
|||
Significance: patch
|
||||
Type: dev
|
||||
Comment: [CYS - E2E tests] Add E2E tests for the loading screen
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
export class AssemblerPage {
|
||||
page;
|
||||
constructor( { page } ) {
|
||||
this.page = page;
|
||||
}
|
||||
|
||||
async setupSite( baseUrl ) {
|
||||
const DESIGN_URL =
|
||||
baseUrl +
|
||||
'/wp-admin/admin.php?page=wc-admin&path=%2Fcustomize-store%2Fdesign';
|
||||
await this.page.goto( DESIGN_URL );
|
||||
}
|
||||
|
||||
async waitForLoadingScreenFinish() {
|
||||
const frame = this.page.frameLocator(
|
||||
'.cys-fullscreen-iframe[style="opacity: 1;"]'
|
||||
);
|
||||
|
||||
await frame.getByRole( 'button', { name: 'Done' } ).waitFor();
|
||||
}
|
||||
|
||||
/**
|
||||
* When the user passes for the loading screen, the assembler is loaded in an iframe.
|
||||
* Otherwise it is loaded in the page itself.
|
||||
*
|
||||
* @return {(Promise<import('playwright').Frame> | Promise<import('playwright').Page>)} The assembler page or the iframe where the assembler is loaded.
|
||||
*/
|
||||
async getAssembler() {
|
||||
const selector = '.cys-fullscreen-iframe[style="opacity: 1;"]';
|
||||
|
||||
if ( await this.page.isVisible( selector ) ) {
|
||||
return this.page.frameLocator( selector );
|
||||
}
|
||||
return this.page;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,106 @@
|
|||
const { test: base, expect } = require( '@playwright/test' );
|
||||
const { AssemblerPage } = require( '../assembler/assembler.page' );
|
||||
const {
|
||||
createRequestsToSetupStoreDictionary,
|
||||
setupRequestInterceptor,
|
||||
} = require( './loading-screen.utils' );
|
||||
|
||||
const test = base.extend( {
|
||||
pageObject: async ( { page }, use ) => {
|
||||
const pageObject = new AssemblerPage( { page } );
|
||||
await use( pageObject );
|
||||
},
|
||||
} );
|
||||
|
||||
const steps = [
|
||||
'Setting up the foundations',
|
||||
'Turning on the lights',
|
||||
'Opening the doors',
|
||||
];
|
||||
|
||||
test.describe( 'Assembler - Loading Page', () => {
|
||||
test.use( { storageState: process.env.ADMINSTATE } );
|
||||
|
||||
test( 'should display loading screen and steps on first run', async ( {
|
||||
pageObject,
|
||||
baseURL,
|
||||
page,
|
||||
} ) => {
|
||||
await pageObject.setupSite( baseURL );
|
||||
|
||||
const requestToSetupStore = createRequestsToSetupStoreDictionary();
|
||||
|
||||
setupRequestInterceptor( page, requestToSetupStore );
|
||||
|
||||
for ( const step of steps ) {
|
||||
await expect(
|
||||
page.locator( '.woocommerce-onboarding-loader' )
|
||||
).toBeVisible();
|
||||
await expect( page.getByText( step ) ).toBeVisible();
|
||||
await expect( page.getByAltText( step ) ).toBeVisible();
|
||||
}
|
||||
|
||||
expect( Object.values( requestToSetupStore ) ).toEqual( [
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
] );
|
||||
|
||||
await pageObject.waitForLoadingScreenFinish();
|
||||
} );
|
||||
|
||||
test( 'should redirect to intro page in case of errors', async ( {
|
||||
pageObject,
|
||||
baseURL,
|
||||
page,
|
||||
} ) => {
|
||||
await pageObject.setupSite( baseURL );
|
||||
|
||||
const requestToSetupStore = createRequestsToSetupStoreDictionary();
|
||||
|
||||
// Abort one of the requests to simulate an error.
|
||||
await page.route(
|
||||
requestToSetupStore[ Math.floor( Math.random() * 3 ) ],
|
||||
( route ) => route.abort()
|
||||
);
|
||||
|
||||
setupRequestInterceptor( page, requestToSetupStore );
|
||||
|
||||
await expect(
|
||||
page
|
||||
.locator( '#woocommerce-layout__primary' )
|
||||
.getByText(
|
||||
'Oops! We encountered a problem while setting up the foundations. Please try again or start with a theme.'
|
||||
)
|
||||
).toBeVisible();
|
||||
} );
|
||||
|
||||
test( 'should hide loading screen and steps on subsequent runs', async ( {
|
||||
pageObject,
|
||||
baseURL,
|
||||
page,
|
||||
} ) => {
|
||||
await pageObject.setupSite( baseURL );
|
||||
await pageObject.waitForLoadingScreenFinish();
|
||||
|
||||
const assembler = await pageObject.getAssembler();
|
||||
await assembler.getByRole( 'button', { name: 'Skip' } ).click();
|
||||
await assembler.getByRole( 'button', { name: 'Done' } ).click();
|
||||
await pageObject.setupSite( baseURL );
|
||||
|
||||
const requestToSetupStore = createRequestsToSetupStoreDictionary();
|
||||
|
||||
setupRequestInterceptor( page, requestToSetupStore );
|
||||
|
||||
for ( const step of steps ) {
|
||||
await expect( page.getByText( step ) ).toBeHidden();
|
||||
await expect( page.getByAltText( step ) ).toBeHidden();
|
||||
}
|
||||
|
||||
expect( Object.values( requestToSetupStore ) ).toEqual( [
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
] );
|
||||
} );
|
||||
} );
|
|
@ -0,0 +1,23 @@
|
|||
const setupRequestInterceptor = ( page, requestToSetupStore ) => {
|
||||
page.on( 'request', ( request ) => {
|
||||
const url = request.url();
|
||||
const requestAssembler = Object.keys( requestToSetupStore ).find(
|
||||
( key ) => url.includes( key )
|
||||
);
|
||||
|
||||
if ( requestToSetupStore[ requestAssembler ] !== undefined ) {
|
||||
requestToSetupStore[ requestAssembler ] = true;
|
||||
}
|
||||
} );
|
||||
};
|
||||
|
||||
const createRequestsToSetupStoreDictionary = () => ( {
|
||||
'onboarding/themes/install?theme=twentytwentyfour': false,
|
||||
'onboarding/products': false,
|
||||
'themes/activate?theme=twentytwentyfour&theme_switch_via_cys_ai_loader': false,
|
||||
} );
|
||||
|
||||
module.exports = {
|
||||
setupRequestInterceptor,
|
||||
createRequestsToSetupStoreDictionary,
|
||||
};
|
Loading…
Reference in New Issue