Add new E2E shop test filtering products by price (#44516)
This commit is contained in:
parent
3d3f6d64b8
commit
86f0ac9852
|
@ -0,0 +1,4 @@
|
||||||
|
Significance: patch
|
||||||
|
Type: dev
|
||||||
|
|
||||||
|
Add new test shopper product filters
|
|
@ -0,0 +1,228 @@
|
||||||
|
const { test, expect } = require( '@playwright/test' );
|
||||||
|
const { closeWelcomeModal } = require( '../../utils/editor' );
|
||||||
|
const wcApi = require( '@woocommerce/woocommerce-rest-api' ).default;
|
||||||
|
|
||||||
|
const singleProductPrice1 = '10';
|
||||||
|
const singleProductPrice2 = '50';
|
||||||
|
const singleProductPrice3 = '200';
|
||||||
|
|
||||||
|
const simpleProductName = 'AAA Filter Products';
|
||||||
|
|
||||||
|
const productsFilteringPageTitle = `Products Filtering ${ Date.now() }`;
|
||||||
|
const productsFilteringPageSlug = productsFilteringPageTitle
|
||||||
|
.replace( / /gi, '-' )
|
||||||
|
.toLowerCase();
|
||||||
|
|
||||||
|
let product1Id, product2Id, product3Id;
|
||||||
|
|
||||||
|
test.describe( 'Filter items in the shop by product price', () => {
|
||||||
|
test.use( { storageState: process.env.ADMINSTATE } );
|
||||||
|
|
||||||
|
test.beforeAll( async ( { baseURL } ) => {
|
||||||
|
const api = new wcApi( {
|
||||||
|
url: baseURL,
|
||||||
|
consumerKey: process.env.CONSUMER_KEY,
|
||||||
|
consumerSecret: process.env.CONSUMER_SECRET,
|
||||||
|
version: 'wc/v3',
|
||||||
|
} );
|
||||||
|
// add products
|
||||||
|
await api
|
||||||
|
.post( 'products', {
|
||||||
|
name: simpleProductName + ' 1',
|
||||||
|
type: 'simple',
|
||||||
|
regular_price: singleProductPrice1,
|
||||||
|
} )
|
||||||
|
.then( ( response ) => {
|
||||||
|
product1Id = response.data.id;
|
||||||
|
} );
|
||||||
|
await api
|
||||||
|
.post( 'products', {
|
||||||
|
name: simpleProductName + ' 2',
|
||||||
|
type: 'simple',
|
||||||
|
regular_price: singleProductPrice2,
|
||||||
|
} )
|
||||||
|
.then( ( response ) => {
|
||||||
|
product2Id = response.data.id;
|
||||||
|
} );
|
||||||
|
await api
|
||||||
|
.post( 'products', {
|
||||||
|
name: simpleProductName + ' 3',
|
||||||
|
type: 'simple',
|
||||||
|
regular_price: singleProductPrice3,
|
||||||
|
} )
|
||||||
|
.then( ( response ) => {
|
||||||
|
product3Id = response.data.id;
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
|
||||||
|
test.afterAll( async ( { baseURL } ) => {
|
||||||
|
const api = new wcApi( {
|
||||||
|
url: baseURL,
|
||||||
|
consumerKey: process.env.CONSUMER_KEY,
|
||||||
|
consumerSecret: process.env.CONSUMER_SECRET,
|
||||||
|
version: 'wc/v3',
|
||||||
|
} );
|
||||||
|
await api.post( 'products/batch', {
|
||||||
|
delete: [ product1Id, product2Id, product3Id ],
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
|
||||||
|
test( 'filter products by prices on the created page', async ( {
|
||||||
|
page,
|
||||||
|
} ) => {
|
||||||
|
const sortingProductsDropdown = '.wc-block-sort-select__select';
|
||||||
|
|
||||||
|
// go to create a new page with filtering products by price
|
||||||
|
await page.goto( 'wp-admin/post-new.php?post_type=page' );
|
||||||
|
|
||||||
|
await closeWelcomeModal( { page } );
|
||||||
|
|
||||||
|
await page
|
||||||
|
.getByRole( 'textbox', { name: 'Add title' } )
|
||||||
|
.fill( productsFilteringPageTitle );
|
||||||
|
await page.getByRole( 'button', { name: 'Add default block' } ).click();
|
||||||
|
await page
|
||||||
|
.getByRole( 'document', {
|
||||||
|
name: 'Empty block; start writing or type forward slash to choose a block',
|
||||||
|
} )
|
||||||
|
.fill( '/filter' );
|
||||||
|
await page
|
||||||
|
.getByRole( 'option' )
|
||||||
|
.filter( { hasText: 'Filter by Price' } )
|
||||||
|
.click();
|
||||||
|
|
||||||
|
await page.getByRole( 'textbox', { name: 'Add title' } ).click();
|
||||||
|
await page.getByLabel( 'Add block' ).click();
|
||||||
|
await page
|
||||||
|
.getByPlaceholder( 'Search', { exact: true } )
|
||||||
|
.fill( 'products' );
|
||||||
|
await page
|
||||||
|
.getByRole( 'option' )
|
||||||
|
.filter( { hasText: 'All Products' } )
|
||||||
|
.click();
|
||||||
|
|
||||||
|
await page
|
||||||
|
.getByRole( 'button', { name: 'Publish', exact: true } )
|
||||||
|
.click();
|
||||||
|
await page
|
||||||
|
.getByRole( 'region', { name: 'Editor publish' } )
|
||||||
|
.getByRole( 'button', { name: 'Publish', exact: true } )
|
||||||
|
.click();
|
||||||
|
await expect(
|
||||||
|
page.getByText( `${ productsFilteringPageTitle } is now live.` )
|
||||||
|
).toBeVisible();
|
||||||
|
|
||||||
|
// go to the page to test filtering products by price
|
||||||
|
await page.goto( productsFilteringPageSlug );
|
||||||
|
await expect(
|
||||||
|
page.getByRole( 'heading', { name: productsFilteringPageTitle } )
|
||||||
|
).toBeVisible();
|
||||||
|
|
||||||
|
// The price filter input is initially enabled, but it becomes disabled
|
||||||
|
// for the time it takes to fetch the data. To avoid setting the filter
|
||||||
|
// value before the input is properly initialized, we wait for the input
|
||||||
|
// to be disabled first. This is a safeguard to avoid flakiness which
|
||||||
|
// should be addressed in the code
|
||||||
|
await page
|
||||||
|
.getByRole( 'textbox', {
|
||||||
|
name: 'Filter products by maximum price',
|
||||||
|
disabled: true,
|
||||||
|
} )
|
||||||
|
.waitFor( { timeout: 3000 } )
|
||||||
|
.catch( () => {
|
||||||
|
// Do not throw in case Playwright doesn't make it in time for the
|
||||||
|
// initial (pre-request) render.
|
||||||
|
} );
|
||||||
|
|
||||||
|
// filter by maximum $50 and verify the results
|
||||||
|
await page
|
||||||
|
.getByRole( 'textbox', { name: 'Filter products by maximum' } )
|
||||||
|
.fill( '$50' );
|
||||||
|
// click and sort products to allow changes to take effect
|
||||||
|
await page.locator( sortingProductsDropdown ).click();
|
||||||
|
await page
|
||||||
|
.locator( sortingProductsDropdown )
|
||||||
|
.selectOption( 'Popularity' );
|
||||||
|
// to avoid flakiness
|
||||||
|
await page
|
||||||
|
.getByRole( 'textbox', {
|
||||||
|
name: 'Filter products by maximum price',
|
||||||
|
disabled: true,
|
||||||
|
} )
|
||||||
|
.waitFor( { timeout: 3000 } )
|
||||||
|
.catch( () => {
|
||||||
|
// Do not throw in case Playwright doesn't make it in time for the
|
||||||
|
// initial (pre-request) render.
|
||||||
|
} );
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.locator( 'h2.wc-block-grid__product-title' )
|
||||||
|
.filter( { hasText: `${ simpleProductName } 1` } )
|
||||||
|
).toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.locator( 'h2.wc-block-grid__product-title' )
|
||||||
|
.filter( { hasText: `${ simpleProductName } 2` } )
|
||||||
|
).toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.locator( 'h2.wc-block-grid__product-title' )
|
||||||
|
.filter( { hasText: `${ simpleProductName } 3` } )
|
||||||
|
).toBeHidden();
|
||||||
|
|
||||||
|
// filter by between $100 and $200 and verify the results
|
||||||
|
await page
|
||||||
|
.getByRole( 'textbox', { name: 'Filter products by maximum' } )
|
||||||
|
.fill( '$200' );
|
||||||
|
// click and sort products to allow changes to take effect
|
||||||
|
await page.locator( sortingProductsDropdown ).click();
|
||||||
|
await page
|
||||||
|
.locator( sortingProductsDropdown )
|
||||||
|
.selectOption( 'Default sorting' );
|
||||||
|
// to avoid flakiness
|
||||||
|
await page
|
||||||
|
.getByRole( 'textbox', {
|
||||||
|
name: 'Filter products by maximum price',
|
||||||
|
disabled: true,
|
||||||
|
} )
|
||||||
|
.waitFor( { timeout: 3000 } )
|
||||||
|
.catch( () => {
|
||||||
|
// Do not throw in case Playwright doesn't make it in time for the
|
||||||
|
// initial (pre-request) render.
|
||||||
|
} );
|
||||||
|
await page
|
||||||
|
.getByRole( 'textbox', { name: 'Filter products by minimum' } )
|
||||||
|
.fill( '$100' );
|
||||||
|
// click and sort products to allow changes to take effect
|
||||||
|
await page.locator( sortingProductsDropdown ).click();
|
||||||
|
await page.locator( sortingProductsDropdown ).selectOption( 'Latest' );
|
||||||
|
// to avoid flakiness
|
||||||
|
await page
|
||||||
|
.getByRole( 'textbox', {
|
||||||
|
name: 'Filter products by maximum price',
|
||||||
|
disabled: true,
|
||||||
|
} )
|
||||||
|
.waitFor( { timeout: 3000 } )
|
||||||
|
.catch( () => {
|
||||||
|
// Do not throw in case Playwright doesn't make it in time for the
|
||||||
|
// initial (pre-request) render.
|
||||||
|
} );
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.locator( 'h2.wc-block-grid__product-title' )
|
||||||
|
.filter( { hasText: `${ simpleProductName } 1` } )
|
||||||
|
).toBeHidden();
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.locator( 'h2.wc-block-grid__product-title' )
|
||||||
|
.filter( { hasText: `${ simpleProductName } 2` } )
|
||||||
|
).toBeHidden();
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.locator( 'h2.wc-block-grid__product-title' )
|
||||||
|
.filter( { hasText: `${ simpleProductName } 3` } )
|
||||||
|
).toBeVisible();
|
||||||
|
} );
|
||||||
|
} );
|
Loading…
Reference in New Issue