xref: /webtrees/tests/app/ValidatorTest.php (revision f6fdd7466ca895d4b685167619a017925064cccb)
1*f6fdd746SJonathan Jaubart<?php
2*f6fdd746SJonathan Jaubart
3*f6fdd746SJonathan Jaubart/**
4*f6fdd746SJonathan Jaubart * webtrees: online genealogy
5*f6fdd746SJonathan Jaubart * Copyright (C) 2021 webtrees development team
6*f6fdd746SJonathan Jaubart * This program is free software: you can redistribute it and/or modify
7*f6fdd746SJonathan Jaubart * it under the terms of the GNU General Public License as published by
8*f6fdd746SJonathan Jaubart * the Free Software Foundation, either version 3 of the License, or
9*f6fdd746SJonathan Jaubart * (at your option) any later version.
10*f6fdd746SJonathan Jaubart * This program is distributed in the hope that it will be useful,
11*f6fdd746SJonathan Jaubart * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*f6fdd746SJonathan Jaubart * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13*f6fdd746SJonathan Jaubart * GNU General Public License for more details.
14*f6fdd746SJonathan Jaubart * You should have received a copy of the GNU General Public License
15*f6fdd746SJonathan Jaubart * along with this program. If not, see <https://www.gnu.org/licenses/>.
16*f6fdd746SJonathan Jaubart */
17*f6fdd746SJonathan Jaubart
18*f6fdd746SJonathan Jaubartdeclare(strict_types=1);
19*f6fdd746SJonathan Jaubart
20*f6fdd746SJonathan Jaubartnamespace Fisharebest\Webtrees;
21*f6fdd746SJonathan Jaubart
22*f6fdd746SJonathan Jaubartuse Fisharebest\Webtrees\Http\Exceptions\HttpBadRequestException;
23*f6fdd746SJonathan Jaubartuse LogicException;
24*f6fdd746SJonathan Jaubart
25*f6fdd746SJonathan Jaubart/**
26*f6fdd746SJonathan Jaubart * Test harness for the class Validator
27*f6fdd746SJonathan Jaubart */
28*f6fdd746SJonathan Jaubartclass ValidatorTest extends TestCase
29*f6fdd746SJonathan Jaubart{
30*f6fdd746SJonathan Jaubart    /**
31*f6fdd746SJonathan Jaubart     * @covers \Fisharebest\Webtrees\Validator::array
32*f6fdd746SJonathan Jaubart     */
33*f6fdd746SJonathan Jaubart    public function testArrayParameter(): void
34*f6fdd746SJonathan Jaubart    {
35*f6fdd746SJonathan Jaubart        $parameters = ['param' => ['test'], 'invalid' => 'not_array'];
36*f6fdd746SJonathan Jaubart        $validator = new Validator($parameters);
37*f6fdd746SJonathan Jaubart
38*f6fdd746SJonathan Jaubart        self::assertSame(['test'], $validator->array('param'));
39*f6fdd746SJonathan Jaubart        self::assertNull($validator->array('invalid'));
40*f6fdd746SJonathan Jaubart        self::assertNull($validator->array('param2'));
41*f6fdd746SJonathan Jaubart    }
42*f6fdd746SJonathan Jaubart
43*f6fdd746SJonathan Jaubart    /**
44*f6fdd746SJonathan Jaubart     * @covers \Fisharebest\Webtrees\Validator::integer
45*f6fdd746SJonathan Jaubart     */
46*f6fdd746SJonathan Jaubart    public function testIntegerParameter(): void
47*f6fdd746SJonathan Jaubart    {
48*f6fdd746SJonathan Jaubart        $parameters = ['param' => '42', 'invalid' => 'not_int', 'integer' => 42];
49*f6fdd746SJonathan Jaubart        $validator = new Validator($parameters);
50*f6fdd746SJonathan Jaubart
51*f6fdd746SJonathan Jaubart        self::assertSame(42, $validator->integer('param'));
52*f6fdd746SJonathan Jaubart        self::assertNull($validator->integer('invalid'));
53*f6fdd746SJonathan Jaubart        self::assertNull($validator->integer('integer'));
54*f6fdd746SJonathan Jaubart        self::assertNull($validator->integer('param2'));
55*f6fdd746SJonathan Jaubart    }
56*f6fdd746SJonathan Jaubart
57*f6fdd746SJonathan Jaubart    /**
58*f6fdd746SJonathan Jaubart     * @covers \Fisharebest\Webtrees\Validator::string
59*f6fdd746SJonathan Jaubart     */
60*f6fdd746SJonathan Jaubart    public function testStringParameter(): void
61*f6fdd746SJonathan Jaubart    {
62*f6fdd746SJonathan Jaubart        $parameters = ['param' => 'test', 'invalid' => ['not_string']];
63*f6fdd746SJonathan Jaubart        $validator = new Validator($parameters);
64*f6fdd746SJonathan Jaubart
65*f6fdd746SJonathan Jaubart        self::assertSame('test', $validator->string('param'));
66*f6fdd746SJonathan Jaubart        self::assertNull($validator->string('invalid'));
67*f6fdd746SJonathan Jaubart        self::assertNull($validator->string('param2'));
68*f6fdd746SJonathan Jaubart    }
69*f6fdd746SJonathan Jaubart
70*f6fdd746SJonathan Jaubart    /**
71*f6fdd746SJonathan Jaubart     * @covers \Fisharebest\Webtrees\Validator::requiredArray
72*f6fdd746SJonathan Jaubart     */
73*f6fdd746SJonathan Jaubart    public function testRequiredArrayParameter(): void
74*f6fdd746SJonathan Jaubart    {
75*f6fdd746SJonathan Jaubart        $parameters = ['param' => ['test'], 'invalid' => 'not_array'];
76*f6fdd746SJonathan Jaubart        $validator = new Validator($parameters);
77*f6fdd746SJonathan Jaubart
78*f6fdd746SJonathan Jaubart        self::assertSame(['test'], $validator->requiredArray('param'));
79*f6fdd746SJonathan Jaubart
80*f6fdd746SJonathan Jaubart        $this->expectException(HttpBadRequestException::class);
81*f6fdd746SJonathan Jaubart        $validator->requiredArray('invalid');
82*f6fdd746SJonathan Jaubart    }
83*f6fdd746SJonathan Jaubart
84*f6fdd746SJonathan Jaubart    /**
85*f6fdd746SJonathan Jaubart     * @covers \Fisharebest\Webtrees\Validator::requiredInteger
86*f6fdd746SJonathan Jaubart     */
87*f6fdd746SJonathan Jaubart    public function testRequiredIntegerParameter(): void
88*f6fdd746SJonathan Jaubart    {
89*f6fdd746SJonathan Jaubart        $parameters = ['param' => '42', 'invalid' => 'not_int'];
90*f6fdd746SJonathan Jaubart        $validator = new Validator($parameters);
91*f6fdd746SJonathan Jaubart
92*f6fdd746SJonathan Jaubart        self::assertSame(42, $validator->requiredInteger('param'));
93*f6fdd746SJonathan Jaubart
94*f6fdd746SJonathan Jaubart        $this->expectException(HttpBadRequestException::class);
95*f6fdd746SJonathan Jaubart        $validator->requiredInteger('invalid');
96*f6fdd746SJonathan Jaubart    }
97*f6fdd746SJonathan Jaubart
98*f6fdd746SJonathan Jaubart    /**
99*f6fdd746SJonathan Jaubart     * @covers \Fisharebest\Webtrees\Validator::requiredString
100*f6fdd746SJonathan Jaubart     */
101*f6fdd746SJonathan Jaubart    public function testRequiredStringParameter(): void
102*f6fdd746SJonathan Jaubart    {
103*f6fdd746SJonathan Jaubart        $parameters = ['param' => 'test', 'invalid' => ['not_string']];
104*f6fdd746SJonathan Jaubart        $validator = new Validator($parameters);
105*f6fdd746SJonathan Jaubart
106*f6fdd746SJonathan Jaubart        self::assertSame('test', $validator->requiredString('param'));
107*f6fdd746SJonathan Jaubart
108*f6fdd746SJonathan Jaubart        $this->expectException(HttpBadRequestException::class);
109*f6fdd746SJonathan Jaubart        $validator->requiredString('invalid');
110*f6fdd746SJonathan Jaubart    }
111*f6fdd746SJonathan Jaubart
112*f6fdd746SJonathan Jaubart    /**
113*f6fdd746SJonathan Jaubart     * @covers \Fisharebest\Webtrees\Validator::isBetween
114*f6fdd746SJonathan Jaubart     */
115*f6fdd746SJonathan Jaubart    public function testIsBetweenParameter(): void
116*f6fdd746SJonathan Jaubart    {
117*f6fdd746SJonathan Jaubart        $parameters = ['param' => '42', 'invalid' => '10', 'wrongtype' => 'not_integer'];
118*f6fdd746SJonathan Jaubart        $validator = (new Validator($parameters))->isBetween(40, 45);
119*f6fdd746SJonathan Jaubart
120*f6fdd746SJonathan Jaubart        self::assertSame(42, $validator->integer('param'));
121*f6fdd746SJonathan Jaubart        self::assertNull($validator->integer('invalid'));
122*f6fdd746SJonathan Jaubart        self::assertNull($validator->integer('wrongtype'));
123*f6fdd746SJonathan Jaubart
124*f6fdd746SJonathan Jaubart        $this->expectException(LogicException::class);
125*f6fdd746SJonathan Jaubart        $validator->string('wrongtype');
126*f6fdd746SJonathan Jaubart    }
127*f6fdd746SJonathan Jaubart
128*f6fdd746SJonathan Jaubart    /**
129*f6fdd746SJonathan Jaubart     * @covers \Fisharebest\Webtrees\Validator::isXref
130*f6fdd746SJonathan Jaubart     */
131*f6fdd746SJonathan Jaubart    public function testIsXrefParameter(): void
132*f6fdd746SJonathan Jaubart    {
133*f6fdd746SJonathan Jaubart        $parameters = [
134*f6fdd746SJonathan Jaubart            'param' => 'X1',
135*f6fdd746SJonathan Jaubart            'param2' => ['X2', 'X3'],
136*f6fdd746SJonathan Jaubart            'invalid' => '@X1@',
137*f6fdd746SJonathan Jaubart            'invalid2' => ['X2', '#X4!'],
138*f6fdd746SJonathan Jaubart            'wrongtype' => '42'
139*f6fdd746SJonathan Jaubart        ];
140*f6fdd746SJonathan Jaubart        $validator = (new Validator($parameters))->isXref();
141*f6fdd746SJonathan Jaubart
142*f6fdd746SJonathan Jaubart        self::assertSame('X1', $validator->string('param'));
143*f6fdd746SJonathan Jaubart        self::assertSame(['X2', 'X3'], $validator->array('param2'));
144*f6fdd746SJonathan Jaubart        self::assertNull($validator->string('param2'));
145*f6fdd746SJonathan Jaubart        self::assertNull($validator->string('invalid'));
146*f6fdd746SJonathan Jaubart        self::assertNull($validator->array('invalid2'));
147*f6fdd746SJonathan Jaubart
148*f6fdd746SJonathan Jaubart        $this->expectException(LogicException::class);
149*f6fdd746SJonathan Jaubart        $validator->integer('wrongtype');
150*f6fdd746SJonathan Jaubart    }
151*f6fdd746SJonathan Jaubart
152*f6fdd746SJonathan Jaubart    /**
153*f6fdd746SJonathan Jaubart     * @covers \Fisharebest\Webtrees\Validator::isLocalUrl
154*f6fdd746SJonathan Jaubart     */
155*f6fdd746SJonathan Jaubart    public function testIsLocalUrlParameter(): void
156*f6fdd746SJonathan Jaubart    {
157*f6fdd746SJonathan Jaubart        $parameters = [
158*f6fdd746SJonathan Jaubart            'param' => 'http://example.local/wt/page',
159*f6fdd746SJonathan Jaubart            'noscheme' => '//example.local/wt/page',
160*f6fdd746SJonathan Jaubart            'https' => 'https://example.local/wt/page',
161*f6fdd746SJonathan Jaubart            'invalid' => 'http://example.com/wt/page',
162*f6fdd746SJonathan Jaubart            'wrongtype' => '42'
163*f6fdd746SJonathan Jaubart        ];
164*f6fdd746SJonathan Jaubart        $validator = (new Validator($parameters))->isLocalUrl('http://example.local/wt');
165*f6fdd746SJonathan Jaubart
166*f6fdd746SJonathan Jaubart        self::assertSame('http://example.local/wt/page', $validator->string('param'));
167*f6fdd746SJonathan Jaubart        self::assertSame('//example.local/wt/page', $validator->string('noscheme'));
168*f6fdd746SJonathan Jaubart        self::assertNull($validator->string('https'));
169*f6fdd746SJonathan Jaubart        self::assertNull($validator->string('invalid'));
170*f6fdd746SJonathan Jaubart        self::assertNull($validator->integer('param'));
171*f6fdd746SJonathan Jaubart
172*f6fdd746SJonathan Jaubart        $this->expectException(LogicException::class);
173*f6fdd746SJonathan Jaubart        $validator->integer('wrongtype');
174*f6fdd746SJonathan Jaubart    }
175*f6fdd746SJonathan Jaubart
176*f6fdd746SJonathan Jaubart    /**
177*f6fdd746SJonathan Jaubart     * @covers \Fisharebest\Webtrees\Validator::isLocalUrl
178*f6fdd746SJonathan Jaubart     */
179*f6fdd746SJonathan Jaubart    public function testIsLocalUrlWithInvalidBaseUrl(): void
180*f6fdd746SJonathan Jaubart    {
181*f6fdd746SJonathan Jaubart        $this->expectException(LogicException::class);
182*f6fdd746SJonathan Jaubart        (new Validator(['param' => 'test']))->isLocalUrl('http://:invalid.url/')->string('param');
183*f6fdd746SJonathan Jaubart    }
184*f6fdd746SJonathan Jaubart
185*f6fdd746SJonathan Jaubart    /**
186*f6fdd746SJonathan Jaubart     * @covers \Fisharebest\Webtrees\Validator::__construct
187*f6fdd746SJonathan Jaubart     * @covers \Fisharebest\Webtrees\Validator::parsedBody
188*f6fdd746SJonathan Jaubart     */
189*f6fdd746SJonathan Jaubart    public function testParsedBody(): void
190*f6fdd746SJonathan Jaubart    {
191*f6fdd746SJonathan Jaubart        $request = self::createRequest()->withQueryParams(['param' => 'test']);
192*f6fdd746SJonathan Jaubart        self::assertNull(Validator::parsedBody($request)->string('param'));
193*f6fdd746SJonathan Jaubart
194*f6fdd746SJonathan Jaubart        $request = self::createRequest()->withParsedBody(['param' => 'test']);
195*f6fdd746SJonathan Jaubart        self::assertSame('test', Validator::parsedBody($request)->string('param'));
196*f6fdd746SJonathan Jaubart    }
197*f6fdd746SJonathan Jaubart
198*f6fdd746SJonathan Jaubart    /**
199*f6fdd746SJonathan Jaubart     * @covers \Fisharebest\Webtrees\Validator::__construct
200*f6fdd746SJonathan Jaubart     * @covers \Fisharebest\Webtrees\Validator::queryParams
201*f6fdd746SJonathan Jaubart     */
202*f6fdd746SJonathan Jaubart    public function testQueryParams(): void
203*f6fdd746SJonathan Jaubart    {
204*f6fdd746SJonathan Jaubart        $request = self::createRequest()->withParsedBody(['param' => 'test']);
205*f6fdd746SJonathan Jaubart        self::assertNull(Validator::queryParams($request)->string('param'));
206*f6fdd746SJonathan Jaubart
207*f6fdd746SJonathan Jaubart        $request = self::createRequest()->withQueryParams(['param' => 'test']);
208*f6fdd746SJonathan Jaubart        self::assertSame('test', Validator::queryParams($request)->string('param'));
209*f6fdd746SJonathan Jaubart    }
210*f6fdd746SJonathan Jaubart}
211