diff --git a/plugins/woocommerce-blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-methods-block/block.tsx b/plugins/woocommerce-blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-methods-block/block.tsx index c4b68bac929..68be42ddde5 100644 --- a/plugins/woocommerce-blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-methods-block/block.tsx +++ b/plugins/woocommerce-blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-methods-block/block.tsx @@ -2,7 +2,10 @@ * External dependencies */ import { __ } from '@wordpress/i18n'; -import { useShippingData } from '@woocommerce/base-context/hooks'; +import { + useCustomerData, + useShippingData, +} from '@woocommerce/base-context/hooks'; import { ShippingRatesControl } from '@woocommerce/base-components/cart-checkout'; import { getShippingRatesPackageCount, @@ -19,15 +22,13 @@ import type { PackageRateOption, CartShippingPackageShippingRate, } from '@woocommerce/types'; -import { CART_STORE_KEY } from '@woocommerce/block-data'; -import { useSelect } from '@wordpress/data'; import NoticeBanner from '@woocommerce/base-components/notice-banner'; +import type { ReactElement } from 'react'; /** * Internal dependencies */ import './style.scss'; -import { shippingAddressHasValidationErrors } from '../../../../data/cart/utils'; /** * Renders a shipping rate control option. @@ -54,10 +55,7 @@ const renderShippingRatesControlOption = ( }; }; -const Block = ( { - noShippingPlaceholder = null, - shippingCostRequiresAddress = false, -} ): React.ReactElement | null => { +const Block = ( { noShippingPlaceholder = null } ): ReactElement | null => { const { isEditor } = useEditorContext(); const { @@ -68,9 +66,7 @@ const Block = ( { isCollectable, } = useShippingData(); - const shippingAddressPushed = useSelect( ( select ) => { - return select( CART_STORE_KEY ).getFullShippingAddressPushed(); - } ); + const { shippingAddress } = useCustomerData(); const filteredShippingRates = isCollectable ? shippingRates.map( ( shippingRatesPackage ) => { @@ -86,25 +82,14 @@ const Block = ( { } ) : shippingRates; - const shippingAddress = useSelect( ( select ) => { - return select( CART_STORE_KEY ).getCustomerData()?.shippingAddress; - } ); - if ( ! needsShipping ) { return null; } - const shippingAddressHasErrors = ! shippingAddressHasValidationErrors(); - const addressComplete = isAddressComplete( shippingAddress ); - const shippingRatesPackageCount = getShippingRatesPackageCount( shippingRates ); - if ( - ( ! hasCalculatedShipping && ! shippingRatesPackageCount ) || - ( shippingCostRequiresAddress && - ( ! shippingAddressPushed || ! shippingAddressHasErrors ) ) - ) { + if ( ! hasCalculatedShipping && ! shippingRatesPackageCount ) { return (

{ __( @@ -114,6 +99,7 @@ const Block = ( {

); } + const addressComplete = isAddressComplete( shippingAddress ); return ( <> diff --git a/plugins/woocommerce-blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-methods-block/frontend.tsx b/plugins/woocommerce-blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-methods-block/frontend.tsx index 9fced3fa2e7..dd67d39fba5 100644 --- a/plugins/woocommerce-blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-methods-block/frontend.tsx +++ b/plugins/woocommerce-blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-methods-block/frontend.tsx @@ -20,7 +20,6 @@ const FrontendBlock = ( { showStepNumber, children, className, - shippingCostRequiresAddress = false, }: { title: string; description: string; @@ -32,7 +31,6 @@ const FrontendBlock = ( { showStepNumber: boolean; children: JSX.Element; className?: string; - shippingCostRequiresAddress: boolean; } ) => { const checkoutIsProcessing = useSelect( ( select ) => select( CHECKOUT_STORE_KEY ).isProcessing() @@ -55,9 +53,7 @@ const FrontendBlock = ( { description={ description } showStepNumber={ showStepNumber } > - + { children } ); diff --git a/plugins/woocommerce-blocks/assets/js/extensions/shipping-methods/pickup-location/general-settings.tsx b/plugins/woocommerce-blocks/assets/js/extensions/shipping-methods/pickup-location/general-settings.tsx index 3bd05a33dcf..fa42758b94a 100644 --- a/plugins/woocommerce-blocks/assets/js/extensions/shipping-methods/pickup-location/general-settings.tsx +++ b/plugins/woocommerce-blocks/assets/js/extensions/shipping-methods/pickup-location/general-settings.tsx @@ -3,7 +3,7 @@ */ import { __ } from '@wordpress/i18n'; import { createInterpolateElement, useState } from '@wordpress/element'; -import { ADMIN_URL } from '@woocommerce/settings'; +import { ADMIN_URL, getSetting } from '@woocommerce/settings'; import { CHECKOUT_PAGE_ID } from '@woocommerce/block-settings'; import { CheckboxControl, @@ -47,6 +47,11 @@ const GeneralSettings = () => { useSettingsContext(); const [ showCosts, setShowCosts ] = useState( !! settings.cost ); + const shippingCostRequiresAddress = getSetting< boolean >( + 'shippingCostRequiresAddress', + false + ); + return ( @@ -78,10 +83,23 @@ const GeneralSettings = () => { 'Enable local pickup', 'woo-gutenberg-products-block' ) } - help={ __( - 'When enabled, local pickup will appear as an option on the block based checkout.', - 'woo-gutenberg-products-block' - ) } + help={ + + { __( + 'When enabled, local pickup will appear as an option on the block based checkout.', + 'woo-gutenberg-products-block' + ) } + { shippingCostRequiresAddress ? ( + <> +
+ { __( + 'If local pickup is enabled, the "Hide shipping costs until an address is entered" setting will be ignored.', + 'woo-gutenberg-products-block' + ) } + + ) : null } +
+ } /> asset_api = $asset_api; $this->asset_data_registry = $asset_data_registry; + + $this->local_pickup_enabled = LocalPickupUtils::is_local_pickup_enabled(); } /** @@ -81,7 +90,7 @@ class ShippingController { * @return boolean Whether shipping cost calculation should require an address to be entered before calculating. */ public function override_cost_requires_address_option( $value ) { - if ( CartCheckoutUtils::is_checkout_block_default() ) { + if ( CartCheckoutUtils::is_checkout_block_default() && $this->local_pickup_enabled ) { return 'no'; } return $value; @@ -94,7 +103,7 @@ class ShippingController { * @return boolean Whether shipping should continue to be enabled/disabled. */ public function force_shipping_enabled( $enabled ) { - if ( CartCheckoutUtils::is_checkout_block_default() ) { + if ( CartCheckoutUtils::is_checkout_block_default() && $this->local_pickup_enabled ) { return true; } return $enabled; @@ -141,48 +150,31 @@ class ShippingController { */ public function remove_shipping_settings( $settings ) { - // Do not add the "Hide shipping costs until an address is entered" setting if the Checkout block is not used on the WC checkout page. - if ( CartCheckoutUtils::is_checkout_block_default() ) { - $settings = array_filter( - $settings, - function( $setting ) { - return ! in_array( - $setting['id'], - array( - 'woocommerce_shipping_cost_requires_address', - ), - true - ); - } - ); - } - // Do not add the shipping calculator setting if the Cart block is not used on the WC cart page. if ( CartCheckoutUtils::is_cart_block_default() ) { - // If the Cart is default, but not the checkout, we should ensure the 'Calculations' title is added to the - // `woocommerce_shipping_cost_requires_address` options group, since it is attached to the - // `woocommerce_enable_shipping_calc` option that we're going to remove later. - if ( ! CartCheckoutUtils::is_checkout_block_default() ) { - $calculations_title = ''; + // Ensure the 'Calculations' title is added to the `woocommerce_shipping_cost_requires_address` options + // group, since it is attached to the `woocommerce_enable_shipping_calc` option that gets removed if the + // Cart block is in use. + $calculations_title = ''; - // Get Calculations title so we can add it to 'Hide shipping costs until an address is entered' option. - foreach ( $settings as $setting ) { - if ( 'woocommerce_enable_shipping_calc' === $setting['id'] ) { - $calculations_title = $setting['title']; - break; - } - } - - // Add Calculations title to 'Hide shipping costs until an address is entered' option. - foreach ( $settings as $index => $setting ) { - if ( 'woocommerce_shipping_cost_requires_address' === $setting['id'] ) { - $settings[ $index ]['title'] = $calculations_title; - $settings[ $index ]['checkboxgroup'] = 'start'; - break; - } + // Get Calculations title so we can add it to 'Hide shipping costs until an address is entered' option. + foreach ( $settings as $setting ) { + if ( 'woocommerce_enable_shipping_calc' === $setting['id'] ) { + $calculations_title = $setting['title']; + break; } } + + // Add Calculations title to 'Hide shipping costs until an address is entered' option. + foreach ( $settings as $index => $setting ) { + if ( 'woocommerce_shipping_cost_requires_address' === $setting['id'] ) { + $settings[ $index ]['title'] = $calculations_title; + $settings[ $index ]['checkboxgroup'] = 'start'; + break; + } + } + $settings = array_filter( $settings, function( $setting ) { @@ -196,6 +188,18 @@ class ShippingController { } ); } + + if ( CartCheckoutUtils::is_checkout_block_default() && $this->local_pickup_enabled ) { + foreach ( $settings as $index => $setting ) { + if ( 'woocommerce_shipping_cost_requires_address' === $setting['id'] ) { + $settings[ $index ]['desc'] .= ' (' . __( 'Not available when using WooCommerce Blocks Local Pickup', 'woo-gutenberg-products-block' ) . ')'; + $settings[ $index ]['disabled'] = true; + $settings[ $index ]['value'] = 'no'; + break; + } + } + } + return $settings; } diff --git a/plugins/woocommerce-blocks/src/StoreApi/Utilities/LocalPickupUtils.php b/plugins/woocommerce-blocks/src/StoreApi/Utilities/LocalPickupUtils.php index 836e3599668..29cff3b2142 100644 --- a/plugins/woocommerce-blocks/src/StoreApi/Utilities/LocalPickupUtils.php +++ b/plugins/woocommerce-blocks/src/StoreApi/Utilities/LocalPickupUtils.php @@ -6,6 +6,16 @@ namespace Automattic\WooCommerce\StoreApi\Utilities; * the ShippingController, i.e. the OrderController. */ class LocalPickupUtils { + + /** + * Checks if WC Blocks local pickup is enabled. + * + * @return bool True if local pickup is enabled. + */ + public static function is_local_pickup_enabled() { + $pickup_location_settings = get_option( 'woocommerce_pickup_location_settings', [] ); + return wc_string_to_bool( $pickup_location_settings['enabled'] ?? 'no' ); + } /** * Gets a list of payment method ids that support the 'local-pickup' feature. * diff --git a/plugins/woocommerce-blocks/tests/e2e/specs/backend/checkout.test.js b/plugins/woocommerce-blocks/tests/e2e/specs/backend/checkout.test.js index 28cc2296609..1329860ac68 100644 --- a/plugins/woocommerce-blocks/tests/e2e/specs/backend/checkout.test.js +++ b/plugins/woocommerce-blocks/tests/e2e/specs/backend/checkout.test.js @@ -22,7 +22,6 @@ import { openWidgetEditor, closeModalIfExists, } from '../../utils.js'; -import { merchant as merchantUtils } from '../../../utils/merchant'; const block = { name: 'Checkout', @@ -128,79 +127,6 @@ describe( `${ block.name } Block`, () => { await selectBlockByName( block.slug ); } ); - it( 'can toggle "hide shipping costs until an address is entered"', async () => { - await selectBlockByName( - 'woocommerce/checkout-shipping-methods-block' - ); - const toggleLabel = await findLabelWithText( - 'Hide shipping costs until an address is entered' - ); - await toggleLabel.click(); - const shippingOptionsRequireAddressText = await page.$x( - '//p[contains(text(), "Shipping options will be displayed here after entering your full shipping address.")]' - ); - await expect( shippingOptionsRequireAddressText ).toHaveLength( - 1 - ); - - await toggleLabel.click(); - await expect( page ).toMatchElement( - '.wc-block-components-shipping-rates-control' - ); - } ); - - it( 'toggles the same setting in shipping method and shipping methods blocks', async () => { - await merchantUtils.goToLocalPickupSettingsPage(); - await merchantUtils.enableLocalPickup(); - await merchantUtils.saveLocalPickupSettingsPageWithRefresh(); - - await visitBlockPage( `${ block.name } Block` ); - await expect( page ).toClick( - '.wc-block-checkout__shipping-method button', - { text: 'Shipping' } - ); - await openSettingsSidebar(); - const toggleLabel = await findLabelWithText( - 'Hide shipping costs until an address is entered' - ); - await toggleLabel.click(); - const [ label ] = await page.$x( - '//label[contains(., "Hide shipping costs until an address is entered")]' - ); - const shippingMethodForValue = await page.evaluate( - ( passedLabel ) => passedLabel.getAttribute( 'for' ), - label - ); - const shippingMethodSettingIsChecked = await page.evaluate( - ( passedShippingMethodForValue ) => - document.getElementById( passedShippingMethodForValue ) - .checked, - shippingMethodForValue - ); - await expect( shippingMethodSettingIsChecked ).toBe( true ); - await selectBlockByName( - 'woocommerce/checkout-shipping-methods-block' - ); - const [ shippingMethodsLabel ] = await page.$x( - '//label[contains(., "Hide shipping costs until an address is entered")]' - ); - const shippingMethodsLabelForValue = await page.evaluate( - ( passedShippingMethodsLabel ) => - passedShippingMethodsLabel.getAttribute( 'for' ), - shippingMethodsLabel - ); - const shippingMethodLabelIsChecked = await page.evaluate( - ( passedShippingMethodsLabelForValue ) => - document.getElementById( - passedShippingMethodsLabelForValue - ).checked, - shippingMethodsLabelForValue - ); - expect( shippingMethodSettingIsChecked ).toBe( - shippingMethodLabelIsChecked - ); - } ); - it( 'can enable dark mode inputs', async () => { const toggleLabel = await findLabelWithText( 'Dark mode inputs' diff --git a/plugins/woocommerce-blocks/tests/e2e/specs/merchant/local-pickup.test.ts b/plugins/woocommerce-blocks/tests/e2e/specs/merchant/local-pickup.test.ts index 2cb4027e434..25138d8c4f6 100644 --- a/plugins/woocommerce-blocks/tests/e2e/specs/merchant/local-pickup.test.ts +++ b/plugins/woocommerce-blocks/tests/e2e/specs/merchant/local-pickup.test.ts @@ -106,32 +106,8 @@ describe( `Local Pickup Settings`, () => { checkoutSlug: 'checkout-block', } ); } ); - it( 'hides the correct shipping options if Checkout block is the default', async () => { - await visitAdminPage( - 'admin.php', - 'page=wc-settings&tab=shipping§ion=options' - ); - const hideShippingLabel = await findLabelWithText( - 'Hide shipping costs until an address is entered' - ); - expect( hideShippingLabel ).toBeUndefined(); - - const shippingCalculatorLabel = await findLabelWithText( - 'Enable the shipping calculator on the cart page' - ); - expect( shippingCalculatorLabel ).toBeUndefined(); - } ); - - it( 'does not hide the relevant setting if Cart or Checkout block is not the default', async () => { - await setCartCheckoutPages( { - cartSlug: 'cart', - checkoutSlug: 'checkout', - } ); - - await visitAdminPage( - 'admin.php', - 'page=wc-settings&tab=advanced' - ); + it( 'shows the correct shipping options depending on whether Local Pickup is enabled', async () => { + await merchant.disableLocalPickup(); await visitAdminPage( 'admin.php', 'page=wc-settings&tab=shipping§ion=options' @@ -141,10 +117,15 @@ describe( `Local Pickup Settings`, () => { ); await expect( hideShippingLabel ).toHaveLength( 1 ); - const shippingCalculatorLabel = await page.$x( - '//label[contains(., "Enable the shipping calculator on the cart page")]' + await merchant.enableLocalPickup(); + await visitAdminPage( + 'admin.php', + 'page=wc-settings&tab=shipping§ion=options' ); - await expect( shippingCalculatorLabel ).toHaveLength( 1 ); + const modifiedHideShippingLabel = await page.$x( + '//label[contains(., "Hide shipping costs until an address is entered (Not available when using WooCommerce Blocks Local Pickup)")]' + ); + await expect( modifiedHideShippingLabel ).toHaveLength( 1 ); } ); } ); diff --git a/plugins/woocommerce-blocks/tests/e2e/specs/shopper/cart-checkout/checkout.test.js b/plugins/woocommerce-blocks/tests/e2e/specs/shopper/cart-checkout/checkout.test.js index c0cf8483e9a..f5a039feb60 100644 --- a/plugins/woocommerce-blocks/tests/e2e/specs/shopper/cart-checkout/checkout.test.js +++ b/plugins/woocommerce-blocks/tests/e2e/specs/shopper/cart-checkout/checkout.test.js @@ -334,40 +334,8 @@ describe( 'Shopper → Checkout', () => { const NORMAL_SHIPPING_NAME = 'Normal Shipping'; const NORMAL_SHIPPING_PRICE = '$20.00'; - afterAll( async () => { + afterEach( async () => { await merchant.login(); - await visitBlockPage( 'Checkout Block' ); - await openSettingsSidebar(); - await selectBlockByName( - 'woocommerce/checkout-shipping-methods-block' - ); - const [ label ] = await page.$x( - '//label[contains(., "Hide shipping costs until an address is entered")]' - ); - const shippingMethodForValue = await page.evaluate( - ( passedLabel ) => passedLabel.getAttribute( 'for' ), - label - ); - let shippingMethodSettingIsChecked = await page.evaluate( - ( passedShippingMethodForValue ) => - document.getElementById( passedShippingMethodForValue ) - .checked, - shippingMethodForValue - ); - if ( ! shippingMethodSettingIsChecked ) { - await setCheckbox( - await getToggleIdByLabel( - 'Hide shipping costs until an address is entered' - ) - ); - } - shippingMethodSettingIsChecked = await page.evaluate( - ( passedShippingMethodForValue ) => - document.getElementById( passedShippingMethodForValue ) - .checked, - shippingMethodForValue - ); - await merchantUtils.disableLocalPickup(); } ); @@ -401,159 +369,68 @@ describe( 'Shopper → Checkout', () => { await expect( page ).toMatch( NORMAL_SHIPPING_NAME ); } ); - it( 'User sees the correct shipping options based on block settings', async () => { - await preventCompatibilityNotice(); - await merchant.login(); - await visitBlockPage( 'Checkout Block' ); - await openSettingsSidebar(); - await selectBlockByName( - 'woocommerce/checkout-shipping-methods-block' - ); - - const [ label ] = await page.$x( - '//label[contains(., "Hide shipping costs until an address is entered")]' - ); - const shippingMethodForValue = await page.evaluate( - ( passedLabel ) => passedLabel.getAttribute( 'for' ), - label - ); - let shippingMethodSettingIsChecked = await page.evaluate( - ( passedShippingMethodForValue ) => - document.getElementById( passedShippingMethodForValue ) - .checked, - shippingMethodForValue - ); - if ( ! shippingMethodSettingIsChecked ) { - await setCheckbox( - await getToggleIdByLabel( - 'Hide shipping costs until an address is entered' - ) - ); - } - shippingMethodSettingIsChecked = await page.evaluate( - ( passedShippingMethodForValue ) => - document.getElementById( passedShippingMethodForValue ) - .checked, - shippingMethodForValue - ); - await expect( shippingMethodSettingIsChecked ).toBe( true ); - await saveOrPublish(); - await shopper.block.emptyCart(); - // Log out to have a fresh empty cart. - await shopper.logout(); - await shopper.block.goToShop(); - await shopper.addToCartFromShopPage( SIMPLE_PHYSICAL_PRODUCT_NAME ); - await shopper.block.goToCheckout(); - // Expect no shipping options to be shown, but with a friendly message. - const shippingOptionsRequireAddressText = await page.$x( - '//p[contains(text(), "Shipping options will be displayed here after entering your full shipping address.")]' - ); - expect( shippingOptionsRequireAddressText ).toHaveLength( 1 ); - - // Enter the address and expect shipping options to be shown. - await shopper.block.fillInCheckoutWithTestData(); - await expect( page ).toMatchElement( - '.wc-block-components-shipping-rates-control' - ); - - // This sequence will reset the checkout form. - await shopper.login(); - await shopper.logout(); - - await preventCompatibilityNotice(); - await merchant.login(); - await visitBlockPage( 'Checkout Block' ); - await openSettingsSidebar(); - await selectBlockByName( - 'woocommerce/checkout-shipping-methods-block' - ); - - await unsetCheckbox( - await getToggleIdByLabel( - 'Hide shipping costs until an address is entered' - ) - ); - await saveOrPublish(); - await shopper.block.emptyCart(); - - await shopper.block.goToShop(); - await shopper.addToCartFromShopPage( SIMPLE_PHYSICAL_PRODUCT_NAME ); - await shopper.block.goToCheckout(); - - // Expect the shipping options to be displayed without entering an address. - await expect( page ).toMatchElement( - '.wc-block-components-shipping-rates-control' - ); - } ); - it( 'User does not see shipping rates until full address is entered', async () => { await preventCompatibilityNotice(); await merchant.login(); - await merchantUtils.enableLocalPickup(); - await merchantUtils.addLocalPickupLocation(); - await visitBlockPage( 'Checkout Block' ); - await openSettingsSidebar(); - await selectBlockByName( - 'woocommerce/checkout-shipping-methods-block' + await merchantUtils.disableLocalPickup(); + await visitAdminPage( + 'admin.php', + 'page=wc-settings&tab=shipping§ion=options' ); + const hideShippingLabel = await page.$x( + '//label[contains(., "Hide shipping costs until an address is entered")]' + ); + await hideShippingLabel[ 0 ].click(); - await setCheckbox( - await getToggleIdByLabel( - 'Hide shipping costs until an address is entered' - ) + const saveButton = await page.$x( + '//button[contains(., "Save changes")]' ); - await saveOrPublish(); + await saveButton[ 0 ].click(); + + await page.waitForXPath( + '//strong[contains(., "Your settings have been saved.")]' + ); + await merchant.logout(); + await shopper.block.emptyCart(); - // Log out to have a fresh empty cart. - await shopper.logout(); await shopper.block.goToShop(); await shopper.addToCartFromShopPage( SIMPLE_PHYSICAL_PRODUCT_NAME ); await shopper.block.goToCheckout(); - // Expect no shipping options to be shown, but with a friendly message. + // // Expect no shipping options to be shown, but with a friendly message. const shippingOptionsRequireAddressText = await page.$x( '//p[contains(text(), "Shipping options will be displayed here after entering your full shipping address.")]' ); - expect( shippingOptionsRequireAddressText ).toHaveLength( 1 ); - - await expect( page ).toClick( - '.wc-block-checkout__shipping-method button', - { text: 'Shipping' } - ); + await expect( shippingOptionsRequireAddressText ).toHaveLength( 1 ); // Enter the address but not city and expect shipping options not to be shown. - await shopper.block.fillInCheckoutWithTestData( { city: '' } ); + await shopper.block.fillInCheckoutWithTestData( { postcode: '' } ); await expect( page ).not.toMatchElement( '.wc-block-components-shipping-rates-control' ); + await merchant.login(); + await merchantUtils.enableLocalPickup(); + await merchantUtils.addLocalPickupLocation(); + await merchant.logout(); + // This sequence will reset the checkout form. await shopper.login(); await shopper.logout(); - await preventCompatibilityNotice(); - await merchant.login(); - await visitBlockPage( 'Checkout Block' ); - await openSettingsSidebar(); - await selectBlockByName( - 'woocommerce/checkout-shipping-methods-block' - ); - - await unsetCheckbox( - await getToggleIdByLabel( - 'Hide shipping costs until an address is entered' - ) - ); - await saveOrPublish(); await shopper.block.emptyCart(); - await shopper.block.goToShop(); await shopper.addToCartFromShopPage( SIMPLE_PHYSICAL_PRODUCT_NAME ); await shopper.block.goToCheckout(); + await expect( page ).toClick( + '.wc-block-checkout__shipping-method button', + { text: 'Shipping' } + ); + // Expect the shipping options to be displayed without entering an address. await expect( page ).toMatchElement( '.wc-block-components-shipping-rates-control' diff --git a/plugins/woocommerce-blocks/tests/utils/shopper.js b/plugins/woocommerce-blocks/tests/utils/shopper.js index 2184c7ec5fb..d3302451340 100644 --- a/plugins/woocommerce-blocks/tests/utils/shopper.js +++ b/plugins/woocommerce-blocks/tests/utils/shopper.js @@ -432,7 +432,7 @@ export const shopper = { }; // We need to wait for the shipping total to update before we assert. - // As no dom elements are being added or removed, we cannot use `await page.waitForSelectot()` + // As no dom elements are being added or removed, we cannot use `await page.waitForSelector()` // so instead we check when the `via ` text changes await page.$eval( '.wc-block-components-totals-shipping .wc-block-components-totals-shipping__via',