IntegrationTest.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. <?php
  2. /**
  3. * \Magento\Integration\Controller\Adminhtml
  4. *
  5. * Copyright © Magento, Inc. All rights reserved.
  6. * See COPYING.txt for license details.
  7. */
  8. namespace Magento\Integration\Test\Unit\Controller\Adminhtml;
  9. use Magento\Integration\Block\Adminhtml\Integration\Edit\Tab\Info;
  10. use Magento\Integration\Model\Integration as IntegrationModel;
  11. use Magento\Security\Model\SecurityCookie;
  12. /**
  13. * @SuppressWarnings(PHPMD.TooManyFields)
  14. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  15. */
  16. abstract class IntegrationTest extends \PHPUnit\Framework\TestCase
  17. {
  18. /** @var \Magento\Integration\Controller\Adminhtml\Integration */
  19. protected $_controller;
  20. /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager $objectManagerHelper */
  21. protected $_objectManagerHelper;
  22. /** @var \Magento\Framework\ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject */
  23. protected $_objectManagerMock;
  24. /** @var \Magento\Backend\Model\View\Layout\Filter\Acl|\PHPUnit_Framework_MockObject_MockObject */
  25. protected $_layoutFilterMock;
  26. /** @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject */
  27. protected $_configMock;
  28. /** @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject */
  29. protected $_eventManagerMock;
  30. /** @var \Magento\Framework\Translate|\PHPUnit_Framework_MockObject_MockObject */
  31. protected $_translateModelMock;
  32. /** @var \Magento\Backend\Model\Session|\PHPUnit_Framework_MockObject_MockObject */
  33. protected $_backendSessionMock;
  34. /** @var \Magento\Backend\App\Action\Context|\PHPUnit_Framework_MockObject_MockObject */
  35. protected $_backendActionCtxMock;
  36. /** @var SecurityCookie|\PHPUnit_Framework_MockObject_MockObject */
  37. protected $securityCookieMock;
  38. /** @var \Magento\Integration\Api\IntegrationServiceInterface|\PHPUnit_Framework_MockObject_MockObject */
  39. protected $_integrationSvcMock;
  40. /** @var \Magento\Integration\Api\OauthServiceInterface|\PHPUnit_Framework_MockObject_MockObject */
  41. protected $_oauthSvcMock;
  42. /** @var \Magento\Backend\Model\Auth|\PHPUnit_Framework_MockObject_MockObject */
  43. protected $_authMock;
  44. /** @var \Magento\User\Model\User|\PHPUnit_Framework_MockObject_MockObject */
  45. protected $_userMock;
  46. /** @var \Magento\Framework\Registry|\PHPUnit_Framework_MockObject_MockObject */
  47. protected $_registryMock;
  48. /** @var \Magento\Framework\App\Request\Http|\PHPUnit_Framework_MockObject_MockObject */
  49. protected $_requestMock;
  50. /** @var \Magento\Framework\App\Response\Http|\PHPUnit_Framework_MockObject_MockObject */
  51. protected $_responseMock;
  52. /** @var \PHPUnit_Framework_MockObject_MockObject */
  53. protected $_messageManager;
  54. /** @var \Magento\Framework\Config\ScopeInterface|\PHPUnit_Framework_MockObject_MockObject */
  55. protected $_configScopeMock;
  56. /** @var \Magento\Integration\Helper\Data|\PHPUnit_Framework_MockObject_MockObject */
  57. protected $_integrationHelperMock;
  58. /** @var \Magento\Framework\App\ViewInterface|\PHPUnit_Framework_MockObject_MockObject */
  59. protected $_viewMock;
  60. /** @var \Magento\Framework\View\Model\Layout\Merge|\PHPUnit_Framework_MockObject_MockObject */
  61. protected $_layoutMergeMock;
  62. /** @var \Magento\Framework\View\LayoutInterface|\PHPUnit_Framework_MockObject_MockObject */
  63. protected $_layoutMock;
  64. /**
  65. * @var \Magento\Framework\View\Result\Page|\PHPUnit_Framework_MockObject_MockObject
  66. */
  67. protected $resultPageMock;
  68. /**
  69. * @var \Magento\Framework\View\Page\Config|\PHPUnit_Framework_MockObject_MockObject
  70. */
  71. protected $viewConfigMock;
  72. /**
  73. * @var \Magento\Framework\View\Page\Title|\PHPUnit_Framework_MockObject_MockObject
  74. */
  75. protected $pageTitleMock;
  76. /**
  77. * @var \Magento\Framework\Escaper|\PHPUnit_Framework_MockObject_MockObject
  78. */
  79. protected $_escaper;
  80. /**
  81. * @var \Magento\Backend\Model\View\Result\RedirectFactory|\PHPUnit_Framework_MockObject_MockObject
  82. */
  83. protected $resultRedirectFactory;
  84. /**
  85. * @var \Magento\Framework\Controller\ResultFactory|\PHPUnit_Framework_MockObject_MockObject
  86. */
  87. protected $resultFactory;
  88. /** Sample integration ID */
  89. const INTEGRATION_ID = 1;
  90. /**
  91. * Setup object manager and initialize mocks
  92. */
  93. protected function setUp()
  94. {
  95. /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager $objectManagerHelper */
  96. $this->_objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  97. $this->_objectManagerMock = $this->createMock(\Magento\Framework\ObjectManagerInterface::class);
  98. // Initialize mocks which are used in several test cases
  99. $this->_configMock = $this->getMockBuilder(
  100. \Magento\Framework\App\Config\ScopeConfigInterface::class
  101. )->disableOriginalConstructor()->getMock();
  102. $this->_eventManagerMock = $this->getMockBuilder(\Magento\Framework\Event\ManagerInterface::class)
  103. ->disableOriginalConstructor()
  104. ->setMethods(['dispatch'])
  105. ->getMock();
  106. $this->_layoutFilterMock = $this->getMockBuilder(
  107. \Magento\Backend\Model\Layout\Filter\Acl::class
  108. )->disableOriginalConstructor()->getMock();
  109. $this->_backendSessionMock = $this->getMockBuilder(\Magento\Backend\Model\Session::class)
  110. ->setMethods(['__call', 'getIntegrationData'])
  111. ->disableOriginalConstructor()
  112. ->getMock();
  113. $this->_userMock = $this->getMockBuilder(\Magento\User\Model\User::class)
  114. ->disableOriginalConstructor()
  115. ->setMethods(['getId', 'load', 'performIdentityCheck'])
  116. ->getMock();
  117. $this->_translateModelMock = $this->getMockBuilder(
  118. \Magento\Framework\TranslateInterface::class
  119. )->disableOriginalConstructor()->getMock();
  120. $this->_integrationSvcMock = $this->getMockBuilder(
  121. \Magento\Integration\Api\IntegrationServiceInterface::class
  122. )->disableOriginalConstructor()->getMock();
  123. $this->_oauthSvcMock = $this->getMockBuilder(
  124. \Magento\Integration\Api\OauthServiceInterface::class
  125. )->disableOriginalConstructor()->getMock();
  126. $this->_authMock = $this->getMockBuilder(\Magento\Backend\Model\Auth::class)
  127. ->disableOriginalConstructor()
  128. ->setMethods(['getUser', 'logout'])
  129. ->getMock();
  130. $this->_requestMock = $this->getMockBuilder(
  131. \Magento\Framework\App\Request\Http::class
  132. )->disableOriginalConstructor()->getMock();
  133. $this->_responseMock = $this->getMockBuilder(
  134. \Magento\Framework\App\Response\Http::class
  135. )->disableOriginalConstructor()->getMock();
  136. $this->_registryMock = $this->getMockBuilder(\Magento\Framework\Registry::class)
  137. ->disableOriginalConstructor()
  138. ->getMock();
  139. $this->_configScopeMock = $this->getMockBuilder(
  140. \Magento\Framework\Config\ScopeInterface::class
  141. )->disableOriginalConstructor()->getMock();
  142. $this->_integrationHelperMock = $this->getMockBuilder(
  143. \Magento\Integration\Helper\Data::class
  144. )->disableOriginalConstructor()->getMock();
  145. $this->_messageManager = $this->getMockBuilder(
  146. \Magento\Framework\Message\ManagerInterface::class
  147. )->disableOriginalConstructor()->getMock();
  148. $this->_escaper = $this->getMockBuilder(
  149. \Magento\Framework\Escaper::class
  150. )->setMethods(
  151. ['escapeHtml']
  152. )->disableOriginalConstructor()->getMock();
  153. $this->resultPageMock = $this->getMockBuilder(\Magento\Framework\View\Result\Page::class)
  154. ->disableOriginalConstructor()
  155. ->getMock();
  156. $this->viewConfigMock = $this->getMockBuilder(\Magento\Framework\View\Page\Config::class)
  157. ->disableOriginalConstructor()
  158. ->getMock();
  159. $this->pageTitleMock = $this->getMockBuilder(\Magento\Framework\View\Page\Title::class)
  160. ->disableOriginalConstructor()
  161. ->getMock();
  162. $this->securityCookieMock = $this->getMockBuilder(SecurityCookie::class)
  163. ->disableOriginalConstructor()
  164. ->setMethods(['setLogoutReasonCookie'])
  165. ->getMock();
  166. }
  167. /**
  168. * @param string $actionName
  169. * @return \Magento\Integration\Controller\Adminhtml\Integration
  170. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  171. */
  172. protected function _createIntegrationController($actionName)
  173. {
  174. // Mock Layout passed into constructor
  175. $this->_viewMock = $this->getMockBuilder(\Magento\Framework\App\ViewInterface::class)
  176. ->getMock();
  177. $this->_layoutMock = $this->getMockBuilder(\Magento\Framework\View\LayoutInterface::class)
  178. ->setMethods(['getNode'])
  179. ->getMockForAbstractClass();
  180. $this->_layoutMergeMock = $this->getMockBuilder(
  181. \Magento\Framework\View\Model\Layout\Merge::class
  182. )->disableOriginalConstructor()->getMock();
  183. $this->_layoutMock->expects(
  184. $this->any()
  185. )->method(
  186. 'getUpdate'
  187. )->will(
  188. $this->returnValue($this->_layoutMergeMock)
  189. );
  190. $testElement = new \Magento\Framework\Simplexml\Element('<test>test</test>');
  191. $this->_layoutMock->expects($this->any())->method('getNode')->will($this->returnValue($testElement));
  192. // for _setActiveMenu
  193. $this->_viewMock->expects($this->any())->method('getLayout')->will($this->returnValue($this->_layoutMock));
  194. $blockMock = $this->getMockBuilder(\Magento\Backend\Block\Menu::class)->disableOriginalConstructor()->getMock();
  195. $menuMock = $this->getMockBuilder(\Magento\Backend\Model\Menu::class)
  196. ->setConstructorArgs([$this->createMock(\Psr\Log\LoggerInterface::class)])
  197. ->getMock();
  198. $loggerMock = $this->getMockBuilder(\Psr\Log\LoggerInterface::class)->getMock();
  199. $loggerMock->expects($this->any())->method('critical')->will($this->returnSelf());
  200. $menuMock->expects($this->any())->method('getParentItems')->will($this->returnValue([]));
  201. $blockMock->expects($this->any())->method('getMenuModel')->will($this->returnValue($menuMock));
  202. $this->_layoutMock->expects($this->any())->method('getMessagesBlock')->will($this->returnValue($blockMock));
  203. $this->_layoutMock->expects($this->any())->method('getBlock')->will($this->returnValue($blockMock));
  204. $this->_viewMock->expects($this->any())
  205. ->method('getPage')
  206. ->willReturn($this->resultPageMock);
  207. $this->resultPageMock->expects($this->any())
  208. ->method('getConfig')
  209. ->willReturn($this->viewConfigMock);
  210. $this->viewConfigMock->expects($this->any())
  211. ->method('getTitle')
  212. ->willReturn($this->pageTitleMock);
  213. $this->resultRedirectFactory = $this->getMockBuilder(\Magento\Backend\Model\View\Result\RedirectFactory::class)
  214. ->disableOriginalConstructor()
  215. ->setMethods(['create'])
  216. ->getMock();
  217. $this->resultFactory = $this->getMockBuilder(\Magento\Framework\Controller\ResultFactory::class)
  218. ->disableOriginalConstructor()
  219. ->setMethods(['create'])
  220. ->getMock();
  221. $this->_authMock->expects(
  222. $this->any()
  223. )->method(
  224. 'getUser'
  225. )->will(
  226. $this->returnValue($this->_userMock)
  227. );
  228. $this->_userMock->expects($this->any())
  229. ->method('load')
  230. ->willReturn($this->_userMock);
  231. $this->_backendSessionMock->expects($this->any())
  232. ->method('getIntegrationData')
  233. ->willReturn(['all_resources' => 1]);
  234. $contextParameters = [
  235. 'view' => $this->_viewMock,
  236. 'objectManager' => $this->_objectManagerMock,
  237. 'session' => $this->_backendSessionMock,
  238. 'translator' => $this->_translateModelMock,
  239. 'request' => $this->_requestMock,
  240. 'response' => $this->_responseMock,
  241. 'messageManager' => $this->_messageManager,
  242. 'resultRedirectFactory' => $this->resultRedirectFactory,
  243. 'resultFactory' => $this->resultFactory,
  244. 'auth' => $this->_authMock,
  245. 'eventManager' => $this->_eventManagerMock
  246. ];
  247. $this->_backendActionCtxMock = $this->_objectManagerHelper->getObject(
  248. \Magento\Backend\App\Action\Context::class,
  249. $contextParameters
  250. );
  251. $integrationCollection =
  252. $this->getMockBuilder(\Magento\Integration\Model\ResourceModel\Integration\Collection::class)
  253. ->disableOriginalConstructor()
  254. ->setMethods(['addUnsecureUrlsFilter', 'getSize'])
  255. ->getMock();
  256. $integrationCollection->expects($this->any())
  257. ->method('addUnsecureUrlsFilter')
  258. ->will($this->returnValue($integrationCollection));
  259. $integrationCollection->expects($this->any())
  260. ->method('getSize')
  261. ->will($this->returnValue(0));
  262. $subControllerParams = [
  263. 'context' => $this->_backendActionCtxMock,
  264. 'integrationService' => $this->_integrationSvcMock,
  265. 'oauthService' => $this->_oauthSvcMock,
  266. 'registry' => $this->_registryMock,
  267. 'logger' => $loggerMock,
  268. 'integrationData' => $this->_integrationHelperMock,
  269. 'escaper' => $this->_escaper,
  270. 'integrationCollection' => $integrationCollection,
  271. ];
  272. /** Create IntegrationController to test */
  273. $controller = $this->_objectManagerHelper->getObject(
  274. '\\Magento\\Integration\\Controller\\Adminhtml\\Integration\\' . $actionName,
  275. $subControllerParams
  276. );
  277. if ($actionName == 'Save') {
  278. $reflection = new \ReflectionClass(get_class($controller));
  279. $reflectionProperty = $reflection->getProperty('securityCookie');
  280. $reflectionProperty->setAccessible(true);
  281. $reflectionProperty->setValue($controller, $this->securityCookieMock);
  282. }
  283. return $controller;
  284. }
  285. /**
  286. * Common mock 'expect' pattern.
  287. * Calls that need to be mocked out when
  288. * \Magento\Backend\App\AbstractAction loadLayout() and renderLayout() are called.
  289. */
  290. protected function _verifyLoadAndRenderLayout()
  291. {
  292. $map = [
  293. [\Magento\Framework\App\Config\ScopeConfigInterface::class, $this->_configMock],
  294. [\Magento\Backend\Model\Layout\Filter\Acl::class, $this->_layoutFilterMock],
  295. [\Magento\Backend\Model\Session::class, $this->_backendSessionMock],
  296. [\Magento\Framework\TranslateInterface::class, $this->_translateModelMock],
  297. [\Magento\Framework\Config\ScopeInterface::class, $this->_configScopeMock],
  298. ];
  299. $this->_objectManagerMock->expects($this->any())->method('get')->will($this->returnValueMap($map));
  300. }
  301. /**
  302. * Return sample Integration Data
  303. *
  304. * @return \Magento\Framework\DataObject
  305. */
  306. protected function _getSampleIntegrationData()
  307. {
  308. return new \Magento\Framework\DataObject(
  309. [
  310. Info::DATA_NAME => 'nameTest',
  311. Info::DATA_ID => self::INTEGRATION_ID,
  312. 'id' => self::INTEGRATION_ID,
  313. Info::DATA_EMAIL => 'test@magento.com',
  314. Info::DATA_ENDPOINT => 'http://magento.ll/endpoint',
  315. Info::DATA_SETUP_TYPE => IntegrationModel::TYPE_MANUAL,
  316. ]
  317. );
  318. }
  319. /**
  320. * Return integration model mock with sample data.
  321. *
  322. * @return \Magento\Integration\Model\Integration|\PHPUnit_Framework_MockObject_MockObject
  323. */
  324. protected function _getIntegrationModelMock()
  325. {
  326. $integrationModelMock = $this->createPartialMock(
  327. \Magento\Integration\Model\Integration::class,
  328. ['save', '__wakeup', 'setStatus', 'getData']
  329. );
  330. $integrationModelMock->expects($this->any())->method('setStatus')->will($this->returnSelf());
  331. $integrationModelMock->expects(
  332. $this->any()
  333. )->method(
  334. 'getData'
  335. )->will(
  336. $this->returnValue($this->_getSampleIntegrationData())
  337. );
  338. return $integrationModelMock;
  339. }
  340. }