Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
113 / 113
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('integration');
11
12use Phexium\Plugin\Session\Adapter\OdanSession;
13use Phexium\Plugin\Session\Port\FlashInterface;
14use Tests\Phexium\Fake\Plugin\Session\OdanSession as FakeOdanSession;
15
16beforeEach(function (): void {
17    $this->fakeSession = new FakeOdanSession();
18    $this->sessionAdapter = new OdanSession($this->fakeSession);
19    $this->sessionAdapter->start();
20});
21
22describe('Session lifecycle', function (): void {
23    it('regenerates the session id', function (): void {
24        $oldId = $this->sessionAdapter->getId();
25        $this->sessionAdapter->regenerateId();
26        $newId = $this->sessionAdapter->getId();
27
28        expect($oldId)->not->toBeEmpty();
29        expect($newId)->not->toBeEmpty();
30        expect($oldId)->not->toBe($newId);
31    });
32
33    it('returns the session id and name', function (): void {
34        expect($this->sessionAdapter->getId())->not->toBeEmpty();
35        expect($this->sessionAdapter->getName())->toBe('app');
36    });
37
38    it('destroys session data and regenerates the session id', function (): void {
39        $this->sessionAdapter->set('foo', 'bar');
40
41        $oldId = $this->sessionAdapter->getId();
42
43        $this->sessionAdapter->destroy();
44
45        $newId = $this->sessionAdapter->getId();
46
47        expect($oldId)->not->toBe($newId);
48        expect($this->sessionAdapter->has('foo'))->toBeFalse();
49        expect($this->sessionAdapter->count())->toBe(0);
50    });
51
52    it('does not restart an already started session when start is called multiple times', function (): void {
53        $this->sessionAdapter->start();
54
55        expect($this->fakeSession->getStartCallCount())->toBe(1);
56    });
57
58    it('calls the underlying session save method when saved', function (): void {
59        $this->sessionAdapter->save();
60
61        expect($this->fakeSession->getSaveCallCount())->toBe(1);
62    });
63});
64
65describe('Data management', function (): void {
66    it('sets and gets a value from the session', function (): void {
67        $this->sessionAdapter->set('foo', 'bar');
68        expect($this->sessionAdapter->get('foo'))->toBe('bar');
69    });
70
71    it('returns null when a key does not exist', function (): void {
72        expect($this->sessionAdapter->get('non_existent_key'))->toBeNull();
73    });
74
75    it('returns the default value when a key does not exist', function (): void {
76        expect($this->sessionAdapter->get('non_existent_key', 'default'))->toBe('default');
77    });
78
79    it('checks if a value exists in the session', function (): void {
80        expect($this->sessionAdapter->has('foo'))->toBeFalse();
81        $this->sessionAdapter->set('foo', 'bar');
82        expect($this->sessionAdapter->has('foo'))->toBeTrue();
83    });
84
85    it('clears all session data', function (): void {
86        $this->sessionAdapter->set('foo', 'bar');
87
88        $this->sessionAdapter->clear();
89
90        expect($this->sessionAdapter->has('foo'))->toBeFalse();
91    });
92
93    it('restarts the session after clearing data', function (): void {
94        $this->sessionAdapter->set('foo', 'bar');
95
96        $this->sessionAdapter->clear();
97        $this->sessionAdapter->start();
98
99        expect($this->sessionAdapter->isStarted())->toBeTrue();
100        expect($this->sessionAdapter->all())->toBeEmpty();
101    });
102
103    it('deletes a value from the session', function (): void {
104        $this->sessionAdapter->set('foo', 'bar');
105        expect($this->sessionAdapter->has('foo'))->toBeTrue();
106
107        $this->sessionAdapter->delete('foo');
108        expect($this->sessionAdapter->has('foo'))->toBeFalse();
109    });
110
111    it('adds flash messages and retrieves them via getFlash', function (): void {
112        $this->sessionAdapter->addFlashMessage('success', 'Success message #1');
113        $this->sessionAdapter->addFlashMessage('error', 'Error message');
114        $this->sessionAdapter->addFlashMessage('success', 'Success message #2');
115
116        $flash = $this->sessionAdapter->getFlash();
117
118        expect($flash)->toBeInstanceOf(FlashInterface::class);
119
120        $successMessages = $flash->get('success');
121        expect($successMessages)->toHaveCount(2);
122        expect($successMessages)->toContain('Success message #1');
123        expect($successMessages)->toContain('Success message #2');
124
125        $errorMessages = $flash->get('error');
126        expect($errorMessages)->toHaveCount(1);
127        expect($errorMessages)->toContain('Error message');
128    });
129
130    it('replaces all session data', function (): void {
131        $this->sessionAdapter->set('foo', 'bar');
132
133        $this->sessionAdapter->replace([
134            'qix' => 'baz',
135        ]);
136
137        expect($this->sessionAdapter->has('foo'))->toBeFalse();
138        expect($this->sessionAdapter->has('qix'))->toBeTrue();
139        expect($this->sessionAdapter->get('qix'))->toBe('baz');
140    });
141
142    it('returns all session data', function (): void {
143        $this->sessionAdapter->set('key1', 'value1');
144        $this->sessionAdapter->set('key2', 'value2');
145
146        expect($this->sessionAdapter->all())->toBe([
147            'key1' => 'value1',
148            'key2' => 'value2',
149        ]);
150    });
151
152    it('counts session data keys', function (): void {
153        expect($this->sessionAdapter->count())->toBe(0);
154
155        $this->sessionAdapter->set('key1', 'value1');
156        expect($this->sessionAdapter->count())->toBe(1);
157
158        $this->sessionAdapter->set('key2', 'value2');
159        $this->sessionAdapter->set('key3', 'value3');
160        expect($this->sessionAdapter->count())->toBe(3);
161
162        $this->sessionAdapter->delete('key2');
163        expect($this->sessionAdapter->count())->toBe(2);
164    });
165});