ware/AuthenticationMiddlewareTest.php$0   A
last analyzed

Complexity

Total Complexity 2

Size/Duplication

Total Lines 8
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 2
dl 0
loc 8
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ApplicationTest\Middleware;
6
7
use Application\Enum\Site;
8
use Application\Middleware\AuthenticationMiddleware;
9
use Application\Model\User;
10
use Application\Repository\UserRepository;
11
use Cake\Chronos\Chronos;
0 ignored issues
show
Bug introduced by
The type Cake\Chronos\Chronos was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
12
use Laminas\Diactoros\Response;
13
use Laminas\Diactoros\ServerRequest;
14
use Mezzio\Session\Session;
15
use Mezzio\Session\SessionInterface;
16
use Mezzio\Session\SessionMiddleware;
17
use PHPUnit\Framework\TestCase;
18
use Psr\Http\Message\ResponseInterface;
19
use Psr\Http\Message\ServerRequestInterface;
20
use Psr\Http\Server\RequestHandlerInterface;
21
22
class AuthenticationMiddlewareTest extends TestCase
23
{
24
    public function testEmptySession(): void
25
    {
26
        $session = $this->process(false, null);
27
28
        self::assertFalse($session->has('user'));
29
        self::assertTrue($session->has('other'));
30
        self::assertNull(User::getCurrent());
31
    }
32
33
    public function testUserNotFound(): void
34
    {
35
        $user = null;
36
        $session = $this->process(true, $user);
37
38
        self::assertFalse($session->has('user'));
39
        self::assertFalse($session->has('other'));
40
        self::assertNull(User::getCurrent());
41
    }
42
43
    public function testUserTooOld(): void
44
    {
45
        $user = new User();
46
        $user->setActiveUntil(new Chronos('2000-01-02'));
47
        $session = $this->process(true, $user);
48
49
        self::assertFalse($session->has('user'));
50
        self::assertNull(User::getCurrent());
51
    }
52
53
    public function testUserStillActive(): void
54
    {
55
        $user = new User();
56
        $user->setActiveUntil(new Chronos('2099-01-02'));
57
        $session = $this->process(true, $user);
58
59
        self::assertTrue($session->has('user'));
60
        self::assertSame($user, User::getCurrent());
61
    }
62
63
    public function testUserNoLimit(): void
64
    {
65
        $user = new User();
66
        $session = $this->process(true, $user);
67
68
        self::assertTrue($session->has('user'));
69
        self::assertTrue($session->has('other'));
70
        self::assertSame($user, User::getCurrent());
71
    }
72
73
    private function process(bool $userInSession, ?User $user): SessionInterface
74
    {
75
        User::setCurrent(null);
76
77
        $userRepository = new class($user) extends UserRepository {
78
            public function __construct(private readonly ?User $user)
79
            {
80
            }
81
82
            public function getOneById(int $id): ?User
83
            {
84
                return $this->user;
85
            }
86
        };
87
88
        $session = new Session(['other' => 'foo']);
89
        if ($userInSession) {
90
            $session->set('user', 123);
91
        }
92
        $request = new ServerRequest();
93
        $request = $request->withAttribute(SessionMiddleware::SESSION_ATTRIBUTE, $session);
94
95
        $response = new Response();
96
        $handler = new class($response) implements RequestHandlerInterface {
97
            public function __construct(private readonly ResponseInterface $response)
98
            {
99
            }
100
101
            public function handle(ServerRequestInterface $request): ResponseInterface
102
            {
103
                return $this->response;
104
            }
105
        };
106
107
        $middleware = new AuthenticationMiddleware($userRepository, Site::Dilps);
108
        $middleware->process($request, $handler);
109
110
        return $session;
111
    }
112
}
113