Add new test scenario for mini-cart inclusive tax price (#41064)

* Update mini-cart test to include tax scenario

* Include changelog file

* Move changelog file to the right place

* Update taxing options

* Update calculation for tax price

* Remove only parameter

* Improve closing welcome popup if prompted

---------

Co-authored-by: Jon Lane <jon.lane@automattic.com>
This commit is contained in:
Veljko V 2023-11-10 19:40:04 +01:00 committed by GitHub
parent 11de6bc7bb
commit ffe90ce432
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 148 additions and 26 deletions

View File

@ -0,0 +1,4 @@
Significance: patch
Type: dev
Add one more scenario to cover taxing

View File

@ -3,14 +3,16 @@ const { admin } = require( '../../test-data/data' );
const wcApi = require( '@woocommerce/woocommerce-rest-api' ).default; const wcApi = require( '@woocommerce/woocommerce-rest-api' ).default;
const pageTitle = 'Mini Cart'; const pageTitle = 'Mini Cart';
const pageSlug = pageTitle.replace( / /gi, '-' ).toLowerCase();
const miniCartButton = '.wc-block-mini-cart__button'; const miniCartButton = '.wc-block-mini-cart__button';
const simpleProductName = 'Single Hundred Product'; const simpleProductName = 'Single Hundred Product';
const simpleProductDesc = 'Lorem ipsum dolor sit amet.'; const simpleProductDesc = 'Lorem ipsum dolor sit amet.';
const singleProductPrice = '100.00'; const singleProductPrice = '100.00';
const singleProductSalePrice = '50.00'; const singleProductSalePrice = '50.00';
const totalInclusiveTax = +singleProductSalePrice + 5 + 2.5;
let product1Id; let productId, countryTaxId, stateTaxId, shippingZoneId;
test.describe( 'Mini Cart block page', () => { test.describe( 'Mini Cart block page', () => {
test.use( { storageState: process.env.ADMINSTATE } ); test.use( { storageState: process.env.ADMINSTATE } );
@ -32,7 +34,58 @@ test.describe( 'Mini Cart block page', () => {
sale_price: singleProductSalePrice, sale_price: singleProductSalePrice,
} ) } )
.then( ( response ) => { .then( ( response ) => {
product1Id = response.data.id; productId = response.data.id;
} );
// add tax
await api.put( 'settings/general/woocommerce_calc_taxes', {
value: 'yes',
} );
await api.put( 'settings/tax/woocommerce_tax_display_cart', {
value: 'excl',
} );
await api
.post( 'taxes', {
country: 'US',
state: '*',
cities: '*',
postcodes: '*',
rate: '10',
name: 'Country Tax',
shipping: false,
priority: 1,
} )
.then( ( response ) => {
countryTaxId = response.data.id;
} );
await api
.post( 'taxes', {
country: '*',
state: 'CA',
cities: '*',
postcodes: '*',
rate: '5',
name: 'State Tax',
shipping: false,
priority: 2,
} )
.then( ( response ) => {
stateTaxId = response.data.id;
} );
// add shipping zone, location and method
await api
.post( 'shipping/zones', {
name: 'US Free Shipping',
} )
.then( ( response ) => {
shippingZoneId = response.data.id;
} );
await api.put( `shipping/zones/${ shippingZoneId }/locations`, [
{
code: 'US',
},
] );
await api.post( `shipping/zones/${ shippingZoneId }/methods`, {
method_id: 'free_shipping',
} ); } );
} ); } );
@ -44,7 +97,16 @@ test.describe( 'Mini Cart block page', () => {
version: 'wc/v3', version: 'wc/v3',
} ); } );
await api.post( 'products/batch', { await api.post( 'products/batch', {
delete: [ product1Id ], delete: [ productId ],
} );
await api.put( 'settings/general/woocommerce_calc_taxes', {
value: 'no',
} );
await api.post( 'taxes/batch', {
delete: [ countryTaxId, stateTaxId ],
} );
await api.delete( `shipping/zones/${ shippingZoneId }`, {
force: true,
} ); } );
const base64auth = Buffer.from( const base64auth = Buffer.from(
`${ admin.username }:${ admin.password }` `${ admin.username }:${ admin.password }`
@ -68,48 +130,51 @@ test.describe( 'Mini Cart block page', () => {
} ); } );
} ); } );
test.beforeEach( async ( { context } ) => {
// shopping cart is very sensitive to cookies, so be explicit
await context.clearCookies();
} );
test( 'can see empty mini cart', async ( { page } ) => { test( 'can see empty mini cart', async ( { page } ) => {
// create a new page with mini cart block // create a new page with mini cart block
await page.goto( 'wp-admin/post-new.php?post_type=page' ); await page.goto( 'wp-admin/post-new.php?post_type=page' );
await page.waitForLoadState( 'networkidle' );
await page.locator( 'input[name="log"]' ).fill( admin.username );
await page.locator( 'input[name="pwd"]' ).fill( admin.password );
await page.locator( 'text=Log In' ).click();
const welcomeModalVisible = await page // Close welcome popup if prompted
.getByRole( 'heading', { try {
name: 'Welcome to the block editor', await page
} ) .getByLabel( 'Close', { exact: true } )
.isVisible(); .click( { timeout: 5000 } );
} catch ( error ) {
if ( welcomeModalVisible ) { console.log( "Welcome modal wasn't present, skipping action." );
await page.getByRole( 'button', { name: 'Close' } ).click();
} }
await page await page
.getByRole( 'textbox', { name: 'Add Title' } ) .getByRole( 'textbox', { name: 'Add title' } )
.fill( pageTitle ); .fill( pageTitle );
await page.getByRole( 'button', { name: 'Add default block' } ).click(); await page.getByRole( 'button', { name: 'Add default block' } ).click();
await page await page
.getByRole( 'document', { .getByRole( 'document', {
name: 'Empty block; start writing or type forward slash to choose a block', name: 'Empty block; start writing or type forward slash to choose a block',
} ) } )
.fill( '/mini' ); .fill( '/mini' );
await page.keyboard.press( 'Enter' ); await page.keyboard.press( 'Enter' );
await page await page
.getByRole( 'button', { name: 'Publish', exact: true } ) .getByRole( 'button', { name: 'Publish', exact: true } )
.click(); .click();
await page await page
.getByRole( 'region', { name: 'Editor publish' } ) .getByRole( 'region', { name: 'Editor publish' } )
.getByRole( 'button', { name: 'Publish', exact: true } ) .getByRole( 'button', { name: 'Publish', exact: true } )
.click(); .click();
await expect( await expect(
page.getByText( `${ pageTitle } is now live.` ) page.getByText( `${ pageTitle } is now live.` )
).toBeVisible(); ).toBeVisible();
// go to the page to test mini cart // go to the page to test mini cart
await page.goto( '/mini-cart' ); await page.goto( pageSlug );
await expect( await expect(
page.getByRole( 'heading', { name: pageTitle } ) page.getByRole( 'heading', { name: pageTitle } )
).toBeVisible(); ).toBeVisible();
@ -126,13 +191,13 @@ test.describe( 'Mini Cart block page', () => {
test( 'can proceed to mini cart, observe it and proceed to the checkout', async ( { test( 'can proceed to mini cart, observe it and proceed to the checkout', async ( {
page, page,
} ) => { } ) => {
const slug = simpleProductName.replace( / /gi, '-' ).toLowerCase();
// add product to cart // add product to cart
await page.goto( `product/${ slug }` ); await page.goto( `/shop/?add-to-cart=${ productId }`, {
await page.getByRole( 'button', { name: 'Add to cart' } ).click(); waitUntil: 'networkidle',
} );
// go to page with mini cart block and test with the product added // go to page with mini cart block and test with the product added
await page.goto( '/mini-cart' ); await page.goto( pageSlug );
await expect( await expect(
page.locator( '.wc-block-mini-cart__button' ) page.locator( '.wc-block-mini-cart__button' )
).toContainText( `$${ singleProductSalePrice }` ); ).toContainText( `$${ singleProductSalePrice }` );
@ -166,9 +231,10 @@ test.describe( 'Mini Cart block page', () => {
).toBeVisible(); ).toBeVisible();
// add product to cart and redirect from mini to regular cart // add product to cart and redirect from mini to regular cart
await page.goto( `product/${ slug }` ); await page.goto( `/shop/?add-to-cart=${ productId }`, {
await page.getByRole( 'button', { name: 'Add to cart' } ).click(); waitUntil: 'networkidle',
await page.goto( '/mini-cart' ); } );
await page.goto( pageSlug );
await page.locator( miniCartButton ).click(); await page.locator( miniCartButton ).click();
await page.getByRole( 'link', { name: 'View my cart' } ).click(); await page.getByRole( 'link', { name: 'View my cart' } ).click();
await expect( await expect(
@ -177,7 +243,7 @@ test.describe( 'Mini Cart block page', () => {
await expect( page.locator( miniCartButton ) ).toBeHidden(); await expect( page.locator( miniCartButton ) ).toBeHidden();
// go to mini cart and test redirection from mini cart to checkout // go to mini cart and test redirection from mini cart to checkout
await page.goto( '/mini-cart' ); await page.goto( pageSlug );
await page.locator( miniCartButton ).click(); await page.locator( miniCartButton ).click();
await page.getByRole( 'link', { name: 'Go to checkout' } ).click(); await page.getByRole( 'link', { name: 'Go to checkout' } ).click();
await expect( await expect(
@ -185,4 +251,56 @@ test.describe( 'Mini Cart block page', () => {
).toBeVisible(); ).toBeVisible();
await expect( page.locator( miniCartButton ) ).toBeHidden(); await expect( page.locator( miniCartButton ) ).toBeHidden();
} ); } );
test( 'can see mini cart total price inclusive with tax', async ( {
page,
baseURL,
} ) => {
const api = new wcApi( {
url: baseURL,
consumerKey: process.env.CONSUMER_KEY,
consumerSecret: process.env.CONSUMER_SECRET,
version: 'wc/v3',
} );
// set inlcuding tax prices
await api.put( 'settings/tax/woocommerce_tax_display_cart', {
value: 'incl',
} );
// add product to cart
await page.goto( `/shop/?add-to-cart=${ productId }`, {
waitUntil: 'networkidle',
} );
// go to cart and add shipping details to calculate tax
await page.goto( '/cart/' ); // we will use the old cart for this purpose
await page.locator( '.shipping-calculator-button' ).click();
await page.getByLabel( 'Town / City' ).fill( 'Sacramento' );
await page.getByLabel( 'ZIP Code' ).fill( '96000' );
await page
.getByRole( 'button', { name: 'Update', exact: true } )
.click();
await expect( page.locator( '.woocommerce-info' ) ).toContainText(
'Shipping costs updated.'
);
await page.goto( pageSlug );
await expect(
page.getByRole( 'heading', { name: pageTitle } )
).toBeVisible();
await expect(
page.locator( '.wc-block-mini-cart__button' )
).toContainText( `$${ totalInclusiveTax }` );
await page.locator( miniCartButton ).click();
await expect(
page.locator( '.wc-block-components-totals-item__value' )
).toContainText( `$${ totalInclusiveTax }` );
await page
.getByRole( 'button' )
.filter( { hasText: 'Remove item' } )
.click();
await expect(
page.getByText( 'Your cart is currently empty!' )
).toBeVisible();
} );
} ); } );