Skip to content

Commit 70f40dc

Browse files
committed
Merge branch '702-Test-coverage-Customer-Downloadable-Products' of github.com:vovsky/graphql-ce into 702-Test-coverage-Customer-Downloadable-Products
2 parents 72f72dd + 153a236 commit 70f40dc

File tree

4 files changed

+293
-0
lines changed

4 files changed

+293
-0
lines changed
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
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\GraphQl\Downloadable;
9+
10+
use Magento\Integration\Api\CustomerTokenServiceInterface;
11+
use Magento\Quote\Api\CartManagementInterface;
12+
use Magento\Quote\Model\ResourceModel\Quote as QuoteResource;
13+
use Magento\TestFramework\Helper\Bootstrap;
14+
use Magento\TestFramework\TestCase\GraphQlAbstract;
15+
use Magento\Quote\Model\QuoteFactory;
16+
17+
/**
18+
* Test retrieving of customer download products
19+
*/
20+
class CustomerDownloadableProductsTest extends GraphQlAbstract
21+
{
22+
/**
23+
* @var QuoteFactory
24+
*/
25+
protected $quoteFactory;
26+
27+
/**
28+
* @var QuoteResource
29+
*/
30+
protected $quoteResource;
31+
32+
/**
33+
* @var CustomerTokenServiceInterface
34+
*/
35+
private $customerTokenService;
36+
37+
/**
38+
* @var CartManagementInterface
39+
*/
40+
private $cartManagement;
41+
42+
/**
43+
* @magentoApiDataFixture Magento/Customer/_files/customer.php
44+
* @magentoApiDataFixture Magento/GraphQl/Catalog/_files/downloadable_product.php
45+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php
46+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_downloadable_product.php
47+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/enable_offline_payment_methods.php
48+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_billing_address.php
49+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_checkmo_payment_method.php
50+
*/
51+
public function testCustomerDownloadableProducts()
52+
{
53+
$quote = $this->quoteFactory->create();
54+
$this->quoteResource->load($quote, 'test_quote', 'reserved_order_id');
55+
$this->cartManagement->placeOrder($quote->getId());
56+
57+
$query = $this->getQuery();
58+
$response = $this->graphQlQuery($query, [], '', $this->getHeaderMap());
59+
60+
self::assertArrayHasKey('items', $response['customerDownloadableProducts']);
61+
self::assertCount(1, $response['customerDownloadableProducts']['items']);
62+
63+
self::assertArrayHasKey('date', $response['customerDownloadableProducts']['items'][0]);
64+
self::assertNotEmpty($response['customerDownloadableProducts']['items'][0]['date']);
65+
66+
self::assertArrayHasKey('download_url', $response['customerDownloadableProducts']['items'][0]);
67+
self::assertNotEmpty($response['customerDownloadableProducts']['items'][0]['download_url']);
68+
69+
self::assertArrayHasKey('order_increment_id', $response['customerDownloadableProducts']['items'][0]);
70+
self::assertNotEmpty($response['customerDownloadableProducts']['items'][0]['order_increment_id']);
71+
72+
self::assertArrayHasKey('remaining_downloads', $response['customerDownloadableProducts']['items'][0]);
73+
self::assertNotEmpty($response['customerDownloadableProducts']['items'][0]['remaining_downloads']);
74+
75+
self::assertArrayHasKey('status', $response['customerDownloadableProducts']['items'][0]);
76+
self::assertNotEmpty($response['customerDownloadableProducts']['items'][0]['status']);
77+
}
78+
79+
/**
80+
* @magentoApiDataFixture Magento/Customer/_files/customer.php
81+
*/
82+
public function testCustomerHasNoOrders()
83+
{
84+
$query = $this->getQuery();
85+
$response = $this->graphQlQuery($query, [], '', $this->getHeaderMap());
86+
87+
self::assertArrayHasKey('items', $response['customerDownloadableProducts']);
88+
self::assertCount(0, $response['customerDownloadableProducts']['items']);
89+
}
90+
91+
/**
92+
* @magentoApiDataFixture Magento/Customer/_files/customer.php
93+
* @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php
94+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/enable_offline_shipping_methods.php
95+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/enable_offline_payment_methods.php
96+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php
97+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php
98+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_shipping_address.php
99+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_billing_address.php
100+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_flatrate_shipping_method.php
101+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_checkmo_payment_method.php
102+
*/
103+
public function testCustomerHasNoDownloadableProducts()
104+
{
105+
$quote = $this->quoteFactory->create();
106+
$this->quoteResource->load($quote, 'test_quote', 'reserved_order_id');
107+
$this->cartManagement->placeOrder($quote->getId());
108+
109+
$query = $this->getQuery();
110+
$response = $this->graphQlQuery($query, [], '', $this->getHeaderMap());
111+
112+
self::assertArrayHasKey('items', $response['customerDownloadableProducts']);
113+
self::assertCount(0, $response['customerDownloadableProducts']['items']);
114+
}
115+
116+
/**
117+
* @inheritdoc
118+
*/
119+
protected function setUp()
120+
{
121+
$objectManager = Bootstrap::getObjectManager();
122+
$this->customerTokenService = $objectManager->get(CustomerTokenServiceInterface::class);
123+
$this->quoteFactory = $objectManager->get(QuoteFactory::class);
124+
$this->quoteResource = $objectManager->get(QuoteResource::class);
125+
$this->cartManagement = $objectManager->get(CartManagementInterface::class);
126+
}
127+
128+
/**
129+
* @return string
130+
*/
131+
private function getQuery(): string
132+
{
133+
return <<<QUERY
134+
{
135+
customerDownloadableProducts {
136+
items {
137+
date
138+
download_url
139+
order_increment_id
140+
remaining_downloads
141+
status
142+
}
143+
}
144+
}
145+
QUERY;
146+
}
147+
148+
/**
149+
* @param string $username
150+
* @param string $password
151+
* @return array
152+
* @throws \Magento\Framework\Exception\AuthenticationException
153+
*/
154+
private function getHeaderMap(string $username = '[email protected]', string $password = 'password'): array
155+
{
156+
$customerToken = $this->customerTokenService->createCustomerAccessToken($username, $password);
157+
$headerMap = ['Authorization' => 'Bearer ' . $customerToken];
158+
return $headerMap;
159+
}
160+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
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+
use Magento\Catalog\Api\Data\ProductInterface;
9+
use Magento\Catalog\Api\Data\ProductInterfaceFactory;
10+
use Magento\Catalog\Api\ProductRepositoryInterface;
11+
use Magento\Catalog\Model\Product\Attribute\Source\Status;
12+
use Magento\Downloadable\Model\Product\Type;
13+
use Magento\Catalog\Model\Product\Visibility;
14+
use Magento\Framework\Api\DataObjectHelper;
15+
use Magento\TestFramework\Helper\Bootstrap;
16+
use Magento\Downloadable\Api\Data\LinkInterfaceFactory;
17+
use Magento\Downloadable\Api\Data\LinkInterface;
18+
use Magento\Downloadable\Model\Link;
19+
use Magento\Downloadable\Helper\Download;
20+
use Magento\Framework\Api\ExtensionAttributesFactory;
21+
22+
$objectManager = Bootstrap::getObjectManager();
23+
/** @var ProductInterfaceFactory $productFactory */
24+
$productFactory = $objectManager->get(ProductInterfaceFactory::class);
25+
/** @var DataObjectHelper $dataObjectHelper */
26+
$dataObjectHelper = Bootstrap::getObjectManager()->get(DataObjectHelper::class);
27+
/** @var ProductRepositoryInterface $productRepository */
28+
$productRepository = $objectManager->get(ProductRepositoryInterface::class);
29+
/** @var LinkInterfaceFactory $linkFactory */
30+
$linkFactory = $objectManager->get(LinkInterfaceFactory::class);
31+
/** @var ExtensionAttributesFactory $extensionAttributesFactory */
32+
$extensionAttributesFactory = $objectManager->get(ExtensionAttributesFactory::class);
33+
34+
$link = $linkFactory->create();
35+
$linkData = [
36+
LINK::KEY_TITLE => 'Downloadable Product Link',
37+
LINK::KEY_LINK_TYPE => Download::LINK_TYPE_URL,
38+
LINK::KEY_IS_SHAREABLE => Link::LINK_SHAREABLE_CONFIG,
39+
LINK::KEY_LINK_URL => 'http://example.com/downloadable.txt',
40+
LINK::KEY_PRICE => 0,
41+
LINK::KEY_NUMBER_OF_DOWNLOADS => 0,
42+
LINK::KEY_SORT_ORDER => 1,
43+
];
44+
45+
$dataObjectHelper->populateWithArray($link, $linkData, LinkInterface::class);
46+
$extensionAttributes = $extensionAttributesFactory->create(ProductInterface::class);
47+
$extensionAttributes->setDownloadableProductLinks([$link]);
48+
49+
$product = $productFactory->create();
50+
$productData = [
51+
ProductInterface::TYPE_ID => Type::TYPE_DOWNLOADABLE,
52+
ProductInterface::ATTRIBUTE_SET_ID => 4,
53+
ProductInterface::SKU => 'downloadable_product',
54+
ProductInterface::NAME => 'Downloadable Product',
55+
ProductInterface::PRICE => 10,
56+
ProductInterface::VISIBILITY => Visibility::VISIBILITY_BOTH,
57+
ProductInterface::STATUS => Status::STATUS_ENABLED,
58+
ProductInterface::EXTENSION_ATTRIBUTES_KEY => $extensionAttributes
59+
];
60+
61+
$dataObjectHelper->populateWithArray($product, $productData, ProductInterface::class);
62+
/** Out of interface */
63+
$product
64+
->setWebsiteIds([1])
65+
->setStockData(
66+
[
67+
'qty' => 85.5,
68+
'is_in_stock' => true,
69+
'manage_stock' => true,
70+
'is_qty_decimal' => true
71+
]
72+
);
73+
74+
$productRepository->save($product);
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
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+
use Magento\Catalog\Api\ProductRepositoryInterface;
9+
use Magento\Framework\Registry;
10+
use Magento\TestFramework\Helper\Bootstrap;
11+
12+
$objectManager = Bootstrap::getObjectManager();
13+
/** @var ProductRepositoryInterface $productRepository */
14+
$productRepository = $objectManager->get(ProductRepositoryInterface::class);
15+
/** @var Registry $registry */
16+
$registry = $objectManager->get(Registry::class);
17+
18+
$currentArea = $registry->registry('isSecureArea');
19+
$registry->unregister('isSecureArea');
20+
$registry->register('isSecureArea', true);
21+
22+
try {
23+
$productRepository->deleteById('downloadable_product');
24+
} catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
25+
/**
26+
* Tests which are wrapped with MySQL transaction clear all data by transaction rollback.
27+
*/
28+
}
29+
30+
$registry->unregister('isSecureArea');
31+
$registry->register('isSecureArea', $currentArea);
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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+
use Magento\Catalog\Api\ProductRepositoryInterface;
9+
use Magento\Quote\Api\CartRepositoryInterface;
10+
use Magento\Quote\Model\QuoteFactory;
11+
use Magento\Quote\Model\ResourceModel\Quote as QuoteResource;
12+
use Magento\TestFramework\Helper\Bootstrap;
13+
14+
/** @var ProductRepositoryInterface $productRepository */
15+
$productRepository = Bootstrap::getObjectManager()->get(ProductRepositoryInterface::class);
16+
/** @var QuoteFactory $quoteFactory */
17+
$quoteFactory = Bootstrap::getObjectManager()->get(QuoteFactory::class);
18+
/** @var QuoteResource $quoteResource */
19+
$quoteResource = Bootstrap::getObjectManager()->get(QuoteResource::class);
20+
/** @var CartRepositoryInterface $cartRepository */
21+
$cartRepository = Bootstrap::getObjectManager()->get(CartRepositoryInterface::class);
22+
23+
$product = $productRepository->get('downloadable_product');
24+
25+
$quote = $quoteFactory->create();
26+
$quoteResource->load($quote, 'test_quote', 'reserved_order_id');
27+
$quote->addProduct($product, 1);
28+
$cartRepository->save($quote);

0 commit comments

Comments
 (0)