FlashMessageTest.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  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 testSetExceptionMessage(): void
  161. {
  162. $this->assertNull($this->Session->read('Flash.flash'));
  163. $this->Flash->setExceptionMessage(new Exception('This is a test message', 404));
  164. $expected = [
  165. [
  166. 'message' => 'This is a test message',
  167. 'key' => 'flash',
  168. 'element' => 'flash/error',
  169. 'params' => ['code' => 404],
  170. ],
  171. ];
  172. $result = $this->Session->read('Flash.flash');
  173. $this->assertEquals($expected, $result);
  174. $this->Flash->setExceptionMessage(
  175. new Exception('This is a test message'),
  176. ['element' => 'default', 'clear' => true]
  177. );
  178. $expected = [
  179. [
  180. 'message' => 'This is a test message',
  181. 'key' => 'flash',
  182. 'element' => 'flash/default',
  183. 'params' => ['code' => null],
  184. ],
  185. ];
  186. $result = $this->Session->read('Flash.flash');
  187. $this->assertEquals($expected, $result);
  188. }
  189. public function testSetWithConstructorConfiguration(): void
  190. {
  191. $this->assertNull($this->Session->read('Flash.flash'));
  192. $flash = new FlashMessage($this->Session, ['element' => 'test']);
  193. $flash->set('This is a test message');
  194. $expected = [
  195. [
  196. 'message' => 'This is a test message',
  197. 'key' => 'flash',
  198. 'element' => 'flash/test',
  199. 'params' => [],
  200. ],
  201. ];
  202. $result = $this->Session->read('Flash.flash');
  203. $this->assertEquals($expected, $result);
  204. }
  205. /**
  206. * @dataProvider convenienceMethods
  207. */
  208. public function testConvenienceMethods(string $type): void
  209. {
  210. $this->assertNull($this->Session->read('Flash.flash'));
  211. $this->Flash->{$type}('It worked');
  212. $expected = [
  213. [
  214. 'message' => 'It worked',
  215. 'key' => 'flash',
  216. 'element' => 'flash/' . $type,
  217. 'params' => [],
  218. ],
  219. ];
  220. $result = $this->Session->read('Flash.flash');
  221. $this->assertEquals($expected, $result);
  222. }
  223. public function convenienceMethods(): array
  224. {
  225. return [
  226. ['success'],
  227. ['error'],
  228. ['warning'],
  229. ['info'],
  230. ];
  231. }
  232. public function testSuccessWithClear(): void
  233. {
  234. $this->assertNull($this->Session->read('Flash.flash'));
  235. $this->Flash->success('It worked');
  236. $expected = [
  237. [
  238. 'message' => 'It worked',
  239. 'key' => 'flash',
  240. 'element' => 'flash/success',
  241. 'params' => [],
  242. ],
  243. ];
  244. $result = $this->Session->read('Flash.flash');
  245. $this->assertEquals($expected, $result);
  246. $this->Flash->success('It worked too', ['clear' => true]);
  247. $expected = [
  248. [
  249. 'message' => 'It worked too',
  250. 'key' => 'flash',
  251. 'element' => 'flash/success',
  252. 'params' => [],
  253. ],
  254. ];
  255. $result = $this->Session->read('Flash.flash');
  256. $this->assertEquals($expected, $result);
  257. }
  258. public function testError(): void
  259. {
  260. $this->assertNull($this->Session->read('Flash.flash'));
  261. $this->Flash->error('It did not work', ['element' => 'error_thing']);
  262. $expected[] = [
  263. 'message' => 'It did not work',
  264. 'key' => 'flash',
  265. 'element' => 'flash/error',
  266. 'params' => [],
  267. ];
  268. $result = $this->Session->read('Flash.flash');
  269. $this->assertEquals($expected, $result, 'Element is ignored in convenience method call.');
  270. }
  271. }