Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
53 / 53
100.00% covered (success)
100.00%
1 / 1
CRAP
n/a
0 / 0
getConcreteApiController
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
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 Nyholm\Psr7\Response;
11use Phexium\Application\AbstractApiController;
12use Phexium\Presentation\ResponseBuilder;
13use Phexium\Presentation\ResponseBuilderInterface;
14use Psr\Http\Message\ResponseInterface;
15
16function getConcreteApiController(ResponseBuilderInterface $responseBuilder): AbstractApiController
17{
18    return new readonly class($responseBuilder) extends AbstractApiController {
19        public function __construct(ResponseBuilderInterface $responseBuilder)
20        {
21            $this->responseBuilder = $responseBuilder;
22        }
23
24        public function exposeJsonSuccess(ResponseInterface $response, array $payload, int $statusCode = 200): ResponseInterface
25        {
26            return $this->jsonSuccess($response, $payload, $statusCode);
27        }
28
29        public function exposeJsonCreated(ResponseInterface $response): ResponseInterface
30        {
31            return $this->jsonCreated($response);
32        }
33
34        public function exposeJsonError(ResponseInterface $response, int $statusCode, string $message): ResponseInterface
35        {
36            return $this->jsonError($response, $statusCode, $message);
37        }
38    };
39}
40
41test('jsonSuccess() returns JSON response with payload and default status 200', function (): void {
42    $response = new Response();
43    $responseBuilder = new ResponseBuilder($response);
44    $controller = getConcreteApiController($responseBuilder);
45
46    $result = $controller->exposeJsonSuccess($response, ['data' => 'test']);
47
48    expect($result->getStatusCode())->toBe(200)
49        ->and($result->getHeaderLine('Content-Type'))->toBe('application/json; charset=utf-8')
50        ->and((string) $result->getBody())->toContain('"data": "test"')
51    ;
52});
53
54test('jsonSuccess() returns JSON response with custom status code', function (): void {
55    $response = new Response();
56    $responseBuilder = new ResponseBuilder($response);
57    $controller = getConcreteApiController($responseBuilder);
58
59    $result = $controller->exposeJsonSuccess($response, ['accepted' => true], 202);
60
61    expect($result->getStatusCode())->toBe(202)
62        ->and($result->getHeaderLine('Content-Type'))->toBe('application/json; charset=utf-8')
63        ->and((string) $result->getBody())->toContain('"accepted": true')
64    ;
65});
66
67test('jsonCreated() returns response with status 201', function (): void {
68    $response = new Response();
69    $responseBuilder = new ResponseBuilder($response);
70    $controller = getConcreteApiController($responseBuilder);
71
72    $result = $controller->exposeJsonCreated($response);
73
74    expect($result->getStatusCode())->toBe(201);
75});
76
77test('jsonError() returns JSON response with error message', function (): void {
78    $response = new Response();
79    $responseBuilder = new ResponseBuilder($response);
80    $controller = getConcreteApiController($responseBuilder);
81
82    $result = $controller->exposeJsonError($response, 400, 'Invalid input');
83
84    expect($result->getStatusCode())->toBe(400)
85        ->and($result->getHeaderLine('Content-Type'))->toBe('application/json; charset=utf-8')
86        ->and((string) $result->getBody())->toContain('"error": "Invalid input"')
87    ;
88});
89
90test('jsonError() returns JSON response with 404 status', function (): void {
91    $response = new Response();
92    $responseBuilder = new ResponseBuilder($response);
93    $controller = getConcreteApiController($responseBuilder);
94
95    $result = $controller->exposeJsonError($response, 404, 'Not found');
96
97    expect($result->getStatusCode())->toBe(404)
98        ->and($result->getHeaderLine('Content-Type'))->toBe('application/json; charset=utf-8')
99        ->and((string) $result->getBody())->toContain('"error": "Not found"')
100    ;
101});