From e069afb149a5b35071a22dde123eaa7067c78360 Mon Sep 17 00:00:00 2001 From: Julia Amosova Date: Fri, 30 Aug 2019 12:03:57 +0100 Subject: [PATCH 1/4] Add 2 new Puppeteer e2e tests: settings general & product --- .../wp-admin-settings-general.test.js | 53 +++++++++++++++++++ .../wp-admin-settings-product.test.js | 41 ++++++++++++++ tests/e2e-tests/utils/flows.js | 13 +++++ tests/e2e-tests/utils/index.js | 12 +++++ 4 files changed, 119 insertions(+) create mode 100644 tests/e2e-tests/specs/wp-admin/wp-admin-settings-general.test.js create mode 100644 tests/e2e-tests/specs/wp-admin/wp-admin-settings-product.test.js diff --git a/tests/e2e-tests/specs/wp-admin/wp-admin-settings-general.test.js b/tests/e2e-tests/specs/wp-admin/wp-admin-settings-general.test.js new file mode 100644 index 00000000000..9c7b1819f6a --- /dev/null +++ b/tests/e2e-tests/specs/wp-admin/wp-admin-settings-general.test.js @@ -0,0 +1,53 @@ +/** + * @format + */ + +/** + * External dependencies + */ +import { activatePlugin } from '@wordpress/e2e-test-utils'; + +/** + * Internal dependencies + */ +import { StoreOwnerFlow } from '../../utils/flows'; +import { settingsPageSaveChanges } from '../../utils'; + +describe( 'WooCommerce General Settings', () => { + beforeAll( async () => { + await activatePlugin( 'woocommerce' ); + } ); + + it( 'can update settings', async () => { + // Go to general settings page + await StoreOwnerFlow.openSettings( 'general' ); + + // Make sure the general tab is active + await expect( page ).toMatchElement( 'a.nav-tab-active', { text: 'General' } ); + + // Set selling location to all countries first, + // so we can choose california as base location. + await expect( page ).toSelect( '#woocommerce_allowed_countries', 'Sell to all countries' ); + await settingsPageSaveChanges(); + await expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ); + + // Set base location with state CA. + await expect( page ).toSelect( 'select[name="woocommerce_default_country"]', 'United States (US) — California' ); + await settingsPageSaveChanges(); + await expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ); + + // Set selling location to specific countries first, so we can choose U.S as base location (without state). + // This will makes specific countries option appears. + await expect( page ).toSelect( '#woocommerce_allowed_countries', 'Sell to specific countries' ); + await expect( page ).toSelect( 'select[name="woocommerce_specific_allowed_countries[]"]', 'United States (US)' ); + await settingsPageSaveChanges(); + await expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ); + + // Set currency options. + await expect( page ).toFill( '#woocommerce_price_thousand_sep', ',' ); + await expect( page ).toFill( '#woocommerce_price_decimal_sep', '.' ); + await expect( page ).toFill( '#woocommerce_price_num_decimals', '2' ); + await settingsPageSaveChanges(); + await expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ); + } ); +} ); diff --git a/tests/e2e-tests/specs/wp-admin/wp-admin-settings-product.test.js b/tests/e2e-tests/specs/wp-admin/wp-admin-settings-product.test.js new file mode 100644 index 00000000000..9eb92b4d575 --- /dev/null +++ b/tests/e2e-tests/specs/wp-admin/wp-admin-settings-product.test.js @@ -0,0 +1,41 @@ +/** + * @format + */ + +/** + * External dependencies + */ +import { activatePlugin } from '@wordpress/e2e-test-utils'; + +/** + * Internal dependencies + */ +import { StoreOwnerFlow } from '../../utils/flows'; +import { settingsPageSaveChanges } from '../../utils'; + +describe( 'WooCommerce Products > Downloadable Products Settings', () => { + beforeAll( async () => { + await activatePlugin( 'woocommerce' ); + } ); + + it( 'can update settings', async () => { + // Go to downloadable products settings page + await StoreOwnerFlow.openSettings( 'products', 'downloadable' ); + + // Make sure the product tab is active + await expect( page ).toMatchElement( 'a.nav-tab-active', { text: 'Products' } ); + await expect( page ).toMatchElement( 'ul.subsubsub > li > a.current', { text: 'Downloadable products' } ); + + await expect( page ).toSelect( '#woocommerce_file_download_method', 'Redirect only' ); + await expect( page ).toClick( '#woocommerce_downloads_require_login' ); + await expect( page ).toClick( '#woocommerce_downloads_grant_access_after_payment' ); + await settingsPageSaveChanges(); + await expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ); + + await expect( page ).toSelect( '#woocommerce_file_download_method', 'Force downloads' ); + await expect( page ).toClick( '#woocommerce_downloads_require_login' ); + await expect( page ).toClick( '#woocommerce_downloads_grant_access_after_payment' ); + await settingsPageSaveChanges(); + await expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ); + } ); +} ); diff --git a/tests/e2e-tests/utils/flows.js b/tests/e2e-tests/utils/flows.js index 535d3371e00..fc5d06720f6 100644 --- a/tests/e2e-tests/utils/flows.js +++ b/tests/e2e-tests/utils/flows.js @@ -5,6 +5,7 @@ const baseUrl = process.env.WP_BASE_URL; const WP_ADMIN_NEW_PRODUCT = baseUrl + '/wp-admin/post-new.php?post_type=product'; +const WP_ADMIN_WC_SETTINGS = baseUrl + '/wp-admin/admin.php?page=wc-settings&tab='; const StoreOwnerFlow = { openNewProduct: async () => { @@ -12,6 +13,18 @@ const StoreOwnerFlow = { waitUntil: 'networkidle0', } ); }, + + openSettings: async ( tab, section = null ) => { + let settingsUrl = WP_ADMIN_WC_SETTINGS + tab; + + if ( section ) { + settingsUrl += `§ion=${ section }`; + } + + await page.goto( settingsUrl, { + waitUntil: 'networkidle0', + } ); + }, }; export { StoreOwnerFlow }; diff --git a/tests/e2e-tests/utils/index.js b/tests/e2e-tests/utils/index.js index 7a5a3d64e29..8d70f71fb61 100644 --- a/tests/e2e-tests/utils/index.js +++ b/tests/e2e-tests/utils/index.js @@ -12,6 +12,17 @@ const clickTab = async ( tabName ) => { await expect( page ).toClick( '.wc-tabs > li > a', { text: tabName } ); }; +/** + * Save changes on a WooCommerce settings page. + */ +const settingsPageSaveChanges = async () => { + await page.focus( 'button.woocommerce-save-button' ); + await Promise.all( [ + page.waitForNavigation( { waitUntil: 'networkidle0' } ), + page.click( 'button.woocommerce-save-button' ), + ] ); +}; + /** * Wait for UI blocking to end. */ @@ -22,5 +33,6 @@ const uiUnblocked = async () => { module.exports = { ...flows, clickTab, + settingsPageSaveChanges, uiUnblocked, }; From d43ac30ba0cfd6a20d69f651bf22d6ea9a810f5b Mon Sep 17 00:00:00 2001 From: Julia Amosova Date: Wed, 4 Sep 2019 13:12:37 +0100 Subject: [PATCH 2/4] Add verification of settings after they've been saved --- .../wp-admin-settings-general.test.js | 33 ++++++-- .../wp-admin-settings-product.test.js | 28 +++++-- tests/e2e-tests/utils/index.js | 82 +++++++++++++++++++ 3 files changed, 131 insertions(+), 12 deletions(-) diff --git a/tests/e2e-tests/specs/wp-admin/wp-admin-settings-general.test.js b/tests/e2e-tests/specs/wp-admin/wp-admin-settings-general.test.js index 9c7b1819f6a..fc062a2ba53 100644 --- a/tests/e2e-tests/specs/wp-admin/wp-admin-settings-general.test.js +++ b/tests/e2e-tests/specs/wp-admin/wp-admin-settings-general.test.js @@ -11,7 +11,7 @@ import { activatePlugin } from '@wordpress/e2e-test-utils'; * Internal dependencies */ import { StoreOwnerFlow } from '../../utils/flows'; -import { settingsPageSaveChanges } from '../../utils'; +import { settingsPageSaveChanges, verifyValueOfInputField } from "../../utils"; describe( 'WooCommerce General Settings', () => { beforeAll( async () => { @@ -29,25 +29,48 @@ describe( 'WooCommerce General Settings', () => { // so we can choose california as base location. await expect( page ).toSelect( '#woocommerce_allowed_countries', 'Sell to all countries' ); await settingsPageSaveChanges(); - await expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ); + + // Verify that settings have been saved + await Promise.all( [ + expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ), + expect( page ).toMatchElement( '#woocommerce_allowed_countries', { text: 'Sell to all countries' } ), + ] ); // Set base location with state CA. await expect( page ).toSelect( 'select[name="woocommerce_default_country"]', 'United States (US) — California' ); await settingsPageSaveChanges(); - await expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ); + + // Verify that settings have been saved + await Promise.all( [ + expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ), + expect( page ).toMatchElement( 'select[name="woocommerce_default_country"]', { text: 'United States (US) — California' } ), + ] ); // Set selling location to specific countries first, so we can choose U.S as base location (without state). // This will makes specific countries option appears. await expect( page ).toSelect( '#woocommerce_allowed_countries', 'Sell to specific countries' ); await expect( page ).toSelect( 'select[name="woocommerce_specific_allowed_countries[]"]', 'United States (US)' ); await settingsPageSaveChanges(); - await expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ); + + // Verify that settings have been saved + await Promise.all( [ + expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ), + expect( page ).toMatchElement( '#woocommerce_allowed_countries', { text: 'Sell to specific countries' } ), + expect( page ).toMatchElement( 'select[name="woocommerce_specific_allowed_countries[]"]', { text: 'United States (US)' } ), + ] ); // Set currency options. await expect( page ).toFill( '#woocommerce_price_thousand_sep', ',' ); await expect( page ).toFill( '#woocommerce_price_decimal_sep', '.' ); await expect( page ).toFill( '#woocommerce_price_num_decimals', '2' ); await settingsPageSaveChanges(); - await expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ); + + // Verify that settings have been saved + await Promise.all( [ + expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ), + verifyValueOfInputField( '#woocommerce_price_thousand_sep', ',' ), + verifyValueOfInputField( '#woocommerce_price_decimal_sep', '.' ), + verifyValueOfInputField( '#woocommerce_price_num_decimals', '2' ), + ] ); } ); } ); diff --git a/tests/e2e-tests/specs/wp-admin/wp-admin-settings-product.test.js b/tests/e2e-tests/specs/wp-admin/wp-admin-settings-product.test.js index 9eb92b4d575..9ca6d9659c4 100644 --- a/tests/e2e-tests/specs/wp-admin/wp-admin-settings-product.test.js +++ b/tests/e2e-tests/specs/wp-admin/wp-admin-settings-product.test.js @@ -11,7 +11,7 @@ import { activatePlugin } from '@wordpress/e2e-test-utils'; * Internal dependencies */ import { StoreOwnerFlow } from '../../utils/flows'; -import { settingsPageSaveChanges } from '../../utils'; +import { setCheckbox, settingsPageSaveChanges, unsetCheckbox, verifyCheckboxIsSet, verifyCheckboxIsUnset } from "../../utils"; describe( 'WooCommerce Products > Downloadable Products Settings', () => { beforeAll( async () => { @@ -27,15 +27,29 @@ describe( 'WooCommerce Products > Downloadable Products Settings', () => { await expect( page ).toMatchElement( 'ul.subsubsub > li > a.current', { text: 'Downloadable products' } ); await expect( page ).toSelect( '#woocommerce_file_download_method', 'Redirect only' ); - await expect( page ).toClick( '#woocommerce_downloads_require_login' ); - await expect( page ).toClick( '#woocommerce_downloads_grant_access_after_payment' ); + await setCheckbox( '#woocommerce_downloads_require_login' ); + await setCheckbox( '#woocommerce_downloads_grant_access_after_payment' ); await settingsPageSaveChanges(); - await expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ); + + // Verify that settings have been saved + await Promise.all( [ + expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ), + expect( page ).toMatchElement( '#woocommerce_file_download_method', { text: 'Redirect only' } ), + verifyCheckboxIsSet( '#woocommerce_downloads_require_login' ), + verifyCheckboxIsSet( '#woocommerce_downloads_grant_access_after_payment' ), + ] ); await expect( page ).toSelect( '#woocommerce_file_download_method', 'Force downloads' ); - await expect( page ).toClick( '#woocommerce_downloads_require_login' ); - await expect( page ).toClick( '#woocommerce_downloads_grant_access_after_payment' ); + await unsetCheckbox( '#woocommerce_downloads_require_login' ); + await unsetCheckbox( '#woocommerce_downloads_grant_access_after_payment' ); await settingsPageSaveChanges(); - await expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ); + + // Verify that settings have been saved + await Promise.all( [ + expect( page ).toMatchElement( '#message', { text: 'Your settings have been saved.' } ), + expect( page ).toMatchElement( '#woocommerce_file_download_method', { text: 'Force downloads' } ), + verifyCheckboxIsUnset( '#woocommerce_downloads_require_login' ), + verifyCheckboxIsUnset( '#woocommerce_downloads_grant_access_after_payment' ), + ] ); } ); } ); diff --git a/tests/e2e-tests/utils/index.js b/tests/e2e-tests/utils/index.js index 8d70f71fb61..eb9522e9a80 100644 --- a/tests/e2e-tests/utils/index.js +++ b/tests/e2e-tests/utils/index.js @@ -23,6 +23,34 @@ const settingsPageSaveChanges = async () => { ] ); }; +/** + * Set checkbox. + * + * @param {string} selector + */ +const setCheckbox = async( selector ) => { + await page.focus( selector ); + const checkbox = await page.$( selector ); + const checkboxStatus = ( await ( await checkbox.getProperty( 'checked' ) ).jsonValue() ); + if ( checkboxStatus !== true ) { + await page.click( selector ); + } +}; + +/** + * Unset checkbox. + * + * @param {string} selector + */ +const unsetCheckbox = async( selector ) => { + await page.focus( selector ); + const checkbox = await page.$( selector ); + const checkboxStatus = ( await ( await checkbox.getProperty( 'checked' ) ).jsonValue() ); + if ( checkboxStatus === true ) { + await page.click( selector ); + } +}; + /** * Wait for UI blocking to end. */ @@ -30,9 +58,63 @@ const uiUnblocked = async () => { await page.waitForFunction( () => ! Boolean( document.querySelector( '.blockUI' ) ) ); }; +/** + * Verify that checkbox is set. + * + * @param {string} selector Selector of the checkbox that needs to be verified. + */ +const verifyCheckboxIsSet = async( selector ) => { + await page.focus( selector ); + const checkbox = await page.$( selector ); + const checkboxStatus = ( await ( await checkbox.getProperty( 'checked' ) ).jsonValue() ); + if ( checkboxStatus === true ) { + return checkboxStatus; + } else { + console.log( selector + ' checkbox is not set.' ); + } +}; + +/** + * Verify that checkbox is unset. + * + * @param {string} selector Selector of the checkbox that needs to be verified. + */ +const verifyCheckboxIsUnset = async( selector ) => { + await page.focus( selector ); + const checkbox = await page.$( selector ); + const checkboxStatus = ( await ( await checkbox.getProperty( 'checked' ) ).jsonValue() ); + if ( checkboxStatus !== true ) { + return checkboxStatus; + } else { + console.log( selector + ' checkbox is not unset.' ); + } +}; + +/** + * Verify the value of input field once it was saved. + * + * @param {string} selector Selector of the input field that needs to be verified. + * @param {string} value Value of the input field that needs to be verified. + */ +const verifyValueOfInputField = async( selector, value ) => { + await page.focus( selector ); + const field = await page.$( selector ); + const fieldValue = ( await ( await field.getProperty( 'value' ) ).jsonValue() ); + if ( fieldValue === value ) { + return fieldValue; + } else { + console.log( 'The value of ' + selector + ' does not equal to ' + value + ' .' ); + } +}; + module.exports = { ...flows, clickTab, settingsPageSaveChanges, + setCheckbox, + unsetCheckbox, uiUnblocked, + verifyCheckboxIsSet, + verifyCheckboxIsUnset, + verifyValueOfInputField, }; From 5b04c7115f9c5d7320389091ceb804bf2e8ac74a Mon Sep 17 00:00:00 2001 From: Julia Amosova Date: Wed, 4 Sep 2019 17:34:33 +0100 Subject: [PATCH 3/4] Update settings saved verification function --- tests/e2e-tests/utils/index.js | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/tests/e2e-tests/utils/index.js b/tests/e2e-tests/utils/index.js index eb9522e9a80..ea586181dfb 100644 --- a/tests/e2e-tests/utils/index.js +++ b/tests/e2e-tests/utils/index.js @@ -67,11 +67,7 @@ const verifyCheckboxIsSet = async( selector ) => { await page.focus( selector ); const checkbox = await page.$( selector ); const checkboxStatus = ( await ( await checkbox.getProperty( 'checked' ) ).jsonValue() ); - if ( checkboxStatus === true ) { - return checkboxStatus; - } else { - console.log( selector + ' checkbox is not set.' ); - } + await expect( checkboxStatus ).toBe( true ); }; /** @@ -83,15 +79,11 @@ const verifyCheckboxIsUnset = async( selector ) => { await page.focus( selector ); const checkbox = await page.$( selector ); const checkboxStatus = ( await ( await checkbox.getProperty( 'checked' ) ).jsonValue() ); - if ( checkboxStatus !== true ) { - return checkboxStatus; - } else { - console.log( selector + ' checkbox is not unset.' ); - } + await expect( checkboxStatus ).not.toBe( true ); }; /** - * Verify the value of input field once it was saved. + * Verify the value of input field once it was saved (can be used for radio buttons verification as well). * * @param {string} selector Selector of the input field that needs to be verified. * @param {string} value Value of the input field that needs to be verified. @@ -100,11 +92,7 @@ const verifyValueOfInputField = async( selector, value ) => { await page.focus( selector ); const field = await page.$( selector ); const fieldValue = ( await ( await field.getProperty( 'value' ) ).jsonValue() ); - if ( fieldValue === value ) { - return fieldValue; - } else { - console.log( 'The value of ' + selector + ' does not equal to ' + value + ' .' ); - } + await expect( fieldValue ).toBe( value ); }; module.exports = { From 061b0f0b911bfa1450fa3c08ab6e119456904b32 Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Fri, 25 Oct 2019 08:56:55 -0300 Subject: [PATCH 4/4] Fixed quotes style --- .../e2e-tests/specs/wp-admin/wp-admin-settings-general.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e-tests/specs/wp-admin/wp-admin-settings-general.test.js b/tests/e2e-tests/specs/wp-admin/wp-admin-settings-general.test.js index fc062a2ba53..e7efe100d8e 100644 --- a/tests/e2e-tests/specs/wp-admin/wp-admin-settings-general.test.js +++ b/tests/e2e-tests/specs/wp-admin/wp-admin-settings-general.test.js @@ -11,7 +11,7 @@ import { activatePlugin } from '@wordpress/e2e-test-utils'; * Internal dependencies */ import { StoreOwnerFlow } from '../../utils/flows'; -import { settingsPageSaveChanges, verifyValueOfInputField } from "../../utils"; +import { settingsPageSaveChanges, verifyValueOfInputField } from '../../utils'; describe( 'WooCommerce General Settings', () => { beforeAll( async () => {