Skip to content

Commit 032c8da

Browse files
committed
fix support for Enum validation rule
1 parent 5a1e177 commit 032c8da

File tree

7 files changed

+52
-180
lines changed

7 files changed

+52
-180
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ Of course you can provide your own custom validation Rules:
102102
```php
103103
it('throws validation error', function () {
104104
$this->postJson('/')
105-
->assertJsonValidationErrorRule('foo', new MyCustomRule());
105+
->assertJsonValidationErrorRule('foo', new Uppercase());
106106
});
107107
```
108108

src/JsonValidation.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
namespace DaniloPolani\JsonValidation;
44

55
use DaniloPolani\JsonValidation\Contracts\HasRuleMessage;
6+
use Illuminate\Validation\Rules\Enum as EnumRule;
67
use Illuminate\Support\Facades\App;
78

89
class JsonValidation
910
{
1011
/**
1112
* Get the error messages for an attribute and a validation rule.
1213
*/
13-
public static function getRuleErrorMessage(string $attribute, string|HasRuleMessage $rule): array
14+
public static function getRuleErrorMessage(string $attribute, string|HasRuleMessage|EnumRule $rule): array
1415
{
1516
return (new Validator(App::make('translator'), [], []))
1617
->getErrorMessage(...func_get_args());

src/JsonValidationServiceProvider.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace DaniloPolani\JsonValidation;
44

55
use DaniloPolani\JsonValidation\Contracts\HasRuleMessage;
6+
use Illuminate\Validation\Rules\Enum as EnumRule;
67
use Illuminate\Support\Facades\App;
78
use Illuminate\Testing\Assert as PHPUnit;
89
use Illuminate\Testing\TestResponse;
@@ -22,13 +23,9 @@ public function packageBooted(): void
2223
'assertJsonValidationErrorRule',
2324
/**
2425
* Assert that the response has the given JSON validation errors.
25-
*
26-
* @param string|array $attribute
27-
* @param string|\Illuminate\Contracts\Validation\Rule|null $rule
28-
* @param string $responseKey
2926
* @return self
3027
*/
31-
function (string|array $attribute, string|HasRuleMessage|null $rule = null, string $responseKey = 'errors') {
28+
function (string|array $attribute, string|HasRuleMessage|EnumRule|null $rule = null, string $responseKey = 'errors') {
3229
$validationRules = $attribute;
3330

3431
if (is_string($attribute)) {

src/Validator.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace DaniloPolani\JsonValidation;
44

55
use DaniloPolani\JsonValidation\Contracts\HasRuleMessage;
6+
use Illuminate\Validation\Rules\Enum as EnumRule;
67
use Illuminate\Support\Str;
78
use Illuminate\Validation\ValidationRuleParser;
89

@@ -23,7 +24,7 @@ class Validator extends \Illuminate\Validation\Validator
2324
/**
2425
* Get the error messages for an attribute and a validation rule.
2526
*/
26-
public function getErrorMessage(string $attribute, string|HasRuleMessage $rule): array
27+
public function getErrorMessage(string $attribute, string|HasRuleMessage|EnumRule $rule): array
2728
{
2829
if ($rule instanceof HasRuleMessage) {
2930
$messages = $rule->message();
@@ -42,6 +43,12 @@ public function getErrorMessage(string $attribute, string|HasRuleMessage $rule):
4243
return $result;
4344
}
4445

46+
if ($rule instanceof EnumRule) {
47+
return [
48+
str_replace(':attribute', $attribute, $this->getMessage($attribute, 'enum')),
49+
];
50+
}
51+
4552
[$rule, $parameters] = ValidationRuleParser::parse($rule);
4653
$result = [];
4754

tests/TestResponseTest.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
<?php
22

33
use DaniloPolani\JsonValidation\Contracts\HasRuleMessage;
4+
use DaniloPolani\JsonValidation\Tests\TestEnumRole;
45
use Illuminate\Contracts\Validation\ValidationRule;
56
use Illuminate\Http\Response;
67
use Illuminate\Testing\TestResponse;
8+
use Illuminate\Validation\Rules\Enum;
79
use PHPUnit\Framework\ExpectationFailedException;
810

911
it('accepts a string as field name', function () {
@@ -33,7 +35,8 @@
3335
});
3436

3537
it('accepts a custom rule', function () {
36-
$rule = new class () implements ValidationRule, HasRuleMessage {
38+
$rule = new class() implements ValidationRule, HasRuleMessage
39+
{
3740
public function validate(string $attribute, mixed $value, \Closure $fail): void
3841
{
3942
return;
@@ -57,6 +60,19 @@ public function message(): string
5760
$testResponse->assertJsonValidationErrorRule('key', $rule);
5861
});
5962

63+
it('accepts "Enum" rule', function () {
64+
$data = [
65+
'response' => 'error',
66+
'errors' => ['key' => 'The selected key is invalid.'],
67+
];
68+
69+
$testResponse = TestResponse::fromBaseResponse(
70+
(new Response())->setContent(json_encode($data))
71+
);
72+
73+
$testResponse->assertJsonValidationErrorRule('key', new Enum(TestEnumRole::class));
74+
});
75+
6076
it('throws error when field is a string and rule is not provided', function () {
6177
$response = TestResponse::fromBaseResponse(new Response());
6278
$response->assertJsonValidationErrorRule('foo');

tests/ValidationRuleMessageTest.php

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
use DaniloPolani\JsonValidation\Contracts\HasRuleMessage;
44
use DaniloPolani\JsonValidation\JsonValidation;
5+
use DaniloPolani\JsonValidation\Tests\TestEnumRole;
56
use Illuminate\Contracts\Validation\ValidationRule;
67
use Illuminate\Support\Collection;
78
use Illuminate\Support\Facades\App;
89
use Illuminate\Translation\ArrayLoader;
910
use Illuminate\Translation\Translator;
11+
use Illuminate\Validation\Rules\Enum;
12+
13+
$rules = require './vendor/laravel/framework/src/Illuminate/Translation/lang/en/validation.php';
1014

11-
$rules = require './tests/validation.php';
1215
$rulesToLoad = Collection::make($rules)->mapWithKeys(fn (mixed $value, string $key) => [
1316
'validation.' . $key => $value,
1417
])->toArray();
@@ -35,7 +38,8 @@
3538
});
3639

3740
it('extracts the error message from a custom rule', function () {
38-
$rule = new class () implements ValidationRule, HasRuleMessage {
41+
$rule = new class() implements ValidationRule, HasRuleMessage
42+
{
3943
public function validate(string $attribute, mixed $value, \Closure $fail): void
4044
{
4145
return;
@@ -244,3 +248,19 @@ public function message(): string
244248
'numeric',
245249
'string',
246250
]);
251+
252+
it('handles "Enum" rule', function () use ($rules, $rulesToLoad) {
253+
$trans = new Translator(new ArrayLoader(), 'en');
254+
$trans->addLines($rulesToLoad, 'en');
255+
256+
/** @var \DaniloPolani\JsonValidation\Tests\TestCase $this */
257+
App::getFacadeApplication()->instance('translator', $trans);
258+
259+
$expected = str_replace(
260+
':attribute',
261+
'role',
262+
$rules['enum'],
263+
);
264+
265+
expect(JsonValidation::getRuleErrorMessage('role', new Enum(TestEnumRole::class)))->toBe([$expected]);
266+
});

tests/validation.php

Lines changed: 0 additions & 169 deletions
This file was deleted.

0 commit comments

Comments
 (0)