Skip to content

Commit ea0a500

Browse files
committed
graphQl-702 Added test coverage for Customer Downloadable Products
1 parent dc2e73a commit ea0a500

File tree

4 files changed

+284
-0
lines changed

4 files changed

+284
-0
lines changed
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
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/customer/create_empty_cart.php
95+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php
96+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/enable_offline_payment_methods.php
97+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_billing_address.php
98+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_checkmo_payment_method.php
99+
*/
100+
public function testCustomerHasNoDownloadableProducts()
101+
{
102+
$query = $this->getQuery();
103+
$response = $this->graphQlQuery($query, [], '', $this->getHeaderMap());
104+
105+
self::assertArrayHasKey('items', $response['customerDownloadableProducts']);
106+
self::assertCount(0, $response['customerDownloadableProducts']['items']);
107+
}
108+
109+
/**
110+
* @inheritdoc
111+
*/
112+
protected function setUp()
113+
{
114+
$objectManager = Bootstrap::getObjectManager();
115+
$this->customerTokenService = $objectManager->get(CustomerTokenServiceInterface::class);
116+
$this->quoteFactory = $objectManager->get(QuoteFactory::class);
117+
$this->quoteResource = $objectManager->get(QuoteResource::class);
118+
$this->cartManagement = $objectManager->get(CartManagementInterface::class);
119+
}
120+
121+
/**
122+
* @return string
123+
*/
124+
private function getQuery(): string
125+
{
126+
return <<<QUERY
127+
{
128+
customerDownloadableProducts {
129+
items {
130+
date
131+
download_url
132+
order_increment_id
133+
remaining_downloads
134+
status
135+
}
136+
}
137+
}
138+
QUERY;
139+
}
140+
141+
/**
142+
* @param string $username
143+
* @param string $password
144+
* @return array
145+
* @throws \Magento\Framework\Exception\AuthenticationException
146+
*/
147+
private function getHeaderMap(string $username = '[email protected]', string $password = 'password'): array
148+
{
149+
$customerToken = $this->customerTokenService->createCustomerAccessToken($username, $password);
150+
$headerMap = ['Authorization' => 'Bearer ' . $customerToken];
151+
return $headerMap;
152+
}
153+
}
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+
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+
'qty' => 85.5,
67+
'is_in_stock' => true,
68+
'manage_stock' => true,
69+
'is_qty_decimal' => true
70+
]);
71+
72+
$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)