CreateTest.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\Braintree\Controller\Adminhtml\Invoice;
  8. use Braintree\Result\Successful;
  9. use Braintree\Transaction;
  10. use Magento\Braintree\Model\Adapter\BraintreeAdapter;
  11. use Magento\Braintree\Model\Adapter\BraintreeAdapterFactory;
  12. use Magento\Framework\Api\SearchCriteriaBuilder;
  13. use Magento\Framework\Data\Form\FormKey;
  14. use Magento\Framework\Message\MessageInterface;
  15. use Magento\Sales\Api\Data\OrderInterface;
  16. use Magento\Sales\Api\OrderRepositoryInterface;
  17. use Magento\TestFramework\TestCase\AbstractBackendController;
  18. use PHPUnit_Framework_MockObject_MockObject as MockObject;
  19. /**
  20. * @magentoAppArea adminhtml
  21. */
  22. class CreateTest extends AbstractBackendController
  23. {
  24. /**
  25. * @var BraintreeAdapter|MockObject
  26. */
  27. private $adapter;
  28. /**
  29. * @inheritdoc
  30. */
  31. protected function setUp()
  32. {
  33. parent::setUp();
  34. $adapterFactory = $this->getMockBuilder(BraintreeAdapterFactory::class)
  35. ->disableOriginalConstructor()
  36. ->getMock();
  37. $this->adapter = $this->getMockBuilder(BraintreeAdapter::class)
  38. ->disableOriginalConstructor()
  39. ->getMock();
  40. $adapterFactory->method('create')
  41. ->willReturn($this->adapter);
  42. $this->_objectManager->addSharedInstance($adapterFactory, BraintreeAdapterFactory::class);
  43. }
  44. /**
  45. * @inheritdoc
  46. */
  47. protected function tearDown()
  48. {
  49. $this->_objectManager->removeSharedInstance(BraintreeAdapterFactory::class);
  50. parent::tearDown();
  51. }
  52. /**
  53. * Checks a case when non default Merchant Account ID should be send to Braintree
  54. * during creation second partial invoice.
  55. *
  56. * @return void
  57. * @magentoConfigFixture default_store payment/braintree/merchant_account_id Magneto
  58. * @magentoConfigFixture current_store payment/braintree/merchant_account_id USA_Merchant
  59. * @magentoDataFixture Magento/Braintree/Fixtures/partial_invoice.php
  60. */
  61. public function testCreatePartialInvoiceWithNonDefaultMerchantAccount(): void
  62. {
  63. $order = $this->getOrder('100000002');
  64. $this->adapter->method('sale')
  65. ->with(self::callback(function ($request) {
  66. self::assertEquals('USA_Merchant', $request['merchantAccountId']);
  67. return true;
  68. }))
  69. ->willReturn($this->getTransactionStub());
  70. $uri = 'backend/sales/order_invoice/save/order_id/' . $order->getEntityId();
  71. $this->prepareRequest($uri);
  72. $this->dispatch($uri);
  73. self::assertSessionMessages(
  74. self::equalTo(['The invoice has been created.']),
  75. MessageInterface::TYPE_SUCCESS
  76. );
  77. }
  78. /**
  79. * Creates stub for Braintree capture Transaction.
  80. *
  81. * @return Successful
  82. */
  83. private function getTransactionStub(): Successful
  84. {
  85. $transaction = $this->getMockBuilder(Transaction::class)
  86. ->disableOriginalConstructor()
  87. ->getMock();
  88. $transaction->status = 'submitted_for_settlement';
  89. $response = new Successful();
  90. $response->success = true;
  91. $response->transaction = $transaction;
  92. return $response;
  93. }
  94. /**
  95. * Gets order by increment ID.
  96. *
  97. * @param string $incrementId
  98. * @return OrderInterface
  99. */
  100. private function getOrder(string $incrementId): OrderInterface
  101. {
  102. /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
  103. $searchCriteriaBuilder = $this->_objectManager->get(SearchCriteriaBuilder::class);
  104. $searchCriteria = $searchCriteriaBuilder->addFilter('increment_id', $incrementId)
  105. ->create();
  106. /** @var OrderRepositoryInterface $repository */
  107. $repository = $this->_objectManager->get(OrderRepositoryInterface::class);
  108. $items = $repository->getList($searchCriteria)
  109. ->getItems();
  110. return array_pop($items);
  111. }
  112. /**
  113. * Prepares POST request for invoice creation.
  114. *
  115. * @param string $uri
  116. * @return void
  117. */
  118. private function prepareRequest(string $uri): void
  119. {
  120. /** @var FormKey $formKey */
  121. $formKey = $this->_objectManager->get(FormKey::class);
  122. $request = $this->getRequest();
  123. $request->setMethod('POST');
  124. $request->setParam('form_key', $formKey->getFormKey());
  125. $request->setRequestUri($uri);
  126. $request->setPostValue(
  127. [
  128. 'invoice' => [
  129. 'capture_case' => 'online'
  130. ]
  131. ]
  132. );
  133. }
  134. }