Skip to content

Commit fc8502f

Browse files
committed
Add the when method for optional validation
1 parent 372d54f commit fc8502f

File tree

5 files changed

+93
-2
lines changed

5 files changed

+93
-2
lines changed

src/Attributes/Precondition.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ public function __construct(string $validator)
2323

2424
public function validate(Request $request): bool
2525
{
26+
if (! $this->validator->when($request)) {
27+
return true;
28+
}
29+
2630
if (empty($this->validator->parameter($request))) {
2731
$this->validator->preProcess();
2832

src/Contracts/PreconditionValidator.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,15 @@
88

99
interface PreconditionValidator
1010
{
11+
public function when(Request $request): bool;
12+
13+
public function preProcess(): void;
14+
1115
public function parameter(Request $request);
1216

1317
public function __invoke(Request $request): bool;
18+
19+
public function getRequiredMessage(): string;
20+
21+
public function getFailedMessage(): string;
1422
}

src/Validators/PreconditionValidator.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,17 @@
44

55
namespace OnurSimsek\Precondition\Validators;
66

7+
use Illuminate\Http\Request;
78
use OnurSimsek\Precondition\Contracts\PreconditionValidator as PreconditionValidatorContract;
89

910
abstract class PreconditionValidator implements PreconditionValidatorContract
1011
{
11-
final public function getRequiredMessage()
12+
final public function getRequiredMessage(): string
1213
{
1314
return isset($this->messages()['required']) ? $this->messages()['required'] : config('precondition.required_message');
1415
}
1516

16-
final public function getFailedMessage()
17+
final public function getFailedMessage(): string
1718
{
1819
return isset($this->messages()['failed']) ? $this->messages()['failed'] : config('precondition.failed_message');
1920
}
@@ -33,4 +34,9 @@ public function preProcess(): void
3334
{
3435
//
3536
}
37+
38+
public function when(Request $request): bool
39+
{
40+
return true;
41+
}
3642
}

tests/Unit/Attributes/PreconditionTest.php

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use OnurSimsek\Precondition\Exceptions\PreconditionRequiredException;
1212
use OnurSimsek\Precondition\Tests\TestCase;
1313
use OnurSimsek\Precondition\Tests\Unit\Fixtures\LostUpdateValidator;
14+
use OnurSimsek\Precondition\Tests\Unit\Fixtures\PrivateArticleValidator;
1415
use PHPUnit\Framework\Attributes\Test;
1516

1617
class PreconditionTest extends TestCase
@@ -81,4 +82,50 @@ public function it_can_be_validate_a_proper_request()
8182

8283
self::assertTrue($this->precondition->validate($request));
8384
}
85+
86+
#[Test]
87+
public function it_can_be_validate_sometimes()
88+
{
89+
$precondition = new Precondition(PrivateArticleValidator::class);
90+
91+
$article = new \stdClass();
92+
$article->is_private = false;
93+
94+
$request = $this->getMockBuilder(Request::class)->getMock();
95+
$request->expects($this->any())
96+
->method('route')
97+
->with('article')
98+
->willReturn($article);
99+
100+
self::assertTrue($precondition->validate($request));
101+
102+
// Private article required exception test
103+
$article->is_private = true;
104+
self::expectException(PreconditionRequiredException::class);
105+
$precondition->validate($request);
106+
107+
// Private article validation failed exception test
108+
$request->expects($this->exactly(2))
109+
->method('header')
110+
->with('X-Article-Secret-Code')
111+
->willReturn(1234);
112+
113+
$article->is_private = true;
114+
$article->secret_code = 4321;
115+
116+
self::expectException(PreconditionFailedException::class);
117+
$precondition->validate($request);
118+
119+
// Private article validate test
120+
$secret = 1234;
121+
$request->expects($this->exactly(2))
122+
->method('header')
123+
->with('X-Article-Secret-Code')
124+
->willReturn($secret);
125+
126+
$article->is_private = true;
127+
$article->secret_code = $secret;
128+
129+
self::assertTrue($precondition->validate($request));
130+
}
84131
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OnurSimsek\Precondition\Tests\Unit\Fixtures;
6+
7+
use Illuminate\Http\Request;
8+
use OnurSimsek\Precondition\Validators\PreconditionValidator;
9+
10+
class PrivateArticleValidator extends PreconditionValidator
11+
{
12+
public function when(Request $request): bool
13+
{
14+
return $request->route('article')->is_private;
15+
}
16+
17+
public function parameter(Request $request)
18+
{
19+
return $request->header('X-Article-Secret-Code');
20+
}
21+
22+
public function __invoke(Request $request): bool
23+
{
24+
return $this->parameter($request) == $request->route('article')->secret_code;
25+
}
26+
}

0 commit comments

Comments
 (0)