MessagePluginTest.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Theme\Test\Unit\Controller\Result;
  7. use Magento\Framework\Controller\Result\Json;
  8. use Magento\Framework\Controller\Result\Redirect;
  9. use Magento\Framework\Json\Helper\Data;
  10. use Magento\Framework\Message\Collection;
  11. use Magento\Framework\Message\ManagerInterface;
  12. use Magento\Framework\Message\MessageInterface;
  13. use Magento\Framework\Stdlib\Cookie\CookieMetadataFactory;
  14. use Magento\Framework\Stdlib\Cookie\PublicCookieMetadata;
  15. use Magento\Framework\Stdlib\CookieManagerInterface;
  16. use Magento\Framework\Translate\InlineInterface;
  17. use Magento\Framework\View\Element\Message\InterpretationStrategyInterface;
  18. use Magento\Theme\Controller\Result\MessagePlugin;
  19. /**
  20. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  21. */
  22. class MessagePluginTest extends \PHPUnit\Framework\TestCase
  23. {
  24. /** @var MessagePlugin */
  25. protected $model;
  26. /** @var CookieManagerInterface|\PHPUnit_Framework_MockObject_MockObject */
  27. protected $cookieManagerMock;
  28. /** @var CookieMetadataFactory|\PHPUnit_Framework_MockObject_MockObject */
  29. protected $cookieMetadataFactoryMock;
  30. /** @var ManagerInterface|\PHPUnit_Framework_MockObject_MockObject */
  31. protected $managerMock;
  32. /** @var InterpretationStrategyInterface|\PHPUnit_Framework_MockObject_MockObject */
  33. protected $interpretationStrategyMock;
  34. /** @var \Magento\Framework\Serialize\Serializer\Json|\PHPUnit_Framework_MockObject_MockObject */
  35. private $serializerMock;
  36. /** @var InlineInterface|\PHPUnit_Framework_MockObject_MockObject */
  37. private $inlineTranslateMock;
  38. protected function setUp()
  39. {
  40. $this->cookieManagerMock = $this->getMockBuilder(CookieManagerInterface::class)
  41. ->getMockForAbstractClass();
  42. $this->cookieMetadataFactoryMock = $this->getMockBuilder(CookieMetadataFactory::class)
  43. ->disableOriginalConstructor()
  44. ->getMock();
  45. $this->managerMock = $this->getMockBuilder(ManagerInterface::class)
  46. ->getMockForAbstractClass();
  47. $this->interpretationStrategyMock = $this->getMockBuilder(InterpretationStrategyInterface::class)
  48. ->getMockForAbstractClass();
  49. $this->serializerMock = $this->getMockBuilder(\Magento\Framework\Serialize\Serializer\Json::class)
  50. ->getMock();
  51. $this->inlineTranslateMock = $this->getMockBuilder(InlineInterface::class)->getMockForAbstractClass();
  52. $this->model = new MessagePlugin(
  53. $this->cookieManagerMock,
  54. $this->cookieMetadataFactoryMock,
  55. $this->managerMock,
  56. $this->interpretationStrategyMock,
  57. $this->serializerMock,
  58. $this->inlineTranslateMock
  59. );
  60. }
  61. public function testAfterRenderResultJson()
  62. {
  63. /** @var Json|\PHPUnit_Framework_MockObject_MockObject $resultMock */
  64. $resultMock = $this->getMockBuilder(Json::class)
  65. ->disableOriginalConstructor()
  66. ->getMock();
  67. $this->cookieManagerMock->expects($this->never())
  68. ->method('setPublicCookie');
  69. $this->assertEquals($resultMock, $this->model->afterRenderResult($resultMock, $resultMock));
  70. }
  71. public function testAfterRenderResult()
  72. {
  73. $existingMessages = [
  74. [
  75. 'type' => 'message0type',
  76. 'text' => 'message0text',
  77. ],
  78. ];
  79. $messageType = 'message1type';
  80. $messageText = 'message1text';
  81. $messages = [
  82. [
  83. 'type' => $messageType,
  84. 'text' => $messageText,
  85. ],
  86. ];
  87. $messages = array_merge($existingMessages, $messages);
  88. /** @var Redirect|\PHPUnit_Framework_MockObject_MockObject $resultMock */
  89. $resultMock = $this->getMockBuilder(Redirect::class)
  90. ->disableOriginalConstructor()
  91. ->getMock();
  92. /** @var PublicCookieMetadata|\PHPUnit_Framework_MockObject_MockObject $cookieMetadataMock */
  93. $cookieMetadataMock = $this->getMockBuilder(PublicCookieMetadata::class)
  94. ->disableOriginalConstructor()
  95. ->getMock();
  96. $this->cookieMetadataFactoryMock->expects($this->once())
  97. ->method('createPublicCookieMetadata')
  98. ->willReturn($cookieMetadataMock);
  99. $this->cookieManagerMock->expects($this->once())
  100. ->method('setPublicCookie')
  101. ->with(
  102. MessagePlugin::MESSAGES_COOKIES_NAME,
  103. json_encode($messages),
  104. $cookieMetadataMock
  105. );
  106. $this->cookieManagerMock->expects($this->once())
  107. ->method('getCookie')
  108. ->with(
  109. MessagePlugin::MESSAGES_COOKIES_NAME
  110. )
  111. ->willReturn(json_encode($existingMessages));
  112. $this->serializerMock->expects($this->once())
  113. ->method('unserialize')
  114. ->willReturnCallback(
  115. function ($data) {
  116. return json_decode($data, true);
  117. }
  118. );
  119. $this->serializerMock->expects($this->once())
  120. ->method('serialize')
  121. ->willReturnCallback(
  122. function ($data) {
  123. return json_encode($data);
  124. }
  125. );
  126. /** @var MessageInterface|\PHPUnit_Framework_MockObject_MockObject $messageMock */
  127. $messageMock = $this->getMockBuilder(MessageInterface::class)
  128. ->getMock();
  129. $messageMock->expects($this->once())
  130. ->method('getType')
  131. ->willReturn($messageType);
  132. $this->interpretationStrategyMock->expects($this->once())
  133. ->method('interpret')
  134. ->with($messageMock)
  135. ->willReturn($messageText);
  136. /** @var Collection|\PHPUnit_Framework_MockObject_MockObject $collectionMock */
  137. $collectionMock = $this->getMockBuilder(Collection::class)
  138. ->disableOriginalConstructor()
  139. ->getMock();
  140. $collectionMock->expects($this->once())
  141. ->method('getItems')
  142. ->willReturn([$messageMock]);
  143. $this->managerMock->expects($this->once())
  144. ->method('getMessages')
  145. ->with(true, null)
  146. ->willReturn($collectionMock);
  147. $this->assertEquals($resultMock, $this->model->afterRenderResult($resultMock, $resultMock));
  148. }
  149. public function testAfterRenderResultWithNoMessages()
  150. {
  151. /** @var Redirect|\PHPUnit_Framework_MockObject_MockObject $resultMock */
  152. $resultMock = $this->getMockBuilder(Redirect::class)
  153. ->disableOriginalConstructor()
  154. ->getMock();
  155. $this->cookieManagerMock->expects($this->once())
  156. ->method('getCookie')
  157. ->with(
  158. MessagePlugin::MESSAGES_COOKIES_NAME
  159. )
  160. ->willReturn(json_encode([]));
  161. $this->serializerMock->expects($this->once())
  162. ->method('unserialize')
  163. ->willReturnCallback(
  164. function ($data) {
  165. return json_decode($data, true);
  166. }
  167. );
  168. $this->serializerMock->expects($this->never())
  169. ->method('serialize');
  170. /** @var Collection|\PHPUnit_Framework_MockObject_MockObject $collectionMock */
  171. $collectionMock = $this->getMockBuilder(Collection::class)
  172. ->disableOriginalConstructor()
  173. ->getMock();
  174. $collectionMock->expects($this->once())
  175. ->method('getItems')
  176. ->willReturn([]);
  177. $this->managerMock->expects($this->once())
  178. ->method('getMessages')
  179. ->with(true, null)
  180. ->willReturn($collectionMock);
  181. $this->cookieMetadataFactoryMock->expects($this->never())
  182. ->method('createPublicCookieMetadata')
  183. ->willReturn(null);
  184. $this->assertEquals($resultMock, $this->model->afterRenderResult($resultMock, $resultMock));
  185. }
  186. public function testAfterRenderResultWithoutExisting()
  187. {
  188. $messageType = 'message1type';
  189. $messageText = 'message1text';
  190. $messages = [
  191. [
  192. 'type' => $messageType,
  193. 'text' => $messageText,
  194. ],
  195. ];
  196. /** @var Redirect|\PHPUnit_Framework_MockObject_MockObject $resultMock */
  197. $resultMock = $this->getMockBuilder(Redirect::class)
  198. ->disableOriginalConstructor()
  199. ->getMock();
  200. /** @var PublicCookieMetadata|\PHPUnit_Framework_MockObject_MockObject $cookieMetadataMock */
  201. $cookieMetadataMock = $this->getMockBuilder(PublicCookieMetadata::class)
  202. ->disableOriginalConstructor()
  203. ->getMock();
  204. $this->cookieMetadataFactoryMock->expects($this->once())
  205. ->method('createPublicCookieMetadata')
  206. ->willReturn($cookieMetadataMock);
  207. $this->cookieManagerMock->expects($this->once())
  208. ->method('setPublicCookie')
  209. ->with(
  210. MessagePlugin::MESSAGES_COOKIES_NAME,
  211. json_encode($messages),
  212. $cookieMetadataMock
  213. );
  214. $this->cookieManagerMock->expects($this->once())
  215. ->method('getCookie')
  216. ->with(
  217. MessagePlugin::MESSAGES_COOKIES_NAME
  218. )
  219. ->willReturn(json_encode([]));
  220. $this->serializerMock->expects($this->once())
  221. ->method('unserialize')
  222. ->willReturnCallback(
  223. function ($data) {
  224. return json_decode($data, true);
  225. }
  226. );
  227. $this->serializerMock->expects($this->once())
  228. ->method('serialize')
  229. ->willReturnCallback(
  230. function ($data) {
  231. return json_encode($data);
  232. }
  233. );
  234. /** @var MessageInterface|\PHPUnit_Framework_MockObject_MockObject $messageMock */
  235. $messageMock = $this->getMockBuilder(MessageInterface::class)
  236. ->getMock();
  237. $messageMock->expects($this->once())
  238. ->method('getType')
  239. ->willReturn($messageType);
  240. $this->interpretationStrategyMock->expects($this->once())
  241. ->method('interpret')
  242. ->with($messageMock)
  243. ->willReturn($messageText);
  244. /** @var Collection|\PHPUnit_Framework_MockObject_MockObject $collectionMock */
  245. $collectionMock = $this->getMockBuilder(Collection::class)
  246. ->disableOriginalConstructor()
  247. ->getMock();
  248. $collectionMock->expects($this->once())
  249. ->method('getItems')
  250. ->willReturn([$messageMock]);
  251. $this->managerMock->expects($this->once())
  252. ->method('getMessages')
  253. ->with(true, null)
  254. ->willReturn($collectionMock);
  255. $this->assertEquals($resultMock, $this->model->afterRenderResult($resultMock, $resultMock));
  256. }
  257. public function testAfterRenderResultWithWrongJson()
  258. {
  259. $messageType = 'message1type';
  260. $messageText = 'message1text';
  261. $messages = [
  262. [
  263. 'type' => $messageType,
  264. 'text' => $messageText,
  265. ],
  266. ];
  267. /** @var Redirect|\PHPUnit_Framework_MockObject_MockObject $resultMock */
  268. $resultMock = $this->getMockBuilder(Redirect::class)
  269. ->disableOriginalConstructor()
  270. ->getMock();
  271. /** @var PublicCookieMetadata|\PHPUnit_Framework_MockObject_MockObject $cookieMetadataMock */
  272. $cookieMetadataMock = $this->getMockBuilder(PublicCookieMetadata::class)
  273. ->disableOriginalConstructor()
  274. ->getMock();
  275. $this->cookieMetadataFactoryMock->expects($this->once())
  276. ->method('createPublicCookieMetadata')
  277. ->willReturn($cookieMetadataMock);
  278. $this->cookieManagerMock->expects($this->once())
  279. ->method('setPublicCookie')
  280. ->with(
  281. MessagePlugin::MESSAGES_COOKIES_NAME,
  282. json_encode($messages),
  283. $cookieMetadataMock
  284. );
  285. $this->cookieManagerMock->expects($this->once())
  286. ->method('getCookie')
  287. ->with(
  288. MessagePlugin::MESSAGES_COOKIES_NAME
  289. )
  290. ->willReturn(null);
  291. $this->serializerMock->expects($this->never())
  292. ->method('unserialize');
  293. $this->serializerMock->expects($this->once())
  294. ->method('serialize')
  295. ->willReturnCallback(
  296. function ($data) {
  297. return json_encode($data);
  298. }
  299. );
  300. /** @var MessageInterface|\PHPUnit_Framework_MockObject_MockObject $messageMock */
  301. $messageMock = $this->getMockBuilder(MessageInterface::class)
  302. ->getMock();
  303. $messageMock->expects($this->once())
  304. ->method('getType')
  305. ->willReturn($messageType);
  306. $this->interpretationStrategyMock->expects($this->once())
  307. ->method('interpret')
  308. ->with($messageMock)
  309. ->willReturn($messageText);
  310. /** @var Collection|\PHPUnit_Framework_MockObject_MockObject $collectionMock */
  311. $collectionMock = $this->getMockBuilder(Collection::class)
  312. ->disableOriginalConstructor()
  313. ->getMock();
  314. $collectionMock->expects($this->once())
  315. ->method('getItems')
  316. ->willReturn([$messageMock]);
  317. $this->managerMock->expects($this->once())
  318. ->method('getMessages')
  319. ->with(true, null)
  320. ->willReturn($collectionMock);
  321. $this->assertEquals($resultMock, $this->model->afterRenderResult($resultMock, $resultMock));
  322. }
  323. public function testAfterRenderResultWithWrongArray()
  324. {
  325. $messageType = 'message1type';
  326. $messageText = 'message1text';
  327. $messages = [
  328. [
  329. 'type' => $messageType,
  330. 'text' => $messageText,
  331. ],
  332. ];
  333. /** @var Redirect|\PHPUnit_Framework_MockObject_MockObject $resultMock */
  334. $resultMock = $this->getMockBuilder(Redirect::class)
  335. ->disableOriginalConstructor()
  336. ->getMock();
  337. /** @var PublicCookieMetadata|\PHPUnit_Framework_MockObject_MockObject $cookieMetadataMock */
  338. $cookieMetadataMock = $this->getMockBuilder(PublicCookieMetadata::class)
  339. ->disableOriginalConstructor()
  340. ->getMock();
  341. $this->cookieMetadataFactoryMock->expects($this->once())
  342. ->method('createPublicCookieMetadata')
  343. ->willReturn($cookieMetadataMock);
  344. $this->cookieManagerMock->expects($this->once())
  345. ->method('setPublicCookie')
  346. ->with(
  347. MessagePlugin::MESSAGES_COOKIES_NAME,
  348. json_encode($messages),
  349. $cookieMetadataMock
  350. );
  351. $this->cookieManagerMock->expects($this->once())
  352. ->method('getCookie')
  353. ->with(
  354. MessagePlugin::MESSAGES_COOKIES_NAME
  355. )
  356. ->willReturn(json_encode('string'));
  357. $this->serializerMock->expects($this->once())
  358. ->method('unserialize')
  359. ->willReturnCallback(
  360. function ($data) {
  361. return json_decode($data, true);
  362. }
  363. );
  364. $this->serializerMock->expects($this->once())
  365. ->method('serialize')
  366. ->willReturnCallback(
  367. function ($data) {
  368. return json_encode($data);
  369. }
  370. );
  371. /** @var MessageInterface|\PHPUnit_Framework_MockObject_MockObject $messageMock */
  372. $messageMock = $this->getMockBuilder(MessageInterface::class)
  373. ->getMock();
  374. $messageMock->expects($this->once())
  375. ->method('getType')
  376. ->willReturn($messageType);
  377. $this->interpretationStrategyMock->expects($this->once())
  378. ->method('interpret')
  379. ->with($messageMock)
  380. ->willReturn($messageText);
  381. /** @var Collection|\PHPUnit_Framework_MockObject_MockObject $collectionMock */
  382. $collectionMock = $this->getMockBuilder(Collection::class)
  383. ->disableOriginalConstructor()
  384. ->getMock();
  385. $collectionMock->expects($this->once())
  386. ->method('getItems')
  387. ->willReturn([$messageMock]);
  388. $this->managerMock->expects($this->once())
  389. ->method('getMessages')
  390. ->with(true, null)
  391. ->willReturn($collectionMock);
  392. $this->assertEquals($resultMock, $this->model->afterRenderResult($resultMock, $resultMock));
  393. }
  394. /**
  395. * @return void
  396. */
  397. public function testAfterRenderResultWithAllowedInlineTranslate(): void
  398. {
  399. $messageType = 'message1type';
  400. $messageText = '{{{message1text}}{{message1text}}{{message1text}}{{theme/luma}}}';
  401. $expectedMessages = [
  402. [
  403. 'type' => $messageType,
  404. 'text' => 'message1text',
  405. ],
  406. ];
  407. /** @var Redirect|\PHPUnit_Framework_MockObject_MockObject $resultMock */
  408. $resultMock = $this->getMockBuilder(Redirect::class)
  409. ->disableOriginalConstructor()
  410. ->getMock();
  411. /** @var PublicCookieMetadata|\PHPUnit_Framework_MockObject_MockObject $cookieMetadataMock */
  412. $cookieMetadataMock = $this->getMockBuilder(PublicCookieMetadata::class)
  413. ->disableOriginalConstructor()
  414. ->getMock();
  415. $this->cookieMetadataFactoryMock->expects($this->once())
  416. ->method('createPublicCookieMetadata')
  417. ->willReturn($cookieMetadataMock);
  418. $this->cookieManagerMock->expects($this->once())
  419. ->method('setPublicCookie')
  420. ->with(
  421. MessagePlugin::MESSAGES_COOKIES_NAME,
  422. json_encode($expectedMessages),
  423. $cookieMetadataMock
  424. );
  425. $this->cookieManagerMock->expects($this->once())
  426. ->method('getCookie')
  427. ->with(
  428. MessagePlugin::MESSAGES_COOKIES_NAME
  429. )
  430. ->willReturn(json_encode([]));
  431. $this->serializerMock->expects($this->once())
  432. ->method('unserialize')
  433. ->willReturnCallback(
  434. function ($data) {
  435. return json_decode($data, true);
  436. }
  437. );
  438. $this->serializerMock->expects($this->once())
  439. ->method('serialize')
  440. ->willReturnCallback(
  441. function ($data) {
  442. return json_encode($data);
  443. }
  444. );
  445. /** @var MessageInterface|\PHPUnit_Framework_MockObject_MockObject $messageMock */
  446. $messageMock = $this->getMockBuilder(MessageInterface::class)
  447. ->getMock();
  448. $messageMock->expects($this->once())
  449. ->method('getType')
  450. ->willReturn($messageType);
  451. $this->interpretationStrategyMock->expects($this->once())
  452. ->method('interpret')
  453. ->with($messageMock)
  454. ->willReturn($messageText);
  455. $this->inlineTranslateMock->expects($this->once())
  456. ->method('isAllowed')
  457. ->willReturn(true);
  458. /** @var Collection|\PHPUnit_Framework_MockObject_MockObject $collectionMock */
  459. $collectionMock = $this->getMockBuilder(Collection::class)
  460. ->disableOriginalConstructor()
  461. ->getMock();
  462. $collectionMock->expects($this->once())
  463. ->method('getItems')
  464. ->willReturn([$messageMock]);
  465. $this->managerMock->expects($this->once())
  466. ->method('getMessages')
  467. ->with(true, null)
  468. ->willReturn($collectionMock);
  469. $this->assertEquals($resultMock, $this->model->afterRenderResult($resultMock, $resultMock));
  470. }
  471. }