Commit 00ff1cf0b72 for woocommerce

commit 00ff1cf0b72cc3a1698424959ea416743a2e1647
Author: Albert Juhé Lluveras <contact@albertjuhe.com>
Date:   Fri Aug 7 14:17:43 2026 +0200

    Harden Reviews blocks tests (#67445)

    * Harden Reviews blocks tests

    * Add changelog

    * Avoid rating collision with Cap reviews

    * Fix changelog type

diff --git a/plugins/woocommerce/changelog/fix-67434-harden-reviews-blocks-tests b/plugins/woocommerce/changelog/fix-67434-harden-reviews-blocks-tests
new file mode 100644
index 00000000000..3cb6e48ce3c
--- /dev/null
+++ b/plugins/woocommerce/changelog/fix-67434-harden-reviews-blocks-tests
@@ -0,0 +1,5 @@
+Significance: patch
+Type: dev
+Comment: Harden Reviews blocks tests
+
+
diff --git a/plugins/woocommerce/tests/e2e/bin/blocks/scripts/parallel/reviews.sh b/plugins/woocommerce/tests/e2e/bin/blocks/scripts/parallel/reviews.sh
index 96b0a034b3b..2d978310899 100644
--- a/plugins/woocommerce/tests/e2e/bin/blocks/scripts/parallel/reviews.sh
+++ b/plugins/woocommerce/tests/e2e/bin/blocks/scripts/parallel/reviews.sh
@@ -1,7 +1,9 @@
 #!/usr/bin/env bash

-# Add a couple of reviews to Hoodie.
+# Add reviews to Hoodie. Order matters: specs treat the last created review as most recent.
+# Include three distinct ratings so latest / highest / lowest are different reviews.
 hoodie_post_id=$(wp post list --post_type=product --field=ID --name="Hoodie" --format=ids)
+wp wc product_review create $hoodie_post_id --name="Jane Smith" --email="customer@woocommerceblockse2etestsuite.com" --review="It's ok." --rating=3 --user=1
 wp wc product_review create $hoodie_post_id --name="Jane Smith" --email="customer@woocommerceblockse2etestsuite.com" --review="Nice album!" --rating=5 --user=1
 wp wc product_review create $hoodie_post_id --name="Jane Smith" --email="customer@woocommerceblockse2etestsuite.com" --review="Not bad." --rating=4 --user=1

diff --git a/plugins/woocommerce/tests/e2e/test-data/blocks/data/data.ts b/plugins/woocommerce/tests/e2e/test-data/blocks/data/data.ts
index 88eb100d53c..9eb63998141 100644
--- a/plugins/woocommerce/tests/e2e/test-data/blocks/data/data.ts
+++ b/plugins/woocommerce/tests/e2e/test-data/blocks/data/data.ts
@@ -60,7 +60,14 @@ const customer = {

 // Reviews are ordered by when they were created.
 // source: plugins/woocommerce/tests/e2e/bin/blocks/scripts/parallel/reviews.sh
+// Three distinct ratings so latest / highest / lowest are different reviews.
 const hoodieReviews = [
+	{
+		name: `${ customer.first_name } ${ customer.last_name }`,
+		email: customer.email,
+		review: "It's ok.",
+		rating: 3,
+	},
 	{
 		name: `${ customer.first_name } ${ customer.last_name }`,
 		email: customer.email,
diff --git a/plugins/woocommerce/tests/e2e/tests/blocks/reviews-by-category/reviews-by-category.block_theme.spec.ts b/plugins/woocommerce/tests/e2e/tests/blocks/reviews-by-category/reviews-by-category.block_theme.spec.ts
index 8f389a700d9..addfe575572 100644
--- a/plugins/woocommerce/tests/e2e/tests/blocks/reviews-by-category/reviews-by-category.block_theme.spec.ts
+++ b/plugins/woocommerce/tests/e2e/tests/blocks/reviews-by-category/reviews-by-category.block_theme.spec.ts
@@ -21,73 +21,92 @@ const lowestRating = [ ...hoodieReviews ].sort(
 const BLOCK_NAME = 'woocommerce/reviews-by-category';

 test.describe( `${ BLOCK_NAME } Block`, () => {
-	test.beforeEach( async ( { admin, editor } ) => {
-		await admin.createNewPost();
-		await editor.insertBlock( { name: BLOCK_NAME } );
+	test.describe( 'with a category selected', () => {
+		test.beforeEach( async ( { admin, editor } ) => {
+			await admin.createNewPost();
+			await editor.insertBlock( { name: BLOCK_NAME } );
+
+			const blockLocator = await editor.getBlockByName( BLOCK_NAME );
+			const categoryCheckbox = blockLocator.getByRole( 'checkbox', {
+				name: 'Clothing',
+				exact: true,
+			} );
+			await categoryCheckbox.check();
+			await expect( categoryCheckbox ).toBeChecked();
+
+			await blockLocator.getByRole( 'button', { name: 'Done' } ).click();
+		} );
+
+		test( 'block can be inserted and it successfully renders a review in the editor and the frontend', async ( {
+			page,
+			editor,
+		} ) => {
+			await expect(
+				editor.canvas.getByText( hoodieReviews[ 0 ].review )
+			).toBeVisible();

-		const blockLocator = await editor.getBlockByName( BLOCK_NAME );
-		const categoryCheckbox = blockLocator.getByRole( 'checkbox', {
-			name: 'Clothing',
-			exact: true,
+			await editor.publishAndVisitPost();
+
+			await expect(
+				page.getByText( hoodieReviews[ 0 ].review )
+			).toBeVisible();
 		} );
-		await categoryCheckbox.check();
-		await expect( categoryCheckbox ).toBeChecked();

-		await blockLocator.getByRole( 'button', { name: 'Done' } ).click();
-	} );
+		test( 'sorts by most recent review by default and can sort by highest rating', async ( {
+			page,
+			frontendUtils,
+			editor,
+		} ) => {
+			await editor.publishAndVisitPost();

-	test( 'block can be inserted and it successfully renders a review in the editor and the frontend', async ( {
-		page,
-		editor,
-	} ) => {
-		await expect(
-			editor.canvas.getByText( hoodieReviews[ 0 ].review )
-		).toBeVisible();
+			const block = await frontendUtils.getBlockByName( BLOCK_NAME );

-		await editor.publishAndVisitPost();
+			const reviews = block.locator(
+				'.wc-block-components-review-list-item__text'
+			);

-		await expect(
-			page.getByText( hoodieReviews[ 0 ].review )
-		).toBeVisible();
-	} );
+			await expect( reviews.first() ).toHaveText( latestReview.review );

-	test( 'sorts by most recent review by default and can sort by highest rating', async ( {
-		page,
-		frontendUtils,
-		editor,
-	} ) => {
-		await editor.publishAndVisitPost();
+			const select = page.getByLabel( 'Order by' );
+			await select.selectOption( 'Highest rating' );

-		const block = await frontendUtils.getBlockByName( BLOCK_NAME );
+			await expect( reviews.first() ).toHaveText( highestRating.review );
+		} );
+
+		test( 'can sort by lowest rating', async ( {
+			page,
+			frontendUtils,
+			editor,
+		} ) => {
+			await editor.publishAndVisitPost();

-		const reviews = block.locator(
-			'.wc-block-components-review-list-item__text'
-		);
+			const block = await frontendUtils.getBlockByName( BLOCK_NAME );

-		await expect( reviews.first() ).toHaveText( latestReview.review );
+			const reviews = block.locator(
+				'.wc-block-components-review-list-item__text'
+			);

-		const select = page.getByLabel( 'Order by' );
-		await select.selectOption( 'Highest rating' );
+			await expect( reviews.first() ).toHaveText( latestReview.review );

-		await expect( reviews.first() ).toHaveText( highestRating.review );
+			const select = page.getByLabel( 'Order by' );
+			await select.selectOption( 'Lowest rating' );
+
+			await expect( reviews.first() ).toHaveText( lowestRating.review );
+		} );
 	} );

-	test( 'can sort by lowest rating', async ( {
-		page,
-		frontendUtils,
+	test( 'renders no reviews on the frontend when published without a category selected', async ( {
+		admin,
 		editor,
+		frontendUtils,
 	} ) => {
+		await admin.createNewPost();
+		await editor.insertBlock( { name: BLOCK_NAME } );
 		await editor.publishAndVisitPost();

 		const block = await frontendUtils.getBlockByName( BLOCK_NAME );
-
-		const reviews = block.locator(
-			'.wc-block-components-review-list-item__text'
-		);
-
-		const select = page.getByLabel( 'Order by' );
-		await select.selectOption( 'Lowest rating' );
-
-		await expect( reviews.first() ).toHaveText( lowestRating.review );
+		await expect(
+			block.locator( '.wc-block-components-review-list-item__text' )
+		).toHaveCount( 0 );
 	} );
 } );
diff --git a/plugins/woocommerce/tests/e2e/tests/blocks/reviews-by-product/reviews-by-product.block_theme.spec.ts b/plugins/woocommerce/tests/e2e/tests/blocks/reviews-by-product/reviews-by-product.block_theme.spec.ts
index fe9a6b7d82d..bf155726a36 100644
--- a/plugins/woocommerce/tests/e2e/tests/blocks/reviews-by-product/reviews-by-product.block_theme.spec.ts
+++ b/plugins/woocommerce/tests/e2e/tests/blocks/reviews-by-product/reviews-by-product.block_theme.spec.ts
@@ -21,71 +21,88 @@ const lowestRating = [ ...hoodieReviews ].sort(
 )[ 0 ];

 test.describe( `${ BLOCK_NAME } Block`, () => {
-	test.beforeEach( async ( { admin, editor } ) => {
-		await admin.createNewPost();
-		await editor.insertBlock( { name: BLOCK_NAME } );
-
-		const productCheckbox = editor.canvas.getByLabel(
-			'Hoodie, has 2 reviews'
-		);
-		await productCheckbox.check();
-		await expect( productCheckbox ).toBeChecked();
-
-		await editor.canvas.getByRole( 'button', { name: 'Done' } ).click();
+	test.describe( 'with a product selected', () => {
+		test.beforeEach( async ( { admin, editor } ) => {
+			await admin.createNewPost();
+			await editor.insertBlock( { name: BLOCK_NAME } );
+
+			const productCheckbox = editor.canvas.getByLabel(
+				'Hoodie, has 3 reviews'
+			);
+			await productCheckbox.check();
+			await expect( productCheckbox ).toBeChecked();
+
+			await editor.canvas.getByRole( 'button', { name: 'Done' } ).click();
+		} );
+
+		test( 'block can be inserted and it successfully renders a review in the editor and the frontend', async ( {
+			page,
+			editor,
+		} ) => {
+			await expect(
+				editor.canvas.getByText( hoodieReviews[ 0 ].review )
+			).toBeVisible();
+
+			await editor.publishAndVisitPost();
+
+			await expect(
+				page.getByText( hoodieReviews[ 0 ].review )
+			).toBeVisible();
+		} );
+
+		test( 'sorts by most recent by default and can sort by highest rating', async ( {
+			page,
+			frontendUtils,
+			editor,
+		} ) => {
+			await editor.publishAndVisitPost();
+			const block = await frontendUtils.getBlockByName( BLOCK_NAME );
+
+			const reviews = block.locator(
+				'.wc-block-components-review-list-item__text'
+			);
+
+			await expect( reviews.first() ).toHaveText( latestReview.review );
+
+			const select = page.getByLabel( 'Order by' );
+			await select.selectOption( 'Highest rating' );
+
+			await expect( reviews.first() ).toHaveText( highestRating.review );
+		} );
+
+		test( 'can sort by lowest rating', async ( {
+			page,
+			frontendUtils,
+			editor,
+		} ) => {
+			await editor.publishAndVisitPost();
+			const block = await frontendUtils.getBlockByName( BLOCK_NAME );
+
+			const reviews = block.locator(
+				'.wc-block-components-review-list-item__text'
+			);
+
+			await expect( reviews.first() ).toHaveText( latestReview.review );
+
+			const select = page.getByLabel( 'Order by' );
+			await select.selectOption( 'Lowest rating' );
+
+			await expect( reviews.first() ).toHaveText( lowestRating.review );
+		} );
 	} );

-	test( 'block can be inserted and it successfully renders a review in the editor and the frontend', async ( {
-		page,
+	test( 'renders no reviews on the frontend when published without a product selected', async ( {
+		admin,
 		editor,
-	} ) => {
-		await expect(
-			editor.canvas.getByText( hoodieReviews[ 0 ].review )
-		).toBeVisible();
-
-		await editor.publishAndVisitPost();
-
-		await expect(
-			page.getByText( hoodieReviews[ 0 ].review )
-		).toBeVisible();
-	} );
-
-	test( 'sorts by most recent by default and can sort by highest rating', async ( {
-		page,
 		frontendUtils,
-		editor,
 	} ) => {
+		await admin.createNewPost();
+		await editor.insertBlock( { name: BLOCK_NAME } );
 		await editor.publishAndVisitPost();
-		const block = await frontendUtils.getBlockByName( BLOCK_NAME );
-
-		const reviews = block.locator(
-			'.wc-block-components-review-list-item__text'
-		);
-
-		await expect( reviews.first() ).toHaveText( latestReview.review );
-
-		const select = page.getByLabel( 'Order by' );
-		await select.selectOption( 'Highest rating' );

-		await expect( reviews.first() ).toHaveText( highestRating.review );
-	} );
-
-	test( 'can sort by lowest rating', async ( {
-		page,
-		frontendUtils,
-		editor,
-	} ) => {
-		await editor.publishAndVisitPost();
 		const block = await frontendUtils.getBlockByName( BLOCK_NAME );
-
-		const reviews = block.locator(
-			'.wc-block-components-review-list-item__text'
-		);
-
-		await expect( reviews.first() ).toHaveText( latestReview.review );
-
-		const select = page.getByLabel( 'Order by' );
-		await select.selectOption( 'Lowest rating' );
-
-		await expect( reviews.first() ).toHaveText( lowestRating.review );
+		await expect(
+			block.locator( '.wc-block-components-review-list-item__text' )
+		).toHaveCount( 0 );
 	} );
 } );