From c9f754f5a33cba050b6b70e9794d631bf1b9f2f8 Mon Sep 17 00:00:00 2001 From: Christopher Allford Date: Tue, 14 Jul 2020 13:57:21 -0700 Subject: [PATCH 1/2] Added the existing meta keys to the `woocommerce_duplicate_product_exclude_meta` filter --- .../class-wc-admin-duplicate-product.php | 17 +++++++++++++-- ...class-wc-tests-admin-duplicate-product.php | 21 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/includes/admin/class-wc-admin-duplicate-product.php b/includes/admin/class-wc-admin-duplicate-product.php index e6886f3ba3e..4a11254e524 100644 --- a/includes/admin/class-wc-admin-duplicate-product.php +++ b/includes/admin/class-wc-admin-duplicate-product.php @@ -129,11 +129,24 @@ class WC_Admin_Duplicate_Product { */ public function product_duplicate( $product ) { /** - * Filter to allow us to unset/remove data we don't want to copy to the duplicate. + * Filter to allow us to exclude meta keys from product duplication.. * + * @param array $exclude_meta The keys to exclude from the duplicate. + * @param array $existing_meta_keys The meta keys that the product already has. * @since 2.6 */ - $meta_to_exclude = array_filter( apply_filters( 'woocommerce_duplicate_product_exclude_meta', array() ) ); + $meta_to_exclude = array_filter( + apply_filters( + 'woocommerce_duplicate_product_exclude_meta', + array(), + array_map( + function ( $datum ) { + return $datum->key; + }, + $product->get_meta_data() + ) + ) + ); $duplicate = clone $product; $duplicate->set_id( 0 ); diff --git a/tests/legacy/unit-tests/admin/class-wc-tests-admin-duplicate-product.php b/tests/legacy/unit-tests/admin/class-wc-tests-admin-duplicate-product.php index aa1671d47a9..cd1da557ce7 100644 --- a/tests/legacy/unit-tests/admin/class-wc-tests-admin-duplicate-product.php +++ b/tests/legacy/unit-tests/admin/class-wc-tests-admin-duplicate-product.php @@ -96,6 +96,27 @@ class WC_Tests_Admin_Duplicate_Product extends WC_Unit_Test_Case { } } + /** + * Tests that the filter will exclude metadata from the duplicate as-expected. + */ + public function test_filter_allows_excluding_metadata_from_duplicate() { + $product = WC_Helper_Product::create_simple_product(); + $product->add_meta_data( 'test_data', 'test' ); + + $filter = function ( $exclude_meta, $existing_meta_keys ) { + $this->assertContains( 'test_data', $existing_meta_keys ); + return array( 'test_data' ); + }; + add_filter( 'woocommerce_duplicate_product_exclude_meta', $filter, 10, 2 ); + + $duplicate = ( new WC_Admin_Duplicate_Product() )->product_duplicate( $product ); + + remove_filter( 'woocommerce_duplicate_product_exclude_meta', $filter ); + + $this->assertNotEquals( $product->get_id(), $duplicate->get_id() ); + $this->assertEmpty( $duplicate->get_meta_data() ); + } + /** * Asserts that the product was correctly reset after duplication. * From fdee8dceafe7baf67711fbab308f4a7a101ad2ac Mon Sep 17 00:00:00 2001 From: Christopher Allford Date: Wed, 15 Jul 2020 07:08:09 -0700 Subject: [PATCH 2/2] Moved test to correct directory --- composer.json | 4 +-- ...class-wc-tests-admin-duplicate-product.php | 21 ------------ .../class-wc-admin-duplicate-product-test.php | 32 +++++++++++++++++++ 3 files changed, 34 insertions(+), 23 deletions(-) create mode 100644 tests/php/includes/admin/class-wc-admin-duplicate-product-test.php diff --git a/composer.json b/composer.json index 93167dd7f0c..8a824140bef 100644 --- a/composer.json +++ b/composer.json @@ -45,8 +45,8 @@ }, "autoload-dev": { "psr-4": { - "Automattic\\WooCommerce\\Tests\\": "tests/php/src", - "Automattic\\WooCommerce\\Testing\\Tools\\": "tests/Tools" + "Automattic\\WooCommerce\\Tests\\": "tests/php/src/", + "Automattic\\WooCommerce\\Testing\\Tools\\": "tests/Tools/" } }, "scripts": { diff --git a/tests/legacy/unit-tests/admin/class-wc-tests-admin-duplicate-product.php b/tests/legacy/unit-tests/admin/class-wc-tests-admin-duplicate-product.php index cd1da557ce7..aa1671d47a9 100644 --- a/tests/legacy/unit-tests/admin/class-wc-tests-admin-duplicate-product.php +++ b/tests/legacy/unit-tests/admin/class-wc-tests-admin-duplicate-product.php @@ -96,27 +96,6 @@ class WC_Tests_Admin_Duplicate_Product extends WC_Unit_Test_Case { } } - /** - * Tests that the filter will exclude metadata from the duplicate as-expected. - */ - public function test_filter_allows_excluding_metadata_from_duplicate() { - $product = WC_Helper_Product::create_simple_product(); - $product->add_meta_data( 'test_data', 'test' ); - - $filter = function ( $exclude_meta, $existing_meta_keys ) { - $this->assertContains( 'test_data', $existing_meta_keys ); - return array( 'test_data' ); - }; - add_filter( 'woocommerce_duplicate_product_exclude_meta', $filter, 10, 2 ); - - $duplicate = ( new WC_Admin_Duplicate_Product() )->product_duplicate( $product ); - - remove_filter( 'woocommerce_duplicate_product_exclude_meta', $filter ); - - $this->assertNotEquals( $product->get_id(), $duplicate->get_id() ); - $this->assertEmpty( $duplicate->get_meta_data() ); - } - /** * Asserts that the product was correctly reset after duplication. * diff --git a/tests/php/includes/admin/class-wc-admin-duplicate-product-test.php b/tests/php/includes/admin/class-wc-admin-duplicate-product-test.php new file mode 100644 index 00000000000..a9e5e7934c8 --- /dev/null +++ b/tests/php/includes/admin/class-wc-admin-duplicate-product-test.php @@ -0,0 +1,32 @@ +add_meta_data( 'test_data', 'test' ); + + $filter = function ( $exclude_meta, $existing_meta_keys ) { + $this->assertContains( 'test_data', $existing_meta_keys ); + return array( 'test_data' ); + }; + add_filter( 'woocommerce_duplicate_product_exclude_meta', $filter, 10, 2 ); + + $duplicate = ( new WC_Admin_Duplicate_Product() )->product_duplicate( $product ); + + remove_filter( 'woocommerce_duplicate_product_exclude_meta', $filter ); + + $this->assertNotEquals( $product->get_id(), $duplicate->get_id() ); + $this->assertEmpty( $duplicate->get_meta_data() ); + } +}