mirror of
https://github.com/Respect/Validation.git
synced 2026-03-17 23:59:51 +01:00
The callable defined to the "Call" rule may also throw an exception and as we don't want to have errors nor exceptions that are not part of the Validation during the validation of inputs it just makes sense to intercept any instance of Throwable. This change was initially thought of because in Travis the version 7.4 of PHP was throwing "Error" instead of triggering PHP errors which made the tests fail. Signed-off-by: Henrique Moody <henriquemoody@gmail.com>
225 lines
5.1 KiB
PHP
225 lines
5.1 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of Respect/Validation.
|
|
*
|
|
* (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net>
|
|
*
|
|
* For the full copyright and license information, please view the "LICENSE.md"
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Respect\Validation\Rules;
|
|
|
|
use Exception;
|
|
use PHPUnit\Framework\TestCase;
|
|
use Respect\Validation\Exceptions\AlwaysInvalidException;
|
|
use Respect\Validation\Exceptions\CallException;
|
|
use Respect\Validation\Validatable;
|
|
|
|
/**
|
|
* @group rule
|
|
*
|
|
* @covers \Respect\Validation\Rules\Call
|
|
*
|
|
* @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net>
|
|
* @author Gabriel Caruso <carusogabriel34@gmail.com>
|
|
* @author Henrique Moody <henriquemoody@gmail.com>
|
|
* @author Nick Lombard <github@jigsoft.co.za>
|
|
*/
|
|
final class CallTest extends TestCase
|
|
{
|
|
/**
|
|
* @test
|
|
*/
|
|
public function assertShouldExecuteCallable(): void
|
|
{
|
|
$input = ' input ';
|
|
$callable = 'trim';
|
|
|
|
$rule = $this->createMock(Validatable::class);
|
|
$rule
|
|
->expects(self::once())
|
|
->method('assert')
|
|
->with($callable($input));
|
|
|
|
$sut = new Call($callable, $rule);
|
|
$sut->assert($input);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function assertShouldThrowCallExceptionWhenPhpTriggersAnError(): void
|
|
{
|
|
$input = [];
|
|
$callable = 'trim';
|
|
|
|
$rule = $this->createMock(Validatable::class);
|
|
$rule
|
|
->expects(self::never())
|
|
->method('assert');
|
|
|
|
$this->expectException(CallException::class);
|
|
|
|
$sut = new Call($callable, $rule);
|
|
$sut->assert($input);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function assertShouldThrowCallExceptionWhenCallableThrowsAnException(): void
|
|
{
|
|
$input = [];
|
|
$callable = function (): void {
|
|
throw new Exception();
|
|
};
|
|
|
|
$rule = $this->createMock(Validatable::class);
|
|
$rule
|
|
->expects(self::never())
|
|
->method('assert');
|
|
|
|
$this->expectException(CallException::class);
|
|
|
|
$sut = new Call($callable, $rule);
|
|
$sut->assert($input);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function assertShouldThrowExceptionOfTheDefinedRule(): void
|
|
{
|
|
$input = 'something';
|
|
$callable = 'trim';
|
|
|
|
$rule = new AlwaysInvalid();
|
|
|
|
$this->expectException(AlwaysInvalidException::class);
|
|
|
|
$sut = new Call($callable, $rule);
|
|
$sut->assert($input);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function checkShouldExecuteCallable(): void
|
|
{
|
|
$input = ' input ';
|
|
$callable = 'trim';
|
|
|
|
$rule = $this->createMock(Validatable::class);
|
|
$rule
|
|
->expects(self::once())
|
|
->method('check')
|
|
->with($callable($input));
|
|
|
|
$sut = new Call($callable, $rule);
|
|
$sut->check($input);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function checkShouldThrowCallExceptionWhenPhpTriggersAnError(): void
|
|
{
|
|
$input = [];
|
|
$callable = 'trim';
|
|
|
|
$rule = $this->createMock(Validatable::class);
|
|
$rule
|
|
->expects(self::never())
|
|
->method('check');
|
|
|
|
$this->expectException(CallException::class);
|
|
|
|
$sut = new Call($callable, $rule);
|
|
$sut->assert($input);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function checkShouldThrowCallExceptionWhenCallableThrowsAnException(): void
|
|
{
|
|
$input = [];
|
|
$callable = function (): void {
|
|
throw new Exception();
|
|
};
|
|
|
|
$rule = $this->createMock(Validatable::class);
|
|
$rule
|
|
->expects(self::never())
|
|
->method('check');
|
|
|
|
$this->expectException(CallException::class);
|
|
|
|
$sut = new Call($callable, $rule);
|
|
$sut->assert($input);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function checkShouldThrowExceptionOfTheDefinedRule(): void
|
|
{
|
|
$rule = new AlwaysInvalid();
|
|
|
|
$this->expectException(AlwaysInvalidException::class);
|
|
|
|
$sut = new Call('trim', $rule);
|
|
$sut->check('something');
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function validateShouldExecuteCallable(): void
|
|
{
|
|
$input = ' input ';
|
|
$callable = 'trim';
|
|
|
|
$rule = $this->createMock(Validatable::class);
|
|
$rule
|
|
->expects(self::once())
|
|
->method('check')
|
|
->with($callable($input));
|
|
|
|
$sut = new Call($callable, $rule);
|
|
|
|
self::assertTrue($sut->validate($input));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function validateShouldReturnFalseWhenPhpTriggersAnError(): void
|
|
{
|
|
$input = [];
|
|
$callable = 'trim';
|
|
|
|
$rule = $this->createMock(Validatable::class);
|
|
$rule
|
|
->expects(self::never())
|
|
->method('check');
|
|
|
|
$sut = new Call($callable, $rule);
|
|
|
|
self::assertFalse($sut->validate($input));
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function validateShouldReturnFalseWhenDefinedRuleFails(): void
|
|
{
|
|
$sut = new Call('trim', new AlwaysInvalid());
|
|
|
|
self::assertFalse($sut->validate('something'));
|
|
}
|
|
}
|