Skip to content

Commit

Permalink
graphQl-470: Creating/getting Cart queries should support Store context
Browse files Browse the repository at this point in the history
  • Loading branch information
kisroman committed Mar 20, 2019
1 parent 0e8428c commit 4e10da6
Show file tree
Hide file tree
Showing 7 changed files with 227 additions and 1 deletion.
20 changes: 19 additions & 1 deletion app/code/Magento/QuoteGraphQl/Model/Cart/GetCartForUser.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Quote\Model\MaskedQuoteIdToQuoteIdInterface;
use Magento\Quote\Model\Quote;
use Magento\Store\Model\StoreManagerInterface;

/**
* Get cart
Expand All @@ -29,16 +30,24 @@ class GetCartForUser
*/
private $cartRepository;

/**
* @var StoreManagerInterface
*/
private $storeManager;

/**
* @param MaskedQuoteIdToQuoteIdInterface $maskedQuoteIdToQuoteId
* @param CartRepositoryInterface $cartRepository
* @param StoreManagerInterface $storeManager
*/
public function __construct(
MaskedQuoteIdToQuoteIdInterface $maskedQuoteIdToQuoteId,
CartRepositoryInterface $cartRepository
CartRepositoryInterface $cartRepository,
StoreManagerInterface $storeManager
) {
$this->maskedQuoteIdToQuoteId = $maskedQuoteIdToQuoteId;
$this->cartRepository = $cartRepository;
$this->storeManager = $storeManager;
}

/**
Expand Down Expand Up @@ -75,6 +84,15 @@ public function execute(string $cartHash, ?int $customerId): Quote
);
}

if ((int)$cart->getStoreId() !== (int)$this->storeManager->getStore()->getId()) {
throw new GraphQlAuthorizationException(
__(
'Wrong store code specified for cart "%masked_cart_id"',
['masked_cart_id' => $cartHash]
)
);
}

$cartCustomerId = (int)$cart->getCustomerId();

/* Guest cart, allow operations */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

namespace Magento\GraphQl\Quote\Customer;

use Magento\Framework\App\ResourceConnection;
use Magento\Integration\Api\CustomerTokenServiceInterface;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\TestCase\GraphQlAbstract;
Expand All @@ -27,11 +28,17 @@ class CreateEmptyCartTest extends GraphQlAbstract
*/
private $customerTokenService;

/**
* @var ResourceConnection
*/
private $resourceConnection;

protected function setUp()
{
$objectManager = Bootstrap::getObjectManager();
$this->guestCartRepository = $objectManager->get(GuestCartRepositoryInterface::class);
$this->customerTokenService = $objectManager->get(CustomerTokenServiceInterface::class);
$this->resourceConnection = $objectManager->get(ResourceConnection::class);
}

/**
Expand All @@ -57,5 +64,51 @@ public function testCreateEmptyCart()

self::assertNotNull($guestCart->getId());
self::assertEquals(1, $guestCart->getCustomer()->getId());
self::assertSame('default', $guestCart->getStore()->getCode());

$this->deleteCreatedQuote($guestCart->getId());
}

/**
* @magentoApiDataFixture Magento/Store/_files/second_store.php
* @magentoApiDataFixture Magento/Customer/_files/customer.php
*/
public function testCreateEmptyCartWithNotDefaultStore()
{
$query = <<<QUERY
mutation {
createEmptyCart
}
QUERY;

$customerToken = $this->customerTokenService->createCustomerAccessToken('customer@example.com', 'password');
$headerMap = ['Authorization' => 'Bearer ' . $customerToken, 'Store' => 'fixture_second_store'];

$response = $this->graphQlQuery($query, [], '', $headerMap);

self::assertArrayHasKey('createEmptyCart', $response);

$maskedCartId = $response['createEmptyCart'];
/* guestCartRepository is used for registered customer to get the cart hash */
$guestCart = $this->guestCartRepository->get($maskedCartId);

self::assertNotNull($guestCart->getId());
self::assertEquals(1, $guestCart->getCustomer()->getId());
self::assertSame('fixture_second_store', $guestCart->getStore()->getCode());

$this->deleteCreatedQuote($guestCart->getId());
}

/**
* Delete active quote for customer by customer id.
* This is needed to have ability to create new quote for another store and not return the active one.
* @see QuoteManagement::createCustomerCart
*
* @param $quoteId
*/
private function deleteCreatedQuote($quoteId)
{
$connection = $this->resourceConnection->getConnection();
$connection->query('DELETE FROM quote WHERE entity_id = ' . $quoteId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,58 @@ public function testGetInactiveCart()
$this->graphQlQuery($query, [], '', $this->getHeaderMap());
}

/**
* @magentoApiDataFixture Magento/Checkout/_files/active_quote_not_default_store.php
*/
public function testGetCartWithNotDefaultStore()
{
$maskedQuoteId = $this->getMaskedQuoteIdByReversedQuoteId('test_order_1_not_default_store');
$query = $this->getCartQuery($maskedQuoteId);

$headerMap = $this->getHeaderMap();
$headerMap['Store'] = 'fixture_second_store';

$response = $this->graphQlQuery($query, [], '', $headerMap);

self::assertArrayHasKey('cart', $response);
self::assertArrayHasKey('items', $response['cart']);
}

/**
* @magentoApiDataFixture Magento/Checkout/_files/active_quote.php
* @magentoApiDataFixture Magento/Store/_files/second_store.php
*
* @expectedException \Exception
* @expectedExceptionMessage Wrong store code specified for cart
*/
public function testGetCartWithWrongStore()
{
$maskedQuoteId = $this->getMaskedQuoteIdByReversedQuoteId('test_order_1');
$query = $this->getCartQuery($maskedQuoteId);

$headerMap = $this->getHeaderMap();
$headerMap['Store'] = 'fixture_second_store';

$this->graphQlQuery($query, [], '', $headerMap);
}

/**
* @magentoApiDataFixture Magento/Checkout/_files/active_quote_not_default_store.php
*
* @expectedException \Exception
* @expectedExceptionMessage Store code not_existing_store does not exist
*/
public function testGetCartWithNotExistingStore()
{
$maskedQuoteId = $this->getMaskedQuoteIdByReversedQuoteId('test_order_1_not_default_store');
$query = $this->getCartQuery($maskedQuoteId);

$headerMap = $this->getHeaderMap();
$headerMap['Store'] = 'not_existing_store';

$this->graphQlQuery($query, [], '', $headerMap);
}

/**
* @param string $maskedQuoteId
* @return string
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,28 @@ public function testCreateEmptyCart()
self::assertNotNull($guestCart->getId());
self::assertNull($guestCart->getCustomer()->getId());
}

/**
* @magentoApiDataFixture Magento/Store/_files/second_store.php
*/
public function testCreateEmptyCartWithNotDefaultStore()
{
$query = <<<QUERY
mutation {
createEmptyCart
}
QUERY;
$headerMap = ['Store' => 'fixture_second_store'];

$response = $this->graphQlQuery($query, [], '', $headerMap);

self::assertArrayHasKey('createEmptyCart', $response);

$maskedCartId = $response['createEmptyCart'];
$guestCart = $this->guestCartRepository->get($maskedCartId);

self::assertNotNull($guestCart->getId());
self::assertNull($guestCart->getCustomer()->getId());
self::assertSame('fixture_second_store', $guestCart->getStore()->getCode());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,54 @@ public function testGetInactiveCart()
$this->graphQlQuery($query);
}

/**
* @magentoApiDataFixture Magento/Checkout/_files/active_quote_not_default_store.php
*/
public function testGetCartWithNotDefaultStore()
{
$maskedQuoteId = $this->getMaskedQuoteIdByReversedQuoteId('test_order_1_not_default_store');
$query = $this->getCartQuery($maskedQuoteId);

$headerMap = ['Store' => 'fixture_second_store'];
$response = $this->graphQlQuery($query, [], '', $headerMap);

self::assertArrayHasKey('cart', $response);
self::assertArrayHasKey('items', $response['cart']);
}

/**
* @magentoApiDataFixture Magento/Checkout/_files/active_quote.php
* @magentoApiDataFixture Magento/Store/_files/second_store.php
*
* @expectedException \Exception
* @expectedExceptionMessage Wrong store code specified for cart
*/
public function testGetCartWithWrongStore()
{
$maskedQuoteId = $this->getMaskedQuoteIdByReversedQuoteId('test_order_1');
$query = $this->getCartQuery($maskedQuoteId);

$headerMap = ['Store' => 'fixture_second_store'];
$this->graphQlQuery($query, [], '', $headerMap);
}

/**
* @magentoApiDataFixture Magento/Customer/_files/customer.php
* @magentoApiDataFixture Magento/Checkout/_files/active_quote_not_default_store.php
*
* @expectedException \Exception
* @expectedExceptionMessage Store code not_existing_store does not exist
*/
public function testGetCartWithNotExistingStore()
{
$maskedQuoteId = $this->getMaskedQuoteIdByReversedQuoteId('test_order_1_not_default_store');

$headerMap['Store'] = 'not_existing_store';
$query = $this->getCartQuery($maskedQuoteId);

$this->graphQlQuery($query, [], '', $headerMap);
}

/**
* @param string $maskedQuoteId
* @return string
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
include 'testsuite/Magento/Store/_files/second_store.php';
include 'testsuite/Magento/Customer/_files/customer.php';

$quote = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\Quote\Model\Quote::class);
$quote->setStoreId($store->getId())
->setIsActive(true)
->setIsMultiShipping(false)
->setReservedOrderId('test_order_1_not_default_store')
->setCustomerId($customer->getId())
->save();

/** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */
$quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
->create(\Magento\Quote\Model\QuoteIdMaskFactory::class)
->create();
$quoteIdMask->setQuoteId($quote->getId());
$quoteIdMask->setDataChanges(true);
$quoteIdMask->save();
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
$quote = $objectManager->create(\Magento\Quote\Model\Quote::class);
$quote->load('test_order_1_not_default_store', 'reserved_order_id')->delete();

0 comments on commit 4e10da6

Please sign in to comment.