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