Skip to content

Commit 1ecd588

Browse files
committed
ACP2E-1237: Product reviews from different stores all show in one store when using graphql
1 parent 05c52a6 commit 1ecd588

File tree

3 files changed

+129
-1
lines changed

3 files changed

+129
-1
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Review\Test\Fixture;
9+
10+
use Magento\Framework\DataObject;
11+
use Magento\Review\Model\ResourceModel\Review as ReviewResourceModel;
12+
use Magento\Review\Model\Review as ReviewModel;
13+
use Magento\Review\Model\ReviewFactory as ReviewModelFactory;
14+
use Magento\TestFramework\Fixture\RevertibleDataFixtureInterface;
15+
16+
class Review implements RevertibleDataFixtureInterface
17+
{
18+
private const DEFAULT_DATA = [
19+
'entity_code' => ReviewModel::ENTITY_PRODUCT_CODE,
20+
'entity_pk_value' => 1,
21+
'nickname' => 'Nickname',
22+
'title' => 'Review title',
23+
'detail' => 'Review detail',
24+
'status_id' => ReviewModel::STATUS_APPROVED,
25+
'store_id' => 1,
26+
];
27+
28+
/**
29+
* @var ReviewModelFactory
30+
*/
31+
private $reviewModelFactory;
32+
33+
/**
34+
* @var ReviewResourceModel
35+
*/
36+
private $reviewResourceModel;
37+
38+
/**
39+
* @param ReviewModelFactory $reviewModelFactory
40+
* @param ReviewResourceModel $reviewResourceModel
41+
*/
42+
public function __construct(
43+
ReviewModelFactory $reviewModelFactory,
44+
ReviewResourceModel $reviewResourceModel
45+
) {
46+
$this->reviewModelFactory = $reviewModelFactory;
47+
$this->reviewResourceModel = $reviewResourceModel;
48+
}
49+
50+
/**
51+
* @inheritdoc
52+
*/
53+
public function apply(array $data = []): ?DataObject
54+
{
55+
$data += self::DEFAULT_DATA;
56+
$data['entity_id'] = $this->reviewResourceModel->getEntityIdByCode($data['entity_code']);
57+
unset($data['entity_code']);
58+
$reviewModel = $this->reviewModelFactory->create(['data' => $data]);
59+
$reviewModel->setStores([$data['store_id']]);
60+
$this->reviewResourceModel->save($reviewModel);
61+
62+
return $reviewModel;
63+
}
64+
65+
/**
66+
* @inheritdoc
67+
*/
68+
public function revert(DataObject $data): void
69+
{
70+
$this->reviewResourceModel->delete($data);
71+
}
72+
}

app/code/Magento/ReviewGraphQl/Model/Resolver/Product/ReviewCount.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ public function resolve(
7575
/** @var Product $product */
7676
$product = $value['model'];
7777

78-
return (int) $this->review->getTotalReviews($product->getId(), true);
78+
return (int) $this->review->getTotalReviews(
79+
$product->getId(),
80+
true,
81+
(int) $context->getExtensionAttributes()->getStore()->getId()
82+
);
7983
}
8084
}

dev/tests/api-functional/testsuite/Magento/GraphQl/Review/GetProductReviewsTest.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,18 @@
88
namespace Magento\GraphQl\Review;
99

1010
use Magento\Catalog\Api\ProductRepositoryInterface;
11+
use Magento\Catalog\Test\Fixture\Product as ProductFixture;
1112
use Magento\Framework\Exception\AuthenticationException;
1213
use Magento\Framework\Registry;
1314
use Magento\Integration\Api\CustomerTokenServiceInterface;
1415
use Magento\Review\Model\ResourceModel\Review\Collection;
1516
use Magento\Review\Model\ResourceModel\Review\CollectionFactory as ReviewCollectionFactory;
1617
use Magento\Review\Model\Review;
1718
use Magento\Review\Model\Review\SummaryFactory;
19+
use Magento\Review\Test\Fixture\Review as ReviewFixture;
1820
use Magento\Store\Model\StoreManagerInterface;
21+
use Magento\Store\Test\Fixture\Store as StoreFixture;
22+
use Magento\TestFramework\Fixture\DataFixture;
1923
use Magento\TestFramework\Helper\Bootstrap;
2024
use Magento\TestFramework\ObjectManager;
2125
use Magento\TestFramework\TestCase\GraphQlAbstract;
@@ -246,6 +250,54 @@ public function testCustomerReviewsAddedToProduct()
246250
self::assertEquals($expectedFirstItem, $response['customer']['reviews']['items'][0]);
247251
}
248252

253+
#[
254+
DataFixture(StoreFixture::class, ['code' => 'store2'], 'store2'),
255+
DataFixture(ProductFixture::class, ['sku' => 'product1'], 'product1'),
256+
DataFixture(ReviewFixture::class, ['entity_pk_value' => '$product1.id$']),
257+
DataFixture(ReviewFixture::class, ['entity_pk_value' => '$product1.id$', 'store_id' => '$store2.id$']),
258+
]
259+
/**
260+
* @dataProvider storesDataProvider
261+
* @param string $storeCode
262+
*/
263+
public function testProductReviewDifferentStores(string $storeCode): void
264+
{
265+
$productSku = 'product1';
266+
$query = <<<QUERY
267+
{
268+
products(filter: {sku: {eq: "$productSku"}}) {
269+
items {
270+
review_count
271+
reviews {
272+
items {
273+
nickname
274+
summary
275+
text
276+
}
277+
}
278+
}
279+
}
280+
}
281+
QUERY;
282+
$response = $this->graphQlQuery($query, [], '', ['Store' => $storeCode]);
283+
self::assertArrayHasKey('products', $response);
284+
self::assertArrayHasKey('items', $response['products']);
285+
self::assertNotEmpty($response['products']['items']);
286+
self::assertEquals(1, $response['products']['items'][0]['review_count']);
287+
self::assertCount(1, $response['products']['items'][0]['reviews']['items']);
288+
}
289+
290+
/**
291+
* @return array
292+
*/
293+
public function storesDataProvider(): array
294+
{
295+
return [
296+
['default'],
297+
['store2'],
298+
];
299+
}
300+
249301
/**
250302
* Removing the recently added product reviews
251303
*/

0 commit comments

Comments
 (0)