Skip to content

Commit 5f2cf63

Browse files
max13frshalvah
andauthored
feat: add support for 'sometimes' rule (#958)
* feat: add support to 'sometimes' rule * style: correct linting * test: add test on sometimes rule --------- Co-authored-by: Shalvah <shalvah@users.noreply.github.com>
1 parent 71f61a8 commit 5f2cf63

File tree

2 files changed

+91
-2
lines changed

2 files changed

+91
-2
lines changed

src/Extracting/ParsesValidationRules.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public function getParametersFromValidationRules(array $validationRulesByParamet
4747
$parameterData = [
4848
'name' => $parameter,
4949
'required' => false,
50+
'sometimes' => false,
5051
'type' => null,
5152
'example' => self::$MISSING_VALUE,
5253
'description' => $description,
@@ -78,8 +79,10 @@ public function getParametersFromValidationRules(array $validationRulesByParamet
7879

7980
// First pass: process rules which provide no type or example info
8081
$firstPassRuleNames = [
82+
"sometimes",
8183
"required",
8284
"required_*",
85+
"accepted",
8386
"same",
8487
"different",
8588
"nullable",
@@ -274,11 +277,18 @@ protected function processRule($rule, $ruleArguments, array &$parameterData, arr
274277
// Reminder: Always append to the description (with a leading space); don't overwrite.
275278
try {
276279
switch ($rule) {
280+
case 'sometimes':
281+
$parameterData['sometimes'] = true;
282+
break;
277283
case 'required':
278-
$parameterData['required'] = true;
284+
if (!$parameterData['sometimes']) {
285+
$parameterData['required'] = true;
286+
}
279287
break;
280288
case 'accepted':
281-
$parameterData['required'] = true;
289+
if (!$parameterData['sometimes']) {
290+
$parameterData['required'] = true;
291+
}
282292
$parameterData['type'] = 'boolean';
283293
$parameterData['description'] .= ' Must be accepted.';
284294
$parameterData['setter'] = fn() => true;

tests/Unit/ValidationRuleParsingTest.php

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,85 @@ public function can_parse_rules_which_reference_other_fields()
698698

699699
$this->assertEquals("Must be a valid date. Must be a date before <code>to_time</code>.", $results['from_time']['description']);
700700
}
701+
702+
/** @test */
703+
public function sometimes_rule_prevents_required_from_required_rule()
704+
{
705+
$ruleset = [
706+
'optional_field' => 'sometimes|required',
707+
];
708+
709+
$results = $this->strategy->parse($ruleset);
710+
711+
$this->assertFalse($results['optional_field']['required'], 'Field with "sometimes|required" should not be required');
712+
$this->assertTrue($results['optional_field']['sometimes'], 'Field should have "sometimes" flag set');
713+
}
714+
715+
/** @test */
716+
public function sometimes_rule_prevents_required_from_accepted_rule()
717+
{
718+
$ruleset = [
719+
'consent_cgu' => 'sometimes|accepted',
720+
];
721+
722+
$results = $this->strategy->parse($ruleset);
723+
724+
$this->assertTrue($results['consent_cgu']['sometimes'], 'Field should have "sometimes" flag set');
725+
$this->assertFalse($results['consent_cgu']['required'], 'Field with "sometimes|accepted" should not be required');
726+
}
727+
728+
/** @test */
729+
public function required_before_sometimes_remains_required()
730+
{
731+
$ruleset = [
732+
'should_be_required' => 'required|sometimes',
733+
];
734+
735+
$results = $this->strategy->parse($ruleset);
736+
737+
$this->assertTrue($results['should_be_required']['required'], 'Field with "required|sometimes" should remain required');
738+
$this->assertTrue($results['should_be_required']['sometimes'], 'Field should have "sometimes" flag set');
739+
}
740+
741+
/** @test */
742+
public function accepted_before_sometimes_remains_required()
743+
{
744+
$ruleset = [
745+
'should_be_required' => 'accepted|sometimes',
746+
];
747+
748+
$results = $this->strategy->parse($ruleset);
749+
750+
$this->assertTrue($results['should_be_required']['required'], 'Field with "accepted|sometimes" should remain required');
751+
$this->assertTrue($results['should_be_required']['sometimes'], 'Field should have "sometimes" flag set');
752+
}
753+
754+
/** @test */
755+
public function sometimes_with_other_validation_rules()
756+
{
757+
$ruleset = [
758+
'sometimes_email' => 'sometimes|email',
759+
'sometimes_numeric' => 'sometimes|numeric|min:5',
760+
'sometimes_array' => 'sometimes|array',
761+
];
762+
763+
$results = $this->strategy->parse($ruleset);
764+
765+
// All should not be required
766+
$this->assertFalse($results['sometimes_email']['required']);
767+
$this->assertFalse($results['sometimes_numeric']['required']);
768+
$this->assertFalse($results['sometimes_array']['required']);
769+
770+
// All should have sometimes flag
771+
$this->assertTrue($results['sometimes_email']['sometimes']);
772+
$this->assertTrue($results['sometimes_numeric']['sometimes']);
773+
$this->assertTrue($results['sometimes_array']['sometimes']);
774+
775+
// Types should be set correctly
776+
$this->assertEquals('string', $results['sometimes_email']['type']);
777+
$this->assertEquals('number', $results['sometimes_numeric']['type']);
778+
$this->assertEquals('object', $results['sometimes_array']['type']);
779+
}
701780
}
702781

703782
class DummyValidationRule implements \Illuminate\Contracts\Validation\Rule

0 commit comments

Comments
 (0)