RestTest.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Webapi\Test\Unit\Controller;
  7. use Magento\Authorization\Model\UserContextInterface;
  8. use Magento\Framework\Exception\AuthorizationException;
  9. /**
  10. * Test Rest controller.
  11. *
  12. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  13. * @SuppressWarnings(PHPMD.TooManyFields)
  14. */
  15. class RestTest extends \PHPUnit\Framework\TestCase
  16. {
  17. /**
  18. * @var \Magento\Webapi\Controller\Rest
  19. */
  20. protected $_restController;
  21. /**
  22. * @var \Magento\Framework\Webapi\Rest\Request|\PHPUnit_Framework_MockObject_MockObject
  23. */
  24. protected $_requestMock;
  25. /**
  26. * @var \Magento\Framework\Webapi\Rest\Response|\PHPUnit_Framework_MockObject_MockObject
  27. */
  28. protected $_responseMock;
  29. /**
  30. * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Webapi\Controller\Rest\Router\Route
  31. */
  32. protected $_routeMock;
  33. /**
  34. * @var \stdClass|\PHPUnit_Framework_MockObject_MockObject
  35. */
  36. protected $_serviceMock;
  37. /**
  38. * @var \Magento\Framework\Oauth\OauthInterface|\PHPUnit_Framework_MockObject_MockObject
  39. */
  40. protected $_oauthServiceMock;
  41. /**
  42. * @var \Magento\Framework\Webapi\Authorization|\PHPUnit_Framework_MockObject_MockObject
  43. */
  44. protected $_authorizationMock;
  45. /**
  46. * @var \Magento\Framework\Webapi\ServiceInputProcessor|\PHPUnit_Framework_MockObject_MockObject
  47. */
  48. protected $serviceInputProcessorMock;
  49. /**
  50. * @var \Magento\Webapi\Model\Rest\Swagger\Generator | \PHPUnit_Framework_MockObject_MockObject
  51. */
  52. protected $swaggerGeneratorMock;
  53. /**
  54. * @var \Magento\Store\Model\StoreManagerInterface | \PHPUnit_Framework_MockObject_MockObject
  55. */
  56. private $storeManagerMock;
  57. /**
  58. * @var \Magento\Store\Api\Data\StoreInterface | \PHPUnit_Framework_MockObject_MockObject
  59. */
  60. private $storeMock;
  61. /**
  62. * @var \Magento\Webapi\Controller\Rest\SchemaRequestProcessor | \PHPUnit_Framework_MockObject_MockObject
  63. */
  64. protected $schemaRequestProcessor;
  65. /**
  66. * @var \Magento\Webapi\Controller\Rest\SynchronousRequestProcessor | \PHPUnit_Framework_MockObject_MockObject
  67. */
  68. protected $synchronousRequestProcessor;
  69. /**
  70. * @var \Magento\Webapi\Controller\Rest\RequestProcessorPool | \PHPUnit_Framework_MockObject_MockObject
  71. */
  72. protected $requestProcessorPool;
  73. const SERVICE_METHOD = 'testMethod';
  74. const SERVICE_ID = \Magento\Webapi\Controller\Rest::class;
  75. protected function setUp()
  76. {
  77. $objectManagerMock = $this->createMock(\Magento\Framework\ObjectManagerInterface::class);
  78. $this->_requestMock = $this->getRequestMock();
  79. $this->_requestMock->expects($this->any())->method('getHttpHost')->willReturn('testHostName.com');
  80. $this->_responseMock = $this->getResponseMock();
  81. $routerMock = $this->getMockBuilder(\Magento\Webapi\Controller\Rest\Router::class)->setMethods(['match'])
  82. ->disableOriginalConstructor()->getMock();
  83. $this->_routeMock = $this->getRouteMock();
  84. $this->_serviceMock = $this->getMockBuilder(self::SERVICE_ID)->setMethods([self::SERVICE_METHOD])
  85. ->disableOriginalConstructor()->getMock();
  86. $this->_oauthServiceMock = $this->getMockBuilder(\Magento\Framework\Oauth\OauthInterface::class)
  87. ->setMethods(['validateAccessTokenRequest'])->getMockForAbstractClass();
  88. $this->_authorizationMock = $this->getMockBuilder(\Magento\Framework\Webapi\Authorization::class)
  89. ->disableOriginalConstructor()->getMock();
  90. $paramsOverriderMock = $this->getMockBuilder(\Magento\Webapi\Controller\Rest\ParamsOverrider::class)
  91. ->setMethods(['overrideParams'])
  92. ->disableOriginalConstructor()->getMock();
  93. $dataObjectProcessorMock = $this->getMockBuilder(\Magento\Framework\Reflection\DataObjectProcessor::class)
  94. ->disableOriginalConstructor()
  95. ->setMethods(['getMethodReturnType'])
  96. ->getMockForAbstractClass();
  97. $layoutMock = $this->getMockBuilder(\Magento\Framework\View\LayoutInterface::class)
  98. ->disableOriginalConstructor()->getMock();
  99. $errorProcessorMock = $this->createMock(\Magento\Framework\Webapi\ErrorProcessor::class);
  100. $errorProcessorMock->expects($this->any())->method('maskException')->will($this->returnArgument(0));
  101. $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  102. $this->serviceInputProcessorMock = $this->getMockBuilder(\Magento\Framework\Webapi\ServiceInputProcessor::class)
  103. ->disableOriginalConstructor()->setMethods(['process'])->getMock();
  104. $areaListMock = $this->createMock(\Magento\Framework\App\AreaList::class);
  105. $areaMock = $this->createMock(\Magento\Framework\App\AreaInterface::class);
  106. $areaListMock->expects($this->any())->method('getArea')->will($this->returnValue($areaMock));
  107. $this->storeMock = $this->createMock(\Magento\Store\Api\Data\StoreInterface::class);
  108. $this->storeManagerMock = $this->createMock(\Magento\Store\Model\StoreManagerInterface::class);
  109. $this->storeManagerMock->expects($this->any())->method('getStore')->willReturn($this->storeMock);
  110. $this->requestProcessorPool = $this->getRequestProccessotPoolMock();
  111. $this->_restController =
  112. $objectManager->getObject(
  113. \Magento\Webapi\Controller\Rest::class,
  114. [
  115. 'request' => $this->_requestMock,
  116. 'response' => $this->_responseMock,
  117. 'router' => $routerMock,
  118. 'objectManager' => $objectManagerMock,
  119. 'layout' => $layoutMock,
  120. 'oauthService' => $this->_oauthServiceMock,
  121. 'authorization' => $this->_authorizationMock,
  122. 'serviceInputProcessor' => $this->serviceInputProcessorMock,
  123. 'errorProcessor' => $errorProcessorMock,
  124. 'areaList' => $areaListMock,
  125. 'paramsOverrider' => $paramsOverriderMock,
  126. 'dataObjectProcessor' => $dataObjectProcessorMock,
  127. 'storeManager' => $this->storeManagerMock,
  128. 'requestProcessorPool' => $this->requestProcessorPool,
  129. ]
  130. );
  131. $this->_routeMock->expects($this->any())->method('getServiceClass')->will($this->returnValue(self::SERVICE_ID));
  132. $this->_routeMock->expects($this->any())->method('getServiceMethod')
  133. ->will($this->returnValue(self::SERVICE_METHOD));
  134. $routerMock->expects($this->any())->method('match')->will($this->returnValue($this->_routeMock));
  135. $objectManagerMock->expects($this->any())->method('get')->will($this->returnValue($this->_serviceMock));
  136. $this->_responseMock->expects($this->any())->method('prepareResponse')->will($this->returnValue([]));
  137. $this->_serviceMock->expects($this->any())->method(self::SERVICE_METHOD)->will($this->returnValue(null));
  138. $dataObjectProcessorMock->expects($this->any())->method('getMethodReturnType')
  139. ->with(self::SERVICE_ID, self::SERVICE_METHOD)
  140. ->will($this->returnValue('null'));
  141. $paramsOverriderMock->expects($this->any())->method('overrideParams')->will($this->returnValue([]));
  142. parent::setUp();
  143. }
  144. public function testDispatchSchemaRequest()
  145. {
  146. $params = [
  147. \Magento\Framework\Webapi\Request::REQUEST_PARAM_SERVICES => 'foo',
  148. ];
  149. $this->_requestMock->expects($this->any())
  150. ->method('getPathInfo')
  151. ->willReturn(\Magento\Webapi\Controller\Rest\SchemaRequestProcessor::PROCESSOR_PATH);
  152. $this->_requestMock->expects($this->any())
  153. ->method('getParams')
  154. ->will($this->returnValue($params));
  155. $schema = 'Some REST schema content';
  156. $this->swaggerGeneratorMock->expects($this->any())->method('generate')->willReturn($schema);
  157. $this->requestProcessorPool->getProcessor($this->_requestMock)->process($this->_requestMock);
  158. $this->assertEquals($schema, $this->_responseMock->getBody());
  159. }
  160. public function testDispatchAllSchemaRequest()
  161. {
  162. $params = [
  163. \Magento\Framework\Webapi\Request::REQUEST_PARAM_SERVICES => 'all',
  164. ];
  165. $this->_requestMock->expects($this->any())
  166. ->method('getPathInfo')
  167. ->willReturn(\Magento\Webapi\Controller\Rest\SchemaRequestProcessor::PROCESSOR_PATH);
  168. $this->_requestMock->expects($this->any())
  169. ->method('getParam')
  170. ->will(
  171. $this->returnValueMap([
  172. [
  173. \Magento\Framework\Webapi\Request::REQUEST_PARAM_SERVICES,
  174. null,
  175. 'all',
  176. ],
  177. ])
  178. );
  179. $this->_requestMock->expects($this->any())
  180. ->method('getParams')
  181. ->will($this->returnValue($params));
  182. $this->_requestMock->expects($this->any())
  183. ->method('getRequestedServices')
  184. ->will($this->returnValue('all'));
  185. $schema = 'Some REST schema content';
  186. $this->swaggerGeneratorMock->expects($this->any())->method('generate')->willReturn($schema);
  187. $this->requestProcessorPool->getProcessor($this->_requestMock)->process($this->_requestMock);
  188. $this->assertEquals($schema, $this->_responseMock->getBody());
  189. }
  190. /**
  191. * @return object|\Magento\Webapi\Controller\Rest\RequestProcessorPool
  192. */
  193. private function getRequestProccessotPoolMock()
  194. {
  195. $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  196. $this->swaggerGeneratorMock = $this->getMockBuilder(\Magento\Webapi\Model\Rest\Swagger\Generator::class)
  197. ->disableOriginalConstructor()
  198. ->setMethods(['generate', 'getListOfServices'])
  199. ->getMockForAbstractClass();
  200. $this->schemaRequestProcessor = $objectManager->getObject(
  201. \Magento\Webapi\Controller\Rest\SchemaRequestProcessor::class,
  202. [
  203. 'swaggerGenerator' => $this->swaggerGeneratorMock,
  204. 'response' => $this->_responseMock,
  205. ]
  206. );
  207. $this->synchronousRequestProcessor =
  208. $this->getMockBuilder(\Magento\Webapi\Controller\Rest\SynchronousRequestProcessor::class)
  209. ->setMethods(['process'])
  210. ->disableOriginalConstructor()
  211. ->getMock();
  212. return $objectManager->getObject(
  213. \Magento\Webapi\Controller\Rest\RequestProcessorPool::class,
  214. [
  215. 'requestProcessors' => [
  216. 'syncSchema' => $this->schemaRequestProcessor,
  217. 'sync' => $this->synchronousRequestProcessor,
  218. ],
  219. ]
  220. );
  221. }
  222. /**
  223. * @return \Magento\Webapi\Controller\Rest\Router\Route | \PHPUnit_Framework_MockObject_MockObject
  224. */
  225. private function getRouteMock()
  226. {
  227. return $this->getMockBuilder(\Magento\Webapi\Controller\Rest\Router\Route::class)
  228. ->setMethods([
  229. 'isSecure',
  230. 'getServiceMethod',
  231. 'getServiceClass',
  232. 'getAclResources',
  233. 'getParameters',
  234. ])
  235. ->disableOriginalConstructor()->getMock();
  236. }
  237. /**
  238. * @return \Magento\Framework\Webapi\Rest\Request|\PHPUnit_Framework_MockObject_MockObject
  239. */
  240. private function getRequestMock()
  241. {
  242. return $this->getMockBuilder(\Magento\Framework\Webapi\Rest\Request::class)
  243. ->setMethods(
  244. [
  245. 'isSecure',
  246. 'getRequestData',
  247. 'getParams',
  248. 'getParam',
  249. 'getRequestedServices',
  250. 'getPathInfo',
  251. 'getHttpHost',
  252. 'getMethod',
  253. ]
  254. )->disableOriginalConstructor()->getMock();
  255. }
  256. /**
  257. * @return \Magento\Framework\Webapi\Rest\Response|\PHPUnit_Framework_MockObject_MockObject
  258. */
  259. private function getResponseMock()
  260. {
  261. return $this->getMockBuilder(\Magento\Framework\Webapi\Rest\Response::class)
  262. ->setMethods(['sendResponse', 'prepareResponse', 'setHeader'])
  263. ->disableOriginalConstructor()
  264. ->getMock();
  265. }
  266. }