CYS - E2E tests: add font picker E2E tests (#45959)
* CYS - E2E tests: add font picker E2E tests * Add changefile(s) from automation for the following project(s): woocommerce * reset to the default theme --------- Co-authored-by: github-actions <github-actions@github.com>
This commit is contained in:
parent
606bb5cf79
commit
9007b780c4
|
@ -0,0 +1,4 @@
|
||||||
|
Significance: patch
|
||||||
|
Type: dev
|
||||||
|
Comment: CYS - E2E tests: Add font picker E2E tests
|
||||||
|
|
|
@ -0,0 +1,246 @@
|
||||||
|
const { test: base, expect, request } = require( '@playwright/test' );
|
||||||
|
const { AssemblerPage } = require( './assembler.page' );
|
||||||
|
const { activateTheme, DEFAULT_THEME } = require( '../../../utils/themes' );
|
||||||
|
const { setOption } = require( '../../../utils/options' );
|
||||||
|
|
||||||
|
const test = base.extend( {
|
||||||
|
pageObject: async ( { page }, use ) => {
|
||||||
|
const pageObject = new AssemblerPage( { page } );
|
||||||
|
await use( pageObject );
|
||||||
|
},
|
||||||
|
} );
|
||||||
|
|
||||||
|
const getUsedFonts = async ( editorOrPage ) => {
|
||||||
|
return await editorOrPage.locator( ':root' ).evaluate( () => {
|
||||||
|
const headers = Array.from(
|
||||||
|
document.querySelectorAll( 'h1, h2, h3, h4, h5, h6' )
|
||||||
|
).map( ( e ) => getComputedStyle( e ).fontFamily );
|
||||||
|
|
||||||
|
const paragraphs = Array.from( document.querySelectorAll( 'p' ) ).map(
|
||||||
|
( e ) => getComputedStyle( e ).fontFamily
|
||||||
|
);
|
||||||
|
|
||||||
|
const buttons = Array.from( document.querySelectorAll( 'button' ) ).map(
|
||||||
|
( e ) => getComputedStyle( e ).fontFamily
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
primaryFont: headers,
|
||||||
|
secondaryFont: [ ...paragraphs, ...buttons ],
|
||||||
|
};
|
||||||
|
} );
|
||||||
|
};
|
||||||
|
|
||||||
|
const slugFontMap = {
|
||||||
|
Cardo: 'Cardo Font',
|
||||||
|
'Inter, sans-serif': 'Inter',
|
||||||
|
'-apple-system, "system-ui", "avenir next", avenir, "segoe ui", "helvetica neue", helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif':
|
||||||
|
'System Sans-serif',
|
||||||
|
'-apple-system, BlinkMacSystemFont, "avenir next", avenir, "segoe ui", "helvetica neue", helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif':
|
||||||
|
'System Sans-serif',
|
||||||
|
};
|
||||||
|
|
||||||
|
test.describe( 'Assembler -> Font Picker', () => {
|
||||||
|
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'
|
||||||
|
);
|
||||||
|
|
||||||
|
// Reset theme back to default.
|
||||||
|
await activateTheme( DEFAULT_THEME );
|
||||||
|
} 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 fonts' ).click();
|
||||||
|
} );
|
||||||
|
|
||||||
|
test( 'Font pickers should be displayed', async ( { pageObject } ) => {
|
||||||
|
const assembler = await pageObject.getAssembler();
|
||||||
|
|
||||||
|
const fontPickers = assembler.locator(
|
||||||
|
'.woocommerce-customize-store_global-styles-variations_item'
|
||||||
|
);
|
||||||
|
await expect( fontPickers ).toHaveCount( 2 );
|
||||||
|
} );
|
||||||
|
|
||||||
|
test( 'Picking a font should trigger an update of fonts on the site preview', async ( {
|
||||||
|
pageObject,
|
||||||
|
} ) => {
|
||||||
|
const assembler = await pageObject.getAssembler();
|
||||||
|
const editor = await pageObject.getEditor();
|
||||||
|
|
||||||
|
await assembler
|
||||||
|
.locator(
|
||||||
|
'.woocommerce-customize-store_global-styles-variations_item'
|
||||||
|
)
|
||||||
|
.waitFor( {
|
||||||
|
strict: false,
|
||||||
|
} );
|
||||||
|
|
||||||
|
const fontPickers = await assembler
|
||||||
|
.locator(
|
||||||
|
'.woocommerce-customize-store_global-styles-variations_item'
|
||||||
|
)
|
||||||
|
.all();
|
||||||
|
|
||||||
|
for ( const fontPicker of fontPickers ) {
|
||||||
|
await fontPicker.waitFor();
|
||||||
|
await fontPicker.click();
|
||||||
|
const [ primaryFont, secondaryFont ] = (
|
||||||
|
await fontPicker.getAttribute( 'aria-label' )
|
||||||
|
)
|
||||||
|
.split( '+' )
|
||||||
|
.map( ( e ) => e.trim() );
|
||||||
|
|
||||||
|
const usedFonts = await getUsedFonts( editor );
|
||||||
|
|
||||||
|
const isPrimaryFontUsed = usedFonts.primaryFont.some( ( font ) =>
|
||||||
|
primaryFont.includes( slugFontMap[ font ] )
|
||||||
|
);
|
||||||
|
|
||||||
|
const isSecondaryFontUsed = usedFonts.secondaryFont.some(
|
||||||
|
( font ) => secondaryFont.includes( slugFontMap[ font ] )
|
||||||
|
);
|
||||||
|
|
||||||
|
expect( isPrimaryFontUsed ).toBe( true );
|
||||||
|
expect( isSecondaryFontUsed ).toBe( true );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
test( 'Font pickers should be focused when a font is picked', async ( {
|
||||||
|
pageObject,
|
||||||
|
} ) => {
|
||||||
|
const assembler = await pageObject.getAssembler();
|
||||||
|
const fontPicker = assembler
|
||||||
|
.locator(
|
||||||
|
'.woocommerce-customize-store_global-styles-variations_item'
|
||||||
|
)
|
||||||
|
.first();
|
||||||
|
|
||||||
|
await fontPicker.click();
|
||||||
|
await expect( fontPicker ).toHaveClass( /is-active/ );
|
||||||
|
} );
|
||||||
|
|
||||||
|
test( 'Picking a font should activate the save button', async ( {
|
||||||
|
pageObject,
|
||||||
|
} ) => {
|
||||||
|
const assembler = await pageObject.getAssembler();
|
||||||
|
const fontPicker = assembler.locator(
|
||||||
|
'.woocommerce-customize-store_global-styles-variations_item:not(.is-active)'
|
||||||
|
);
|
||||||
|
|
||||||
|
await fontPicker.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 fontPicker = assembler.locator(
|
||||||
|
'.woocommerce-customize-store_global-styles-variations_item:not(.is-active)'
|
||||||
|
);
|
||||||
|
|
||||||
|
await fontPicker.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 font palette should be applied on the frontend', async ( {
|
||||||
|
pageObject,
|
||||||
|
page,
|
||||||
|
baseURL,
|
||||||
|
}, testInfo ) => {
|
||||||
|
testInfo.snapshotSuffix = '';
|
||||||
|
const assembler = await pageObject.getAssembler();
|
||||||
|
const fontPicker = assembler
|
||||||
|
.locator(
|
||||||
|
'.woocommerce-customize-store_global-styles-variations_item'
|
||||||
|
)
|
||||||
|
.last();
|
||||||
|
|
||||||
|
await fontPicker.click();
|
||||||
|
|
||||||
|
const [ primaryFont, secondaryFont ] = (
|
||||||
|
await fontPicker.getAttribute( 'aria-label' )
|
||||||
|
)
|
||||||
|
.split( '+' )
|
||||||
|
.map( ( e ) => e.trim() );
|
||||||
|
|
||||||
|
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 usedFonts = await getUsedFonts( page );
|
||||||
|
|
||||||
|
const isPrimaryFontUsed = usedFonts.primaryFont.some( ( font ) =>
|
||||||
|
primaryFont.includes( slugFontMap[ font ] )
|
||||||
|
);
|
||||||
|
|
||||||
|
const isSecondaryFontUsed = usedFonts.secondaryFont.some( ( font ) =>
|
||||||
|
secondaryFont.includes( slugFontMap[ font ] )
|
||||||
|
);
|
||||||
|
|
||||||
|
expect( isPrimaryFontUsed ).toBe( true );
|
||||||
|
expect( isSecondaryFontUsed ).toBe( true );
|
||||||
|
} );
|
||||||
|
} );
|
Loading…
Reference in New Issue