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