Skip to content

Commit fc6075e

Browse files
committed
Merge branch 'ACP2E-2155' of https://github.com/magento-l3/magento2ce into PR-10122023
2 parents 8c5e74d + a7a5dda commit fc6075e

File tree

2 files changed

+111
-3
lines changed

2 files changed

+111
-3
lines changed

app/code/Magento/ConfigurableProductGraphQl/Model/Resolver/AddConfigurableProductsToCart.php

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1414
use Magento\QuoteGraphQl\Model\Cart\AddProductsToCart;
1515
use Magento\QuoteGraphQl\Model\Cart\GetCartForUser;
16+
use Magento\Quote\Model\QuoteMutexInterface;
17+
use Magento\Framework\GraphQl\Query\Resolver\ContextInterface;
1618

1719
/**
1820
* Add configurable products to cart GraphQl resolver
@@ -30,16 +32,24 @@ class AddConfigurableProductsToCart implements ResolverInterface
3032
*/
3133
private $addProductsToCart;
3234

35+
/**
36+
* @var QuoteMutexInterface
37+
*/
38+
private $quoteMutex;
39+
3340
/**
3441
* @param GetCartForUser $getCartForUser
3542
* @param AddProductsToCart $addProductsToCart
43+
* @param QuoteMutexInterface $quoteMutex
3644
*/
3745
public function __construct(
3846
GetCartForUser $getCartForUser,
39-
AddProductsToCart $addProductsToCart
47+
AddProductsToCart $addProductsToCart,
48+
QuoteMutexInterface $quoteMutex
4049
) {
4150
$this->getCartForUser = $getCartForUser;
4251
$this->addProductsToCart = $addProductsToCart;
52+
$this->quoteMutex = $quoteMutex;
4353
}
4454

4555
/**
@@ -50,15 +60,33 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
5060
if (!isset($args['input']['cart_id']) || empty($args['input']['cart_id'])) {
5161
throw new GraphQlInputException(__('Required parameter "cart_id" is missing'));
5262
}
53-
$maskedCartId = $args['input']['cart_id'];
5463

5564
if (!isset($args['input']['cart_items']) || empty($args['input']['cart_items'])
5665
|| !is_array($args['input']['cart_items'])
5766
) {
5867
throw new GraphQlInputException(__('Required parameter "cart_items" is missing'));
5968
}
60-
$cartItems = $args['input']['cart_items'];
6169

70+
return $this->quoteMutex->execute(
71+
[$args['input']['cart_id']],
72+
\Closure::fromCallable([$this, 'run']),
73+
[$context, $args]
74+
);
75+
}
76+
77+
/**
78+
* Run the resolver.
79+
*
80+
* @param ContextInterface $context
81+
* @param array|null $args
82+
* @return array[]
83+
* @throws GraphQlInputException
84+
* @SuppressWarnings(PHPMD.UnusedPrivateMethod)
85+
*/
86+
public function run($context, array $args): array
87+
{
88+
$cartItems = $args['input']['cart_items'];
89+
$maskedCartId = $args['input']['cart_id'];
6290
$storeId = (int)$context->getExtensionAttributes()->getStore()->getId();
6391
$cart = $this->getCartForUser->execute($maskedCartId, $context->getUserId(), $storeId);
6492
$this->addProductsToCart->execute($cart, $cartItems);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
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\ConfigurableProductGraphQl\Test\Unit\Model\Resolver;
9+
10+
use Magento\ConfigurableProductGraphQl\Model\Resolver\AddConfigurableProductsToCart;
11+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
12+
use Magento\GraphQl\Model\Query\ContextInterface;
13+
use Magento\Framework\GraphQl\Config\Element\Field;
14+
use Magento\Quote\Model\QuoteMutexInterface;
15+
use Magento\QuoteGraphQl\Model\Cart\AddProductsToCart;
16+
use Magento\QuoteGraphQl\Model\Cart\GetCartForUser;
17+
use PHPUnit\Framework\MockObject\MockObject;
18+
use PHPUnit\Framework\TestCase;
19+
20+
/**
21+
* Test for AddConfigurableProductsToCart
22+
*/
23+
class AddConfigurableProductsToCartTest extends TestCase
24+
{
25+
/**
26+
* @var GetCartForUser|MockObject
27+
*/
28+
private $getCartForUser;
29+
30+
/**
31+
* @var AddProductsToCart|MockObject
32+
*/
33+
private $addProductsToCart;
34+
35+
/**
36+
* @var QuoteMutexInterface|MockObject
37+
*/
38+
private $quoteMutex;
39+
40+
/**
41+
* @var AddConfigurableProductsToCart
42+
*/
43+
private $resolver;
44+
45+
/**
46+
* @inheritDoc
47+
*/
48+
protected function setUp(): void
49+
{
50+
$this->getCartForUser = $this->createMock(GetCartForUser::class);
51+
$this->addProductsToCart = $this->createMock(AddProductsToCart::class);
52+
$this->quoteMutex = $this->createMock(QuoteMutexInterface::class);
53+
54+
$this->resolver = new AddConfigurableProductsToCart(
55+
$this->getCartForUser,
56+
$this->addProductsToCart,
57+
$this->quoteMutex
58+
);
59+
}
60+
61+
/**
62+
* @throws \Exception
63+
*/
64+
public function testResolve()
65+
{
66+
$maskedId = 'maskedId';
67+
$args = ['input' => ['cart_id' => $maskedId, 'cart_items' => ['item1', 'item2']]];
68+
$field = $this->createMock(Field::class);
69+
$context = $this->createMock(ContextInterface::class);
70+
$info = $this->createMock(ResolveInfo::class);
71+
$this->quoteMutex->expects($this->once())
72+
->method('execute')
73+
->willReturnCallback(function ($maskedIds, $callable, $actualArgs) use ($maskedId, $args, $context) {
74+
$this->assertEquals([$maskedId], $maskedIds);
75+
$this->assertTrue(is_callable($callable));
76+
$this->assertEquals([$context, $args], $actualArgs);
77+
});
78+
$this->resolver->resolve($field, $context, $info, null, $args);
79+
}
80+
}

0 commit comments

Comments
 (0)