wip: optimized steps

This commit is contained in:
rodel 2021-03-23 04:57:29 -07:00
parent 6f67a3a5b3
commit 56bd958dde
1 changed files with 62 additions and 43 deletions

View File

@ -7,13 +7,13 @@ const {
verifyPublishAndTrash, verifyPublishAndTrash,
uiUnblocked uiUnblocked
} = require('@woocommerce/e2e-utils'); } = require('@woocommerce/e2e-utils');
const faker = require('faker');
const config = require('config'); const config = require('config');
const { HTTPClientFactory, const { HTTPClientFactory,
VariableProduct, VariableProduct,
GroupedProduct, GroupedProduct,
SimpleProduct, SimpleProduct,
ProductVariation ProductVariation,
ExternalProduct
} = require('@woocommerce/api'); } = require('@woocommerce/api');
const runCreateOrderTest = () => { const runCreateOrderTest = () => {
@ -46,84 +46,103 @@ const runCreateOrderTest = () => {
// todo remove .only // todo remove .only
it('can create new complex order with multiple product types & tax classes', async () => { it('can create new complex order with multiple product types & tax classes', async () => {
// Initialize different product types // Initialize products for each product type
const variations = config.get('products.variations');;
const initProducts = async () => { const initProducts = async () => {
// Initialize HTTP client
const apiUrl = config.get('url'); const apiUrl = config.get('url');
const adminUsername = config.get('users.admin.username'); const adminUsername = config.get('users.admin.username');
const adminPassword = config.get('users.admin.password'); const adminPassword = config.get('users.admin.password');
const httpClient = HTTPClientFactory.build(apiUrl) const httpClient = HTTPClientFactory.build(apiUrl)
.withBasicAuth(adminUsername, adminPassword) .withBasicAuth(adminUsername, adminPassword)
.create(); .create();
const productName = () => faker.commerce.productName();
const price = () => faker.commerce.price(1, 999);
// Initialize repositories // Initialization functions per product type
const simpleRepo = SimpleProduct.restRepository(httpClient); const initSimpleProduct = async () => {
const variationsRepo = ProductVariation.restRepository(httpClient); const repo = SimpleProduct.restRepository(httpClient);
const variableRepo = VariableProduct.restRepository(httpClient); const props = config.get('products.simple');
const groupedRepo = GroupedProduct.restRepository(httpClient); return await repo.create(props);
};
// Initialize Simple Product const initVariableProduct = async () => {
const simpleProduct = await simpleRepo.create({ name: productName(), price: price() }); const prodProps = config.get('products.variable');
const productRepo = VariableProduct.restRepository(httpClient);
// Initialize Variable Product const variationRepo = ProductVariation.restRepository(httpClient);
const variations = config.get('products.variations'); const variableProduct = await productRepo.create(prodProps);
const variableProduct = await variableRepo.create({ name: productName() }); for (const v of variations) {
await variationsRepo.create(variableProduct.id, variations) await variationRepo.create(variableProduct.id, v);
// Initialize Grouped Products
const groupSize = 3;
const groupedProducts = [];
for (let i = 0; i < groupSize; i++) {
const prod = await simpleRepo.create({ name: productName(), price: price() });
groupedProducts.push(prod)
} }
const groupedProduct = await groupedRepo.create({
name: productName(), return variableProduct;
groupedProducts: groupedProducts };
}); const initGroupedProduct = async () => {
const repo = GroupedProduct.restRepository(httpClient);
const props = config.get('products.grouped');
return await repo.create(props);
};
const initExternalProduct = async () => {
const repo = ExternalProduct.restRepository(httpClient);
const props = config.get('products.external');
return await repo.create(props);
};
// Create a product for each product type
const simpleProduct = await initSimpleProduct();
const variableProduct = await initVariableProduct();
const groupedProduct = await initGroupedProduct();
const externalProduct = await initExternalProduct();
return [ return [
simpleProduct, simpleProduct,
variableProduct, variableProduct,
groupedProduct groupedProduct,
externalProduct
]; ];
} };
const products = await initProducts(); const products = await initProducts();
// Go to "add order" page // Go to "add order" page
await merchant.openNewOrder(); await merchant.openNewOrder();
// Add products (line items) to the order // Open modal window for adding line items
await expect(page).toClick('button.add-line-item'); await expect(page).toClick('button.add-line-item');
await expect(page).toClick('button.add-order-item'); await expect(page).toClick('button.add-order-item');
await page.waitForSelector('.wc-backbone-modal-header'); await page.waitForSelector('.wc-backbone-modal-header');
for (const { name, id } of products) {
// Search for each product to add, then verify that they are saved
for (const { name } of products) {
await expect(page).toClick('.wc-backbone-modal-content tr:last-child .wc-product-search'); await expect(page).toClick('.wc-backbone-modal-content tr:last-child .wc-product-search');
await expect(page).toFill('#wc-backbone-modal-dialog + .select2-container .select2-search__field', name); await expect(page).toFill('#wc-backbone-modal-dialog + .select2-container .select2-search__field',
await expect(page).toClick('li[aria-selected="true"]'); name
);
const firstResult = await page.waitForSelector('li[data-selected]');
await firstResult.click();
await expect(page).toMatchElement( await expect(page).toMatchElement(
'.wc-backbone-modal-content tr:nth-last-child(2) .wc-product-search option', '.wc-backbone-modal-content tr:nth-last-child(2) .wc-product-search option',
`${name} (#${id})` name
); );
} }
await page.click('.wc-backbone-modal-content #btn-ok'); // Save the line items, then verify
await expect(page).toClick('.wc-backbone-modal-content #btn-ok');
await uiUnblocked(); await uiUnblocked();
await expect(page).toClick('button.save_order');
// Verify the products we added show as line items now await page.waitForNavigation();
for (const { name } of products) { for (const { name } of products) {
await expect(page).toMatchElement('.wc-order-item-name', { text: name }); await expect(page).toMatchElement('.wc-order-item-name', { text: name });
} }
// Verify variation details in variable product line item // Verify variation details
await expect(page).toMatchElement('.wc-order-item-variation', { text: products.filter(p => p.variations).id }) const lastVariation = variations[0];
const attributes = lastVariation.attributes;
const actualAttributes = await page.$('.display_meta');
await expect(page).toMatchElement('.wc-order-item-variation', { text: lastVariation.id });
for (const { name, option } of attributes) {
await expect(actualAttributes).toMatch(name);
await expect(actualAttributes).toMatch(option);
}
// todo specify quantities // todo specify quantities
// todo setup tax classes // todo setup tax classes
}) })
}); });
} }