Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1441 ariadna 1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
4
// Moodle is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8
//
9
// Moodle is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
 
17
namespace core\router\schema\parameters;
18
 
19
use core\param;
20
use core\tests\router\route_testcase;
21
use GuzzleHttp\Psr7\ServerRequest;
22
use invalid_parameter_exception;
23
use Psr\Http\Message\ServerRequestInterface;
24
use ValueError;
25
 
26
/**
27
 * Tests for header objects.
28
 *
29
 * @package    core
30
 * @copyright  Andrew Lyons <andrew@nicols.co.uk>
31
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
32
 * @covers     \core\router\schema\parameters\header_object
33
 */
34
final class header_object_test extends route_testcase {
35
    public function test_validate(): void {
36
        $param = new header_object(
37
            name: 'example',
38
            type: param::TEXT,
39
        );
40
 
41
        /** @var ServerRequestInterface $request */ // phpcs:ignore moodle.Commenting.InlineComment.DocBlock
42
        $request = (new ServerRequest('GET', 'http://example.com'))
43
            // A known header.
44
            ->withHeader('Accept', 'application/json')
45
            // An unknown header is kept.
46
            ->withHeader('X-Example', 'example')
47
            // A known header with multiple values.
48
            ->withAddedHeader('X-Multiple', 'value1')
49
            ->withAddedHeader('X-Multiple', 'value2')
50
            // An unknown header with multiple values.
51
            ->withAddedHeader('X-Unknown', 'value1')
52
            ->withAddedHeader('X-Unknown', 'value2');
53
 
54
        $result = $param->validate($request);
55
        $this->assertInstanceOf(ServerRequestInterface::class, $result);
56
 
57
        $this->assertEquals('application/json', $result->getHeaderLine('Accept'));
58
        $this->assertEquals('example', $result->getHeaderLine('X-Example'));
59
        $this->assertEquals(['value1', 'value2'], $result->getHeader('X-Multiple'));
60
        $this->assertEquals(['value1', 'value2'], $result->getHeader('X-Unknown'));
61
    }
62
 
63
    public function test_required_missing(): void {
64
        $request = new ServerRequest('GET', 'http://example.com');
65
        $param = new header_object(
66
            name: 'example',
67
            type: param::TEXT,
68
            required: true,
69
        );
70
 
71
        $this->expectException(invalid_parameter_exception::class);
72
        $param->validate($request);
73
    }
74
 
75
    public function test_optional_default(): void {
76
        $request = new ServerRequest('GET', 'http://example.com');
77
        $param = new header_object(
78
            name: 'example',
79
            type: param::TEXT,
80
            required: false,
81
            default: 'default',
82
        );
83
 
84
        $request = $param->validate($request);
85
        $this->assertEquals('default', $request->getHeaderLine('example'));
86
    }
87
 
88
    public function test_optional_without_default(): void {
89
        $request = new ServerRequest('GET', 'http://example.com');
90
        $param = new header_object(
91
            name: 'example',
92
            type: param::TEXT,
93
            required: false,
94
        );
95
 
96
        $request = $param->validate($request);
97
        $this->assertEquals(null, $request->getHeaderLine('example'));
98
    }
99
 
100
    public function test_multiple_allowed(): void {
101
        $request = new ServerRequest('GET', 'http://example.com');
102
        $request = $request
103
            ->withAddedHeader('example', 'value1')
104
            ->withAddedHeader('example', 'value2');
105
        $param = new header_object(
106
            name: 'example',
107
            type: param::TEXT,
108
            multiple: true,
109
        );
110
 
111
        $request = $param->validate($request);
112
        $this->assertEquals(['value1', 'value2'], $request->getHeader('example'));
113
    }
114
 
115
    public function test_multiple_not_allowed(): void {
116
        $request = new ServerRequest('GET', 'http://example.com');
117
        $request = $request
118
            ->withAddedHeader('example', 'value1')
119
            ->withAddedHeader('example', 'value2');
120
        $param = new header_object(
121
            name: 'example',
122
            type: param::TEXT,
123
            multiple: false,
124
        );
125
 
126
        $this->expectException(invalid_parameter_exception::class);
127
        $param->validate($request);
128
    }
129
 
130
    public function test_boolean_param(): void {
131
        $request = (new ServerRequest('GET', 'http://example.com'))
132
            ->withHeader('example', 'true');
133
        $param = new header_object(
134
            name: 'example',
135
            type: param::BOOL,
136
        );
137
 
138
        $request = $param->validate($request);
139
        $this->assertEquals([true], $request->getHeader('example'));
140
    }
141
 
142
    public function test_multiple_boolean_param(): void {
143
        $request = (new ServerRequest('GET', 'http://example.com'))
144
            ->withAddedHeader('example', 'true')
145
            ->withAddedHeader('example', 'false')
146
            ->withAddedHeader('example', 'true');
147
        $param = new header_object(
148
            name: 'example',
149
            type: param::BOOL,
150
            multiple: true,
151
        );
152
 
153
        $request = $param->validate($request);
154
        $this->assertEquals([true, false, true], $request->getHeader('example'));
155
    }
156
 
157
    public function test_multiple_boolean_param_invalid(): void {
158
        $request = (new ServerRequest('GET', 'http://example.com'))
159
            ->withAddedHeader('example', 'true')
160
            ->withAddedHeader('example', '0')
161
            ->withAddedHeader('example', 'true');
162
        $param = new header_object(
163
            name: 'example',
164
            type: param::BOOL,
165
            multiple: true,
166
        );
167
 
168
        $this->expectException(ValueError::class);
169
        $param->validate($request);
170
    }
171
}