RegistryCheckerTest::testAnyValue()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 21
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 21
rs 9.3142
c 0
b 0
f 0
cc 1
eloc 12
nc 1
nop 0
1
<?php
2
3
namespace Vvval\Spiral\Validation\Tests\Checkers;
4
5
use TestApplication\Database\Sources\TestSource;
6
use TestApplication\Database\TestRecord;
7
use Vvval\Spiral\Validation\Tests\BaseTest;
8
9
class RegistryCheckerTest extends BaseTest
10
{
11
    /**
12
     * registry::anyValue has to be in emptyConditions section in the validation config.
13
     *
14
     * @throws \Psr\Container\ContainerExceptionInterface
15
     * @throws \Psr\Container\NotFoundExceptionInterface
16
     */
17
    public function testAnyValue()
18
    {
19
        $rules = [
20
            'field' => [
21
                'registry::anyValue'
22
            ],
23
        ];
24
        $validator = $this->createValidator($rules);
25
26
        //nothing passed or null passed
27
        $validator->setData([]);
28
        $this->assertFalse($validator->isValid(), 'Validation PASSED');
29
30
        $validator->setData(['field' => null]);
31
        $this->assertFalse($validator->isValid(), 'Validation PASSED');
32
        $this->assertArrayHasKey('field', $validator->getErrors());
33
34
        //not null value
35
        $validator->setData(['field' => false]);
36
        $this->assertTrue($validator->isValid(), 'Validation FAILED');
37
    }
38
39
    public function testAnyValueAndPassErrorToField()
40
    {
41
        $rules = [
42
            'field' => [
43
                ['registry::anyValue']
44
            ],
45
        ];
46
        $validator = $this->createValidator($rules);
47
48
        $validator->setData(['field' => null]);
49
        $this->assertFalse($validator->isValid(), 'Validation PASSED');
50
        $this->assertArrayHasKey('field', $validator->getErrors());
51
52
        $rules = [
53
            'field' => [
54
                ['registry::anyValue', 'test-field']
55
            ],
56
        ];
57
        $validator->setRules($rules);
58
59
        $validator->setData(['field' => null]);
60
        $this->assertFalse($validator->isValid(), 'Validation PASSED');
61
        $this->assertArrayHasKey('test-field', $validator->getErrors());
62
        $this->assertArrayNotHasKey('field', $validator->getErrors());
63
    }
64
65
    public function testAllowedValues()
66
    {
67
        $source = $this->container->get(TestSource::class);
68
        $this->fill($source, ['a', 'b', 'c', 'd']);
69
70
        $rules = [
71
            'field' => [
72
                ['registry::allowedValues', TestSource::class, 'field']
73
            ],
74
        ];
75
        $validator = $this->createValidator($rules);
76
77
        //nothing is allowed
78
        $validator->setData([]);
79
        $this->assertTrue($validator->isValid(), 'Validation FAILED');
80
81
        //in array
82
        $validator->setData(['field' => ['a']]);
83
        $this->assertTrue($validator->isValid(), 'Validation FAILED');
84
85
        //not in array
86
        $validator->setData(['field' => ['aa']]);
87
        $this->assertFalse($validator->isValid(), 'Validation PASSED');
88
89
        //mixed
90
        $validator->setData(['field' => ['a', 'aa']]);
91
        $this->assertFalse($validator->isValid(), 'Validation PASSED');
92
    }
93
94
    public function testAllowedValuesAndPassErrorToField()
95
    {
96
        $source = $this->container->get(TestSource::class);
97
        $this->fill($source, ['a', 'b', 'c', 'd']);
98
99
        $rules = [
100
            'field' => [
101
                ['registry::allowedValues', TestSource::class, 'field']
102
            ],
103
        ];
104
        $validator = $this->createValidator($rules);
105
106
        //not in array
107
        $validator->setData(['field' => ['aa']]);
108
        $this->assertFalse($validator->isValid(), 'Validation PASSED');
109
        $this->assertArrayHasKey('field', $validator->getErrors());
110
111
        $rules = [
112
            'field' => [
113
                ['registry::allowedValues', TestSource::class, 'field', 'test-field']
114
            ],
115
        ];
116
        $validator->setRules($rules);
117
118
        //errors will be in main error (global error) and for each sub-value (static error field)
119
        $validator->setData(['field' => ['aa']]);
120
        $this->assertFalse($validator->isValid(), 'Validation PASSED');
121
        $this->assertArrayHasKey('test-field', $validator->getErrors());
122
        $this->assertArrayHasKey('field', $validator->getErrors());
123
124
        $rules = [
125
            'field' => [
126
                ['registry::allowedValues', TestSource::class, 'field', 'test-field-%s']
127
            ],
128
        ];
129
        $validator->setRules($rules);
130
131
        //errors will be in main error (global error) and for each sub-value (dynamic value)
132
        $validator->setData(['field' => ['aa', 'bb']]);
133
        $this->assertFalse($validator->isValid(), 'Validation PASSED');
134
        $this->assertArrayHasKey('test-field-aa', $validator->getErrors());
135
        $this->assertArrayHasKey('test-field-bb', $validator->getErrors());
136
        $this->assertArrayHasKey('field', $validator->getErrors());
137
    }
138
139
    /**
140
     * @param TestSource $source
141
     * @param array      $input
142
     */
143
    protected function fill(TestSource $source, array $input)
144
    {
145
        foreach (array_unique($input) as $value) {
146
            /** @var TestRecord $record */
147
            $record = $source->create();
148
            $record->field = $value;
149
            $record->save();
150
        }
151
    }
152
}