Skip to content

Commit

Permalink
Merge pull request #5 from onursimsek/feature/optional-validation
Browse files Browse the repository at this point in the history
Add the when method for optional validation
  • Loading branch information
onursimsek authored May 17, 2024
2 parents 372d54f + fc8502f commit 47b794b
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 2 deletions.
4 changes: 4 additions & 0 deletions src/Attributes/Precondition.php
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
8 changes: 8 additions & 0 deletions src/Contracts/PreconditionValidator.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
10 changes: 8 additions & 2 deletions src/Validators/PreconditionValidator.php
Original file line number Diff line number Diff line change
Expand Up @@ -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');
}
Expand All @@ -33,4 +34,9 @@ public function preProcess(): void
{
//
}

public function when(Request $request): bool
{
return true;
}
}
47 changes: 47 additions & 0 deletions tests/Unit/Attributes/PreconditionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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));
}
}
26 changes: 26 additions & 0 deletions tests/Unit/Fixtures/PrivateArticleValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

declare(strict_types=1);

namespace OnurSimsek\Precondition\Tests\Unit\Fixtures;

use Illuminate\Http\Request;
use OnurSimsek\Precondition\Validators\PreconditionValidator;

class PrivateArticleValidator extends PreconditionValidator
{
public function when(Request $request): bool
{
return $request->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;
}
}

0 comments on commit 47b794b

Please sign in to comment.