123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Sales\Model\Order;
- use Magento\Framework\Api\SearchCriteriaBuilder;
- use Magento\Framework\ObjectManagerInterface;
- use Magento\Sales\Api\InvoiceRepositoryInterface;
- use Magento\Sales\Model\Order;
- use Magento\TestFramework\Helper\Bootstrap;
- /**
- * Test for CreditmemoFactory class.
- * @magentoDbIsolation enabled
- */
- class CreditmemoFactoryTest extends \PHPUnit\Framework\TestCase
- {
- /**
- * Placeholder for order item id field.
- */
- const ORDER_ITEM_ID_PLACEHOLDER = 'id_item_';
- /**
- * @var ObjectManagerInterface
- */
- private $objectManager;
- /**
- * @var CreditmemoFactory
- */
- private $creditmemoFactory;
- /**
- * {@inheritdoc}
- */
- protected function setUp()
- {
- $this->objectManager = Bootstrap::getObjectManager();
- $this->creditmemoFactory = $this->objectManager->create(CreditmemoFactory::class);
- }
- /**
- * Checks a case when creditmemo created from the order.
- *
- * @magentoDataFixture Magento/Sales/_files/order_with_bundle_and_invoiced.php
- * @dataProvider createByOrderDataProvider
- * @param array $creditmemoData
- * @param int $expectedQty
- */
- public function testCreateByOrder(array $creditmemoData, $expectedQty)
- {
- $order = $this->getOrder('100000001');
- $creditmemoData = $this->prepareCreditMemoData($order, $creditmemoData);
- $creditmemo = $this->creditmemoFactory->createByOrder($order, $creditmemoData);
- self::assertEquals($expectedQty, $creditmemo->getTotalQty(), 'Creditmemo has wrong total qty.');
- }
- /**
- * @return array
- */
- public function createByOrderDataProvider(): array
- {
- return [
- [
- 'creditmemoData' => [
- 'qtys' => [
- self::ORDER_ITEM_ID_PLACEHOLDER . '2' => 2,
- self::ORDER_ITEM_ID_PLACEHOLDER . '3' => 10,
- ],
- ],
- 'expectedQty' => 12,
- ],
- [
- 'creditmemoData' => [
- 'qtys' => [
- self::ORDER_ITEM_ID_PLACEHOLDER . '1' => 2,
- self::ORDER_ITEM_ID_PLACEHOLDER . '2' => 2,
- self::ORDER_ITEM_ID_PLACEHOLDER . '3' => 10,
- ],
- ],
- 'expectedQty' => 14,
- ],
- ];
- }
- /**
- * Checks a case when creditmemo created from the invoice.
- *
- * @magentoDataFixture Magento/Sales/_files/invoice_with_bundle.php
- *
- * @return void
- */
- public function testCreateByInvoice()
- {
- $invoice = $this->getInvoice('100000001');
- $creditmemo = $this->creditmemoFactory->createByInvoice($invoice);
- self::assertEquals(14, $creditmemo->getTotalQty(), 'Creditmemo has wrong total qty.');
- }
- /**
- * Prepare Creditmemo data.
- *
- * @param Order $order
- * @param array $creditmemoData
- * @return array
- */
- private function prepareCreditMemoData(Order $order, array $creditmemoData): array
- {
- $result = [];
- $orderItems = $order->getAllItems();
- foreach ($creditmemoData['qtys'] as $key => $item) {
- $result[$orderItems[$this->prepareOrderItemKey($key)]->getId()] = $item;
- }
- $creditmemoData['qtys'] = $result;
- return $creditmemoData;
- }
- /**
- * Prepare order item key.
- *
- * @param string $key
- * @return int
- */
- private function prepareOrderItemKey($key)
- {
- return str_replace(self::ORDER_ITEM_ID_PLACEHOLDER, '', $key) - 1;
- }
- /**
- * Retrieves order by increment ID.
- *
- * @param string $incrementId
- * @return Order
- */
- private function getOrder(string $incrementId): Order
- {
- /** @var Order $order */
- $order = $this->objectManager->create(Order::class);
- $order->loadByIncrementId($incrementId);
- return $order;
- }
- /**
- * Retrieves invoice by increment ID.
- *
- * @param string $incrementId
- * @return Invoice
- */
- private function getInvoice(string $incrementId): Invoice
- {
- /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
- $searchCriteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class);
- $searchCriteria = $searchCriteriaBuilder
- ->addFilter('increment_id', $incrementId)
- ->create();
- /** @var InvoiceRepositoryInterface $repository */
- $repository = $this->objectManager->get(InvoiceRepositoryInterface::class);
- $items = $repository->getList($searchCriteria)->getItems();
- return array_pop($items);
- }
- }
|