Passed
Pull Request — master (#412)
by
unknown
17:58 queued 15:20
created

RequiredTest::testSkipOnError()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Validator\Tests\Rule;
6
7
use Closure;
8
use Yiisoft\Validator\Rule\Required;
9
use Yiisoft\Validator\Rule\RequiredHandler;
10
use Yiisoft\Validator\EmptyCriteria\WhenEmpty;
11
use Yiisoft\Validator\EmptyCriteria\WhenNull;
12
use Yiisoft\Validator\Tests\Rule\Base\DifferentRuleInHandlerTestTrait;
13
use Yiisoft\Validator\Tests\Rule\Base\RuleTestCase;
14
use Yiisoft\Validator\Tests\Rule\Base\RuleWithOptionsTestTrait;
15
use Yiisoft\Validator\Tests\Rule\Base\SkipOnErrorTestTrait;
16
use Yiisoft\Validator\Tests\Rule\Base\WhenTestTrait;
17
18
final class RequiredTest extends RuleTestCase
19
{
20
    use DifferentRuleInHandlerTestTrait;
21
    use RuleWithOptionsTestTrait;
22
    use SkipOnErrorTestTrait;
23
    use WhenTestTrait;
24
25
    public function testDefaultValues(): void
26
    {
27
        $rule = new Required();
28
29
        $this->assertInstanceOf(WhenEmpty::class, $rule->getEmptyCriteria());
30
        $this->assertSame(RequiredHandler::class, $rule->getHandlerClassName());
31
        $this->assertSame('Value cannot be blank.', $rule->getMessage());
32
        $this->assertSame('required', $rule->getName());
33
        $this->assertSame('Value not passed.', $rule->getNotPassedMessage());
34
        $this->assertNull($rule->getWhen());
35
        $this->assertFalse($rule->shouldSkipOnError());
36
    }
37
38
    public function dataGetEmptyCriteria(): array
39
    {
40
        return [
41
            'null' => [null, WhenEmpty::class],
42
            'skip on null' => [new WhenNull(), WhenNull::class],
43
            'closure' => [static fn () => false, Closure::class],
44
        ];
45
    }
46
47
    /**
48
     * @dataProvider dataGetEmptyCriteria
49
     */
50
    public function testGetEmptyCriteria(?callable $callback, string $expectedCallbackClassName): void
51
    {
52
        $rule = new Required(emptyCriteria: $callback);
53
54
        $this->assertInstanceOf($expectedCallbackClassName, $rule->getEmptyCriteria());
55
    }
56
57
    public function dataOptions(): array
58
    {
59
        return [
60
            [
61
                new Required(),
62
                [
63
                    'message' => [
64
                        'template' => 'Value cannot be blank.',
65
                        'parameters' => [],
66
                    ],
67
                    'notPassedMessage' => [
68
                        'template' => 'Value not passed.',
69
                        'parameters' => [],
70
                    ],
71
                    'skipOnError' => false,
72
                ],
73
            ],
74
        ];
75
    }
76
77
    public function dataValidationPassed(): array
78
    {
79
        return [
80
            ['not empty', [new Required()]],
81
            [['with', 'elements'], [new Required()]],
82
            'skip on null' => [
83
                '',
84
                [new Required(emptyCriteria: new WhenNull())],
85
            ],
86
        ];
87
    }
88
89
    public function dataValidationFailed(): array
90
    {
91
        $singleMessageCannotBeBlank = ['' => ['Value cannot be blank.']];
92
93
        return [
94
            [null, [new Required()], $singleMessageCannotBeBlank],
95
            [[], [new Required()], $singleMessageCannotBeBlank],
96
            'custom empty callback' => [
97
                '42',
98
                [new Required(emptyCriteria: static fn (mixed $value): bool => $value === '42')],
99
                $singleMessageCannotBeBlank,
100
            ],
101
            'custom error' => [null, [new Required(message: 'Custom error')], ['' => ['Custom error']]],
102
            'empty after trimming' => [' ', [new Required()], $singleMessageCannotBeBlank],
103
        ];
104
    }
105
106
    public function testSkipOnError(): void
107
    {
108
        $this->testSkipOnErrorInternal(new Required(), new Required(skipOnError: true));
109
    }
110
111
    public function testWhen(): void
112
    {
113
        $when = static fn (mixed $value): bool => $value !== null;
114
        $this->testWhenInternal(new Required(), new Required(when: $when));
115
    }
116
117
    protected function getDifferentRuleInHandlerItems(): array
118
    {
119
        return [Required::class, RequiredHandler::class];
120
    }
121
}
122