From fc8502fe5f71578dad353b7a635d73f865bad3e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20=C5=9Eim=C5=9Fek?= Date: Fri, 17 May 2024 13:54:45 +0300 Subject: [PATCH] Add the when method for optional validation --- src/Attributes/Precondition.php | 4 ++ src/Contracts/PreconditionValidator.php | 8 ++++ src/Validators/PreconditionValidator.php | 10 +++- tests/Unit/Attributes/PreconditionTest.php | 47 +++++++++++++++++++ .../Unit/Fixtures/PrivateArticleValidator.php | 26 ++++++++++ 5 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 tests/Unit/Fixtures/PrivateArticleValidator.php diff --git a/src/Attributes/Precondition.php b/src/Attributes/Precondition.php index 655d02f..97395a5 100644 --- a/src/Attributes/Precondition.php +++ b/src/Attributes/Precondition.php @@ -23,6 +23,10 @@ public function __construct(string $validator) public function validate(Request $request): bool { + if (! $this->validator->when($request)) { + return true; + } + if (empty($this->validator->parameter($request))) { $this->validator->preProcess(); diff --git a/src/Contracts/PreconditionValidator.php b/src/Contracts/PreconditionValidator.php index 1c4663c..14d6126 100644 --- a/src/Contracts/PreconditionValidator.php +++ b/src/Contracts/PreconditionValidator.php @@ -8,7 +8,15 @@ interface PreconditionValidator { + public function when(Request $request): bool; + + public function preProcess(): void; + public function parameter(Request $request); public function __invoke(Request $request): bool; + + public function getRequiredMessage(): string; + + public function getFailedMessage(): string; } diff --git a/src/Validators/PreconditionValidator.php b/src/Validators/PreconditionValidator.php index 9a061c5..8019774 100644 --- a/src/Validators/PreconditionValidator.php +++ b/src/Validators/PreconditionValidator.php @@ -4,16 +4,17 @@ namespace OnurSimsek\Precondition\Validators; +use Illuminate\Http\Request; use OnurSimsek\Precondition\Contracts\PreconditionValidator as PreconditionValidatorContract; abstract class PreconditionValidator implements PreconditionValidatorContract { - final public function getRequiredMessage() + final public function getRequiredMessage(): string { return isset($this->messages()['required']) ? $this->messages()['required'] : config('precondition.required_message'); } - final public function getFailedMessage() + final public function getFailedMessage(): string { return isset($this->messages()['failed']) ? $this->messages()['failed'] : config('precondition.failed_message'); } @@ -33,4 +34,9 @@ public function preProcess(): void { // } + + public function when(Request $request): bool + { + return true; + } } diff --git a/tests/Unit/Attributes/PreconditionTest.php b/tests/Unit/Attributes/PreconditionTest.php index aff619e..b548347 100644 --- a/tests/Unit/Attributes/PreconditionTest.php +++ b/tests/Unit/Attributes/PreconditionTest.php @@ -11,6 +11,7 @@ use OnurSimsek\Precondition\Exceptions\PreconditionRequiredException; use OnurSimsek\Precondition\Tests\TestCase; use OnurSimsek\Precondition\Tests\Unit\Fixtures\LostUpdateValidator; +use OnurSimsek\Precondition\Tests\Unit\Fixtures\PrivateArticleValidator; use PHPUnit\Framework\Attributes\Test; class PreconditionTest extends TestCase @@ -81,4 +82,50 @@ public function it_can_be_validate_a_proper_request() self::assertTrue($this->precondition->validate($request)); } + + #[Test] + public function it_can_be_validate_sometimes() + { + $precondition = new Precondition(PrivateArticleValidator::class); + + $article = new \stdClass(); + $article->is_private = false; + + $request = $this->getMockBuilder(Request::class)->getMock(); + $request->expects($this->any()) + ->method('route') + ->with('article') + ->willReturn($article); + + self::assertTrue($precondition->validate($request)); + + // Private article required exception test + $article->is_private = true; + self::expectException(PreconditionRequiredException::class); + $precondition->validate($request); + + // Private article validation failed exception test + $request->expects($this->exactly(2)) + ->method('header') + ->with('X-Article-Secret-Code') + ->willReturn(1234); + + $article->is_private = true; + $article->secret_code = 4321; + + self::expectException(PreconditionFailedException::class); + $precondition->validate($request); + + // Private article validate test + $secret = 1234; + $request->expects($this->exactly(2)) + ->method('header') + ->with('X-Article-Secret-Code') + ->willReturn($secret); + + $article->is_private = true; + $article->secret_code = $secret; + + self::assertTrue($precondition->validate($request)); + } } diff --git a/tests/Unit/Fixtures/PrivateArticleValidator.php b/tests/Unit/Fixtures/PrivateArticleValidator.php new file mode 100644 index 0000000..9d450c7 --- /dev/null +++ b/tests/Unit/Fixtures/PrivateArticleValidator.php @@ -0,0 +1,26 @@ +route('article')->is_private; + } + + public function parameter(Request $request) + { + return $request->header('X-Article-Secret-Code'); + } + + public function __invoke(Request $request): bool + { + return $this->parameter($request) == $request->route('article')->secret_code; + } +}