Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
62 / 62
n/a
0 / 0
CRAP
n/a
0 / 0
1<?php
2
3// ╔════════════════════════════════════════════════════════════╗
4// ║ MIT Licence (#Expat) - https://opensource.org/licenses/MIT ║
5// ║ Copyright 2026 Frederic Poeydomenge <dyno@phexium.com>     ║
6// ╚════════════════════════════════════════════════════════════╝
7
8declare(strict_types=1);
9
10pest()->group('unit');
11
12use Phexium\Plugin\Session\Adapter\NativeFlash;
13
14beforeEach(function (): void {
15    $this->storage = [];
16    $this->flash = new NativeFlash($this->storage);
17});
18
19describe('Flash messages', function (): void {
20    it('stores message in correct level', function (): void {
21        $this->flash->add('success', 'Operation successful');
22        $this->flash->add('success', 'Another success');
23        $this->flash->add('error', 'An error occurred');
24
25        expect($this->storage['_flash']['success'])->toBe(['Operation successful', 'Another success']);
26        expect($this->storage['_flash']['error'])->toBe(['An error occurred']);
27    });
28
29    it('retrieves and clears messages on get() (read-once)', function (): void {
30        $this->flash->add('success', 'Message 1');
31        $this->flash->add('success', 'Message 2');
32
33        $messages = $this->flash->get('success');
34
35        expect($messages)->toBe(['Message 1', 'Message 2']);
36        expect($this->flash->get('success'))->toBe([]);
37    });
38
39    it('returns empty array for non-existent level', function (): void {
40        expect($this->flash->get('info'))->toBe([]);
41    });
42
43    it('retrieves all messages grouped by level', function (): void {
44        $this->flash->add('success', 'Success message');
45        $this->flash->add('error', 'Error message 1');
46        $this->flash->add('error', 'Error message 2');
47
48        $all = $this->flash->all();
49
50        expect($all)->toBe([
51            'success' => ['Success message'],
52            'error' => ['Error message 1', 'Error message 2'],
53        ]);
54    });
55
56    it('returns true when level has messages', function (): void {
57        $this->flash->add('warning', 'A warning');
58
59        expect($this->flash->has('warning'))->toBeTrue();
60    });
61
62    it('returns false when level is empty', function (): void {
63        expect($this->flash->has('info'))->toBeFalse();
64    });
65
66    it('does not clear messages on has()', function (): void {
67        $this->flash->add('success', 'A message');
68
69        $this->flash->has('success');
70
71        expect($this->flash->get('success'))->toBe(['A message']);
72    });
73});
74
75describe('Lifecycle', function (): void {
76    it('clears all messages after all()', function (): void {
77        $this->flash->add('success', 'Success message');
78        $this->flash->add('error', 'Error message');
79
80        $this->flash->all();
81
82        expect($this->flash->all())->toBe([]);
83    });
84
85    it('removes all flash messages on clear()', function (): void {
86        $this->flash->add('success', 'Success');
87        $this->flash->add('error', 'Error');
88
89        $this->flash->clear();
90
91        expect($this->flash->has('success'))->toBeFalse();
92        expect($this->flash->has('error'))->toBeFalse();
93        expect($this->flash->all())->toBe([]);
94    });
95});