Co-authored-by: Lucio Giannotta <lucio.giannotta@a8c.com>
This commit is contained in:
Tung Du 2022-11-16 08:52:51 +07:00 committed by GitHub
parent da594b87a4
commit e59c931a9b
20 changed files with 176 additions and 89 deletions

View File

@ -94,7 +94,7 @@
"@wordpress/data-controls": "2.2.7",
"@wordpress/dependency-extraction-webpack-plugin": "3.2.1",
"@wordpress/dom": "3.16.0",
"@wordpress/e2e-test-utils": "8.3.0",
"@wordpress/e2e-test-utils": "^8.4.0",
"@wordpress/e2e-tests": "4.6.0",
"@wordpress/element": "4.0.4",
"@wordpress/env": "^4.9.0",
@ -13358,15 +13358,15 @@
}
},
"node_modules/@wordpress/e2e-test-utils": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils/-/e2e-test-utils-8.3.0.tgz",
"integrity": "sha512-4clSCcbyTwIXSL1NLyNjN0RWXfzbWcAbTSq8RQ3DeKc2wU4m2VorAZ/qXxrUFQMH3/zsHuoC4hxMlcXuL3kriw==",
"version": "8.4.0",
"resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils/-/e2e-test-utils-8.4.0.tgz",
"integrity": "sha512-FGOQz2JfZD0mAxMqqGSpK+L15LmIf613EJr4RRPLI1Ppbi1LZHIQPzV7jArDgYTOo0FYwfOYBRxn4CjbwL3Vgw==",
"dev": true,
"dependencies": {
"@babel/runtime": "^7.16.0",
"@wordpress/api-fetch": "^6.16.0",
"@wordpress/keycodes": "^3.19.0",
"@wordpress/url": "^3.20.0",
"@wordpress/api-fetch": "^6.17.0",
"@wordpress/keycodes": "^3.20.0",
"@wordpress/url": "^3.21.0",
"change-case": "^4.1.2",
"form-data": "^4.0.0",
"node-fetch": "^2.6.0"
@ -59073,15 +59073,15 @@
}
},
"@wordpress/e2e-test-utils": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils/-/e2e-test-utils-8.3.0.tgz",
"integrity": "sha512-4clSCcbyTwIXSL1NLyNjN0RWXfzbWcAbTSq8RQ3DeKc2wU4m2VorAZ/qXxrUFQMH3/zsHuoC4hxMlcXuL3kriw==",
"version": "8.4.0",
"resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils/-/e2e-test-utils-8.4.0.tgz",
"integrity": "sha512-FGOQz2JfZD0mAxMqqGSpK+L15LmIf613EJr4RRPLI1Ppbi1LZHIQPzV7jArDgYTOo0FYwfOYBRxn4CjbwL3Vgw==",
"dev": true,
"requires": {
"@babel/runtime": "^7.16.0",
"@wordpress/api-fetch": "^6.16.0",
"@wordpress/keycodes": "^3.19.0",
"@wordpress/url": "^3.20.0",
"@wordpress/api-fetch": "^6.17.0",
"@wordpress/keycodes": "^3.20.0",
"@wordpress/url": "^3.21.0",
"change-case": "^4.1.2",
"form-data": "^4.0.0",
"node-fetch": "^2.6.0"

View File

@ -145,7 +145,7 @@
"@wordpress/data-controls": "2.2.7",
"@wordpress/dependency-extraction-webpack-plugin": "3.2.1",
"@wordpress/dom": "3.16.0",
"@wordpress/e2e-test-utils": "8.3.0",
"@wordpress/e2e-test-utils": "8.4.0",
"@wordpress/e2e-tests": "4.6.0",
"@wordpress/element": "4.0.4",
"@wordpress/env": "^4.9.0",

View File

@ -3,7 +3,7 @@
exports[`Store Editing Templates Product Catalog block template should contain the "WooCommerce Product Grid Block" classic template 1`] = `
"<!-- wp:template-part {\\"slug\\":\\"header\\",\\"theme\\":\\"emptytheme\\",\\"tagName\\":\\"header\\"} /-->
<!-- wp:group {\\"layout\\":{\\"inherit\\":true}} -->
<!-- wp:group {\\"layout\\":{\\"inherit\\":true,\\"type\\":\\"constrained\\"}} -->
<div class=\\"wp-block-group\\"><!-- wp:woocommerce/legacy-template {\\"template\\":\\"archive-product\\"} /--></div>
<!-- /wp:group -->
@ -13,7 +13,7 @@ exports[`Store Editing Templates Product Catalog block template should contain t
exports[`Store Editing Templates Product Search Results block template should contain the "WooCommerce Product Grid Block" classic template 1`] = `
"<!-- wp:template-part {\\"slug\\":\\"header\\",\\"theme\\":\\"emptytheme\\",\\"tagName\\":\\"header\\"} /-->
<!-- wp:group {\\"layout\\":{\\"inherit\\":true}} -->
<!-- wp:group {\\"layout\\":{\\"inherit\\":true,\\"type\\":\\"constrained\\"}} -->
<div class=\\"wp-block-group\\"><!-- wp:woocommerce/legacy-template {\\"template\\":\\"product-search-results\\"} /--></div>
<!-- /wp:group -->
@ -23,7 +23,7 @@ exports[`Store Editing Templates Product Search Results block template should co
exports[`Store Editing Templates Product by Category block template should contain the "WooCommerce Product Taxonomy Block" classic template 1`] = `
"<!-- wp:template-part {\\"slug\\":\\"header\\",\\"theme\\":\\"emptytheme\\",\\"tagName\\":\\"header\\"} /-->
<!-- wp:group {\\"layout\\":{\\"inherit\\":true}} -->
<!-- wp:group {\\"layout\\":{\\"inherit\\":true,\\"type\\":\\"constrained\\"}} -->
<div class=\\"wp-block-group\\"><!-- wp:woocommerce/legacy-template {\\"template\\":\\"taxonomy-product_cat\\"} /--></div>
<!-- /wp:group -->
@ -33,7 +33,7 @@ exports[`Store Editing Templates Product by Category block template should conta
exports[`Store Editing Templates Products by Tag block template should contain the "WooCommerce Product Taxonomy Block" classic template 1`] = `
"<!-- wp:template-part {\\"slug\\":\\"header\\",\\"theme\\":\\"emptytheme\\",\\"tagName\\":\\"header\\"} /-->
<!-- wp:group {\\"layout\\":{\\"inherit\\":true}} -->
<!-- wp:group {\\"layout\\":{\\"inherit\\":true,\\"type\\":\\"constrained\\"}} -->
<div class=\\"wp-block-group\\"><!-- wp:woocommerce/legacy-template {\\"template\\":\\"taxonomy-product_tag\\"} /--></div>
<!-- /wp:group -->
@ -43,7 +43,7 @@ exports[`Store Editing Templates Products by Tag block template should contain t
exports[`Store Editing Templates Single Product block template should contain the "WooCommerce Single Product Block" classic template 1`] = `
"<!-- wp:template-part {\\"slug\\":\\"header\\",\\"theme\\":\\"emptytheme\\",\\"tagName\\":\\"header\\"} /-->
<!-- wp:group {\\"layout\\":{\\"inherit\\":true}} -->
<!-- wp:group {\\"layout\\":{\\"inherit\\":true,\\"type\\":\\"constrained\\"}} -->
<div class=\\"wp-block-group\\"><!-- wp:woocommerce/legacy-template {\\"template\\":\\"single-product\\"} /--></div>
<!-- /wp:group -->

View File

@ -44,7 +44,12 @@ describeOrSkip( GUTENBERG_EDITOR_CONTEXT === 'gutenberg' )(
await expect( page ).toRenderBlock( block );
} );
it( 'Editor preview shows only on sale products after enabling `Show only products on sale`', async () => {
/**
* We changed the Show only products on sale from a top-level toggle
* setting to a product filter, but tests for them haven't been updated
* yet. We will fix these tests in a follow-up PR.
*/
it.skip( 'Editor preview shows only on sale products after enabling `Show only products on sale`', async () => {
await visitBlockPage( `${ block.name } Block` );
const canvasEl = canvas();
await openDocumentSettingsSidebar();
@ -84,7 +89,12 @@ describeOrSkip( GUTENBERG_EDITOR_CONTEXT === 'gutenberg' )(
expect( products ).toHaveLength( 1 );
} );
it( 'Does not have on sale toggle', async () => {
/**
* We changed the Show only products on sale from a top-level toggle
* setting to a product filter, but tests for them haven't been updated
* yet. We will fix these tests in a follow-up PR.
*/
it.skip( 'Does not have on sale toggle', async () => {
await openDocumentSettingsSidebar();
await openListView();
await page.click(

View File

@ -11,6 +11,7 @@ import {
} from '@wordpress/e2e-test-utils';
import { SHOP_PAGE } from '@woocommerce/e2e-utils';
import { Frame, Page } from 'puppeteer';
import { insertBlockUsingSlash } from '@woocommerce/blocks-test-utils';
/**
* Internal dependencies
@ -97,7 +98,7 @@ describe( 'Shopper → Active Filters Block', () => {
} );
await insertBlocks();
await insertBlock( 'All Products' );
await insertBlockUsingSlash( 'All Products' );
await configurateFilterProductsByAttributeBlock( page );
await publishPost();

View File

@ -46,7 +46,7 @@ describe( 'Shopper → Checkout → Account', () => {
await selectBlockByName(
'woocommerce/checkout-contact-information-block'
);
await openBlockEditorSettings( { isFSEEditor: false } );
await openBlockEditorSettings();
//Enable shoppers to sign up at checkout option.
// eslint-disable-next-line jest/no-standalone-expect
await expect( page ).toClick( 'label', {

View File

@ -8,11 +8,11 @@ import {
unsetCheckbox,
withRestApi,
} from '@woocommerce/e2e-utils';
import {
visitBlockPage,
selectBlockByName,
saveOrPublish,
getToggleIdByLabel,
} from '@woocommerce/blocks-test-utils';
/**
@ -36,7 +36,6 @@ if ( process.env.WOOCOMMERCE_BLOCKS_PHASE < 2 ) {
test.only( 'Skipping Cart & Checkout tests', () => {} );
}
let companyCheckboxId = null;
let coupon;
describe( 'Shopper → Checkout', () => {
@ -75,16 +74,7 @@ describe( 'Shopper → Checkout', () => {
'woocommerce/checkout-shipping-address-block'
);
// This checkbox ID is unstable, so, we're getting its value from "for" attribute of the label
const [ companyCheckboxLabel ] = await page.$x(
`//label[contains(text(), "Company") and contains(@class, "components-toggle-control__label")]`
);
companyCheckboxId = await page.evaluate(
( label ) => `#${ label.getAttribute( 'for' ) }`,
companyCheckboxLabel
);
await setCheckbox( companyCheckboxId );
await setCheckbox( await getToggleIdByLabel( 'Company' ) );
await saveOrPublish();
await shopper.block.emptyCart();
} );
@ -96,7 +86,7 @@ describe( 'Shopper → Checkout', () => {
await selectBlockByName(
'woocommerce/checkout-shipping-address-block'
);
await unsetCheckbox( companyCheckboxId );
await unsetCheckbox( await getToggleIdByLabel( 'Company' ) );
await saveOrPublish();
await merchant.logout();
await reactivateCompatibilityNotice();

View File

@ -9,7 +9,10 @@ import {
switchUserToAdmin,
publishPost,
} from '@wordpress/e2e-test-utils';
import { selectBlockByName } from '@woocommerce/blocks-test-utils';
import {
selectBlockByName,
insertBlockUsingSlash,
} from '@woocommerce/blocks-test-utils';
/**
* Internal dependencies
@ -65,7 +68,7 @@ describe( `${ block.name } Block`, () => {
title: block.name,
} );
await insertBlock( 'All Products' );
await insertBlockUsingSlash( 'All Products' );
await insertBlock( block.name );
const canvasEl = canvas();
@ -185,7 +188,7 @@ describe( `${ block.name } Block`, () => {
} );
await selectBlockByName( block.slug );
await openBlockEditorSettings( { isFSEEditor: true } );
await openBlockEditorSettings();
const [ filterButtonToggle ] = await page.$x(
block.selectors.editor.filterButtonToggle
);

View File

@ -8,7 +8,10 @@ import {
switchUserToAdmin,
publishPost,
} from '@wordpress/e2e-test-utils';
import { selectBlockByName } from '@woocommerce/blocks-test-utils';
import {
selectBlockByName,
insertBlockUsingSlash,
} from '@woocommerce/blocks-test-utils';
/**
* Internal dependencies
@ -70,7 +73,7 @@ describe( `${ block.name } Block`, () => {
} );
await insertBlock( block.name );
await insertBlock( 'All Products' );
await insertBlockUsingSlash( 'All Products' );
await insertBlock( 'Active Product Filters' );
await publishPost();
@ -182,7 +185,7 @@ describe( `${ block.name } Block`, () => {
} );
await selectBlockByName( block.slug );
await openBlockEditorSettings( { isFSEEditor: true } );
await openBlockEditorSettings();
await page.waitForXPath(
block.selectors.editor.filterButtonToggle
);

View File

@ -8,7 +8,10 @@ import {
switchUserToAdmin,
publishPost,
} from '@wordpress/e2e-test-utils';
import { selectBlockByName } from '@woocommerce/blocks-test-utils';
import {
selectBlockByName,
insertBlockUsingSlash,
} from '@woocommerce/blocks-test-utils';
/**
* Internal dependencies
@ -62,7 +65,7 @@ describe( `${ block.name } Block`, () => {
} );
await insertBlock( block.name );
await insertBlock( 'All Products' );
await insertBlockUsingSlash( 'All Products' );
await publishPost();
link = await page.evaluate( () =>

View File

@ -8,7 +8,10 @@ import {
switchUserToAdmin,
publishPost,
} from '@wordpress/e2e-test-utils';
import { selectBlockByName } from '@woocommerce/blocks-test-utils';
import {
selectBlockByName,
insertBlockUsingSlash,
} from '@woocommerce/blocks-test-utils';
/**
* Internal dependencies
@ -61,7 +64,7 @@ describe( `${ block.name } Block`, () => {
} );
await insertBlock( block.name );
await insertBlock( 'All Products' );
await insertBlockUsingSlash( 'All Products' );
await publishPost();
link = await page.evaluate( () =>
@ -160,7 +163,7 @@ describe( `${ block.name } Block`, () => {
await waitForCanvas();
await selectBlockByName( block.slug );
await openBlockEditorSettings( { isFSEEditor: true } );
await openBlockEditorSettings();
await page.waitForXPath(
block.selectors.editor.filterButtonToggle
);

View File

@ -24,6 +24,10 @@ const block = {
productPrice:
'.wc-block-grid__product:nth-child(2) .wc-block-grid__product-price',
addToCartButton: 'button.add_to_cart_button',
checkoutOrderSummary: {
content: '.wc-block-components-order-summary__content',
toggle: '.wc-block-components-order-summary button[aria-expanded="false"]',
},
},
},
};
@ -554,7 +558,18 @@ describe( 'Shopper → Mini Cart', () => {
await expect( page ).toMatchElement( 'h1', { text: 'Checkout' } );
await expect( page ).toMatch( productTitle );
const orderSummaryToggle = await page.$(
selectors.frontend.checkoutOrderSummary.toggle
);
if ( orderSummaryToggle ) {
await orderSummaryToggle.click();
}
await expect( page ).toMatchElement(
selectors.frontend.checkoutOrderSummary.content,
{ text: productTitle }
);
} );
} );

View File

@ -409,24 +409,20 @@ export const createCoupon = async ( coupon ) => {
};
/**
* Open the block editor settings menu.
* Open the block editor settings menu if it hasn't opened.
*
* @param {Object} [root0]
* @param {boolean} [root0.isFSEEditor] Amount to be applied. Defaults to 5.
* @todo Replace openBlockEditorSettings with ensureSidebarOpened when WordPress/gutenberg#45480 is released. See https://github.com/WordPress/gutenberg/pull/45480.
*/
export const openBlockEditorSettings = async () => {
const toggleSidebarButton = await page.$(
'.edit-post-header__settings [aria-label="Settings"][aria-expanded="false"],' +
'.edit-site-header__actions [aria-label="Settings"][aria-expanded="false"],' +
'.edit-widgets-header__actions [aria-label="Settings"][aria-expanded="false"],' +
'.edit-site-header-edit-mode__actions [aria-label="Settings"][aria-expanded="false"]'
);
export const openBlockEditorSettings = async ( { isFSEEditor = false } ) => {
const buttonSelector = isFSEEditor
? '.edit-site-header__actions button[aria-label="Settings"]'
: '.edit-post-header__settings button[aria-label="Settings"]';
const isPressed = `${ buttonSelector }.is-pressed`;
const isSideBarAlreadyOpened = await page.$( isPressed );
if ( isSideBarAlreadyOpened === null ) {
// @ts-ignore
await page.$eval( buttonSelector, ( el ) => el.click() );
if ( toggleSidebarButton ) {
await toggleSidebarButton.click();
}
};
@ -449,10 +445,3 @@ export const waitForAllProductsBlockLoaded = async () => {
*/
export const describeOrSkip = ( condition ) =>
condition ? describe : describe.skip;
/**
* Execute or skip the test base on the provided condition.
*
* @param {boolean} condition Condition to execute test.
*/
export const itOrSkip = ( condition ) => ( condition ? it : it.skip );

View File

@ -17,3 +17,4 @@ export const BILLING_DETAILS = config.get( 'addresses.customer.billing' );
export const PERFORMANCE_REPORT_FILENAME = 'reports/e2e-performance.json';
export const SHIPPING_DETAILS = config.get( 'addresses.customer.shipping' );
export const BASE_URL = config.get( 'url' );
export const DEFAULT_TIMEOUT = 30000;

View File

@ -0,0 +1,40 @@
/**
* Internal dependencies
*/
import { DEFAULT_TIMEOUT } from './constants';
/**
* Get the ID of the setting toogle so test can manipulate the toggle using
* unsetCheckbox and setCheckbox utilities.
*
* We're using 'adaptive timeout' here as the id of the toggle is changed on
* every render, so we wait a bit for the toggle to finish rerendering, then
* check if the node still attached to the document before returning its
* ID. If the node is detached, it means that the toggle is rendered, then
* we retry by calling this function again with increased retry argument. We
* will retry until the timeout is reached.
*/
export const getToggleIdByLabel = async (
label: string,
retry = 0
): Promise< string > => {
const delay = 1000;
const labelElement = await page.waitForXPath(
`//label[contains(text(), "${ label }") and contains(@class, "components-toggle-control__label")]`,
{ visible: true }
);
const checkboxId = await page.evaluate(
( toggleLabel ) => `#${ toggleLabel.getAttribute( 'for' ) }`,
labelElement
);
// Wait a bit for toggle to finish rerendering.
await page.waitForTimeout( delay );
const checkbox = await page.$( checkboxId );
if ( ! checkbox ) {
if ( retry * delay < DEFAULT_TIMEOUT ) {
return await getToggleIdByLabel( label, retry + 1 );
}
throw new Error( `Can't find toggle with label ${ label }` );
}
return checkboxId;
};

View File

@ -18,3 +18,6 @@ export * from './taxes';
export * from './constants';
export { insertInnerBlock } from './insert-inner-block';
export { getFixtureProductsData } from './get-fixture-products-data';
export { getToggleIdByLabel } from './get-toggle-id-by-label';
export { insertBlockUsingQuickInserter } from './insert-block-using-quick-inserter';
export { insertBlockUsingSlash } from './insert-block-using-slash';

View File

@ -0,0 +1,25 @@
/**
* External dependencies
*/
import { canvas } from '@wordpress/e2e-test-utils';
/**
* Internal dependencies
*/
import SELECTORS from './selectors';
export const insertBlockUsingQuickInserter = async ( blockTitle: string ) => {
const blockInserterButton = await canvas().waitForSelector(
SELECTORS.quickInserter.button
);
await blockInserterButton.click();
const blockInsertInput = await page.waitForSelector(
SELECTORS.quickInserter.searchInput
);
await blockInsertInput.focus();
await page.keyboard.type( blockTitle );
const insertButton = await page.waitForXPath(
`//button//span[contains(text(), '${ blockTitle }')]`
);
await insertButton.click();
};

View File

@ -0,0 +1,16 @@
/**
* External dependencies
*/
import { canvas, insertBlock } from '@wordpress/e2e-test-utils';
/**
* Internal dependencies
*/
import SELECTORS from './selectors';
export const insertBlockUsingSlash = async ( blockTitle: string ) => {
await insertBlock( 'Paragraph' );
await canvas().keyboard.type( `/${ blockTitle }` );
await canvas().waitForSelector( SELECTORS.popover );
await canvas().keyboard.press( 'Enter' );
};

View File

@ -1,13 +1,8 @@
/**
* External dependencies
*/
import { canvas } from '@wordpress/e2e-test-utils';
/**
* Internal dependencies
*/
import { selectBlockByName } from '.';
import SELECTORS from './selectors';
import { insertBlockUsingQuickInserter } from './insert-block-using-quick-inserter';
/**
* Inserts an inner block into the currently selected block. If a parent block
@ -26,17 +21,6 @@ export const insertInnerBlock = async (
if ( parentBlockName ) {
await selectBlockByName( parentBlockName );
}
const blockInserterButton = await canvas().waitForSelector(
SELECTORS.quickInserter.button
);
await blockInserterButton.click();
const blockInsertInput = await page.waitForSelector(
SELECTORS.quickInserter.searchInput
);
await blockInsertInput.focus();
await page.keyboard.type( blockTitle );
const insertButton = await page.waitForXPath(
`//button//span[contains(text(), '${ blockTitle }')]`
);
await insertButton.click();
await insertBlockUsingQuickInserter( blockTitle );
};

View File

@ -4,4 +4,5 @@ export default {
searchInput:
'.block-editor-inserter__quick-inserter.has-search.has-expand .components-search-control__input',
},
popover: '.components-popover.components-autocomplete__popover',
};