Skip to content
This repository has been archived by the owner on Feb 23, 2024. It is now read-only.

Product Query unit tests #7747

Merged
merged 18 commits into from
Dec 8, 2022
Merged

Product Query unit tests #7747

merged 18 commits into from
Dec 8, 2022

Conversation

dinhtungdu
Copy link
Member

@dinhtungdu dinhtungdu commented Nov 25, 2022

This PR adds PHP tests that cover merging queries logic used in the ProductQuery block.

Fixes #7627

Other Checks

  • This PR adds/removes a feature flag & I've updated this doc.
  • This PR adds/removes an experimental interfaces and I've updated this doc.
  • I tagged two reviewers because this PR makes queries to the database or I think it might have some security impact.

Testing

Automated Tests

  • Changes in this PR are covered by Automated Tests.
    • Unit tests
    • E2E tests

WooCommerce Visibility

  • WooCommerce Core
  • Feature plugin
  • Experimental

@dinhtungdu dinhtungdu self-assigned this Nov 25, 2022
@dinhtungdu dinhtungdu added skip-changelog PRs that you don't want to appear in the changelog. category: tests block-type: product-query Issues related to/affecting all product-query variations. labels Nov 25, 2022
@github-actions
Copy link
Contributor

The release ZIP for this PR is accessible via:

https://wcblocks.wpcomstaging.com/wp-content/uploads/woocommerce-gutenberg-products-block-7747.zip

@github-actions
Copy link
Contributor

github-actions bot commented Nov 25, 2022

TypeScript Errors Report

Files with errors: 429
Total errors: 2059

🎉 🎉 This PR does not introduce new TS errors.

@github-actions
Copy link
Contributor

github-actions bot commented Nov 25, 2022

Size Change: 0 B

Total Size: 975 kB

ℹ️ View Unchanged
Filename Size
build/active-filters-frontend.js 7.74 kB
build/active-filters-wrapper-frontend.js 6.01 kB
build/active-filters.js 7.32 kB
build/all-products-frontend.js 11.3 kB
build/all-products.js 33.2 kB
build/all-reviews.js 7.79 kB
build/attribute-filter-frontend.js 22.6 kB
build/attribute-filter-wrapper-frontend.js 7.14 kB
build/attribute-filter.js 12.3 kB
build/blocks-checkout.js 27.3 kB
build/cart-blocks/cart-accepted-payment-methods-frontend.js 1.38 kB
build/cart-blocks/cart-cross-sells-frontend.js 253 B
build/cart-blocks/cart-cross-sells-products--product-add-to-cart-frontend.js 5.48 kB
build/cart-blocks/cart-cross-sells-products-frontend.js 4.77 kB
build/cart-blocks/cart-express-payment--checkout-blocks/express-payment-frontend.js 5.04 kB
build/cart-blocks/cart-express-payment-frontend.js 778 B
build/cart-blocks/cart-items-frontend.js 299 B
build/cart-blocks/cart-line-items--mini-cart-contents-block/products-table-frontend.js 5.29 kB
build/cart-blocks/cart-line-items-frontend.js 1.07 kB
build/cart-blocks/cart-order-summary-frontend.js 1.24 kB
build/cart-blocks/cart-totals-frontend.js 319 B
build/cart-blocks/empty-cart-frontend.js 346 B
build/cart-blocks/filled-cart-frontend.js 782 B
build/cart-blocks/order-summary-coupon-form-frontend.js 1.73 kB
build/cart-blocks/order-summary-discount-frontend.js 2.15 kB
build/cart-blocks/order-summary-fee-frontend.js 273 B
build/cart-blocks/order-summary-heading-frontend.js 455 B
build/cart-blocks/order-summary-shipping-frontend.js 5.99 kB
build/cart-blocks/order-summary-subtotal-frontend.js 274 B
build/cart-blocks/order-summary-taxes-frontend.js 435 B
build/cart-blocks/proceed-to-checkout-frontend.js 1.19 kB
build/cart-frontend.js 46.2 kB
build/cart.js 46.4 kB
build/checkout-blocks/actions-frontend.js 1.77 kB
build/checkout-blocks/billing-address--checkout-blocks/shipping-address-frontend.js 3.9 kB
build/checkout-blocks/billing-address-frontend.js 1.09 kB
build/checkout-blocks/contact-information-frontend.js 1.87 kB
build/checkout-blocks/express-payment-frontend.js 1.13 kB
build/checkout-blocks/fields-frontend.js 343 B
build/checkout-blocks/order-note-frontend.js 1.14 kB
build/checkout-blocks/order-summary-cart-items-frontend.js 3.67 kB
build/checkout-blocks/order-summary-coupon-form-frontend.js 1.89 kB
build/checkout-blocks/order-summary-discount-frontend.js 2.28 kB
build/checkout-blocks/order-summary-fee-frontend.js 276 B
build/checkout-blocks/order-summary-frontend.js 1.24 kB
build/checkout-blocks/order-summary-shipping-frontend.js 6.04 kB
build/checkout-blocks/order-summary-subtotal-frontend.js 273 B
build/checkout-blocks/order-summary-taxes-frontend.js 436 B
build/checkout-blocks/payment-frontend.js 8.31 kB
build/checkout-blocks/shipping-address-frontend.js 1.07 kB
build/checkout-blocks/shipping-methods-frontend.js 5.01 kB
build/checkout-blocks/terms-frontend.js 1.63 kB
build/checkout-blocks/totals-frontend.js 325 B
build/checkout-frontend.js 48.3 kB
build/checkout.js 40.6 kB
build/featured-category.js 13.2 kB
build/featured-product.js 13.4 kB
build/filter-wrapper-frontend.js 13.8 kB
build/filter-wrapper.js 2.4 kB
build/general-style-rtl.css 1.29 kB
build/general-style.css 1.29 kB
build/handpicked-products.js 7.29 kB
build/legacy-template.js 2.86 kB
build/mini-cart-component-frontend.js 20 kB
build/mini-cart-contents-block/empty-cart-frontend.js 366 B
build/mini-cart-contents-block/filled-cart-frontend.js 230 B
build/mini-cart-contents-block/footer-frontend.js 2.95 kB
build/mini-cart-contents-block/items-frontend.js 237 B
build/mini-cart-contents-block/products-table-frontend.js 591 B
build/mini-cart-contents-block/shopping-button-frontend.js 288 B
build/mini-cart-contents-block/title-frontend.js 368 B
build/mini-cart-contents.js 17.1 kB
build/mini-cart-frontend.js 1.88 kB
build/mini-cart.js 4.29 kB
build/price-filter-frontend.js 13.6 kB
build/price-filter-wrapper-frontend.js 7.02 kB
build/price-filter.js 8.39 kB
build/price-format.js 1.19 kB
build/product-add-to-cart--product-button--product-category-list--product-image--product-price--product-r--a0326d00.js 226 B
build/product-add-to-cart--product-button--product-image--product-rating--product-title.js 151 B
build/product-add-to-cart-frontend.js 1.46 kB
build/product-add-to-cart.js 8.36 kB
build/product-best-sellers.js 7.62 kB
build/product-button--product-category-list--product-image--product-price--product-rating--product-sale-b--e17c7c01.js 430 B
build/product-button--product-image--product-rating--product-sale-badge--product-title.js 301 B
build/product-button-frontend.js 2.17 kB
build/product-button.js 3.85 kB
build/product-categories.js 2.36 kB
build/product-category-list-frontend.js 1.13 kB
build/product-category-list.js 503 B
build/product-category.js 8.61 kB
build/product-image-frontend.js 2.16 kB
build/product-image.js 3.93 kB
build/product-new.js 7.62 kB
build/product-on-sale.js 7.95 kB
build/product-price-frontend.js 2.16 kB
build/product-price.js 1.54 kB
build/product-query.js 5.74 kB
build/product-rating-frontend.js 1.47 kB
build/product-rating.js 816 B
build/product-sale-badge-frontend.js 1.38 kB
build/product-sale-badge.js 811 B
build/product-search.js 2.61 kB
build/product-sku-frontend.js 629 B
build/product-sku.js 377 B
build/product-stock-indicator-frontend.js 1.26 kB
build/product-stock-indicator.js 644 B
build/product-summary-frontend.js 1.52 kB
build/product-summary.js 920 B
build/product-tag-list-frontend.js 1.12 kB
build/product-tag-list.js 497 B
build/product-tag.js 8 kB
build/product-title-frontend.js 1.57 kB
build/product-title.js 3.3 kB
build/product-top-rated.js 7.86 kB
build/products-by-attribute.js 8.54 kB
build/rating-filter-frontend.js 7.16 kB
build/rating-filter-wrapper-frontend.js 5.41 kB
build/rating-filter.js 5.8 kB
build/reviews-by-category.js 11.2 kB
build/reviews-by-product.js 12.3 kB
build/reviews-frontend.js 7.02 kB
build/single-product-frontend.js 17.5 kB
build/single-product.js 10.1 kB
build/stock-filter-frontend.js 7.8 kB
build/stock-filter-wrapper-frontend.js 6.04 kB
build/stock-filter.js 6.71 kB
build/vendors--attribute-filter-wrapper--mini-cart-contents-block/footer--product-add-to-cart-frontend.js 6.86 kB
build/vendors--attribute-filter-wrapper-frontend.js 8.2 kB
build/vendors--cart-blocks/cart-cross-sells-products--cart-blocks/cart-line-items--cart-blocks/cart-order--671ca56f-frontend.js 5.26 kB
build/vendors--cart-blocks/cart-cross-sells-products--cart-blocks/order-summary-shipping--checkout-blocks--18f9376a-frontend.js 19.1 kB
build/vendors--cart-blocks/cart-cross-sells-products--product-add-to-cart-frontend.js 7.54 kB
build/vendors--cart-blocks/cart-line-items--checkout-blocks/order-summary-cart-items--mini-cart-contents---233ab542-frontend.js 3.14 kB
build/vendors--cart-blocks/order-summary-shipping--checkout-blocks/billing-address--checkout-blocks/order--5b8feb0b-frontend.js 4.85 kB
build/vendors--cart-blocks/order-summary-shipping--checkout-blocks/order-summary-shipping--checkout-block--dda5866c-frontend.js 8.85 kB
build/wc-blocks-data.js 18.8 kB
build/wc-blocks-editor-style-rtl.css 5.19 kB
build/wc-blocks-editor-style.css 5.19 kB
build/wc-blocks-google-analytics.js 1.56 kB
build/wc-blocks-middleware.js 934 B
build/wc-blocks-registry.js 2.92 kB
build/wc-blocks-shared-context.js 1.52 kB
build/wc-blocks-shared-hocs.js 1.72 kB
build/wc-blocks-style-rtl.css 24.2 kB
build/wc-blocks-style.css 24.2 kB
build/wc-blocks-vendors-style-rtl.css 1.95 kB
build/wc-blocks-vendors-style.css 1.95 kB
build/wc-blocks-vendors.js 62.4 kB
build/wc-blocks.js 2.63 kB
build/wc-payment-method-bacs.js 816 B
build/wc-payment-method-cheque.js 811 B
build/wc-payment-method-cod.js 909 B
build/wc-payment-method-paypal.js 837 B
build/wc-settings.js 2.6 kB

compressed-size-action

@github-actions
Copy link
Contributor

github-actions bot commented Nov 29, 2022

Script Dependencies Report

There is no changed script dependency between this branch and trunk.

This comment was automatically generated by the ./github/compare-assets action.

@dinhtungdu dinhtungdu marked this pull request as ready for review November 30, 2022 09:11
@rubikuserbot rubikuserbot requested review from a team and sunyatasattva and removed request for a team November 30, 2022 09:11
Copy link
Contributor

@sunyatasattva sunyatasattva left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love how you did the tests! Great job. I have a few comments, but I'm pre-approving.

Another comment would be: I am not too familiar with unit testing in PHP and the tools, but it'd be nice if we can more clearly divide certain tests. Is it possible to give them more explanatory names or descriptions? If not, perhaps more clearly dividing the test cases that are about the global query used with the query params on the front-end by the filters, and the ones used in the editor.

Also, we should add test cases in which these overlap. Right now we are testing each function, but the mess happens when we try and set some price or stock status settings in the editor, and then the user will change the front-end filters (or use the FSE templates). We should have a few test cases for those and make sure things come out as expected.

Though we don't need to add to this PR, which is already great. We can create another one as well.

Comment on lines 25 to 34
'attrs' => array(
'namespace' => 'woocommerce/product-query',
'query' => array(
'posts_per_page' => 6,
'orderby' => 'date',
'order' => 'desc',
'offset' => 0,
),
),
);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we perhaps populate this with all the defaults from QUERY_DEFAULT_ATTRIBUTES?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make sense! I actually use the wrong data, fixed in 8995798

use Automattic\WooCommerce\Blocks\Integrations\IntegrationRegistry;

/**
* ProductQueryMock used to test cart block functions.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suppose cart block function was a copy+paste mistake?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it is. Thank you for the catch!

class ProductQueryMock extends ProductQuery {

/**
* We initaite our mock class.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* We initaite our mock class.
* We initialize our mock class.

initialize? instantiate?

foreach ( $on_sale_product_ids as $id ) {
$this->assertContainsEquals( $id, $merged_query['post__in'] );
}
$this->assertNotContains( 384123, $merged_query['post__in'] );
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are we asserting not containing this specific number?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My intention is to avoid false-positive tests. But looking at again, this is obvious. I updated this assertion to check for the length of post__in array instead.

@github-actions github-actions bot added this to the 9.1.0 milestone Dec 1, 2022
@senadir senadir modified the milestones: 9.1.0, 9.2.0 Dec 5, 2022
@dinhtungdu
Copy link
Member Author

Also, we should add test cases in which these overlap.
Though we don't need to add to this PR, which is already great. We can create another one as well.

@sunyatasattva I'm late updating this PR (I'm sorry about that), so I decided to add tests for overlap cases in 4db2658. Can you take a look?

Is it possible to give them more explanatory names or descriptions? If not, perhaps more clearly dividing the test cases that are about the global query used with the query params on the front-end by the filters, and the ones used in the editor.

I'd love to make the test more descriptive. For now, this is what I use to distinguish between test cases:

  • test_merging_..._queries for tests that merge Product Query advanced filters and popular filters.
  • test_merging_filter_..._queries for tests that merge queries from filter blocks.
  • test_merging_multiple_queries and test_merging_multiple_filter_queries for tests that merge overlap cases for each.

I agree for now it's hard to scan through the file. We can divide it into multiple test files, but after reading this answer, I tend to keep the current organization. I'm open to suggestions for improving the test name/description. Having fresh eyes on this is really valuable 🙇🏽 .

Copy link
Contributor

@sunyatasattva sunyatasattva left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with this naming convention, I'd rather not split the tests in separate files. Just better names and perhaps better internal class organization is fine for me. I think you have done a good job at this point with the names and comments.

Comment on lines +208 to +214
$parsed_block = $this->get_base_parsed_block();
$parsed_block['attrs']['query']['orderBy'] = 'rating';
$parsed_block['attrs']['query']['__woocommerceStockStatus'] = array(
'instock',
'onbackorder',
);
$parsed_block['attrs']['query']['__woocommerceAttributes'] = array(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm a bit confused by the = alignments here. Line 208 is aligned with 209, and 210 with 214. Why are they not all aligned? Does PHP Lint not complain here? These rules are confusing 😅

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does PHP Lint not complain here?

phpcs will complains if we align = signs, I agree that's they're confusing 😂

image

@dinhtungdu dinhtungdu merged commit b26fb06 into trunk Dec 8, 2022
@dinhtungdu dinhtungdu deleted the tests/product-query-phpunit branch December 8, 2022 01:48
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
block-type: product-query Issues related to/affecting all product-query variations. skip-changelog PRs that you don't want to appear in the changelog.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Product Query [3]: [Tests] Unit test that queries are merged correctly by the ProductQuery class
3 participants