FlashMessageTest.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
  5. * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  6. *
  7. * Licensed under The MIT License
  8. * For full copyright and license information, please see the LICENSE.txt
  9. * Redistributions of files must retain the above copyright notice
  10. *
  11. * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  12. * @link https://cakephp.org CakePHP(tm) Project
  13. * @since 4.2.0
  14. * @license https://opensource.org/licenses/mit-license.php MIT License
  15. */
  16. namespace Cake\Test\TestCase\Http;
  17. use Cake\Http\FlashMessage;
  18. use Cake\Http\Session;
  19. use Cake\TestSuite\TestCase;
  20. use Exception;
  21. /**
  22. * FlashMessageTest class
  23. */
  24. class FlashMessageTest extends TestCase
  25. {
  26. /**
  27. * @var \Cake\Http\FlashMessage
  28. */
  29. protected $Flash;
  30. /**
  31. * @var \Cake\Http\Session
  32. */
  33. protected $Session;
  34. public function setUp(): void
  35. {
  36. parent::setUp();
  37. static::setAppNamespace();
  38. $this->Session = new Session();
  39. $this->Flash = new FlashMessage($this->Session);
  40. }
  41. public function tearDown(): void
  42. {
  43. parent::tearDown();
  44. $this->Session->destroy();
  45. }
  46. public function testSet(): void
  47. {
  48. $this->assertNull($this->Session->read('Flash.flash'));
  49. $this->Flash->set('This is a test message');
  50. $expected = [
  51. [
  52. 'message' => 'This is a test message',
  53. 'key' => 'flash',
  54. 'element' => 'flash/default',
  55. 'params' => [],
  56. ],
  57. ];
  58. $result = $this->Session->read('Flash.flash');
  59. $this->assertEquals($expected, $result);
  60. $this->Flash->set(
  61. 'This is a test message',
  62. ['element' => 'test', 'params' => ['foo' => 'bar']]
  63. );
  64. $expected[] = [
  65. 'message' => 'This is a test message',
  66. 'key' => 'flash',
  67. 'element' => 'flash/test',
  68. 'params' => ['foo' => 'bar'],
  69. ];
  70. $result = $this->Session->read('Flash.flash');
  71. $this->assertEquals($expected, $result);
  72. $this->Flash->set('This is a test message', ['element' => 'MyPlugin.alert']);
  73. $expected[] = [
  74. 'message' => 'This is a test message',
  75. 'key' => 'flash',
  76. 'element' => 'MyPlugin.flash/alert',
  77. 'params' => [],
  78. ];
  79. $result = $this->Session->read('Flash.flash');
  80. $this->assertEquals($expected, $result);
  81. $this->Flash->set('This is a test message', ['key' => 'foobar']);
  82. $expected = [
  83. [
  84. 'message' => 'This is a test message',
  85. 'key' => 'foobar',
  86. 'element' => 'flash/default',
  87. 'params' => [],
  88. ],
  89. ];
  90. $result = $this->Session->read('Flash.foobar');
  91. $this->assertEquals($expected, $result);
  92. }
  93. public function testDuplicateIgnored(): void
  94. {
  95. $this->assertNull($this->Session->read('Flash.flash'));
  96. $this->Flash->setConfig('duplicate', false);
  97. $this->Flash->set('This test message should appear once only');
  98. $this->Flash->set('This test message should appear once only');
  99. $result = $this->Session->read('Flash.flash');
  100. $this->assertCount(1, $result);
  101. }
  102. public function testSetEscape(): void
  103. {
  104. $this->assertNull($this->Session->read('Flash.flash'));
  105. $this->Flash->set(
  106. 'This is a <b>test</b> message',
  107. ['escape' => false, 'params' => ['foo' => 'bar']]
  108. );
  109. $expected = [
  110. [
  111. 'message' => 'This is a <b>test</b> message',
  112. 'key' => 'flash',
  113. 'element' => 'flash/default',
  114. 'params' => ['foo' => 'bar', 'escape' => false],
  115. ],
  116. ];
  117. $result = $this->Session->read('Flash.flash');
  118. $this->assertEquals($expected, $result);
  119. $this->Flash->set(
  120. 'This is a test message',
  121. ['key' => 'escaped', 'escape' => false, 'params' => ['foo' => 'bar', 'escape' => true]]
  122. );
  123. $expected = [
  124. [
  125. 'message' => 'This is a test message',
  126. 'key' => 'escaped',
  127. 'element' => 'flash/default',
  128. 'params' => ['foo' => 'bar', 'escape' => true],
  129. ],
  130. ];
  131. $result = $this->Session->read('Flash.escaped');
  132. $this->assertEquals($expected, $result);
  133. }
  134. public function testSetWithClear(): void
  135. {
  136. $this->assertNull($this->Session->read('Flash.flash'));
  137. $this->Flash->set('This is a test message');
  138. $expected = [
  139. [
  140. 'message' => 'This is a test message',
  141. 'key' => 'flash',
  142. 'element' => 'flash/default',
  143. 'params' => [],
  144. ],
  145. ];
  146. $result = $this->Session->read('Flash.flash');
  147. $this->assertEquals($expected, $result);
  148. $this->Flash->set('This is another test message', ['clear' => true]);
  149. $expected = [
  150. [
  151. 'message' => 'This is another test message',
  152. 'key' => 'flash',
  153. 'element' => 'flash/default',
  154. 'params' => [],
  155. ],
  156. ];
  157. $result = $this->Session->read('Flash.flash');
  158. $this->assertEquals($expected, $result);
  159. }
  160. public function testSetWithPlugin(): void
  161. {
  162. $this->Flash->set('This is a test message', ['plugin' => 'FooBar']);
  163. $expected = [
  164. [
  165. 'message' => 'This is a test message',
  166. 'key' => 'flash',
  167. 'element' => 'FooBar.flash/default',
  168. 'params' => [],
  169. ],
  170. ];
  171. $result = $this->Session->read('Flash.flash');
  172. $this->assertEquals($expected, $result);
  173. // Value of 'plugin' will override the plugin name used in 'element'
  174. $this->Flash->set('This is a test message', [
  175. 'key' => 'msg',
  176. 'element' => 'Plugin.success',
  177. 'plugin' => 'FooBar',
  178. ]);
  179. $expected = [
  180. [
  181. 'message' => 'This is a test message',
  182. 'key' => 'msg',
  183. 'element' => 'FooBar.flash/success',
  184. 'params' => [],
  185. ],
  186. ];
  187. $result = $this->Session->read('Flash.msg');
  188. $this->assertEquals($expected, $result);
  189. }
  190. public function testSetExceptionMessage(): void
  191. {
  192. $this->assertNull($this->Session->read('Flash.flash'));
  193. $this->Flash->setExceptionMessage(new Exception('This is a test message', 404));
  194. $expected = [
  195. [
  196. 'message' => 'This is a test message',
  197. 'key' => 'flash',
  198. 'element' => 'flash/error',
  199. 'params' => ['code' => 404],
  200. ],
  201. ];
  202. $result = $this->Session->read('Flash.flash');
  203. $this->assertEquals($expected, $result);
  204. $this->Flash->setExceptionMessage(
  205. new Exception('This is a test message'),
  206. ['element' => 'default', 'clear' => true]
  207. );
  208. $expected = [
  209. [
  210. 'message' => 'This is a test message',
  211. 'key' => 'flash',
  212. 'element' => 'flash/default',
  213. 'params' => ['code' => null],
  214. ],
  215. ];
  216. $result = $this->Session->read('Flash.flash');
  217. $this->assertEquals($expected, $result);
  218. }
  219. public function testSetWithConstructorConfiguration(): void
  220. {
  221. $this->assertNull($this->Session->read('Flash.flash'));
  222. $flash = new FlashMessage($this->Session, ['element' => 'test']);
  223. $flash->set('This is a test message');
  224. $expected = [
  225. [
  226. 'message' => 'This is a test message',
  227. 'key' => 'flash',
  228. 'element' => 'flash/test',
  229. 'params' => [],
  230. ],
  231. ];
  232. $result = $this->Session->read('Flash.flash');
  233. $this->assertEquals($expected, $result);
  234. }
  235. /**
  236. * @dataProvider convenienceMethods
  237. */
  238. public function testConvenienceMethods(string $type): void
  239. {
  240. $this->assertNull($this->Session->read('Flash.flash'));
  241. $this->Flash->{$type}('It worked');
  242. $expected = [
  243. [
  244. 'message' => 'It worked',
  245. 'key' => 'flash',
  246. 'element' => 'flash/' . $type,
  247. 'params' => [],
  248. ],
  249. ];
  250. $result = $this->Session->read('Flash.flash');
  251. $this->assertEquals($expected, $result);
  252. }
  253. public function convenienceMethods(): array
  254. {
  255. return [
  256. ['success'],
  257. ['error'],
  258. ['warning'],
  259. ['info'],
  260. ];
  261. }
  262. public function testSuccessWithClear(): void
  263. {
  264. $this->assertNull($this->Session->read('Flash.flash'));
  265. $this->Flash->success('It worked');
  266. $expected = [
  267. [
  268. 'message' => 'It worked',
  269. 'key' => 'flash',
  270. 'element' => 'flash/success',
  271. 'params' => [],
  272. ],
  273. ];
  274. $result = $this->Session->read('Flash.flash');
  275. $this->assertEquals($expected, $result);
  276. $this->Flash->success('It worked too', ['clear' => true]);
  277. $expected = [
  278. [
  279. 'message' => 'It worked too',
  280. 'key' => 'flash',
  281. 'element' => 'flash/success',
  282. 'params' => [],
  283. ],
  284. ];
  285. $result = $this->Session->read('Flash.flash');
  286. $this->assertEquals($expected, $result);
  287. }
  288. public function testError(): void
  289. {
  290. $this->assertNull($this->Session->read('Flash.flash'));
  291. $this->Flash->error('It did not work', ['element' => 'error_thing']);
  292. $expected[] = [
  293. 'message' => 'It did not work',
  294. 'key' => 'flash',
  295. 'element' => 'flash/error',
  296. 'params' => [],
  297. ];
  298. $result = $this->Session->read('Flash.flash');
  299. $this->assertEquals($expected, $result, 'Element is ignored in convenience method call.');
  300. }
  301. }