CarrierTest.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. <?php
  2. /**
  3. * Refer to LICENSE.txt distributed with the Temando Shipping module for notice of license
  4. */
  5. namespace Temando\Shipping\Model\Shipping;
  6. use Magento\Catalog\Model\Product;
  7. use Magento\Framework\Exception\CouldNotSaveException;
  8. use Magento\Quote\Model\Quote;
  9. use Magento\Quote\Model\Quote\Address\RateRequest;
  10. use Magento\Quote\Model\Quote\Address\RateResult\Error;
  11. use Magento\Quote\Model\Quote\Item;
  12. use Magento\TestFramework\Helper\Bootstrap;
  13. use Psr\Log\LogLevel;
  14. use Temando\Shipping\Model\Experience;
  15. use Temando\Shipping\Model\ResourceModel\Experience\ExperienceRepository;
  16. use Temando\Shipping\Model\Shipment\TrackEventInterface;
  17. use Temando\Shipping\Test\Integration\Provider\RateRequestProvider;
  18. use Temando\Shipping\Webservice\Logger;
  19. use Temando\Shipping\Webservice\Response\Type\OrderResponseType;
  20. use Temando\Shipping\Webservice\Response\Type\QualificationResponseType;
  21. /**
  22. * Temando Shipping Carrier Test
  23. *
  24. * @magentoAppIsolation enabled
  25. *
  26. * @package Temando\Shipping\Test\Integration
  27. * @author Christoph Aßmann <christoph.assmann@netresearch.de>
  28. * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  29. * @link http://www.temando.com/
  30. */
  31. class CarrierTest extends \PHPUnit\Framework\TestCase
  32. {
  33. /**
  34. * Delegate provisioning of test data to separate class
  35. * @return RateRequest[][]
  36. */
  37. public function getRateRequest()
  38. {
  39. return RateRequestProvider::getRateRequest();
  40. }
  41. /**
  42. * Delegate provisioning of test data to separate class
  43. * @return RateRequest|OrderResponseType[][]
  44. */
  45. public function getRateRequestWithShippingExperience()
  46. {
  47. return RateRequestProvider::getRateRequestWithShippingExperience();
  48. }
  49. /**
  50. * @test
  51. */
  52. public function carrierHasTrackingCapabilities()
  53. {
  54. /** @var Carrier $carrier */
  55. $carrier = Bootstrap::getObjectManager()->create(Carrier::class);
  56. $this->assertTrue($carrier->isTrackingAvailable());
  57. }
  58. /**
  59. * @test
  60. */
  61. public function carrierMethodsAreLoaded()
  62. {
  63. /** @var Experience $productionExperience */
  64. $productionExperience = Bootstrap::getObjectManager()->create(Experience::class, ['data' => [
  65. Experience::EXPERIENCE_ID => '123',
  66. Experience::NAME => 'PROD',
  67. Experience::STATUS => Experience::STATUS_PRODUCTION,
  68. ]]);
  69. /** @var Experience $draftExperience */
  70. $draftExperience = Bootstrap::getObjectManager()->create(Experience::class, ['data' => [
  71. Experience::EXPERIENCE_ID => '456',
  72. Experience::NAME => 'DRAFT',
  73. Experience::STATUS => Experience::STATUS_DRAFT,
  74. ]]);
  75. /** @var Experience $disabledExperience */
  76. $disabledExperience = Bootstrap::getObjectManager()->create(Experience::class, ['data' => [
  77. Experience::EXPERIENCE_ID => '789',
  78. Experience::NAME => 'DISABLED',
  79. Experience::STATUS => Experience::STATUS_DISABLED,
  80. ]]);
  81. $experiences = [
  82. $productionExperience->getExperienceId() => $productionExperience,
  83. $draftExperience->getExperienceId() => $draftExperience,
  84. $disabledExperience->getExperienceId() => $disabledExperience
  85. ];
  86. $experienceRepository = $this->getMockBuilder(ExperienceRepository::class)
  87. ->setMethods(['getExperiences'])
  88. ->disableOriginalConstructor()
  89. ->getMock();
  90. $experienceRepository
  91. ->expects($this->once())
  92. ->method('getExperiences')
  93. ->willReturn($experiences);
  94. /** @var Carrier $carrier */
  95. $carrier = Bootstrap::getObjectManager()->create(Carrier::class, [
  96. 'experienceRepository' => $experienceRepository,
  97. ]);
  98. $allowedMethods = $carrier->getAllowedMethods();
  99. $this->assertInternalType('array', $allowedMethods);
  100. $this->assertNotEmpty($allowedMethods);
  101. $this->assertCount(2, $allowedMethods);
  102. $this->assertArrayHasKey($productionExperience->getExperienceId(), $allowedMethods);
  103. $this->assertArrayHasKey($draftExperience->getExperienceId(), $allowedMethods);
  104. $this->assertArrayNotHasKey($disabledExperience->getExperienceId(), $allowedMethods);
  105. }
  106. /**
  107. * @test
  108. * @dataProvider getRateRequest
  109. * @magentoConfigFixture default_store general/store_information/name Foo Store
  110. *
  111. * @param RateRequest $rateRequest
  112. */
  113. public function collectRatesRepositoryError(RateRequest $rateRequest)
  114. {
  115. $loggerMock = $this->getMockBuilder(Logger::class)
  116. ->setMethods(['log'])
  117. ->disableOriginalConstructor()
  118. ->getMock();
  119. $loggerMock
  120. ->expects($this->once())
  121. ->method('log')
  122. ->with($this->equalTo(LogLevel::WARNING));
  123. $experienceRepository = $this->getMockBuilder(ExperienceRepository::class)
  124. ->setMethods(['getExperiencesForOrder'])
  125. ->disableOriginalConstructor()
  126. ->getMock();
  127. $experienceRepository
  128. ->expects($this->once())
  129. ->method('getExperiencesForOrder')
  130. ->willThrowException(new CouldNotSaveException(__('Foo')));
  131. /** @var Carrier $carrier */
  132. $carrier = Bootstrap::getObjectManager()->create(Carrier::class, [
  133. 'logger' => $loggerMock,
  134. 'experienceRepository' => $experienceRepository,
  135. ]);
  136. // replace quote by mock
  137. /** @var Item $item */
  138. foreach ($rateRequest->getAllItems() as $item) {
  139. $product = Bootstrap::getObjectManager()->create(Product::class);
  140. $quoteData = $item->getQuote()->getData();
  141. /** @var Quote|\PHPUnit_Framework_MockObject_MockObject $quote */
  142. $quote = $this->getMockBuilder(Quote::class)
  143. ->setMethods(['getShippingAddress', 'getBillingAddress'])
  144. ->disableOriginalConstructor()
  145. ->getMock();
  146. $quote
  147. ->expects($this->any())
  148. ->method('getShippingAddress')
  149. ->willReturn($quoteData['shipping_address']);
  150. $quote
  151. ->expects($this->any())
  152. ->method('getBillingAddress')
  153. ->willReturn($quoteData['billing_address']);
  154. $quote->setData($quoteData);
  155. $item->setQuote($quote);
  156. $item->setData('product', $product);
  157. }
  158. $ratesResult = $carrier->collectRates($rateRequest);
  159. $this->assertTrue($ratesResult->getError());
  160. $rates = $ratesResult;
  161. foreach ($rates as $rate) {
  162. $this->assertInstanceOf(Error::class, $rate);
  163. }
  164. }
  165. /**
  166. * @test
  167. * @dataProvider getRateRequestWithShippingExperience
  168. * @magentoConfigFixture default_store general/store_information/name Foo Store
  169. *
  170. * @param RateRequest $rateRequest
  171. * @param QualificationResponseType $qualificationResponseType
  172. */
  173. public function collectRatesSuccess(RateRequest $rateRequest, QualificationResponseType $qualificationResponseType)
  174. {
  175. $loggerMock = $this->getMockBuilder(Logger::class)
  176. ->setMethods(['log'])
  177. ->disableOriginalConstructor()
  178. ->getMock();
  179. $loggerMock
  180. ->expects($this->never())
  181. ->method('log')
  182. ->with($this->equalTo(LogLevel::WARNING));
  183. $experienceRepository = $this->getMockBuilder(ExperienceRepository::class)
  184. ->setMethods(['getExperiencesForOrder'])
  185. ->disableOriginalConstructor()
  186. ->getMock();
  187. $experienceRepository
  188. ->expects($this->once())
  189. ->method('getExperiencesForOrder')
  190. ->willReturn($qualificationResponseType);
  191. /** @var Carrier $carrier */
  192. $carrier = Bootstrap::getObjectManager()->create(Carrier::class, [
  193. 'logger' => $loggerMock,
  194. 'experienceRepository' => $experienceRepository,
  195. ]);
  196. // replace quote by mock
  197. /** @var Item $item */
  198. foreach ($rateRequest->getAllItems() as $item) {
  199. $product = Bootstrap::getObjectManager()->create(Product::class);
  200. $quoteData = $item->getQuote()->getData();
  201. /** @var Quote|\PHPUnit_Framework_MockObject_MockObject $quote */
  202. $quote = $this->getMockBuilder(Quote::class)
  203. ->setMethods(['getShippingAddress', 'getBillingAddress'])
  204. ->disableOriginalConstructor()
  205. ->getMock();
  206. $quote
  207. ->expects($this->any())
  208. ->method('getShippingAddress')
  209. ->willReturn($quoteData['shipping_address']);
  210. $quote
  211. ->expects($this->any())
  212. ->method('getBillingAddress')
  213. ->willReturn($quoteData['billing_address']);
  214. $quote->setData($quoteData);
  215. $item->setQuote($quote);
  216. $item->setData('product', $product);
  217. }
  218. $rates = $carrier->collectRates($rateRequest)->getAllRates();
  219. $this->assertNotEmpty($rates);
  220. foreach ($rates as $rate) {
  221. $this->assertEquals(Carrier::CODE, $rate->getData('carrier'));
  222. }
  223. }
  224. }