SendApiRequestTest.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <?php
  2. /**
  3. * @copyright Vertex. All rights reserved. https://www.vertexinc.com/
  4. * @author Mediotype https://www.mediotype.com/
  5. */
  6. namespace Vertex\Tax\Test\Unit\Model\Vertex;
  7. use Magento\Framework\Stdlib\DateTime\DateTime;
  8. use Magento\Framework\Stdlib\DateTime\DateTimeFactory;
  9. use Magento\Store\Model\Store;
  10. use Magento\Store\Model\StoreManagerInterface;
  11. use PHPUnit_Framework_MockObject_MockObject as MockObject;
  12. use Vertex\Tax\Api\Data\LogEntryInterface;
  13. use Vertex\Tax\Api\Data\LogEntryInterfaceFactory;
  14. use Vertex\Tax\Model\ApiClient;
  15. use Vertex\Tax\Model\ApiClient\ObjectConverter;
  16. use Vertex\Tax\Model\Config;
  17. use Vertex\Tax\Model\DomDocumentFactory;
  18. use Vertex\Tax\Model\ExceptionLogger;
  19. use Vertex\Tax\Model\RequestLogger;
  20. use Vertex\Tax\Test\Unit\TestCase;
  21. use Vertex\Utility\SoapClientFactory;
  22. /**
  23. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  24. */
  25. class SendApiRequestTest extends TestCase
  26. {
  27. const OBJECT_ID = '3.14';
  28. const STORE_ID = '4.18';
  29. const REQUEST_XML = '<request />';
  30. const RESPONSE_XML = '<response />';
  31. const TYPE = 'some_type';
  32. const TYPE_LOOKUP = 'tax_area_lookup';
  33. const ORDER = null;
  34. const DATE = '1991-08-06 12:00:00';
  35. const VALIDATION_FUNCTION = 'LookupTaxAreas60';
  36. const CALCULATION_FUNCTION = 'CalculateTax60';
  37. const VERTEX_HOST = 'vertex_host';
  38. const VERTEX_ADDRESS_HOST = 'vertex_address_host';
  39. /** @var DateTimeFactory|MockObject */
  40. private $dateTimeFactory;
  41. /** @var array */
  42. private $defaultRequest = [];
  43. /** @var Config|MockObject */
  44. private $mockConfig;
  45. /** @var StoreManagerInterface|MockObject */
  46. private $storeManagerMock;
  47. protected function setUp()
  48. {
  49. parent::setUp();
  50. $this->mockConfig = $this->createPartialMock(
  51. Config::class,
  52. ['getValidationFunction', 'getCalculationFunction', 'getVertexHost', 'getVertexAddressHost']
  53. );
  54. $this->mockConfig->method('getValidationFunction')
  55. ->willReturn(static::VALIDATION_FUNCTION);
  56. $this->mockConfig->method('getCalculationFunction')
  57. ->willReturn(static::CALCULATION_FUNCTION);
  58. $this->mockConfig->method('getVertexHost')
  59. ->willReturn(static::VERTEX_HOST);
  60. $this->mockConfig->method('getVertexAddressHost')
  61. ->willReturn(static::VERTEX_ADDRESS_HOST);
  62. $dateTimeMock = $this->createPartialMock(DateTime::class, ['date']);
  63. $dateTimeMock->expects($this->any())
  64. ->method('date')
  65. ->willReturn(static::DATE);
  66. $this->dateTimeFactory = $this->createMock(DateTimeFactory::class);
  67. $this->dateTimeFactory->expects($this->any())
  68. ->method('create')
  69. ->willReturn($dateTimeMock);
  70. $storeMock = $this->createMock(Store::class);
  71. $storeMock->method('getId')
  72. ->willReturn(static::STORE_ID);
  73. $this->storeManagerMock = $this->createMock(StoreManagerInterface::class);
  74. $this->storeManagerMock->method('getStore')
  75. ->willReturn($storeMock);
  76. }
  77. public function testErrorLoggingIsLogged()
  78. {
  79. $requestException = new \SoapFault('test', 'Exception during Request');
  80. $loggingException = new \Exception('Exception during Logging');
  81. $mockSoapClient = $this->createPartialMock(
  82. \SoapClient::class,
  83. [static::VALIDATION_FUNCTION, static::CALCULATION_FUNCTION, '__getLastRequest', '__getLastResponse']
  84. );
  85. $mockSoapClient->method('__getLastRequest')
  86. ->willReturn(static::REQUEST_XML);
  87. $mockSoapClient->method('__getLastResponse')
  88. ->willReturn(static::RESPONSE_XML);
  89. $mockSoapClient->expects($this->once())
  90. ->method(static::VALIDATION_FUNCTION)
  91. ->willReturn($requestException);
  92. $mockSoapClientFactory = $this->createPartialMock(SoapClientFactory::class, ['create']);
  93. $mockSoapClientFactory->method('create')
  94. ->willReturn($mockSoapClient);
  95. $requestLoggerMock = $this->createPartialMock(RequestLogger::class, ['log']);
  96. $requestLoggerMock->method('log')
  97. ->willThrowException($loggingException);
  98. // Test logged through Magento
  99. $loggerMock = $this->createMock(ExceptionLogger::class);
  100. $loggerMock->expects($this->exactly(2))
  101. ->method('critical');
  102. $vertex = $this->getObject(
  103. ApiClient::class,
  104. [
  105. 'config' => $this->mockConfig,
  106. 'soapClientFactory' => $mockSoapClientFactory,
  107. 'dateTimeFactory' => $this->dateTimeFactory,
  108. 'requestLogger' => $requestLoggerMock,
  109. 'storeManager' => $this->storeManagerMock,
  110. 'logger' => $loggerMock,
  111. ]
  112. );
  113. $vertex->sendApiRequest($this->defaultRequest, static::TYPE_LOOKUP, static::ORDER);
  114. }
  115. public function testNonSoapExceptionDuringRequestLogs()
  116. {
  117. $mockSoapClient = $this->createMock(\SoapClient::class);
  118. $mockSoapClientFactory = $this->createPartialMock(SoapClientFactory::class, ['create']);
  119. $mockSoapClientFactory->method('create')
  120. ->willReturn($mockSoapClient);
  121. // Test logged through Magento
  122. $loggerMock = $this->createMock(ExceptionLogger::class);
  123. $loggerMock->expects($this->once())
  124. ->method('critical');
  125. // Ensure no attempt is made to log to database
  126. $logFactory = $this->createMock(LogEntryInterfaceFactory::class);
  127. $logFactory->expects($this->never())
  128. ->method('create');
  129. /** @var ApiClient $vertex */
  130. $vertex = $this->getObject(
  131. ApiClient::class,
  132. [
  133. 'logger' => $loggerMock,
  134. 'soapClientFactory' => $mockSoapClientFactory,
  135. 'storeManager' => $this->storeManagerMock,
  136. 'logEntryFactory' => $logFactory,
  137. ]
  138. );
  139. $vertex->sendApiRequest($this->defaultRequest, 'invalid_type', static::ORDER);
  140. }
  141. public function testTaxAreaLookupCallsValidationAndLogs()
  142. {
  143. $mockSoapClient = $this->createPartialMock(
  144. \SoapClient::class,
  145. [static::VALIDATION_FUNCTION, static::CALCULATION_FUNCTION, '__getLastRequest', '__getLastResponse']
  146. );
  147. $mockSoapClient->method('__getLastRequest')
  148. ->willReturn(static::REQUEST_XML);
  149. $mockSoapClient->method('__getLastResponse')
  150. ->willReturn(static::RESPONSE_XML);
  151. $mockSoapClient->expects($this->once())
  152. ->method(static::VALIDATION_FUNCTION)
  153. ->willReturn(['key0' => 'something', 'key1' => 'result']);
  154. $mockSoapClientFactory = $this->createPartialMock(SoapClientFactory::class, ['create']);
  155. $mockSoapClientFactory->method('create')
  156. ->willReturn($mockSoapClient);
  157. $logEntryMock = $this->createMock(LogEntryInterface::class);
  158. $logEntryFactoryMock = $this->createPartialMock(LogEntryInterfaceFactory::class, ['create']);
  159. $logEntryFactoryMock->method('create')
  160. ->willReturn($logEntryMock);
  161. // Test logged type is type passed to method
  162. $logEntryMock->expects($this->once())
  163. ->method('setType')
  164. ->with(static::TYPE_LOOKUP);
  165. $requestLogger = $this->getObject(
  166. RequestLogger::class,
  167. [
  168. 'logEntryFactory' => $logEntryFactoryMock,
  169. 'dateTime' => $this->dateTimeFactory->create(),
  170. 'documentFactory' => $this->getObject(DomDocumentFactory::class),
  171. ]
  172. );
  173. $vertex = $this->getObject(
  174. ApiClient::class,
  175. [
  176. 'config' => $this->mockConfig,
  177. 'soapClientFactory' => $mockSoapClientFactory,
  178. 'storeManager' => $this->storeManagerMock,
  179. 'requestLogger' => $requestLogger,
  180. 'objectConverter' => $this->getObject(ObjectConverter::class),
  181. ]
  182. );
  183. $vertex->sendApiRequest($this->defaultRequest, static::TYPE_LOOKUP, static::ORDER);
  184. }
  185. }