LabelGeneratorTest.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Shipping\Test\Unit\Model\Shipping;
  7. use Magento\Framework\DataObject;
  8. use Magento\Sales\Model\Order\Shipment;
  9. use Magento\Store\Model\ScopeInterface;
  10. /**
  11. * Class LabelGeneratorTest
  12. *
  13. * Test class for \Magento\Shipping\Model\Shipping\LabelGenerator
  14. *
  15. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  16. */
  17. class LabelGeneratorTest extends \PHPUnit\Framework\TestCase
  18. {
  19. const CARRIER_CODE = 'fedex';
  20. const CARRIER_TITLE = 'Fedex carrier';
  21. /**
  22. * @var \Magento\Shipping\Model\CarrierFactory|\PHPUnit_Framework_MockObject_MockObject
  23. */
  24. private $carrierFactory;
  25. /**
  26. * @var \Magento\Shipping\Model\Shipping\LabelsFactory|\PHPUnit_Framework_MockObject_MockObject
  27. */
  28. private $labelsFactory;
  29. /**
  30. * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject
  31. */
  32. private $scopeConfig;
  33. /**
  34. * @var \Magento\Sales\Model\Order\Shipment\TrackFactory|\PHPUnit_Framework_MockObject_MockObject
  35. */
  36. private $trackFactory;
  37. /**
  38. * @var \Magento\Framework\Filesystem|\PHPUnit_Framework_MockObject_MockObject
  39. */
  40. private $filesystem;
  41. /**
  42. * @var \Magento\Shipping\Model\Shipping\LabelGenerator
  43. */
  44. private $labelGenerator;
  45. protected function setUp()
  46. {
  47. $this->carrierFactory = $this->getMockBuilder(\Magento\Shipping\Model\CarrierFactory::class)
  48. ->disableOriginalConstructor()
  49. ->getMock();
  50. $this->labelsFactory = $this->getMockBuilder(\Magento\Shipping\Model\Shipping\LabelsFactory::class)
  51. ->disableOriginalConstructor()
  52. ->setMethods(['create'])
  53. ->getMock();
  54. $this->scopeConfig = $this->createMock(\Magento\Framework\App\Config\ScopeConfigInterface::class);
  55. $this->trackFactory = $this->getMockBuilder(\Magento\Sales\Model\Order\Shipment\TrackFactory::class)
  56. ->disableOriginalConstructor()
  57. ->setMethods(['create'])
  58. ->getMock();
  59. $this->filesystem = $this->getMockBuilder(\Magento\Framework\Filesystem::class)
  60. ->disableOriginalConstructor()
  61. ->getMock();
  62. $this->labelGenerator = new \Magento\Shipping\Model\Shipping\LabelGenerator(
  63. $this->carrierFactory,
  64. $this->labelsFactory,
  65. $this->scopeConfig,
  66. $this->trackFactory,
  67. $this->filesystem
  68. );
  69. }
  70. /**
  71. * @covers \Magento\Shipping\Model\Shipping\LabelGenerator
  72. * @param array $info
  73. * @dataProvider labelInfoDataProvider
  74. */
  75. public function testAddTrackingNumbersToShipment(array $info)
  76. {
  77. $order = $this->getMockBuilder(\Magento\Sales\Model\Order::class)
  78. ->disableOriginalConstructor()
  79. ->getMock();
  80. $order->expects(static::once())
  81. ->method('getShippingMethod')
  82. ->with(true)
  83. ->willReturn($this->getShippingMethodMock());
  84. /**
  85. * @var $shipmentMock \Magento\Sales\Model\Order\Shipment|\PHPUnit_Framework_MockObject_MockObject
  86. */
  87. $shipmentMock = $this->getMockBuilder(\Magento\Sales\Model\Order\Shipment::class)
  88. ->disableOriginalConstructor()
  89. ->getMock();
  90. $shipmentMock->expects(static::once())->method('getOrder')->willReturn($order);
  91. $this->carrierFactory->expects(static::once())
  92. ->method('create')
  93. ->with(self::CARRIER_CODE)
  94. ->willReturn($this->getCarrierMock());
  95. $labelsMock = $this->getMockBuilder(\Magento\Shipping\Model\Shipping\Labels::class)
  96. ->disableOriginalConstructor()
  97. ->getMock();
  98. $labelsMock->expects(static::once())
  99. ->method('requestToShipment')
  100. ->with($shipmentMock)
  101. ->willReturn($this->getResponseMock($info));
  102. $this->labelsFactory->expects(static::once())
  103. ->method('create')
  104. ->willReturn($labelsMock);
  105. $this->filesystem->expects(static::once())
  106. ->method('getDirectoryWrite')
  107. ->willReturn($this->createMock(\Magento\Framework\Filesystem\Directory\WriteInterface::class));
  108. $this->scopeConfig->expects(static::once())
  109. ->method('getValue')
  110. ->with(
  111. 'carriers/' . self::CARRIER_CODE . '/title',
  112. ScopeInterface::SCOPE_STORE,
  113. null
  114. )->willReturn(self::CARRIER_TITLE);
  115. $this->labelsFactory->expects(static::once())
  116. ->method('create')
  117. ->willReturn($labelsMock);
  118. $trackMock = $this->getMockBuilder(\Magento\Sales\Model\Order\Shipment\Track::class)
  119. ->setMethods(['setNumber', 'setCarrierCode', 'setTitle'])
  120. ->disableOriginalConstructor()
  121. ->getMock();
  122. $i = 0;
  123. $trackingNumbers = is_array($info['tracking_number']) ? $info['tracking_number'] : [$info['tracking_number']];
  124. foreach ($trackingNumbers as $trackingNumber) {
  125. $trackMock->expects(static::at($i++))
  126. ->method('setNumber')
  127. ->with($trackingNumber)
  128. ->willReturnSelf();
  129. $trackMock->expects(static::at($i++))
  130. ->method('setCarrierCode')
  131. ->with(self::CARRIER_CODE)
  132. ->willReturnSelf();
  133. $trackMock->expects(static::at($i++))
  134. ->method('setTitle')
  135. ->with(self::CARRIER_TITLE)
  136. ->willReturnSelf();
  137. }
  138. $this->trackFactory->expects(static::any())
  139. ->method('create')
  140. ->willReturn($trackMock);
  141. /**
  142. * @var $requestMock \Magento\Framework\App\RequestInterface|\PHPUnit_Framework_MockObject_MockObject
  143. */
  144. $requestMock = $this->createMock(\Magento\Framework\App\RequestInterface::class);
  145. $this->labelGenerator->create($shipmentMock, $requestMock);
  146. }
  147. /**
  148. * @return \PHPUnit_Framework_MockObject_MockObject
  149. */
  150. private function getShippingMethodMock()
  151. {
  152. $shippingMethod = $this->getMockBuilder(\Magento\Framework\DataObject::class)
  153. ->disableOriginalConstructor()
  154. ->setMethods(['getCarrierCode'])
  155. ->getMock();
  156. $shippingMethod->expects(static::once())
  157. ->method('getCarrierCode')
  158. ->willReturn(self::CARRIER_CODE);
  159. return $shippingMethod;
  160. }
  161. /**
  162. * @return \PHPUnit_Framework_MockObject_MockObject
  163. */
  164. private function getCarrierMock()
  165. {
  166. $carrierMock = $this->getMockBuilder(\Magento\Shipping\Model\Carrier\AbstractCarrier::class)
  167. ->disableOriginalConstructor()
  168. ->setMethods(['isShippingLabelsAvailable', 'getCarrierCode'])
  169. ->getMockForAbstractClass();
  170. $carrierMock->expects(static::once())
  171. ->method('isShippingLabelsAvailable')
  172. ->willReturn(true);
  173. $carrierMock->expects(static::once())
  174. ->method('getCarrierCode')
  175. ->willReturn(self::CARRIER_CODE);
  176. return $carrierMock;
  177. }
  178. /**
  179. * @param array $info
  180. * @return \PHPUnit_Framework_MockObject_MockObject
  181. */
  182. private function getResponseMock(array $info)
  183. {
  184. $responseMock = $this->getMockBuilder(\Magento\Framework\DataObject::class)
  185. ->setMethods(['hasErrors', 'hasInfo', 'getInfo'])
  186. ->disableOriginalConstructor()
  187. ->getMock();
  188. $responseMock->expects(static::once())
  189. ->method('hasErrors')
  190. ->willReturn(false);
  191. $responseMock->expects(static::once())
  192. ->method('hasInfo')
  193. ->willReturn(true);
  194. $responseMock->expects(static::once())
  195. ->method('getInfo')
  196. ->willReturn([$info]);
  197. return $responseMock;
  198. }
  199. /**
  200. * @return array
  201. */
  202. public function labelInfoDataProvider()
  203. {
  204. return [
  205. [['tracking_number' => ['111111', '222222', '333333'], 'label_content' => 'some']],
  206. [['tracking_number' => '111111', 'label_content' => 'some']],
  207. ];
  208. }
  209. }