CYS - E2E tests: Add color picker E2E tests (#45926)

* CYS - E2E tests: Add color picker E2E tests

* remove not necessary changes

* fix E2E tests

* re-add beforeEach

* fix E2E tests

* improve test assertation

* add comment

* Add changefile(s) from automation for the following project(s): woocommerce

* fix E2E tests

* don't print error

* fix E2E tests

---------

Co-authored-by: github-actions <github-actions@github.com>
This commit is contained in:
Luigi Teschio 2024-03-27 13:01:26 +01:00 committed by GitHub
parent 6ddbbae207
commit 11c31c2312
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 255 additions and 28 deletions

View File

@ -0,0 +1,4 @@
Significance: patch
Type: dev
Comment: CYS - E2E tests: Add color picker E2E tests

View File

@ -1,6 +1,5 @@
const { test, expect, request } = require( '@playwright/test' ); const { test, expect, request } = require( '@playwright/test' );
const { BASE_URL } = process.env; const { BASE_URL } = process.env;
const { features } = require( '../../utils' );
const { activateTheme } = require( '../../utils/themes' ); const { activateTheme } = require( '../../utils/themes' );
const { setOption } = require( '../../utils/options' ); const { setOption } = require( '../../utils/options' );
@ -29,6 +28,7 @@ test.describe( 'Store owner can view Assembler Hub for store customization', ()
test.use( { storageState: process.env.ADMINSTATE } ); test.use( { storageState: process.env.ADMINSTATE } );
test.beforeAll( async ( { baseURL } ) => { test.beforeAll( async ( { baseURL } ) => {
try {
// In some environments the tour blocks clicking other elements. // In some environments the tour blocks clicking other elements.
await setOption( await setOption(
request, request,
@ -36,16 +36,10 @@ test.describe( 'Store owner can view Assembler Hub for store customization', ()
'woocommerce_customize_store_onboarding_tour_hidden', 'woocommerce_customize_store_onboarding_tour_hidden',
'yes' 'yes'
); );
await features.setFeatureFlag(
request,
baseURL,
'customize-store',
true
);
// Need a block enabled theme to test
await activateTheme( 'twentytwentythree' ); await activateTheme( 'twentytwentythree' );
} catch ( error ) {
console.log( 'Store completed option not updated' );
}
} ); } );
test.beforeEach( async ( { baseURL } ) => { test.beforeEach( async ( { baseURL } ) => {
@ -57,13 +51,11 @@ test.describe( 'Store owner can view Assembler Hub for store customization', ()
'no' 'no'
); );
} catch ( error ) { } catch ( error ) {
console.log( 'Store completed option not updated', error ); console.log( 'Store completed option not updated' );
} }
} ); } );
test.afterAll( async ( { baseURL } ) => { test.afterAll( async ( { baseURL } ) => {
await features.resetFeatureFlags( request, baseURL );
// Reset theme back to twentynineteen // Reset theme back to twentynineteen
await activateTheme( 'twentynineteen' ); await activateTheme( 'twentynineteen' );

View File

@ -33,4 +33,14 @@ export class AssemblerPage {
} }
return this.page; return this.page;
} }
/**
* Get the editor frame locator.
*
* @return {Promise<import('playwright').FrameLocator>} The editor frame locator.
*/
async getEditor() {
const assembler = await this.getAssembler();
return assembler.frameLocator( '[name="editor-canvas"]' );
}
} }

View File

@ -0,0 +1,200 @@
const { test: base, expect, request } = require( '@playwright/test' );
const { AssemblerPage } = require( './assembler.page' );
const { activateTheme } = require( '../../../utils/themes' );
const { setOption } = require( '../../../utils/options' );
const test = base.extend( {
pageObject: async ( { page }, use ) => {
const pageObject = new AssemblerPage( { page } );
await use( pageObject );
},
} );
test.describe( 'Assembler -> Color Pickers', () => {
test.use( { storageState: process.env.ADMINSTATE } );
test.beforeAll( async ( { baseURL } ) => {
try {
// In some environments the tour blocks clicking other elements.
await setOption(
request,
baseURL,
'woocommerce_customize_store_onboarding_tour_hidden',
'yes'
);
} catch ( error ) {
console.log( 'Store completed option not updated' );
}
} );
test.afterAll( async ( { baseURL } ) => {
try {
// In some environments the tour blocks clicking other elements.
await setOption(
request,
baseURL,
'woocommerce_customize_store_onboarding_tour_hidden',
'no'
);
await setOption(
request,
baseURL,
'woocommerce_admin_customize_store_completed',
'no'
);
await activateTheme( 'twentynineteen' );
} catch ( error ) {
console.log( 'Store completed option not updated' );
}
} );
test.beforeEach( async ( { baseURL, pageObject } ) => {
await pageObject.setupSite( baseURL );
await pageObject.waitForLoadingScreenFinish();
const assembler = await pageObject.getAssembler();
await assembler.getByText( 'Choose your color palette' ).click();
} );
test( 'Color pickers should be displayed', async ( { pageObject } ) => {
const assembler = await pageObject.getAssembler();
const colorPickers = assembler.locator(
'.woocommerce-customize-store_global-styles-variations_item'
);
await expect( colorPickers ).toHaveCount( 18 );
} );
test( 'Picking a color should trigger an update of colors on the site preview', async ( {
pageObject,
}, testInfo ) => {
const assembler = await pageObject.getAssembler();
const editor = await pageObject.getEditor();
testInfo.snapshotSuffix = '';
await assembler
.locator(
'.woocommerce-customize-store_global-styles-variations_item'
)
.waitFor( {
strict: false,
} );
const colorPickers = await assembler
.locator(
'.woocommerce-customize-store_global-styles-variations_item'
)
.all();
let index = 0;
for ( const colorPicker of colorPickers ) {
await colorPicker.waitFor();
await colorPicker.click();
// The snapshot is created in headless mode. Please make sure the browser is in headless mode to ensure the snapshot is correct.
await expect(
( await editor.locator( 'style' ).allInnerTexts() ).join( ',' )
).toMatchSnapshot( {
name: 'color-palette-' + index,
} );
index++;
}
} );
test( 'Color picker should be focused when a color is picked', async ( {
pageObject,
} ) => {
const assembler = await pageObject.getAssembler();
const colorPicker = assembler
.locator(
'.woocommerce-customize-store_global-styles-variations_item'
)
.first();
await colorPicker.click();
await expect( colorPicker ).toHaveClass( /is-active/ );
} );
test( 'Picking a color should activate the save button', async ( {
pageObject,
} ) => {
const assembler = await pageObject.getAssembler();
const colorPicker = assembler
.locator(
'.woocommerce-customize-store_global-styles-variations_item'
)
.nth( 2 );
await colorPicker.click();
const saveButton = assembler.getByText( 'Save' );
await expect( saveButton ).toBeEnabled();
} );
test( 'The Done button should be visible after clicking save', async ( {
pageObject,
page,
} ) => {
const assembler = await pageObject.getAssembler();
const colorPicker = assembler
.locator(
'.woocommerce-customize-store_global-styles-variations_item'
)
.nth( 2 );
await colorPicker.click();
const saveButton = assembler.getByText( 'Save' );
const waitResponse = page.waitForResponse(
( response ) =>
response.url().includes( 'wp-json/wp/v2/global-styles' ) &&
response.status() === 200
);
await saveButton.click();
await waitResponse;
await expect( assembler.getByText( 'Done' ) ).toBeEnabled();
} );
test( 'Selected color palette should be applied on the frontend', async ( {
pageObject,
page,
baseURL,
}, testInfo ) => {
testInfo.snapshotSuffix = '';
const assembler = await pageObject.getAssembler();
const colorPicker = assembler
.locator(
'.woocommerce-customize-store_global-styles-variations_item'
)
.last();
await colorPicker.click();
const saveButton = assembler.getByText( 'Save' );
const waitResponse = page.waitForResponse(
( response ) =>
response.url().includes( 'wp-json/wp/v2/global-styles' ) &&
response.status() === 200
);
await saveButton.click();
await waitResponse;
await page.goto( baseURL );
const style = await page
.locator( '#global-styles-inline-css' )
.innerHTML();
// The snapshot is created in headless mode. Please make sure the browser is in headless mode to ensure the snapshot is correct.
expect( style ).toMatchSnapshot( {
name: 'color-palette-frontend',
} );
} );
} );

View File

@ -1,8 +1,8 @@
const { test, expect, request } = require('@playwright/test'); const { test, expect, request } = require( '@playwright/test' );
const { BASE_URL } = process.env; const { BASE_URL } = process.env;
const { features } = require('../../utils'); const { features } = require( '../../utils' );
const { activateTheme } = require('../../utils/themes'); const { activateTheme } = require( '../../utils/themes' );
const { setOption } = require('../../utils/options'); const { setOption } = require( '../../utils/options' );
const CUSTOMIZE_STORE_URL = const CUSTOMIZE_STORE_URL =
'/wp-admin/admin.php?page=wc-admin&path=%2Fcustomize-store'; '/wp-admin/admin.php?page=wc-admin&path=%2Fcustomize-store';
@ -32,7 +32,7 @@ test.describe( 'Store owner can view the Intro page', () => {
'no' 'no'
); );
} catch ( error ) { } catch ( error ) {
console.log( 'Store completed option not updated', error ); console.log( 'Store completed option not updated' );
} }
} ); } );
@ -87,7 +87,7 @@ test.describe( 'Store owner can view the Intro page', () => {
'yes' 'yes'
); );
} catch ( error ) { } catch ( error ) {
console.log( 'Store completed option not updated', error ); console.log( 'Store completed option not updated' );
} }
await page.goto( CUSTOMIZE_STORE_URL ); await page.goto( CUSTOMIZE_STORE_URL );

View File

@ -39,7 +39,7 @@ test.describe( 'Store owner can view the Transitional page', () => {
'no' 'no'
); );
} catch ( error ) { } catch ( error ) {
console.log( 'Store completed option not updated', error ); console.log( 'Store completed option not updated' );
} }
} ); } );