Add utility methods for the variable product tests
This commit is contained in:
parent
0ef5904b7e
commit
30e27254c1
|
@ -1,9 +1,11 @@
|
||||||
const onboarding = require( './onboarding' );
|
const onboarding = require( './onboarding' );
|
||||||
const api = require( './api' );
|
const api = require( './api' );
|
||||||
const site = require( './site' );
|
const site = require( './site' );
|
||||||
|
const variableProducts = require( './variable-products' );
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
onboarding,
|
onboarding,
|
||||||
api,
|
api,
|
||||||
site,
|
site,
|
||||||
|
variableProducts,
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,226 @@
|
||||||
|
const api = require( './api' );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array to hold all product ID's to be deleted after test.
|
||||||
|
*/
|
||||||
|
const productIds = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `attributes` property to be used in the request payload for creating a variable product through the REST API.
|
||||||
|
*
|
||||||
|
* @see {@link [Product - Attributes properties](https://woocommerce.github.io/woocommerce-rest-api-docs/#product-attributes-properties)}
|
||||||
|
*/
|
||||||
|
const productAttributes = [
|
||||||
|
{
|
||||||
|
name: 'Colour',
|
||||||
|
visible: true,
|
||||||
|
variation: true,
|
||||||
|
options: [ 'Red', 'Green' ],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Size',
|
||||||
|
visible: true,
|
||||||
|
variation: true,
|
||||||
|
options: [ 'Small', 'Medium' ],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Logo',
|
||||||
|
visible: true,
|
||||||
|
variation: true,
|
||||||
|
options: [ 'Woo', 'WordPress' ],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request payload for creating variations.
|
||||||
|
*
|
||||||
|
* @see {@link [Product variation properties](https://woocommerce.github.io/woocommerce-rest-api-docs/#product-variation-properties)}
|
||||||
|
*/
|
||||||
|
const sampleVariations = [
|
||||||
|
{
|
||||||
|
regular_price: '9.99',
|
||||||
|
attributes: [
|
||||||
|
{
|
||||||
|
name: 'Colour',
|
||||||
|
option: 'Red',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Size',
|
||||||
|
option: 'Small',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Logo',
|
||||||
|
option: 'Woo',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
regular_price: '10.99',
|
||||||
|
attributes: [
|
||||||
|
{
|
||||||
|
name: 'Colour',
|
||||||
|
option: 'Red',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Size',
|
||||||
|
option: 'Small',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Logo',
|
||||||
|
option: 'WordPress',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
regular_price: '11.99',
|
||||||
|
attributes: [
|
||||||
|
{
|
||||||
|
name: 'Colour',
|
||||||
|
option: 'Red',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Size',
|
||||||
|
option: 'Medium',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Logo',
|
||||||
|
option: 'Woo',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a variable product using the WooCommerce REST API.
|
||||||
|
*
|
||||||
|
* @param {{ name: string, visible: boolean, variation: boolean, options: string[] }[]} attributes List of attributes. See [Product - Attributes properties](https://woocommerce.github.io/woocommerce-rest-api-docs/#product-attributes-properties).
|
||||||
|
* @returns {Promise<number>} ID of the created variable product
|
||||||
|
*/
|
||||||
|
async function createVariableProduct( attributes = [] ) {
|
||||||
|
const randomNum = Math.floor( Math.random() * 1000 );
|
||||||
|
const payload = {
|
||||||
|
name: `Unbranded Granite Shirt ${ randomNum }`,
|
||||||
|
type: 'variable',
|
||||||
|
attributes,
|
||||||
|
};
|
||||||
|
|
||||||
|
const productId = await api.create.product( payload );
|
||||||
|
|
||||||
|
productIds.push( productId );
|
||||||
|
|
||||||
|
return productId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clean up all products created by the test.
|
||||||
|
*/
|
||||||
|
async function deleteProductsAddedByTests() {
|
||||||
|
await api.deletePost.products( productIds );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable or disable the variable product tour through JavaScript.
|
||||||
|
*
|
||||||
|
* @param {import('@playwright/test').Browser} browser
|
||||||
|
* @param {boolean} show Whether to show the variable product tour or not.
|
||||||
|
*/
|
||||||
|
async function showVariableProductTour( browser, show ) {
|
||||||
|
const productPageURL = 'wp-admin/post-new.php?post_type=product';
|
||||||
|
const addProductPage = await browser.newPage();
|
||||||
|
|
||||||
|
// Go to "Add new product" page
|
||||||
|
await addProductPage.goto( productPageURL );
|
||||||
|
|
||||||
|
// Get the current user's ID and user preferences
|
||||||
|
const { id: userId, woocommerce_meta } = await addProductPage.evaluate(
|
||||||
|
() => {
|
||||||
|
return window.wp.data.select( 'core' ).getCurrentUser();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Turn off the variable product tour
|
||||||
|
const updatedWooCommerceMeta = {
|
||||||
|
...woocommerce_meta,
|
||||||
|
variable_product_tour_shown: show ? '' : '"yes"',
|
||||||
|
};
|
||||||
|
|
||||||
|
// Save the updated user preferences
|
||||||
|
await addProductPage.evaluate(
|
||||||
|
async ( { userId, updatedWooCommerceMeta } ) => {
|
||||||
|
await window.wp.data.dispatch( 'core' ).saveUser( {
|
||||||
|
id: userId,
|
||||||
|
woocommerce_meta: updatedWooCommerceMeta,
|
||||||
|
} );
|
||||||
|
},
|
||||||
|
{ userId, updatedWooCommerceMeta }
|
||||||
|
);
|
||||||
|
|
||||||
|
// Close the page
|
||||||
|
await addProductPage.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate all possible variations from the given attributes.
|
||||||
|
*
|
||||||
|
* @param {{ name: string, visible: boolean, variation: boolean, options: string[] }[]} attributes
|
||||||
|
* @returns All possible variations from the given attributes
|
||||||
|
*/
|
||||||
|
function generateVariationsFromAttributes( attributes ) {
|
||||||
|
const combine = ( runningList, nextAttribute ) => {
|
||||||
|
const variations = [];
|
||||||
|
let newVar;
|
||||||
|
|
||||||
|
if ( ! Array.isArray( runningList[ 0 ] ) ) {
|
||||||
|
runningList = [ runningList ];
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( const partialVariation of runningList ) {
|
||||||
|
if ( runningList.length === 1 ) {
|
||||||
|
for ( const startingAttribute of partialVariation ) {
|
||||||
|
for ( const nextAttrValue of nextAttribute ) {
|
||||||
|
newVar = [ startingAttribute, nextAttrValue ];
|
||||||
|
variations.push( newVar );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for ( const nextAttrValue of nextAttribute ) {
|
||||||
|
newVar = partialVariation.concat( [ nextAttrValue ] );
|
||||||
|
variations.push( newVar );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return variations;
|
||||||
|
};
|
||||||
|
|
||||||
|
let allVariations = attributes[ 0 ].options;
|
||||||
|
|
||||||
|
for ( let i = 1; i < attributes.length; i++ ) {
|
||||||
|
const nextAttribute = attributes[ i ].options;
|
||||||
|
|
||||||
|
allVariations = combine( allVariations, nextAttribute );
|
||||||
|
}
|
||||||
|
|
||||||
|
return allVariations;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create variations through the WooCommerce REST API.
|
||||||
|
*
|
||||||
|
* @param {number} productId Product ID to add variations to.
|
||||||
|
* @param {{regular_price: string, attributes: {name: string, option: string}[]}[]} variations List of variations to create.
|
||||||
|
* @returns {Promise<number[]>} Array of variation ID's created.
|
||||||
|
*/
|
||||||
|
async function createVariations( productId, variations ) {
|
||||||
|
return await api.create.productVariations( productId, variations );
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
createVariableProduct,
|
||||||
|
deleteProductsAddedByTests,
|
||||||
|
generateVariationsFromAttributes,
|
||||||
|
productAttributes,
|
||||||
|
showVariableProductTour,
|
||||||
|
sampleVariations,
|
||||||
|
createVariations,
|
||||||
|
};
|
Loading…
Reference in New Issue