Merge branch 'trunk' into update/woocommerce-blocks-6.9.0

This commit is contained in:
Roy Ho 2022-02-10 06:45:17 -08:00 committed by GitHub
commit 53d30f7000
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 232 additions and 121 deletions

View File

@ -77,6 +77,15 @@ jest --group=api
## Writing tests
### Conventions
1. All tests should be placed in the `tests` directory.
1. Always provide a JS doc in all tests, and tag them with `@group`. See the [Test groups](#test-groups) section for more info on grouping tests.
1. Use functions in the `data` folder when generating test data instead of constructing them from scratch within the test.
1. Use functions in the `endpoints` folder to send requests instead of directly using SuperTest's `request()` function.
1. Use `describe.each()` or `it.each()` when writing repetitive tests.
1. Always clean up all test data generated by the tests.
### Test groups
This package makes use of the `jest-runner-groups` package, which allows grouping tests together around semantic groups (such as `orders` API calls, or `coupons` API calls) to make running test suites more granular.
@ -116,6 +125,20 @@ const queryString = {
const response = await getRequest('/orders', queryString);
```
## Creating test data
Most of the time, test data would be in the form of a request payload. Instead of building them from scratch inside the test, create a test data file inside the `data` directory. Create a model of the request payload within that file, and export it as an object or a function that generates this object.
Afterwards, make sure to add the test data file to the `data/index.js` file.
This way, the test data would be decoupled from the test itself, allowing for easier test data management, and more readable tests.
## Creating endpoint functions
All functions for sending requests to endpoints should be placed in the `endpoints` directory.
Newly created files should be added to the `endpoints/index.js` file.
## Debugging tests
You can make use of the REST API log plugin to see how requests are being made, and check the request payload, response, and more.

View File

@ -4,7 +4,6 @@
"description": "API tests for WooCommerce",
"main": "index.js",
"scripts": {
"preinstall": "npx only-allow pnpm",
"test": "jest",
"test:api": "jest --group=api",
"test:hello": "jest --group=hello",

View File

@ -26,7 +26,6 @@
],
"sideEffects": false,
"scripts": {
"preinstall": "npx only-allow pnpm",
"clean": "rm -rf ./dist ./tsconfig.tsbuildinfo",
"compile": "tsc -b",
"build": "pnpm run clean && npm run compile",

View File

@ -1,16 +1,13 @@
# Unreleased
## Changed
- Updated top level menu css selectors
## Fixed
- Moved `merchant.login()` out of `beforeAll()` block and into test body for retried runs.
## Added
- A `specs/data` folder to store page element data.
- Tests to verify that different top-level menu and their associated sub-menus load successfully.
- Tests to verify that different top-level menus and their associated sub-menus load successfully.
- Test scaffolding via `npx wc-e2e install @woocommerce/e2e-core-tests`
## Changed

View File

@ -1,5 +1,12 @@
/**
* External dependencies
*/
const path = require( 'path' );
const buildPath = ( filename ) => `installFiles${path.sep}${filename}`;
module.exports = {
testSpecs: 'installFiles/scaffold-tests.json',
defaultJson: 'installFiles/default-test-config.json',
initializeSh: 'installFiles/initialize.sh.default',
testSpecs: buildPath( 'scaffold-tests.json' ),
defaultJson: buildPath( 'default-test-config.json' ),
initializeSh: buildPath( 'initialize.sh.default' ),
};

View File

@ -45,7 +45,6 @@
"access": "public"
},
"scripts": {
"preinstall": "npx only-allow pnpm",
"prepare": "pnpm run build",
"clean": "rm -rf ./build ./build-module",
"compile": "node ./../bin/build.js",

View File

@ -1,34 +1,31 @@
# Unreleased
## Changes
- Updated `deleteDownloadedPluginFiles()` to also be able to delete directories.
## Added
- Added `post-results-to-github-pr.js` to post smoke test results to a GitHub PR.
- Added jest flags to generate a json test report
- Added `post-results-to-github-pr.js` to post test results to a GitHub PR.
- Added more entries to `default.json`
- Added test retry support
- Save `test-results.json` from test runs to the `tests/e2e` folder.
- Added `await` for every call to `shopper.logout`
- Updated `getLatestReleaseZipUrl()` to allow passing in an authorization token and simplified arguments to just the repository name
- Added `upload.ini` which increases the limits for uploading files (such as for plugins) in the Docker environment
- Test setup, scaffolding, and removal via `wc-e2e install` and `wc-e2e uninstall`
- Added quotes around `WORDPRESS_TITLE` value in .env file to address issue with docker compose 2 "key cannot contain a space" error.
- Added `LATEST_WP_VERSION_MINUS` that allows setting a number to subtract from the current WordPress version for the WordPress Docker image.
- Support for PHP_VERSION, MARIADB_VERSION environment variables for built in container initialization
- `resolveLocalE2ePath` to resolve path to local E2E file
- `resolveLocalE2ePath()` to resolve path to local E2E file
- `resolvePackagePath()` to resolve path to package file
- `WC_E2E_FOLDER` for mapping plugin root to path within repo
- Added the `resolveSingleE2EPath` method which builds a path to a specific E2E test
- Added the `resolveSingleE2EPath()` method which builds a path to a specific E2E test
- Added the ability to take screenshots from multiple test failures (when retried) in `utils/take-screenshot.js`.
## Changed
- Updated `getLatestReleaseZipUrl()` to allow passing in an authorization token and simplified arguments to just the repository name
- Updated `deleteDownloadedPluginFiles()` to also be able to delete directories.
## Fixed
- Updated the browserViewport in `jest.setup.js` to match the `defaultViewport` dimensions defined in `jest-puppeteer.config.js`
- Use consistent `defaultViewport` in both headless and non-headless context
- Fixed issue with docker compose 2 "key cannot contain a space" error.
- Add missing `config` dependency
# 0.2.3

View File

@ -10,7 +10,7 @@ if [[ $1 ]]; then
if [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+ ]]; then
export WORDPRESS_VERSION=$WP_VERSION
else
export WORDPRESS_VERSION="5.8.0"
export WORDPRESS_VERSION="5.9"
fi
if [[ $LATEST_WP_VERSION_MINUS ]]; then

View File

@ -24,12 +24,24 @@ const {
} = require( '../utils/scaffold' );
const args = process.argv.slice( 2 );
const [ command, packageName ] = args;
const command = args[ 0 ];
let packageName = null;
if ( args[ 1 ] && args[ 1 ].substr(0, 2) !== '--' ) {
packageName = args[ 1 ];
}
// Allow multiple spec file extensions and formats.
let testExtension = 'test.js';
let testFormat = '';
for ( let a = 2; a < args.length; a++ ) {
let force = false;
for ( let a = 1; a < args.length; a++ ) {
if ( args[ a ] === '--force' ) {
force = true;
continue;
}
// These arguments take a value, eg: --format foo
const nextArg = a + 1;
if ( nextArg >= args.length ) {
break;
@ -50,7 +62,7 @@ for ( let a = 2; a < args.length; a++ ) {
if ( command == 'install' ) {
// Install some environment defaults if no package is requested.
if ( ! packageName ) {
installDefaults();
installDefaults( force );
return;
}
@ -66,7 +78,7 @@ if ( command == 'install' ) {
if ( defaultJson ) {
const defaultJsonName = `config${path.sep}default-${packageSlug}.json`;
createLocalE2ePath( 'config' );
if ( confirmLocalCopy( defaultJsonName, defaultJson, pkg ) ) {
if ( confirmLocalCopy( defaultJsonName, defaultJson, pkg, force ) ) {
console.log( `Created sample test configuration to 'tests/e2e/${defaultJsonName}'.` );
}
}
@ -75,7 +87,7 @@ if ( command == 'install' ) {
if ( initializeSh ) {
const defaultInitName = `docker${path.sep}${packageSlug}.sh`;
createLocalE2ePath( 'docker' );
if ( confirmLocalCopy( defaultInitName, initializeSh, pkg ) ) {
if ( confirmLocalCopy( defaultInitName, initializeSh, pkg, force ) ) {
console.log( `Created sample test container initialization script to 'tests/e2e/${defaultInitName}'.` );
}
}
@ -95,13 +107,16 @@ if ( command == 'install' ) {
const eol = "\n";
const autoGenerate = sprintf( '/* This file was auto-generated by the command `npx wc-e2e install %s`. */', packageName );
let importLineFormat;
let overwriteFiles;
let confirmPrompt;
if ( testFormat.toLowerCase() == 'cjs' ) {
importLineFormat = sprintf( "const {%%s} = require( '%s' );", pkg );
} else {
importLineFormat = sprintf( "import {%%s} from '%s';", pkg );
}
let overwriteFiles;
if ( force ) {
overwriteFiles = 'a';
}
// Create the specs folder if not present
let specFolderPath = createLocalE2ePath( 'specs' );

View File

@ -5,7 +5,7 @@ const babelConfig = require( './babel.config' );
const esLintConfig = require( './.eslintrc.js' );
const allE2EConfig = require( './config' );
const allE2EUtils = require( './utils' );
const slackUtils = require( './src/slack' );
const slackUtils = require( './build/slack' );
/**
* External dependencies
*/

View File

@ -35,7 +35,8 @@
"jest-each": "25.5.0",
"jest-puppeteer": "^4.4.0",
"node-stream-zip": "^1.13.6",
"readline-sync": "^1.4.10",
"puppeteer": "2.1.1",
"readline-sync": "^1.4.10",
"request": "^2.88.2",
"sprintf-js": "^1.1.2"
},

View File

@ -46,15 +46,16 @@ const confirm = ( prompt, choices ) => {
* @param {string} localE2ePath Destination path
* @param {string} packageE2ePath Source path
* @param {string} packageName Source package. Default @woocommerce/e2e-environment package.
* @param {boolean} force Whether to override files if they exist without confirmation.
* @return {boolean}
*/
const confirmLocalCopy = ( localE2ePath, packageE2ePath, packageName = '' ) => {
const confirmLocalCopy = ( localE2ePath, packageE2ePath, packageName = '', force = false ) => {
const localPath = resolveLocalE2ePath( localE2ePath );
const packagePath = resolvePackagePath( packageE2ePath, packageName );
const confirmPrompt = `${localE2ePath} already exists. Overwrite? [Y]es/[n]o: `;
let overwriteFiles;
if ( fs.existsSync( localPath ) ) {
if ( ! force && fs.existsSync( localPath ) ) {
overwriteFiles = confirm( confirmPrompt, 'ny' );
overwriteFiles = overwriteFiles.toLowerCase();
} else {
@ -102,16 +103,16 @@ const getPackageData = ( packageName ) => {
/**
* Install test runner and test container defaults
*/
const installDefaults = () => {
const installDefaults = ( force ) => {
createLocalE2ePath( 'docker' );
console.log( 'Writing tests/e2e/docker/initialize.sh' );
confirmLocalCopy( `docker${path.sep}initialize.sh`, `installFiles${path.sep}initialize.sh` );
confirmLocalCopy( `docker${path.sep}initialize.sh`, `installFiles${path.sep}initialize.sh`, '', force );
createLocalE2ePath( 'config' );
console.log( 'Writing tests/e2e/config/jest.config.js' );
confirmLocalCopy( `config${path.sep}jest.config.js`, `installFiles${path.sep}jest.config.js.default` );
confirmLocalCopy( `config${path.sep}jest.config.js`, `installFiles${path.sep}jest.config.js.default`, '', force );
console.log( 'Writing tests/e2e/config/jest.setup.js' );
confirmLocalCopy( `config${path.sep}jest.setup.js`, `installFiles${path.sep}jest.setup.js.default` );
confirmLocalCopy( `config${path.sep}jest.setup.js`, `installFiles${path.sep}jest.setup.js.default`, '', force );
};
module.exports = {

View File

@ -4,10 +4,6 @@
- Identified the default product category using `slug == 'uncategorized'` in `deleteAllProductCategories`
## Changes
- Removed `page.waitForNavigation()` from `shopper.logout()`
## Added
- `utils.waitForTimeout( delay )` pause processing for `delay` milliseconds
@ -15,8 +11,6 @@
- Update `shopper.addToCartFromShopPage()` and `.removeFromCart()` to accept product Id or Title
- Added `deleteAllProductAttributes()`, `deleteAllProductCategories()`, and `deleteAllProductTags()` to clean up meta data added when products are imported
- Added `withRestApi.createProductCategory()` that creates a product category and returns the ID
- `deleteAllProductAttributes()`, `deleteAllProductCategories()`, and `deleteAllProductTags()` to clean up meta data added when products are imported
- `withRestApi.createProductCategory()` that creates a product category and returns the ID
- `withRestApi.deleteCoupon()` that deletes a single coupon
- `withRestApi.addTaxClasses()` that adds an array of tax classes if they do not exist
- `withRestApi.addTaxRates()` that adds an array of tax rates if they do not exist

View File

@ -41,7 +41,6 @@
"access": "public"
},
"scripts": {
"preinstall": "npx only-allow pnpm",
"clean": "rm -rf ./build ./build-module",
"compile": "node ./../bin/build.js",
"build": "pnpm run clean && pnpm run compile",

View File

@ -17,8 +17,8 @@ export function simpleProductFactory( httpClient ) {
} );
return {
name: params.name ?? faker.commerce.productName(),
regularPrice: params.regularPrice ?? faker.commerce.price(),
name: params.name ? params.name : faker.commerce.productName(),
regularPrice: params.regularPrice ? params.regularPrice : faker.commerce.price(),
};
} );
}

View File

@ -21,7 +21,7 @@
"pelago/emogrifier": "3.1.0",
"psr/container": "1.0.0",
"woocommerce/action-scheduler": "3.4.0",
"woocommerce/woocommerce-admin": "3.1.0",
"woocommerce/woocommerce-admin": "3.2.0-rc.1",
"woocommerce/woocommerce-blocks": "6.9.0"
},
"require-dev": {

View File

@ -543,16 +543,16 @@
},
{
"name": "woocommerce/woocommerce-admin",
"version": "3.1.0",
"version": "3.2.0-rc.1",
"source": {
"type": "git",
"url": "https://github.com/woocommerce/woocommerce-admin.git",
"reference": "59dfff627d9b7b1d5396686e69b709a820f5e7e5"
"reference": "0e3d26c283f3cff3507469478a33b47ca7e70649"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/woocommerce/woocommerce-admin/zipball/59dfff627d9b7b1d5396686e69b709a820f5e7e5",
"reference": "59dfff627d9b7b1d5396686e69b709a820f5e7e5",
"url": "https://api.github.com/repos/woocommerce/woocommerce-admin/zipball/0e3d26c283f3cff3507469478a33b47ca7e70649",
"reference": "0e3d26c283f3cff3507469478a33b47ca7e70649",
"shasum": ""
},
"require": {
@ -608,9 +608,9 @@
"homepage": "https://github.com/woocommerce/woocommerce-admin",
"support": {
"issues": "https://github.com/woocommerce/woocommerce-admin/issues",
"source": "https://github.com/woocommerce/woocommerce-admin/tree/v3.1.0"
"source": "https://github.com/woocommerce/woocommerce-admin/tree/v3.2.0-rc.1"
},
"time": "2022-01-25T02:36:40+00:00"
"time": "2022-02-09T15:33:34+00:00"
},
{
"name": "woocommerce/woocommerce-blocks",
@ -2926,5 +2926,5 @@
"platform-overrides": {
"php": "7.0.33"
},
"plugin-api-version": "2.1.0"
"plugin-api-version": "2.2.0"
}

View File

@ -15,7 +15,7 @@ defined( 'ABSPATH' ) || exit;
return array(
'AF' => array(),
'AL' => array( // Albania states.
'AL' => array( // Albanian states.
'AL-01' => __( 'Berat', 'woocommerce' ),
'AL-09' => __( 'Dibër', 'woocommerce' ),
'AL-02' => __( 'Durrës', 'woocommerce' ),
@ -29,7 +29,7 @@ return array(
'AL-11' => __( 'Tirana', 'woocommerce' ),
'AL-12' => __( 'Vlorë', 'woocommerce' ),
),
'AO' => array( // Angola states.
'AO' => array( // Angolan states.
'BGO' => __( 'Bengo', 'woocommerce' ),
'BLU' => __( 'Benguela', 'woocommerce' ),
'BIE' => __( 'Bié', 'woocommerce' ),
@ -87,7 +87,7 @@ return array(
'WA' => __( 'Western Australia', 'woocommerce' ),
),
'AX' => array(),
'BD' => array( // Bangladeshi states (districts).
'BD' => array( // Bangladeshi districts.
'BD-05' => __( 'Bagerhat', 'woocommerce' ),
'BD-01' => __( 'Bandarban', 'woocommerce' ),
'BD-02' => __( 'Barguna', 'woocommerce' ),
@ -186,7 +186,7 @@ return array(
),
'BH' => array(),
'BI' => array(),
'BJ' => array( // Benin states.
'BJ' => array( // Beninese states.
'AL' => __( 'Alibori', 'woocommerce' ),
'AK' => __( 'Atakora', 'woocommerce' ),
'AQ' => __( 'Atlantique', 'woocommerce' ),
@ -211,7 +211,7 @@ return array(
'BO-S' => __( 'Santa Cruz', 'woocommerce' ),
'BO-T' => __( 'Tarija', 'woocommerce' ),
),
'BR' => array( // Brazillian states.
'BR' => array( // Brazilian states.
'AC' => __( 'Acre', 'woocommerce' ),
'AL' => __( 'Alagoas', 'woocommerce' ),
'AP' => __( 'Amapá', 'woocommerce' ),
@ -255,7 +255,7 @@ return array(
'SK' => __( 'Saskatchewan', 'woocommerce' ),
'YT' => __( 'Yukon Territory', 'woocommerce' ),
),
'CH' => array( // Cantons of Switzerland.
'CH' => array( // Swiss cantons.
'AG' => __( 'Aargau', 'woocommerce' ),
'AR' => __( 'Appenzell Ausserrhoden', 'woocommerce' ),
'AI' => __( 'Appenzell Innerrhoden', 'woocommerce' ),
@ -283,7 +283,7 @@ return array(
'ZG' => __( 'Zug', 'woocommerce' ),
'ZH' => __( 'Zürich', 'woocommerce' ),
),
'CL' => array( // Chile states.
'CL' => array( // Chilean states.
'CL-AI' => __( 'Aisén del General Carlos Ibañez del Campo', 'woocommerce' ),
'CL-AN' => __( 'Antofagasta', 'woocommerce' ),
'CL-AP' => __( 'Arica y Parinacota', 'woocommerce' ),
@ -335,7 +335,7 @@ return array(
'CN31' => __( 'Tibet / 西藏', 'woocommerce' ),
'CN32' => __( 'Xinjiang / 新疆', 'woocommerce' ),
),
'CO' => array( // Colombia States.
'CO' => array( // Colombian states.
'CO-AMA' => __( 'Amazonas', 'woocommerce' ),
'CO-ANT' => __( 'Antioquia', 'woocommerce' ),
'CO-ARA' => __( 'Arauca', 'woocommerce' ),
@ -370,7 +370,7 @@ return array(
'CO-VAU' => __( 'Vaupés', 'woocommerce' ),
'CO-VID' => __( 'Vichada', 'woocommerce' ),
),
'CR' => array( // Costa Rica states.
'CR' => array( // Costa Rican states.
'CR-A' => __( 'Alajuela', 'woocommerce' ),
'CR-C' => __( 'Cartago', 'woocommerce' ),
'CR-G' => __( 'Guanacaste', 'woocommerce' ),
@ -380,9 +380,26 @@ return array(
'CR-SJ' => __( 'San José', 'woocommerce' ),
),
'CZ' => array(),
'DE' => array(),
'DE' => array( // German states.
'DE-BW' => __( 'Baden-Württemberg', 'woocommerce' ),
'DE-BY' => __( 'Bavaria', 'woocommerce' ),
'DE-BE' => __( 'Berlin', 'woocommerce' ),
'DE-BB' => __( 'Brandenburg', 'woocommerce' ),
'DE-HB' => __( 'Bremen', 'woocommerce' ),
'DE-HH' => __( 'Hamburg', 'woocommerce' ),
'DE-HE' => __( 'Hesse', 'woocommerce' ),
'DE-MV' => __( 'Mecklenburg-Vorpommern', 'woocommerce' ),
'DE-NI' => __( 'Lower Saxony', 'woocommerce' ),
'DE-NW' => __( 'North Rhine-Westphalia', 'woocommerce' ),
'DE-RP' => __( 'Rhineland-Palatinate', 'woocommerce' ),
'DE-SL' => __( 'Saarland', 'woocommerce' ),
'DE-SN' => __( 'Saxony', 'woocommerce' ),
'DE-ST' => __( 'Saxony-Anhalt', 'woocommerce' ),
'DE-SH' => __( 'Schleswig-Holstein', 'woocommerce' ),
'DE-TH' => __( 'Thuringia', 'woocommerce' ),
),
'DK' => array(),
'DO' => array( // Dominican Republic.
'DO' => array( // Dominican states.
'DO-01' => __( 'Distrito Nacional', 'woocommerce' ),
'DO-02' => __( 'Azua', 'woocommerce' ),
'DO-03' => __( 'Baoruco', 'woocommerce' ),
@ -426,7 +443,7 @@ return array(
'DO-27' => __( 'Valverde', 'woocommerce' ),
'DO-42' => __( 'Yuma', 'woocommerce' ),
),
'DZ' => array(
'DZ' => array( // Algerian states.
'DZ-01' => __( 'Adrar', 'woocommerce' ),
'DZ-02' => __( 'Chlef', 'woocommerce' ),
'DZ-03' => __( 'Laghouat', 'woocommerce' ),
@ -477,7 +494,7 @@ return array(
'DZ-48' => __( 'Relizane', 'woocommerce' ),
),
'EE' => array(),
'EC' => array( // Ecuador states.
'EC' => array( // Ecuadorian states.
'EC-A' => __( 'Azuay', 'woocommerce' ),
'EC-B' => __( 'Bolívar', 'woocommerce' ),
'EC-F' => __( 'Cañar', 'woocommerce' ),
@ -503,7 +520,7 @@ return array(
'EC-T' => __( 'Tungurahua', 'woocommerce' ),
'EC-Z' => __( 'Zamora-Chinchipe', 'woocommerce' ),
),
'EG' => array( // Egypt states.
'EG' => array( // Egyptian states.
'EGALX' => __( 'Alexandria', 'woocommerce' ),
'EGASN' => __( 'Aswan', 'woocommerce' ),
'EGAST' => __( 'Asyut', 'woocommerce' ),
@ -589,7 +606,7 @@ return array(
'FI' => array(),
'FR' => array(),
'GF' => array(),
'GH' => array( // Ghanaian Regions.
'GH' => array( // Ghanaian regions.
'AF' => __( 'Ahafo', 'woocommerce' ),
'AH' => __( 'Ashanti', 'woocommerce' ),
'BA' => __( 'Brong-Ahafo', 'woocommerce' ),
@ -609,7 +626,7 @@ return array(
'WN' => __( 'Western North', 'woocommerce' ),
),
'GP' => array(),
'GR' => array( // Greek Regions.
'GR' => array( // Greek regions.
'I' => __( 'Attica', 'woocommerce' ),
'A' => __( 'East Macedonia and Thrace', 'woocommerce' ),
'B' => __( 'Central Macedonia', 'woocommerce' ),
@ -653,7 +670,7 @@ return array(
'KOWLOON' => __( 'Kowloon', 'woocommerce' ),
'NEW TERRITORIES' => __( 'New Territories', 'woocommerce' ),
),
'HN' => array( // Honduras states.
'HN' => array( // Honduran states.
'HN-AT' => __( 'Atlántida', 'woocommerce' ),
'HN-IB' => __( 'Bay Islands', 'woocommerce' ),
'HN-CH' => __( 'Choluteca', 'woocommerce' ),
@ -673,7 +690,7 @@ return array(
'HN-VA' => __( 'Valle', 'woocommerce' ),
'HN-YO' => __( 'Yoro', 'woocommerce' ),
),
'HU' => array( // Hungary states.
'HU' => array( // Hungarian states.
'BK' => __( 'Bács-Kiskun', 'woocommerce' ),
'BE' => __( 'Békés', 'woocommerce' ),
'BA' => __( 'Baranya', 'woocommerce' ),
@ -695,7 +712,7 @@ return array(
'VE' => __( 'Veszprém', 'woocommerce' ),
'ZA' => __( 'Zala', 'woocommerce' ),
),
'ID' => array( // Indonesia Provinces.
'ID' => array( // Indonesian provinces.
'AC' => __( 'Daerah Istimewa Aceh', 'woocommerce' ),
'SU' => __( 'Sumatera Utara', 'woocommerce' ),
'SB' => __( 'Sumatera Barat', 'woocommerce' ),
@ -731,7 +748,7 @@ return array(
'PA' => __( 'Papua', 'woocommerce' ),
'PB' => __( 'Papua Barat', 'woocommerce' ),
),
'IE' => array( // Republic of Ireland.
'IE' => array( // Irish states.
'CW' => __( 'Carlow', 'woocommerce' ),
'CN' => __( 'Cavan', 'woocommerce' ),
'CE' => __( 'Clare', 'woocommerce' ),
@ -798,7 +815,7 @@ return array(
'LD' => __( 'Lakshadeep', 'woocommerce' ),
'PY' => __( 'Pondicherry (Puducherry)', 'woocommerce' ),
),
'IR' => array( // Iran States.
'IR' => array( // Irania states.
'KHZ' => __( 'Khuzestan (خوزستان)', 'woocommerce' ),
'THR' => __( 'Tehran (تهران)', 'woocommerce' ),
'ILM' => __( 'Ilaam (ایلام)', 'woocommerce' ),
@ -832,7 +849,7 @@ return array(
'SBN' => __( 'Sistan and Baluchestan (سیستان و بلوچستان)', 'woocommerce' ),
),
'IS' => array(),
'IT' => array( // Italy Provinces.
'IT' => array( // Italian provinces.
'AG' => __( 'Agrigento', 'woocommerce' ),
'AL' => __( 'Alessandria', 'woocommerce' ),
'AN' => __( 'Ancona', 'woocommerce' ),
@ -943,7 +960,7 @@ return array(
),
'IL' => array(),
'IM' => array(),
'JM' => array( // Jamaica's Parishes. Ref: https://en.wikipedia.org/wiki/ISO_3166-2:JM.
'JM' => array( // Jamaican parishes.
'JM-01' => __( 'Kingston', 'woocommerce' ),
'JM-02' => __( 'Saint Andrew', 'woocommerce' ),
'JM-03' => __( 'Saint Thomas', 'woocommerce' ),
@ -961,7 +978,7 @@ return array(
),
/**
* Japan States.
* Japanese states.
*
* English notation of prefectures conform to the notation of Japan Post.
* The suffix corresponds with the Japanese translation file.
@ -1015,7 +1032,7 @@ return array(
'JP46' => __( 'Kagoshima', 'woocommerce' ),
'JP47' => __( 'Okinawa', 'woocommerce' ),
),
'KE' => array( // Kenya counties.
'KE' => array( // Kenyan counties.
'KE01' => __( 'Baringo', 'woocommerce' ),
'KE02' => __( 'Bomet', 'woocommerce' ),
'KE03' => __( 'Bungoma', 'woocommerce' ),
@ -1066,7 +1083,7 @@ return array(
),
'KR' => array(),
'KW' => array(),
'LA' => array(
'LA' => array( // Laotian provinces.
'AT' => __( 'Attapeu', 'woocommerce' ),
'BK' => __( 'Bokeo', 'woocommerce' ),
'BL' => __( 'Bolikhamsai', 'woocommerce' ),
@ -1087,7 +1104,7 @@ return array(
'XS' => __( 'Xaisomboun', 'woocommerce' ),
),
'LB' => array(),
'LR' => array( // Liberia provinces.
'LR' => array( // Liberian provinces.
'BM' => __( 'Bomi', 'woocommerce' ),
'BN' => __( 'Bong', 'woocommerce' ),
'GA' => __( 'Gbarpolu', 'woocommerce' ),
@ -1105,7 +1122,7 @@ return array(
'SN' => __( 'Sinoe', 'woocommerce' ),
),
'LU' => array(),
'MD' => array( // Moldova states.
'MD' => array( // Moldovan states.
'C' => __( 'Chișinău', 'woocommerce' ),
'BL' => __( 'Bălți', 'woocommerce' ),
'AN' => __( 'Anenii Noi', 'woocommerce' ),
@ -1144,7 +1161,7 @@ return array(
),
'MQ' => array(),
'MT' => array(),
'MX' => array( // Mexico States.
'MX' => array( // Mexican states.
'DF' => __( 'Ciudad de México', 'woocommerce' ),
'JA' => __( 'Jalisco', 'woocommerce' ),
'NL' => __( 'Nuevo León', 'woocommerce' ),
@ -1196,7 +1213,7 @@ return array(
'PJY' => __( 'Putrajaya', 'woocommerce' ),
'KUL' => __( 'Kuala Lumpur', 'woocommerce' ),
),
'MZ' => array( // Mozambique provinces.
'MZ' => array( // Mozambican provinces.
'MZP' => __( 'Cabo Delgado', 'woocommerce' ),
'MZG' => __( 'Gaza', 'woocommerce' ),
'MZI' => __( 'Inhambane', 'woocommerce' ),
@ -1209,7 +1226,7 @@ return array(
'MZT' => __( 'Tete', 'woocommerce' ),
'MZQ' => __( 'Zambézia', 'woocommerce' ),
),
'NA' => array( // Namibia regions.
'NA' => array( // Namibian regions.
'ER' => __( 'Erongo', 'woocommerce' ),
'HA' => __( 'Hardap', 'woocommerce' ),
'KA' => __( 'Karas', 'woocommerce' ),
@ -1266,7 +1283,7 @@ return array(
),
'NL' => array(),
'NO' => array(),
'NP' => array( // Nepal states (Zones).
'NP' => array( // Nepalese zones.
'BAG' => __( 'Bagmati', 'woocommerce' ),
'BHE' => __( 'Bheri', 'woocommerce' ),
'DHA' => __( 'Dhaulagiri', 'woocommerce' ),
@ -1282,7 +1299,7 @@ return array(
'SAG' => __( 'Sagarmatha', 'woocommerce' ),
'SET' => __( 'Seti', 'woocommerce' ),
),
'NI' => array( // Nicaragua states
'NI' => array( // Nicaraguan states.
'NI-AN' => __( 'Atlántico Norte', 'woocommerce' ),
'NI-AS' => __( 'Atlántico Sur', 'woocommerce' ),
'NI-BO' => __( 'Boaco', 'woocommerce' ),
@ -1301,7 +1318,7 @@ return array(
'NI-RI' => __( 'Rivas', 'woocommerce' ),
'NI-SJ' => __( 'Río San Juan', 'woocommerce' ),
),
'NZ' => array( // New Zealand States.
'NZ' => array( // New Zealand states.
'NL' => __( 'Northland', 'woocommerce' ),
'AK' => __( 'Auckland', 'woocommerce' ),
'WA' => __( 'Waikato', 'woocommerce' ),
@ -1319,7 +1336,7 @@ return array(
'OT' => __( 'Otago', 'woocommerce' ),
'SL' => __( 'Southland', 'woocommerce' ),
),
'PA' => array( // Panama states.
'PA' => array( // Panamanian states.
'PA-1' => __( 'Bocas del Toro', 'woocommerce' ),
'PA-2' => __( 'Coclé', 'woocommerce' ),
'PA-3' => __( 'Colón', 'woocommerce' ),
@ -1334,7 +1351,7 @@ return array(
'PA-KY' => __( 'Guna Yala', 'woocommerce' ),
'PA-NB' => __( 'Ngöbe-Buglé', 'woocommerce' ),
),
'PE' => array( // Peru states.
'PE' => array( // Peruvian states.
'CAL' => __( 'El Callao', 'woocommerce' ),
'LMA' => __( 'Municipalidad Metropolitana de Lima', 'woocommerce' ),
'AMA' => __( 'Amazonas', 'woocommerce' ),
@ -1362,11 +1379,7 @@ return array(
'TUM' => __( 'Tumbes', 'woocommerce' ),
'UCA' => __( 'Ucayali', 'woocommerce' ),
),
/**
* Philippine Provinces.
*/
'PH' => array(
'PH' => array( // Philippine provinces.
'ABR' => __( 'Abra', 'woocommerce' ),
'AGN' => __( 'Agusan del Norte', 'woocommerce' ),
'AGS' => __( 'Agusan del Sur', 'woocommerce' ),
@ -1450,7 +1463,7 @@ return array(
'ZSI' => __( 'Zamboanga Sibugay', 'woocommerce' ),
'00' => __( 'Metro Manila', 'woocommerce' ),
),
'PK' => array( // Pakistan's states.
'PK' => array( // Pakistani states.
'JK' => __( 'Azad Kashmir', 'woocommerce' ),
'BA' => __( 'Balochistan', 'woocommerce' ),
'TA' => __( 'FATA', 'woocommerce' ),
@ -1463,7 +1476,7 @@ return array(
'PL' => array(),
'PR' => array(),
'PT' => array(),
'PY' => array( // Paraguay states.
'PY' => array( // Paraguayan states.
'PY-ASU' => __( 'Asunción', 'woocommerce' ),
'PY-1' => __( 'Concepción', 'woocommerce' ),
'PY-2' => __( 'San Pedro', 'woocommerce' ),
@ -1484,7 +1497,7 @@ return array(
'PY-17' => __( 'Boquerón', 'woocommerce' ),
),
'RE' => array(),
'RO' => array( // Romania states.
'RO' => array( // Romanian states.
'AB' => __( 'Alba', 'woocommerce' ),
'AR' => __( 'Arad', 'woocommerce' ),
'AG' => __( 'Argeș', 'woocommerce' ),
@ -1531,7 +1544,7 @@ return array(
'SG' => array(),
'SK' => array(),
'SI' => array(),
'SV' => array( // El Salvador states.
'SV' => array( // Salvadoran states.
'SV-AH' => __( 'Ahuachapán', 'woocommerce' ),
'SV-CA' => __( 'Cabañas', 'woocommerce' ),
'SV-CH' => __( 'Chalatenango', 'woocommerce' ),
@ -1547,7 +1560,7 @@ return array(
'SV-UN' => __( 'La Unión', 'woocommerce' ),
'SV-US' => __( 'Usulután', 'woocommerce' ),
),
'TH' => array( // Thailand states.
'TH' => array( // Thai states.
'TH-37' => __( 'Amnat Charoen', 'woocommerce' ),
'TH-15' => __( 'Ang Thong', 'woocommerce' ),
'TH-14' => __( 'Ayutthaya', 'woocommerce' ),
@ -1626,7 +1639,7 @@ return array(
'TH-95' => __( 'Yala', 'woocommerce' ),
'TH-35' => __( 'Yasothon', 'woocommerce' ),
),
'TR' => array( // Turkey States.
'TR' => array( // Turkish states.
'TR01' => __( 'Adana', 'woocommerce' ),
'TR02' => __( 'Adıyaman', 'woocommerce' ),
'TR03' => __( 'Afyon', 'woocommerce' ),
@ -1709,7 +1722,7 @@ return array(
'TR80' => __( 'Osmaniye', 'woocommerce' ),
'TR81' => __( 'Düzce', 'woocommerce' ),
),
'TZ' => array( // Tanzania States.
'TZ' => array( // Tanzanian states.
'TZ01' => __( 'Arusha', 'woocommerce' ),
'TZ02' => __( 'Dar es Salaam', 'woocommerce' ),
'TZ03' => __( 'Dodoma', 'woocommerce' ),
@ -1742,7 +1755,7 @@ return array(
'TZ30' => __( 'Simiyu', 'woocommerce' ),
),
'LK' => array(),
'RS' => array( // Serbia districts. Ref: https://github.com/unicode-org/cldr/blob/release-37/common/subdivisions/en.xml#L4251-L4283.
'RS' => array( // Serbian districts.
'RS00' => _x( 'Belgrade', 'district', 'woocommerce' ),
'RS14' => _x( 'Bor', 'district', 'woocommerce' ),
'RS11' => _x( 'Braničevo', 'district', 'woocommerce' ),
@ -1777,7 +1790,7 @@ return array(
'RSVO' => _x( 'Vojvodina', 'district', 'woocommerce' ),
),
'SE' => array(),
'UA' => array( // Ukraine. Ref: https://en.wikipedia.org/wiki/Oblasts_of_Ukraine.
'UA' => array( // Ukrainian oblasts.
'VN' => __( 'Vinnytsia Oblast', 'woocommerce' ),
'VL' => __( 'Volyn Oblast', 'woocommerce' ),
'DP' => __( 'Dnipropetrovsk Oblast', 'woocommerce' ),
@ -1803,7 +1816,7 @@ return array(
'CH' => __( 'Chernihiv Oblast', 'woocommerce' ),
'CV' => __( 'Chernivtsi Oblast', 'woocommerce' ),
),
'UG' => array( // Uganda districts. Ref: https://en.wikipedia.org/wiki/ISO_3166-2:UG.
'UG' => array( // Ugandan districts.
'UG314' => __( 'Abim', 'woocommerce' ),
'UG301' => __( 'Adjumani', 'woocommerce' ),
'UG322' => __( 'Agago', 'woocommerce' ),
@ -1944,7 +1957,7 @@ return array(
'95' => __( 'Palmyra Atoll', 'woocommerce' ),
'79' => __( 'Wake Island', 'woocommerce' ),
),
'US' => array( // United States.
'US' => array( // U.S. states.
'AL' => __( 'Alabama', 'woocommerce' ),
'AK' => __( 'Alaska', 'woocommerce' ),
'AZ' => __( 'Arizona', 'woocommerce' ),
@ -2000,7 +2013,7 @@ return array(
'AE' => __( 'Armed Forces (AE)', 'woocommerce' ),
'AP' => __( 'Armed Forces (AP)', 'woocommerce' ),
),
'UY' => array( // Uruguay States.
'UY' => array( // Uruguayan states.
'UY-AR' => __( 'Artigas', 'woocommerce' ),
'UY-CA' => __( 'Canelones', 'woocommerce' ),
'UY-CL' => __( 'Cerro Largo', 'woocommerce' ),
@ -2021,7 +2034,7 @@ return array(
'UY-TA' => __( 'Tacuarembó', 'woocommerce' ),
'UY-TT' => __( 'Treinta y Tres', 'woocommerce' ),
),
'VE' => array( // Venezuela States.
'VE' => array( // Venezuelan states.
'VE-A' => __( 'Capital', 'woocommerce' ),
'VE-B' => __( 'Anzoátegui', 'woocommerce' ),
'VE-C' => __( 'Apure', 'woocommerce' ),
@ -2061,7 +2074,7 @@ return array(
'NW' => __( 'North West', 'woocommerce' ),
'WC' => __( 'Western Cape', 'woocommerce' ),
),
'ZM' => array( // Zambia's Provinces. Ref: https://en.wikipedia.org/wiki/ISO_3166-2:ZM.
'ZM' => array( // Zambian provinces.
'ZM-01' => __( 'Western', 'woocommerce' ),
'ZM-02' => __( 'Central', 'woocommerce' ),
'ZM-03' => __( 'Eastern', 'woocommerce' ),

View File

@ -151,6 +151,9 @@ class WC_Tracker {
// Payment gateway info.
$data['gateways'] = self::get_active_payment_gateways();
// WcPay settings info.
$data['wcpay_settings'] = self::get_wcpay_settings();
// Shipping method info.
$data['shipping_methods'] = self::get_active_shipping_methods();
@ -303,6 +306,15 @@ class WC_Tracker {
);
}
/**
* Get the settings of WooCommerce Payments plugin
*
* @return array
*/
private static function get_wcpay_settings() {
return get_option( 'woocommerce_woocommerce_payments_settings' );
}
/**
* Check to see if the helper is connected to woocommerce.com
*
@ -589,6 +601,7 @@ class WC_Tracker {
return $active_gateways;
}
/**
* Get a list of all active shipping methods.
*

View File

@ -1085,10 +1085,10 @@ function wc_get_price_excluding_tax( $product, $args = array() ) {
if ( $product->is_taxable() && wc_prices_include_tax() ) {
$order = ArrayUtil::get_value_or_default( $args, 'order' );
$customer_id = $order ? $order->get_customer_id() : 0;
if ( apply_filters( 'woocommerce_adjust_non_base_location_prices', true ) || ! $customer_id ) {
if ( apply_filters( 'woocommerce_adjust_non_base_location_prices', true ) ) {
$tax_rates = WC_Tax::get_base_tax_rates( $product->get_tax_class( 'unfiltered' ) );
} else {
$customer = wc_get_container()->get( LegacyProxy::class )->get_instance_of( WC_Customer::class, $customer_id );
$customer = $customer_id ? wc_get_container()->get( LegacyProxy::class )->get_instance_of( WC_Customer::class, $customer_id ) : null;
$tax_rates = WC_Tax::get_rates( $product->get_tax_class(), $customer );
}
$remove_taxes = WC_Tax::calc_tax( $line_price, $tax_rates, true );

View File

@ -2345,13 +2345,15 @@ function wc_update_600_db_version() {
* @return false Always false, since the LookupDataStore class handles all the data filling process.
*/
function wc_update_630_create_product_attributes_lookup_table() {
$data_store = wc_get_container()->get( LookupDataStore::class );
$data_store = wc_get_container()->get( LookupDataStore::class );
$data_regenerator = wc_get_container()->get( DataRegenerator::class );
if ( $data_store->check_lookup_table_exists() ) {
return false;
$data_regenerator->maybe_create_table_indices();
} else {
$data_regenerator->initiate_regeneration();
}
$data_regenerator = wc_get_container()->get( DataRegenerator::class );
$data_regenerator->initiate_regeneration();
return false;
}

View File

@ -141,6 +141,8 @@ CREATE TABLE ' . $this->lookup_table_name . '(
);
// phpcs:enable WordPress.DB.PreparedSQL.NotPrepared
$this->maybe_create_table_indices();
$last_existing_product_id =
WC()->call_function(
'wc_get_products',
@ -165,6 +167,49 @@ CREATE TABLE ' . $this->lookup_table_name . '(
return true;
}
/**
* Create the indices for the lookup table unless they exist already.
*/
public function maybe_create_table_indices() {
global $wpdb;
// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
$wpdb->query( 'DROP PROCEDURE IF EXISTS __create_wc_product_attributes_lookup_indices;' );
$wpdb->query(
"
CREATE PROCEDURE __create_wc_product_attributes_lookup_indices()
BEGIN
IF (SELECT COUNT(1)
FROM INFORMATION_SCHEMA.STATISTICS
WHERE table_schema='" . $wpdb->dbname . "'
AND table_name='" . $this->lookup_table_name . "'
AND index_name='product_or_parent_id_term_id')=0
THEN
ALTER TABLE " . $this->lookup_table_name . "
ADD INDEX product_or_parent_id_term_id (product_or_parent_id, term_id);
END IF;
IF (SELECT COUNT(1)
FROM INFORMATION_SCHEMA.STATISTICS
WHERE table_schema='" . $wpdb->dbname . "'
AND table_name='" . $this->lookup_table_name . "'
AND index_name='is_variation_attribute_term_id')=0
THEN
ALTER TABLE " . $this->lookup_table_name . '
ADD INDEX is_variation_attribute_term_id (is_variation_attribute, term_id);
END IF;
END;
'
);
$wpdb->query( 'CALL __create_wc_product_attributes_lookup_indices();' );
$wpdb->query( 'DROP PROCEDURE IF EXISTS __create_wc_product_attributes_lookup_indices;' );
// phpcs:enable WordPress.DB.PreparedSQL.NotPrepared
}
/**
* Action scheduler callback, performs one regeneration step and then
* schedules the next step if necessary.
@ -247,7 +292,6 @@ CREATE TABLE ' . $this->lookup_table_name . '(
* Cleanup/final option setup after the regeneration has been completed.
*
* @param bool $enable_usage Whether the table usage should be enabled or not.
*
*/
private function finalize_regeneration( bool $enable_usage ) {
delete_option( 'woocommerce_attribute_lookup_last_product_id_to_process' );

View File

@ -105,6 +105,10 @@ class WC_Product_Functions_Tests extends \WC_Unit_Test_Case {
$this->assertEquals( $order->get_customer_id(), $customer_id_passed_to_wc_customer_constructor );
$this->assertFalse( $get_base_rates_invoked );
$this->assertSame( $customer, $customer_passed_to_get_rates );
} elseif ( ! $customer_id && $set_filter ) {
$this->assertFalse( $customer_id_passed_to_wc_customer_constructor );
$this->assertNull( $customer_passed_to_get_rates );
$this->assertFalse( $get_base_rates_invoked );
} else {
$this->assertFalse( $customer_id_passed_to_wc_customer_constructor );
$this->assertFalse( $customer_passed_to_get_rates );
@ -114,8 +118,8 @@ class WC_Product_Functions_Tests extends \WC_Unit_Test_Case {
wc_get_price_excluding_tax( $product );
$this->assertFalse( $customer_id_passed_to_wc_customer_constructor );
$this->assertFalse( $customer_passed_to_get_rates );
$this->assertTrue( $get_base_rates_invoked );
$this->assertEquals( $set_filter ? null : false, $customer_passed_to_get_rates );
$this->assertEquals( ! $set_filter, $get_base_rates_invoked );
}
// phpcs:enable Squiz.Commenting

View File

@ -163,6 +163,7 @@ importers:
jest-puppeteer: ^4.4.0
ndb: ^1.1.5
node-stream-zip: ^1.13.6
puppeteer: 2.1.1
readline-sync: ^1.4.10
request: ^2.88.2
semver: ^7.3.2
@ -172,7 +173,7 @@ importers:
'@jest/test-sequencer': 25.5.4
'@slack/web-api': 6.5.1
'@woocommerce/api': link:../api
'@wordpress/e2e-test-utils': 4.16.1_jest@25.5.4
'@wordpress/e2e-test-utils': 4.16.1_jest@25.5.4+puppeteer@2.1.1
'@wordpress/jest-preset-default': 7.1.3_@babel+core@7.12.9+jest@25.5.4
app-root-path: 3.0.0
commander: 4.1.1
@ -180,8 +181,9 @@ importers:
jest: 25.5.4
jest-circus: 25.1.0
jest-each: 25.5.0
jest-puppeteer: 4.4.0
jest-puppeteer: 4.4.0_puppeteer@2.1.1
node-stream-zip: 1.15.0
puppeteer: 2.1.1
readline-sync: 1.4.10
request: 2.88.2
sprintf-js: 1.1.2
@ -5346,7 +5348,7 @@ packages:
- react-native
dev: false
/@wordpress/e2e-test-utils/4.16.1_jest@25.5.4:
/@wordpress/e2e-test-utils/4.16.1_jest@25.5.4+puppeteer@2.1.1:
resolution: {integrity: sha512-Dpsq5m0VSvjIhro2MjACSzkOkOf1jGEryzgEMW1ikbT6YI+motspHfGtisKXgYhZJOnjV4PwuEg+9lPVnd971g==}
engines: {node: '>=8'}
peerDependencies:
@ -5359,6 +5361,7 @@ packages:
jest: 25.5.4
lodash: 4.17.21
node-fetch: 2.6.5
puppeteer: 2.1.1
transitivePeerDependencies:
- react-native
dev: false
@ -13271,13 +13274,14 @@ packages:
jest-resolve: 27.3.1
dev: true
/jest-puppeteer/4.4.0:
/jest-puppeteer/4.4.0_puppeteer@2.1.1:
resolution: {integrity: sha512-ZaiCTlPZ07B9HW0erAWNX6cyzBqbXMM7d2ugai4epBDKpKvRDpItlRQC6XjERoJELKZsPziFGS0OhhUvTvQAXA==}
peerDependencies:
puppeteer: '>= 1.5.0 < 3'
dependencies:
expect-puppeteer: 4.4.0
jest-environment-puppeteer: 4.4.0
puppeteer: 2.1.1
transitivePeerDependencies:
- supports-color
dev: false