Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
63 / 63
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 Nyholm\Psr7\Response;
11use Phexium\Presentation\ResponseBuilder;
12
13test('Should initialize with custom response', function (): void {
14    $customResponse = new Response(404, ['X-Custom' => 'toto'], 'HTML');
15
16    $builder = new ResponseBuilder($customResponse);
17
18    $result = $builder->build();
19
20    expect($result->getStatusCode())->toBe(404);
21    expect($result->getHeader('X-Custom'))->toBe(['toto']);
22    expect($result->getBody()->getContents())->toBe('HTML');
23});
24
25test('Should set custom response', function (): void {
26    $customResponse = new Response(404, ['X-Custom' => 'toto'], 'HTML');
27
28    $builder = new ResponseBuilder(new Response());
29
30    $result = $builder->build();
31
32    expect($result->getStatusCode())->toBe(200);
33    expect($result->getHeader('X-Custom'))->toBe([]);
34    expect($result->getBody()->getContents())->toBe('');
35
36    $result = $builder->withResponse($customResponse)->build();
37
38    expect($result->getStatusCode())->toBe(404);
39    expect($result->getHeader('X-Custom'))->toBe(['toto']);
40    expect($result->getBody()->getContents())->toBe('HTML');
41});
42
43test('Should build HTML response with default charset', function (): void {
44    $builder = new ResponseBuilder(new Response());
45
46    $result = $builder
47        ->withHtml('<h1>Hello World</h1>')
48        ->build()
49    ;
50
51    expect($result->getStatusCode())->toBe(200);
52    expect($result->getHeaderLine('Content-Type'))->toBe('text/html; charset=utf-8');
53    expect((string) $result->getBody())->toBe('<h1>Hello World</h1>');
54});
55
56test('Should build JSON response with default charset', function (): void {
57    $builder = new ResponseBuilder(new Response());
58
59    $result = $builder
60        ->withJson(['message' => 'Hello World'])
61        ->build()
62    ;
63
64    expect($result->getStatusCode())->toBe(200);
65    expect($result->getHeaderLine('Content-Type'))->toBe('application/json; charset=utf-8');
66    expect((string) $result->getBody())->json()->toBe(['message' => 'Hello World']);
67});
68
69test('Should set custom header (replaces existing)', function (): void {
70    $builder = new ResponseBuilder(new Response());
71
72    $result = $builder
73        ->withHeader('X-Custom', 'value1')
74        ->withHeader('X-Custom', 'value2')
75        ->build()
76    ;
77
78    expect($result->getHeader('X-Custom'))->toBe(['value2']);
79});
80
81test('Should add custom header', function (): void {
82    $builder = new ResponseBuilder(new Response());
83
84    $result = $builder
85        ->withHeader('X-Custom', 'value1')
86        ->addHeader('X-Custom', 'value2')
87        ->build()
88    ;
89
90    expect($result->getHeader('X-Custom'))->toBe(['value1', 'value2']);
91});
92
93test('Should set custom status code', function (): void {
94    $builder = new ResponseBuilder(new Response());
95
96    $result = $builder->withStatus(404)->build();
97
98    expect($result->getStatusCode())->toBe(404);
99});