woocommerce/plugins/woocommerce-blocks/tests/e2e/specs/merchant/checkout-terms.test.js

111 lines
3.7 KiB
JavaScript
Raw Normal View History

/**
* External dependencies
*/
import { merchant, setCheckbox, unsetCheckbox } from '@woocommerce/e2e-utils';
import {
visitBlockPage,
selectBlockByName,
saveOrPublish,
} from '@woocommerce/blocks-test-utils';
/**
* Internal dependencies
*/
import { openSettingsSidebar } from '../../utils';
import {
shopper,
preventCompatibilityNotice,
reactivateCompatibilityNotice,
} from '../../../utils';
import {
BASE_URL,
BILLING_DETAILS,
SIMPLE_VIRTUAL_PRODUCT_NAME,
} from '../../../utils/constants';
if ( process.env.WOOCOMMERCE_BLOCKS_PHASE < 2 ) {
// eslint-disable-next-line jest/no-focused-tests, jest/expect-expect
test.only( `Skipping checkout tests`, () => {} );
}
describe( 'Merchant → Checkout → Can adjust T&S and Privacy Policy options', () => {
beforeAll( async () => {
await shopper.goToShop();
await page.goto( `${ BASE_URL }/?setup_terms_and_privacy` );
// eslint-disable-next-line jest/no-standalone-expect
await expect( page ).toMatch( 'Terms & Privacy pages set up.' );
await shopper.block.emptyCart();
} );
afterAll( async () => {
await shopper.block.emptyCart();
await page.goto( `${ BASE_URL }/?teardown_terms_and_privacy` );
// eslint-disable-next-line jest/no-standalone-expect
await expect( page ).toMatch( 'Terms & Privacy pages teared down.' );
} );
it( 'Merchant can see T&S and Privacy Policy links without checkbox', async () => {
await shopper.goToShop();
await shopper.addToCartFromShopPage( SIMPLE_VIRTUAL_PRODUCT_NAME );
await shopper.block.goToCheckout();
await expect( page ).toMatch(
'By proceeding with your purchase you agree to our Terms and Conditions and Privacy Policy'
);
await shopper.block.fillInCheckoutWithTestData();
await shopper.block.placeOrder();
await expect( page ).toMatch( 'Order received' );
} );
it( 'Merchant can see T&S and Privacy Policy links with checkbox', async () => {
// Activate checkboxes for T&S and Privacy Policy links.
await preventCompatibilityNotice();
await merchant.login();
await visitBlockPage( 'Checkout Block' );
await openSettingsSidebar();
await selectBlockByName( 'woocommerce/checkout-terms-block' );
const [ termsCheckboxLabel ] = await page.$x(
`//label[contains(text(), "Require checkbox") and contains(@class, "components-toggle-control__label")]`
);
const termsCheckboxId = await page.evaluate(
( label ) => `#${ label.getAttribute( 'for' ) }`,
termsCheckboxLabel
);
await setCheckbox( termsCheckboxId );
await saveOrPublish();
await shopper.goToShop();
await shopper.addToCartFromShopPage( SIMPLE_VIRTUAL_PRODUCT_NAME );
await shopper.block.goToCheckout();
await shopper.block.fillBillingDetails( BILLING_DETAILS );
Remove WC Core shipping settings if Cart/Checkout blocks are in use (https://github.com/woocommerce/woocommerce-blocks/pull/8679) * Add CartCheckoutUtils class This class will store reusable methods relating to Cart/Checkout Blocks, i.e. whether they are used on the Cart/Checkout page. * Update ShippingController to use the new CartCheckoutUtils function This will reduce code duplication when checking if the Cart/Checkout blocks are in use on the Cart/Checkout page. * Add filter to remove shipping settings when Cart/Checkout are default * Ensure setting displays correctly if cart is default but not checkout * Add tests to ensure core shipping settings update correctly * Add setCartCheckoutPages function to update set the cart/checkout page * Force shipping to be enabled if the Checkout block is in use. * Add filter to override cost requires address option * Add shippingCostRequiresAddress option * Check if the address is required before showing rates * Show shipping rates in editor * Add shippingCostRequiresAddress attribute to shipping methods block * Update frontend type to show shippingCostRequiresAddress is a prop * Add control to toggle shippingCostRequiresAddress option * Show address notice in the correct scenario * Send shippingCostRequiresAddress to Block in front end context * Add e2e test for editor control * Add e2e tests for shipping options on the front end * Add updateAttributeInSiblingBlock function * Add shippingCostRequiresAddress to shipping method block * Ensure attribute is updated in both blocks when editing * In Shipping Methods Block, show correct component based on block setting * Show correct block in editor * Remove broken test from PR * Clean up updateAttributeInSiblingBlock * Add setCartCheckoutPages function to update set the cart/checkout page * Add tests to ensure core shipping settings update correctly * Add isAddressComplete function Borrowed from woocommerce/woocommerce-blocks#8141 * Check if the address is required before showing rates * Show shipping rates in editor * Show address notice in the correct scenario * Add e2e tests for shipping options on the front end * Ensure errorId is passed to StateInput * Add fullShippingAddressPushed action to wc/store/cart * Add fullShippingAddressPushed case to reducer * Ensure fullShippingAddressPushed is set when initialising cart store * Add fullShippingAddressPushed selector and default state entry * Add shippingAddressHasValidationErrors util function * Do not overwrite addresses when selecting a rate * Set whether full address has been pushed when saving address changes * In Shipping Methods Block, show correct component based on block setting * Don't show from price if rates should be hidden until address entered * Check city validation errors to assert if shipping address is valid * Rename merchant.js to merchant.ts * Move local pickup functions to common merchant util * Update local pickup tests to use common merchant utils * Add test to ensure setting toggles in both blocks * Add navigating to settings and saving in merchant util * Create addPickupLocation merchant util * Add test for local pickup and require full address * Make sure correct conditions are met to show shipping options * Ensure checkbox is checked during local pickup tests * Unset the checkbox when tests are finished running * Update checkout block fixture * Prevent error in unit tests * Import validation store key from constants Required because importing from the index causes the validation data store to register twice * Update checkout terms test to wait for button not to be disabled * Revert "Add isAddressComplete function" This reverts commit 9967dc0d4f10cf638859ae085e6f4cc2901dd299.
2023-03-13 11:49:28 +00:00
// Wait for the "Place Order" button to avoid flakey tests.
await page.waitForSelector(
'.wc-block-components-checkout-place-order-button:not([disabled])'
);
// Placing an order now, must lead to an error.
await page.click( '.wc-block-components-checkout-place-order-button' );
const termsCheckbox = await page.$(
'.wp-block-woocommerce-checkout-terms-block div'
);
const termsCheckboxClassList = (
await ( await termsCheckbox.getProperty( 'className' ) ).jsonValue()
).split( ' ' );
expect( termsCheckboxClassList ).toContain( 'has-error' );
await setCheckbox( '#terms-and-conditions' );
// Placing an order now, must succeed.
await shopper.block.placeOrder();
await expect( page ).toMatch( 'Order received' );
// Deactivate checkboxes for T&S and Privacy Policy links.
await visitBlockPage( 'Checkout Block' );
await openSettingsSidebar();
await selectBlockByName( 'woocommerce/checkout-terms-block' );
await unsetCheckbox( termsCheckboxId );
await saveOrPublish();
await merchant.logout();
await reactivateCompatibilityNotice();
} );
} );