2021-08-12 15:27:53 -05:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace Illuminate\Tests\Validation;
|
|
|
|
|
|
2021-08-16 21:21:52 +08:00
|
|
|
use Illuminate\Support\Fluent;
|
2021-08-12 15:27:53 -05:00
|
|
|
use Illuminate\Validation\Rule;
|
|
|
|
|
use Illuminate\Validation\ValidationRuleParser;
|
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
|
|
|
|
|
|
class ValidationRuleParserTest extends TestCase
|
|
|
|
|
{
|
2022-01-19 11:52:41 -05:00
|
|
|
public function testConditionalRulesAreProperlyExpandedAndFiltered()
|
2021-08-12 15:27:53 -05:00
|
|
|
{
|
2023-11-20 17:33:39 +02:00
|
|
|
$isAdmin = true;
|
|
|
|
|
|
2021-08-12 15:27:53 -05:00
|
|
|
$rules = ValidationRuleParser::filterConditionalRules([
|
2023-11-20 17:33:39 +02:00
|
|
|
'name' => Rule::when($isAdmin, ['required', 'min:2']),
|
|
|
|
|
'email' => Rule::unless($isAdmin, ['required', 'min:2']),
|
|
|
|
|
'password' => Rule::when($isAdmin, 'required|min:2'),
|
|
|
|
|
'username' => ['required', Rule::when($isAdmin, ['min:2'])],
|
|
|
|
|
'address' => ['required', Rule::unless($isAdmin, ['min:2'])],
|
2021-08-16 21:21:52 +08:00
|
|
|
'city' => ['required', Rule::when(function (Fluent $input) {
|
2021-08-12 15:27:53 -05:00
|
|
|
return true;
|
|
|
|
|
}, ['min:2'])],
|
2023-11-20 17:33:39 +02:00
|
|
|
'state' => ['required', Rule::when($isAdmin, function (Fluent $input) {
|
2022-02-01 09:50:14 -05:00
|
|
|
return 'min:2';
|
|
|
|
|
})],
|
2023-11-20 17:33:39 +02:00
|
|
|
'zip' => ['required', Rule::when($isAdmin, function (Fluent $input) {
|
2022-02-01 09:50:14 -05:00
|
|
|
return ['min:2'];
|
|
|
|
|
})],
|
2024-01-17 22:16:48 +01:00
|
|
|
'when_cb_true' => Rule::when(fn () => true, ['required'], ['nullable']),
|
|
|
|
|
'when_cb_false' => Rule::when(fn () => false, ['required'], ['nullable']),
|
|
|
|
|
'unless_cb_true' => Rule::unless(fn () => true, ['required'], ['nullable']),
|
|
|
|
|
'unless_cb_false' => Rule::unless(fn () => false, ['required'], ['nullable']),
|
2021-08-12 15:27:53 -05:00
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'name' => ['required', 'min:2'],
|
2021-08-26 17:16:55 -04:00
|
|
|
'email' => [],
|
2021-08-12 15:27:53 -05:00
|
|
|
'password' => ['required', 'min:2'],
|
|
|
|
|
'username' => ['required', 'min:2'],
|
|
|
|
|
'address' => ['required'],
|
|
|
|
|
'city' => ['required', 'min:2'],
|
2022-02-01 09:50:14 -05:00
|
|
|
'state' => ['required', 'min:2'],
|
|
|
|
|
'zip' => ['required', 'min:2'],
|
2024-01-17 22:16:48 +01:00
|
|
|
'when_cb_true' => ['required'],
|
|
|
|
|
'when_cb_false' => ['nullable'],
|
|
|
|
|
'unless_cb_true' => ['nullable'],
|
|
|
|
|
'unless_cb_false' => ['required'],
|
2021-08-12 15:27:53 -05:00
|
|
|
], $rules);
|
|
|
|
|
}
|
2021-08-19 22:58:29 +02:00
|
|
|
|
2022-01-19 11:52:41 -05:00
|
|
|
public function testEmptyRulesArePreserved()
|
2021-08-26 17:16:55 -04:00
|
|
|
{
|
2023-11-20 17:33:39 +02:00
|
|
|
$isAdmin = true;
|
|
|
|
|
|
2021-08-26 17:16:55 -04:00
|
|
|
$rules = ValidationRuleParser::filterConditionalRules([
|
|
|
|
|
'name' => [],
|
|
|
|
|
'email' => '',
|
2023-11-20 17:33:39 +02:00
|
|
|
'password' => Rule::when($isAdmin, 'required|min:2'),
|
|
|
|
|
'gender' => Rule::unless($isAdmin, 'required'),
|
2021-08-26 17:16:55 -04:00
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'name' => [],
|
|
|
|
|
'email' => '',
|
|
|
|
|
'password' => ['required', 'min:2'],
|
2023-11-20 17:33:39 +02:00
|
|
|
'gender' => [],
|
2021-08-26 17:16:55 -04:00
|
|
|
], $rules);
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-02 15:55:57 +02:00
|
|
|
public function testEmptyRulesCanBeExploded()
|
|
|
|
|
{
|
|
|
|
|
$parser = new ValidationRuleParser(['foo' => 'bar']);
|
|
|
|
|
|
|
|
|
|
$this->assertIsObject($parser->explode(['foo' => []]));
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-19 11:52:41 -05:00
|
|
|
public function testConditionalRulesWithDefault()
|
2021-08-19 22:58:29 +02:00
|
|
|
{
|
2023-11-20 17:33:39 +02:00
|
|
|
$isAdmin = true;
|
|
|
|
|
|
2021-08-19 22:58:29 +02:00
|
|
|
$rules = ValidationRuleParser::filterConditionalRules([
|
2023-11-20 17:33:39 +02:00
|
|
|
'name' => Rule::when($isAdmin, ['required', 'min:2'], ['string', 'max:10']),
|
|
|
|
|
'email' => Rule::unless($isAdmin, ['required', 'min:2'], ['string', 'max:10']),
|
|
|
|
|
'password' => Rule::unless($isAdmin, 'required|min:2', 'string|max:10'),
|
|
|
|
|
'username' => ['required', Rule::when($isAdmin, ['min:2'], ['string', 'max:10'])],
|
|
|
|
|
'address' => ['required', Rule::unless($isAdmin, ['min:2'], ['string', 'max:10'])],
|
2021-08-19 22:58:29 +02:00
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'name' => ['required', 'min:2'],
|
|
|
|
|
'email' => ['string', 'max:10'],
|
|
|
|
|
'password' => ['string', 'max:10'],
|
|
|
|
|
'username' => ['required', 'min:2'],
|
|
|
|
|
'address' => ['required', 'string', 'max:10'],
|
|
|
|
|
], $rules);
|
|
|
|
|
}
|
2021-08-26 17:16:55 -04:00
|
|
|
|
2022-01-19 11:52:41 -05:00
|
|
|
public function testEmptyConditionalRulesArePreserved()
|
2021-08-26 17:16:55 -04:00
|
|
|
{
|
2023-11-20 17:33:39 +02:00
|
|
|
$isAdmin = true;
|
|
|
|
|
|
2021-08-26 17:16:55 -04:00
|
|
|
$rules = ValidationRuleParser::filterConditionalRules([
|
2023-11-20 17:33:39 +02:00
|
|
|
'name' => Rule::when($isAdmin, '', ['string', 'max:10']),
|
|
|
|
|
'email' => Rule::unless($isAdmin, ['required', 'min:2']),
|
|
|
|
|
'password' => Rule::unless($isAdmin, 'required|min:2', 'string|max:10'),
|
2021-08-26 17:16:55 -04:00
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'name' => [],
|
|
|
|
|
'email' => [],
|
|
|
|
|
'password' => ['string', 'max:10'],
|
|
|
|
|
], $rules);
|
|
|
|
|
}
|
2022-01-19 11:52:41 -05:00
|
|
|
|
2023-01-09 09:42:00 -05:00
|
|
|
public function testExplodeFailsParsingSingleRegexRuleContainingPipe()
|
2022-02-11 09:35:03 -05:00
|
|
|
{
|
|
|
|
|
$data = ['items' => [['type' => 'foo']]];
|
|
|
|
|
|
|
|
|
|
$exploded = (new ValidationRuleParser($data))->explode(
|
|
|
|
|
['items.*.type' => 'regex:/^(foo|bar)$/i']
|
|
|
|
|
);
|
|
|
|
|
|
2023-01-09 09:42:00 -05:00
|
|
|
$this->assertSame('regex:/^(foo', $exploded->rules['items.0.type'][0]);
|
|
|
|
|
$this->assertSame('bar)$/i', $exploded->rules['items.0.type'][1]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testExplodeProperlyParsesSingleRegexRuleNotContainingPipe()
|
|
|
|
|
{
|
|
|
|
|
$data = ['items' => [['type' => 'foo']]];
|
|
|
|
|
|
|
|
|
|
$exploded = (new ValidationRuleParser($data))->explode(
|
|
|
|
|
['items.*.type' => 'regex:/^[\d\-]*$/|max:20']
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$this->assertSame('regex:/^[\d\-]*$/', $exploded->rules['items.0.type'][0]);
|
|
|
|
|
$this->assertSame('max:20', $exploded->rules['items.0.type'][1]);
|
2022-02-11 09:35:03 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testExplodeProperlyParsesRegexWithArrayOfRules()
|
|
|
|
|
{
|
|
|
|
|
$data = ['items' => [['type' => 'foo']]];
|
|
|
|
|
|
|
|
|
|
$exploded = (new ValidationRuleParser($data))->explode(
|
|
|
|
|
['items.*.type' => ['in:foo', 'regex:/^(foo|bar)$/i']]
|
|
|
|
|
);
|
|
|
|
|
|
2022-02-22 15:46:19 +01:00
|
|
|
$this->assertSame('in:foo', $exploded->rules['items.0.type'][0]);
|
|
|
|
|
$this->assertSame('regex:/^(foo|bar)$/i', $exploded->rules['items.0.type'][1]);
|
2022-02-11 09:35:03 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testExplodeProperlyParsesRegexThatDoesNotContainPipe()
|
|
|
|
|
{
|
|
|
|
|
$data = ['items' => [['type' => 'foo']]];
|
|
|
|
|
|
|
|
|
|
$exploded = (new ValidationRuleParser($data))->explode(
|
|
|
|
|
['items.*.type' => 'in:foo|regex:/^(bar)$/i']
|
|
|
|
|
);
|
|
|
|
|
|
2022-02-22 15:46:19 +01:00
|
|
|
$this->assertSame('in:foo', $exploded->rules['items.0.type'][0]);
|
|
|
|
|
$this->assertSame('regex:/^(bar)$/i', $exploded->rules['items.0.type'][1]);
|
2022-02-11 09:35:03 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testExplodeFailsParsingRegexWithOtherRulesInSingleString()
|
|
|
|
|
{
|
|
|
|
|
$data = ['items' => [['type' => 'foo']]];
|
|
|
|
|
|
|
|
|
|
$exploded = (new ValidationRuleParser($data))->explode(
|
|
|
|
|
['items.*.type' => 'in:foo|regex:/^(foo|bar)$/i']
|
|
|
|
|
);
|
|
|
|
|
|
2022-02-22 15:46:19 +01:00
|
|
|
$this->assertSame('in:foo', $exploded->rules['items.0.type'][0]);
|
|
|
|
|
$this->assertSame('regex:/^(foo', $exploded->rules['items.0.type'][1]);
|
|
|
|
|
$this->assertSame('bar)$/i', $exploded->rules['items.0.type'][2]);
|
2022-02-11 09:35:03 -05:00
|
|
|
}
|
|
|
|
|
|
2022-01-19 11:52:41 -05:00
|
|
|
public function testExplodeGeneratesNestedRules()
|
|
|
|
|
{
|
|
|
|
|
$parser = (new ValidationRuleParser([
|
|
|
|
|
'users' => [
|
2024-04-22 18:58:19 +03:30
|
|
|
['name' => 'Taylor Otwell', 'email' => 'taylor@laravel.com'],
|
2022-01-19 11:52:41 -05:00
|
|
|
],
|
|
|
|
|
]));
|
|
|
|
|
|
|
|
|
|
$results = $parser->explode([
|
2024-04-22 18:58:19 +03:30
|
|
|
'users.*.name' => Rule::forEach(function ($value, $attribute, $data, $context) {
|
2022-02-22 15:46:19 +01:00
|
|
|
$this->assertSame('Taylor Otwell', $value);
|
|
|
|
|
$this->assertSame('users.0.name', $attribute);
|
2026-04-17 15:15:54 +02:00
|
|
|
$this->assertSame('Taylor Otwell', $data['users.0.name']);
|
2024-04-22 18:58:19 +03:30
|
|
|
$this->assertEquals(['name' => 'Taylor Otwell', 'email' => 'taylor@laravel.com'], $context);
|
2022-01-19 11:52:41 -05:00
|
|
|
|
|
|
|
|
return [Rule::requiredIf(true)];
|
|
|
|
|
}),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals(['users.0.name' => ['required']], $results->rules);
|
|
|
|
|
$this->assertEquals(['users.*.name' => ['users.0.name']], $results->implicitAttributes);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testExplodeGeneratesNestedRulesForNonNestedData()
|
|
|
|
|
{
|
|
|
|
|
$parser = (new ValidationRuleParser([
|
|
|
|
|
'name' => 'Taylor Otwell',
|
2024-04-22 18:58:19 +03:30
|
|
|
'email' => 'taylor@laravel.com',
|
2022-01-19 11:52:41 -05:00
|
|
|
]));
|
|
|
|
|
|
|
|
|
|
$results = $parser->explode([
|
2024-05-11 03:24:21 +08:00
|
|
|
'name' => Rule::forEach(function ($value, $attribute, $data, $context) {
|
2022-02-22 15:46:19 +01:00
|
|
|
$this->assertSame('Taylor Otwell', $value);
|
|
|
|
|
$this->assertSame('name', $attribute);
|
2024-04-22 18:58:19 +03:30
|
|
|
$this->assertEquals(['name' => 'Taylor Otwell', 'email' => 'taylor@laravel.com'], $data);
|
|
|
|
|
$this->assertEquals(['name' => 'Taylor Otwell', 'email' => 'taylor@laravel.com'], $context);
|
2022-01-19 11:52:41 -05:00
|
|
|
|
|
|
|
|
return 'required';
|
|
|
|
|
}),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals(['name' => ['required']], $results->rules);
|
2026-04-17 15:15:54 +02:00
|
|
|
$this->assertSame([], $results->implicitAttributes);
|
2022-01-19 11:52:41 -05:00
|
|
|
}
|
|
|
|
|
|
2023-11-07 13:17:03 +00:00
|
|
|
public function testExplodeHandlesForwardSlashesInWildcardRule()
|
|
|
|
|
{
|
|
|
|
|
$parser = (new ValidationRuleParser([
|
|
|
|
|
'redirects' => [
|
|
|
|
|
'directory/subdirectory/file' => [
|
|
|
|
|
'directory/subdirectory/redirectedfile',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
]));
|
|
|
|
|
|
|
|
|
|
$results = $parser->explode([
|
|
|
|
|
'redirects.directory/subdirectory/file.*' => 'string',
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'redirects.directory/subdirectory/file.0' => ['string'],
|
|
|
|
|
], $results->rules);
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'redirects.directory/subdirectory/file.*' => ['redirects.directory/subdirectory/file.0'],
|
|
|
|
|
], $results->implicitAttributes);
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-19 11:52:41 -05:00
|
|
|
public function testExplodeHandlesArraysOfNestedRules()
|
|
|
|
|
{
|
|
|
|
|
$parser = (new ValidationRuleParser([
|
|
|
|
|
'users' => [
|
|
|
|
|
['name' => 'Taylor Otwell'],
|
|
|
|
|
['name' => 'Abigail Otwell'],
|
|
|
|
|
],
|
|
|
|
|
]));
|
|
|
|
|
|
|
|
|
|
$results = $parser->explode([
|
2022-08-29 09:56:58 -04:00
|
|
|
'users.*.name' => Rule::forEach(function ($value, $attribute, $data) {
|
2022-08-29 13:57:28 +00:00
|
|
|
$this->assertEquals([
|
|
|
|
|
'users.0.name' => 'Taylor Otwell',
|
|
|
|
|
'users.1.name' => 'Abigail Otwell',
|
|
|
|
|
], $data);
|
|
|
|
|
|
|
|
|
|
return [
|
|
|
|
|
Rule::requiredIf(true),
|
|
|
|
|
$value === 'Taylor Otwell'
|
|
|
|
|
? Rule::in('taylor')
|
|
|
|
|
: Rule::in('abigail'),
|
|
|
|
|
];
|
|
|
|
|
}),
|
2022-01-19 11:52:41 -05:00
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'users.0.name' => ['required', 'in:"taylor"'],
|
|
|
|
|
'users.1.name' => ['required', 'in:"abigail"'],
|
|
|
|
|
], $results->rules);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'users.*.name' => [
|
|
|
|
|
'users.0.name',
|
|
|
|
|
'users.1.name',
|
|
|
|
|
],
|
|
|
|
|
], $results->implicitAttributes);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testExplodeHandlesRecursivelyNestedRules()
|
|
|
|
|
{
|
|
|
|
|
$parser = (new ValidationRuleParser([
|
|
|
|
|
'users' => [['name' => 'Taylor Otwell']],
|
|
|
|
|
]));
|
|
|
|
|
|
|
|
|
|
$results = $parser->explode([
|
2022-08-29 09:56:58 -04:00
|
|
|
'users.*.name' => Rule::forEach(function ($value, $attribute, $data) {
|
|
|
|
|
$this->assertSame('Taylor Otwell', $value);
|
|
|
|
|
$this->assertSame('users.0.name', $attribute);
|
|
|
|
|
$this->assertEquals(['users.0.name' => 'Taylor Otwell'], $data);
|
|
|
|
|
|
|
|
|
|
return Rule::forEach(function ($value, $attribute, $data) {
|
|
|
|
|
$this->assertNull($value);
|
2022-02-22 15:46:19 +01:00
|
|
|
$this->assertSame('users.0.name', $attribute);
|
2022-01-19 11:52:41 -05:00
|
|
|
$this->assertEquals(['users.0.name' => 'Taylor Otwell'], $data);
|
|
|
|
|
|
2022-01-24 11:33:32 -05:00
|
|
|
return Rule::forEach(function ($value, $attribute, $data) {
|
2022-01-19 11:52:41 -05:00
|
|
|
$this->assertNull($value);
|
2022-02-22 15:46:19 +01:00
|
|
|
$this->assertSame('users.0.name', $attribute);
|
2022-01-19 11:52:41 -05:00
|
|
|
$this->assertEquals(['users.0.name' => 'Taylor Otwell'], $data);
|
|
|
|
|
|
2022-08-29 09:56:58 -04:00
|
|
|
return [Rule::requiredIf(true)];
|
2022-01-19 11:52:41 -05:00
|
|
|
});
|
2022-08-29 09:56:58 -04:00
|
|
|
});
|
|
|
|
|
}),
|
2022-01-19 11:52:41 -05:00
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals(['users.0.name' => ['required']], $results->rules);
|
|
|
|
|
$this->assertEquals(['users.*.name' => ['users.0.name']], $results->implicitAttributes);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testExplodeHandlesSegmentingNestedRules()
|
|
|
|
|
{
|
|
|
|
|
$parser = (new ValidationRuleParser([
|
|
|
|
|
'items' => [
|
|
|
|
|
['discounts' => [['id' => 1], ['id' => 2]]],
|
|
|
|
|
['discounts' => [['id' => 1], ['id' => 2]]],
|
|
|
|
|
],
|
|
|
|
|
]));
|
|
|
|
|
|
|
|
|
|
$rules = [
|
2022-01-24 11:33:32 -05:00
|
|
|
'items.*' => Rule::forEach(function () {
|
2022-01-19 11:52:41 -05:00
|
|
|
return ['discounts.*.id' => 'distinct'];
|
|
|
|
|
}),
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
$results = $parser->explode($rules);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'items.0.discounts.0.id' => ['distinct'],
|
|
|
|
|
'items.0.discounts.1.id' => ['distinct'],
|
|
|
|
|
'items.1.discounts.0.id' => ['distinct'],
|
|
|
|
|
'items.1.discounts.1.id' => ['distinct'],
|
|
|
|
|
], $results->rules);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'items.1.discounts.*.id' => [
|
|
|
|
|
'items.1.discounts.0.id',
|
|
|
|
|
'items.1.discounts.1.id',
|
|
|
|
|
],
|
|
|
|
|
'items.0.discounts.*.id' => [
|
|
|
|
|
'items.0.discounts.0.id',
|
|
|
|
|
'items.0.discounts.1.id',
|
|
|
|
|
],
|
|
|
|
|
'items.*' => [
|
|
|
|
|
'items.0',
|
|
|
|
|
'items.1',
|
|
|
|
|
],
|
|
|
|
|
], $results->implicitAttributes);
|
|
|
|
|
}
|
2025-02-19 22:52:59 +01:00
|
|
|
|
|
|
|
|
public function testExplodeHandlesStringDateRule()
|
|
|
|
|
{
|
|
|
|
|
$parser = (new ValidationRuleParser([
|
|
|
|
|
'date' => '2021-01-01',
|
|
|
|
|
]));
|
|
|
|
|
|
|
|
|
|
$rules = [
|
|
|
|
|
'date' => 'date|date_format:Y-m-d',
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
$results = $parser->explode($rules);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'date' => [
|
|
|
|
|
'date',
|
|
|
|
|
'date_format:Y-m-d',
|
|
|
|
|
],
|
|
|
|
|
], $results->rules);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testExplodeHandlesDateRule()
|
|
|
|
|
{
|
|
|
|
|
$parser = (new ValidationRuleParser([
|
|
|
|
|
'date' => '2021-01-01',
|
|
|
|
|
]));
|
|
|
|
|
|
|
|
|
|
$rules = [
|
|
|
|
|
'date' => Rule::date(),
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
$results = $parser->explode($rules);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'date' => [
|
|
|
|
|
'date',
|
|
|
|
|
],
|
|
|
|
|
], $results->rules);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testExplodeHandlesDateRuleWithAdditionalRules()
|
|
|
|
|
{
|
|
|
|
|
$parser = (new ValidationRuleParser([
|
|
|
|
|
'date' => '2021-01-01',
|
|
|
|
|
]));
|
|
|
|
|
|
|
|
|
|
$rules = [
|
2025-03-17 15:32:44 -05:00
|
|
|
'date' => Rule::date()->after('today'),
|
2025-02-19 22:52:59 +01:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
$results = $parser->explode($rules);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'date' => [
|
|
|
|
|
'date',
|
2025-03-17 15:32:44 -05:00
|
|
|
'after:today',
|
2025-02-19 22:52:59 +01:00
|
|
|
],
|
|
|
|
|
], $results->rules);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testExplodeHandlesNumericStringRule()
|
|
|
|
|
{
|
|
|
|
|
$parser = (new ValidationRuleParser([
|
|
|
|
|
'number' => 42,
|
|
|
|
|
]));
|
|
|
|
|
|
|
|
|
|
$rules = [
|
|
|
|
|
'number' => 'numeric|max:100',
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
$results = $parser->explode($rules);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'number' => [
|
|
|
|
|
'numeric',
|
|
|
|
|
'max:100',
|
|
|
|
|
],
|
|
|
|
|
], $results->rules);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testExplodeHandlesNumericRule()
|
|
|
|
|
{
|
|
|
|
|
$parser = (new ValidationRuleParser([
|
|
|
|
|
'number' => 42,
|
|
|
|
|
]));
|
|
|
|
|
|
|
|
|
|
$rules = [
|
|
|
|
|
'number' => Rule::numeric(),
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
$results = $parser->explode($rules);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'number' => [
|
|
|
|
|
'numeric',
|
|
|
|
|
],
|
|
|
|
|
], $results->rules);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testExplodeHandlesNumericRuleWithAdditionalRules()
|
|
|
|
|
{
|
|
|
|
|
$parser = (new ValidationRuleParser([
|
|
|
|
|
'number' => 42,
|
|
|
|
|
]));
|
|
|
|
|
|
|
|
|
|
$rules = [
|
|
|
|
|
'number' => Rule::numeric()->max(100),
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
$results = $parser->explode($rules);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals([
|
|
|
|
|
'number' => [
|
|
|
|
|
'numeric',
|
|
|
|
|
'max:100',
|
|
|
|
|
],
|
|
|
|
|
], $results->rules);
|
|
|
|
|
}
|
2022-01-19 11:53:58 -05:00
|
|
|
}
|