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
c 0
b 0
f 0
dl 0
loc 8
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ApplicationTest\Middleware;
6
7
use Application\Enum\UserStatus;
8
use Application\Middleware\AuthenticationMiddleware;
9
use Application\Model\User;
10
use Application\Repository\UserRepository;
11
use Laminas\Diactoros\Response;
12
use Laminas\Diactoros\ServerRequest;
13
use Mezzio\Session\Session;
14
use Mezzio\Session\SessionInterface;
15
use Mezzio\Session\SessionMiddleware;
16
use PHPUnit\Framework\TestCase;
17
use Psr\Http\Message\ResponseInterface;
18
use Psr\Http\Message\ServerRequestInterface;
19
use Psr\Http\Server\RequestHandlerInterface;
20
21
class AuthenticationMiddlewareTest extends TestCase
22
{
23
    public function testEmptySession(): void
24
    {
25
        $session = $this->process(false, null);
26
27
        self::assertFalse($session->has('user'));
28
        self::assertTrue($session->has('other'));
29
        self::assertNull(User::getCurrent());
30
    }
31
32
    public function testUserNotFound(): void
33
    {
34
        $user = null;
35
        $session = $this->process(true, $user);
36
37
        self::assertFalse($session->has('user'));
38
        self::assertFalse($session->has('other'));
39
        self::assertNull(User::getCurrent());
40
    }
41
42
    public function testUserNoLimit(): void
43
    {
44
        $user = new User();
45
        $session = $this->process(true, $user);
46
47
        self::assertTrue($session->has('user'));
48
        self::assertTrue($session->has('other'));
49
        self::assertSame($user, User::getCurrent());
50
    }
51
52
    public function testUserArchived(): void
53
    {
54
        $user = new User();
55
        $user->setStatus(UserStatus::Archived);
56
        $session = $this->process(true, $user);
57
58
        self::assertFalse($session->has('user'));
59
        self::assertFalse($session->has('other'));
60
        self::assertNull(User::getCurrent());
61
    }
62
63
    private function process(bool $userInSession, ?User $user): SessionInterface
64
    {
65
        User::setCurrent(null);
66
67
        $userRepository = new class($user) extends UserRepository {
68
            public function __construct(
69
                private readonly ?User $user,
70
            ) {}
71
72
            public function getOneById(int $id): ?User
73
            {
74
                return $this->user;
75
            }
76
        };
77
78
        $session = new Session(['other' => 'foo']);
79
        if ($userInSession) {
80
            $session->set('user', 123);
81
        }
82
        $request = new ServerRequest();
83
        $request = $request->withAttribute(SessionMiddleware::SESSION_ATTRIBUTE, $session);
84
85
        $response = new Response();
86
        $handler = new class($response) implements RequestHandlerInterface {
87
            public function __construct(
88
                private readonly ResponseInterface $response,
89
            ) {}
90
91
            public function handle(ServerRequestInterface $request): ResponseInterface
92
            {
93
                return $this->response;
94
            }
95
        };
96
97
        $middleware = new AuthenticationMiddleware($userRepository);
98
        $middleware->process($request, $handler);
99
100
        return $session;
101
    }
102
}
103