HttpContentProviderTest.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\ReleaseNotification\Test\Unit\Model\ContentProvider\Http;
  7. use Magento\ReleaseNotification\Model\ContentProvider\Http\HttpContentProvider;
  8. use Magento\ReleaseNotification\Model\ContentProvider\Http\UrlBuilder;
  9. use Magento\Framework\HTTP\ClientInterface;
  10. use Psr\Log\LoggerInterface;
  11. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
  12. /**
  13. * A unit test for testing of the representation of a HttpContentProvider request.
  14. */
  15. class HttpContentProviderTest extends \PHPUnit\Framework\TestCase
  16. {
  17. /**
  18. * @var HttpContentProvider
  19. */
  20. private $httpContentProvider;
  21. /**
  22. * @var LoggerInterface|\PHPUnit_Framework_MockObject_MockObject
  23. */
  24. private $loggerMock;
  25. /**
  26. * @var UrlBuilder|\PHPUnit_Framework_MockObject_MockObject
  27. */
  28. private $urlBuilderMock;
  29. /**
  30. * @var ClientInterface|\PHPUnit_Framework_MockObject_MockObject
  31. */
  32. private $httpClientMock;
  33. public function setUp()
  34. {
  35. $this->loggerMock = $this->getMockBuilder(LoggerInterface::class)
  36. ->getMockForAbstractClass();
  37. $this->urlBuilderMock = $this->getMockBuilder(UrlBuilder::class)
  38. ->disableOriginalConstructor()
  39. ->setMethods(['getUrl'])
  40. ->getMock();
  41. $this->httpClientMock = $this->getMockBuilder(ClientInterface::class)
  42. ->getMockForAbstractClass();
  43. $objectManager = new ObjectManager($this);
  44. $this->httpContentProvider = $objectManager->getObject(
  45. HttpContentProvider::class,
  46. [
  47. 'httpClient' => $this->httpClientMock,
  48. 'urlBuilder' => $this->urlBuilderMock,
  49. 'logger' => $this->loggerMock
  50. ]
  51. );
  52. }
  53. public function testGetContentSuccess()
  54. {
  55. $version = '2.3.0';
  56. $edition = 'Community';
  57. $locale = 'fr_FR';
  58. $url = 'https://content.url.example/'. $version . '/' . $edition . '/' . $locale . '.json';
  59. $response = '{"return":"success"}';
  60. $this->urlBuilderMock->expects($this->any())
  61. ->method('getUrl')
  62. ->willReturn($url);
  63. $this->httpClientMock->expects($this->once())
  64. ->method('get')
  65. ->with($url);
  66. $this->httpClientMock->expects($this->once())
  67. ->method('getBody')
  68. ->willReturn($response);
  69. $this->httpClientMock->expects($this->once())
  70. ->method('getStatus')
  71. ->willReturn(200);
  72. $this->loggerMock->expects($this->never())
  73. ->method('warning');
  74. $this->assertEquals($response, $this->httpContentProvider->getContent($version, $edition, $locale));
  75. }
  76. public function testGetContentFailure()
  77. {
  78. $version = '2.3.5';
  79. $edition = 'Community';
  80. $locale = 'fr_FR';
  81. $url = 'https://content.url.example/'. $version . '/' . $edition . '/' . $locale . '.json';
  82. $this->urlBuilderMock->expects($this->any())
  83. ->method('getUrl')
  84. ->with($version, $edition, $locale)
  85. ->willReturn($url);
  86. $this->httpClientMock->expects($this->once())
  87. ->method('get')
  88. ->with($url)
  89. ->will($this->throwException(new \Exception));
  90. $this->httpClientMock->expects($this->never())->method('getBody');
  91. $this->loggerMock->expects($this->once())
  92. ->method('warning');
  93. $this->assertFalse($this->httpContentProvider->getContent($version, $edition, $locale));
  94. }
  95. public function testGetContentSuccessOnLocaleDefault()
  96. {
  97. $version = '2.3.1';
  98. $edition = 'Community';
  99. $locale = 'fr_FR';
  100. $urlLocale = 'https://content.url.example/'. $version . '/' . $edition . '/' . $locale . '.json';
  101. $urlDefaultLocale = 'https://content.url.example/'. $version . '/' . $edition . '/en_US.json';
  102. $response = '{"return":"default-locale"}';
  103. $this->urlBuilderMock->expects($this->exactly(2))
  104. ->method('getUrl')
  105. ->withConsecutive(
  106. [$version, $edition, $locale],
  107. [$version, $edition, 'en_US']
  108. )
  109. ->willReturnOnConsecutiveCalls($urlLocale, $urlDefaultLocale);
  110. $this->httpClientMock->expects($this->exactly(2))
  111. ->method('get')
  112. ->withConsecutive([$urlLocale], [$urlDefaultLocale]);
  113. $this->httpClientMock->expects($this->exactly(2))
  114. ->method('getBody')
  115. ->willReturnOnConsecutiveCalls('', $response);
  116. $this->httpClientMock->expects($this->exactly(2))
  117. ->method('getStatus')
  118. ->willReturnOnConsecutiveCalls(404, 200);
  119. $this->loggerMock->expects($this->never())
  120. ->method('warning');
  121. $this->assertEquals($response, $this->httpContentProvider->getContent($version, $edition, $locale));
  122. }
  123. /**
  124. * @param string $version
  125. * @param string $edition
  126. * @param string $locale
  127. * @param string $response
  128. * @dataProvider getGetContentOnDefaultOrEmptyProvider
  129. */
  130. public function testGetContentSuccessOnDefaultOrEmpty($version, $edition, $locale, $response)
  131. {
  132. $urlLocale = 'https://content.url.example/'. $version . '/' . $edition . '/' . $locale . '.json';
  133. $urlDefaultLocale = 'https://content.url.example/'. $version . '/' . $edition . '/en_US.json';
  134. $urlDefault = 'https://content.url.example/' . $version . '/default.json';
  135. $this->urlBuilderMock->expects($this->exactly(3))
  136. ->method('getUrl')
  137. ->withConsecutive(
  138. [$version, $edition, $locale],
  139. [$version, $edition, 'en_US'],
  140. [$version, '', 'default']
  141. )
  142. ->willReturnOnConsecutiveCalls($urlLocale, $urlDefaultLocale, $urlDefault);
  143. $this->httpClientMock->expects($this->exactly(3))
  144. ->method('get')
  145. ->withConsecutive([$urlLocale], [$urlDefaultLocale], [$urlDefault]);
  146. $this->httpClientMock->expects($this->exactly(3))
  147. ->method('getBody')
  148. ->willReturnOnConsecutiveCalls('', '', $response);
  149. $this->httpClientMock->expects($this->exactly(3))
  150. ->method('getStatus')
  151. ->willReturnOnConsecutiveCalls(404, 404, 200);
  152. $this->loggerMock->expects($this->never())
  153. ->method('warning');
  154. $this->assertEquals($response, $this->httpContentProvider->getContent($version, $edition, $locale));
  155. }
  156. /**
  157. * @return array
  158. */
  159. public function getGetContentOnDefaultOrEmptyProvider()
  160. {
  161. return [
  162. 'default-fr_FR' => [
  163. '2.3.0',
  164. 'Community',
  165. 'fr_FR',
  166. '{"return":"default-fr_FR"}'
  167. ],
  168. 'default-en_US' => [
  169. '2.3.0',
  170. 'Community',
  171. 'en_US',
  172. '{"return":"default-en_US"}'
  173. ],
  174. 'empty-fr_FR' => [
  175. '2.3.0',
  176. 'Community',
  177. 'fr_FR',
  178. '{"return":"empty-fr_FR"}'
  179. ],
  180. 'empty-en_US' => [
  181. '2.3.0',
  182. 'Community',
  183. 'en_US',
  184. '{"return":"empty-en_US"}'
  185. ]
  186. ];
  187. }
  188. }