PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.24.0
GiveWP – Donation Plugin and Fundraising Platform v2.24.0
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / vendor / stellarwp / validation / tests / unit / ValidatorTest.php
give / vendor / stellarwp / validation / tests / unit Last commit date
Rules 3 years ago ValidationRuleSetTest.php 3 years ago ValidatorTest.php 3 years ago _bootstrap.php 3 years ago
ValidatorTest.php
314 lines
1 <?php
2
3 declare(strict_types=1);
4
5 namespace StellarWP\Validation\Tests\Unit;
6
7 use Closure;
8 use InvalidArgumentException;
9 use StellarWP\Validation\Config;
10 use StellarWP\Validation\Contracts\Sanitizer;
11 use StellarWP\Validation\Contracts\ValidationRule;
12 use StellarWP\Validation\Tests\TestCase;
13 use StellarWP\Validation\ValidationRulesRegistrar;
14 use StellarWP\Validation\Validator;
15
16 /**
17 * @covers \StellarWP\Validation\Validator
18 *
19 * @unreleased
20 */
21 class ValidatorTest extends TestCase
22 {
23 public function setUp(): void
24 {
25 parent::setUp();
26
27 $this->mockValidationRulesRegister();
28 }
29
30 /**
31 * @unreleased
32 */
33 public function testValidatorPasses()
34 {
35 $validator = new Validator(
36 [
37 'name' => ['required'],
38 'email' => ['required'],
39 ],
40 [
41 'name' => 'Bill Murray',
42 'email' => 'bill@example.com',
43 ]
44 );
45
46 self::assertTrue($validator->passes());
47 self::assertFalse($validator->fails());
48 }
49
50 /**
51 * @unreleased
52 */
53 public function testValidatorAcceptsArraysAsRules()
54 {
55 $validator = new Validator([
56 'foo' => ['required'],
57 'bar' => ['required'],
58 ], [
59 'foo' => 'foo',
60 'bar' => 'bar',
61 ]);
62
63 $this->assertTrue($validator->passes());
64 }
65
66 /**
67 * @unreleased
68 */
69 public function testFailingValidations()
70 {
71 $validator = new Validator([
72 'foo' => ['required'],
73 'bar' => ['required'],
74 ], [
75 'foo' => 'foo',
76 'bar' => '',
77 ]);
78
79 self::assertTrue($validator->fails());
80 self::assertFalse($validator->passes());
81 }
82
83 /**
84 * @unreleased
85 */
86 public function testReturnsErrorsForFailedValidations()
87 {
88 $validator = new Validator([
89 'foo' => ['required'],
90 'bar' => ['required'],
91 ], [
92 'foo' => 'foo',
93 'bar' => '',
94 ]);
95
96 self::assertEquals([
97 'bar' => 'bar required',
98 ], $validator->errors());
99 }
100
101 /**
102 * @unreleased
103 */
104 public function testUsesLabelsWhenAvailableInErrorMessage()
105 {
106 $validator = new Validator([
107 'foo' => ['required'],
108 'bar' => ['required'],
109 ], [
110 'foo' => '',
111 'bar' => '',
112 ], [
113 'bar' => 'Bar',
114 ]);
115
116 self::assertEquals([
117 'foo' => 'foo required',
118 'bar' => 'Bar required',
119 ], $validator->errors());
120 }
121
122 /**
123 * @unreleased
124 */
125 public function testReturnsValidatedValues()
126 {
127 $validator = new Validator([
128 'foo' => ['required'],
129 'bar' => ['required'],
130 ], [
131 'foo' => 'foo',
132 'bar' => 'bar',
133 ]);
134
135 self::assertEquals([
136 'foo' => 'foo',
137 'bar' => 'bar',
138 ], $validator->validated());
139 }
140
141 /**
142 * @unreleased
143 */
144 public function testValuesWithoutRulesAreOmitted()
145 {
146 $validator = new Validator([
147 'foo' => ['required'],
148 ], [
149 'foo' => 'foo',
150 'bar' => 'bar',
151 ]);
152
153 self::assertEquals([
154 'foo' => 'foo',
155 ], $validator->validated());
156 }
157
158 /**
159 * @unreleased
160 */
161 public function testRuleArraysWithoutRulesAreConsideredOptional()
162 {
163 // When no rules are specified, the field is considered optional. This simply means that
164 // whatever value is passed in will be returned as validated. Keep in mind that if the rule
165 // is entirely omitted then the value will also be omitted.
166 $validator = new Validator([
167 'foo' => [],
168 ], [
169 'foo' => 'foo',
170 'bar' => 'bar',
171 ]);
172
173 self::assertEquals([
174 'foo' => 'foo',
175 ], $validator->validated());
176 }
177
178 /**
179 * @unreleased
180 */
181 public function testRulesWithSanitizationAreApplied()
182 {
183 $validator = new Validator([
184 'name' => ['required'],
185 'age' => ['required', 'integer'],
186 ], [
187 'name' => 'Bill Murray',
188 'age' => '72',
189 ]);
190
191 self::assertSame([
192 'name' => 'Bill Murray',
193 'age' => 72,
194 ], $validator->validated());
195 }
196
197 /**
198 * @unreleased
199 */
200 public function testInvalidRulesThrowInvalidArgumentException()
201 {
202 $this->expectException(InvalidArgumentException::class);
203 $this->expectExceptionMessage(
204 'Validation rules must be an instance of ValidationRuleSet or a compatible array'
205 );
206
207 new Validator([
208 'foo' => 'wrong',
209 ], [
210 'foo' => 'foo',
211 ]);
212 }
213
214 /**
215 * @unreleased
216 */
217 public function testRulesWithoutValuesThrowsAnException()
218 {
219 $this->expectException(InvalidArgumentException::class);
220 $this->expectExceptionMessage('Missing values for rules');
221
222 new Validator([
223 'foo' => ['required'],
224 ], []);
225 }
226
227 /**
228 * Adds the validation register to the container, and adds a mock validation rule
229 *
230 * @unreleased
231 */
232 private function mockValidationRulesRegister()
233 {
234 Config::getServiceContainer()->singleton(
235 ValidationRulesRegistrar::class,
236 function () {
237 $register = new ValidationRulesRegistrar();
238 $register->register(
239 MockRequiredRule::class,
240 MockIntegerRule::class
241 );
242
243 return $register;
244 }
245 );
246 }
247 }
248
249 class MockRequiredRule implements ValidationRule
250 {
251 /**
252 * @inheritDoc
253 */
254 public static function id(): string
255 {
256 return 'required';
257 }
258
259 /**
260 * @inheritDoc
261 */
262 public static function fromString(string $options = null): ValidationRule
263 {
264 return new self();
265 }
266
267 /**
268 * @inheritDoc
269 */
270 public function __invoke($value, Closure $fail, string $key, array $values)
271 {
272 if (empty($value)) {
273 $fail('{field} required');
274 }
275 }
276 }
277
278 class MockIntegerRule implements ValidationRule, Sanitizer
279 {
280 /**
281 * @inheritDoc
282 */
283 public static function id(): string
284 {
285 return 'integer';
286 }
287
288 /**
289 * @inheritDoc
290 */
291 public static function fromString(string $options = null): ValidationRule
292 {
293 return new self();
294 }
295
296 /**
297 * @inheritDoc
298 */
299 public function __invoke($value, Closure $fail, string $key, array $values)
300 {
301 if (!is_numeric($value)) {
302 $fail('{field} must be an integer');
303 }
304 }
305
306 /**
307 * @inheritDoc
308 */
309 public function sanitize($value)
310 {
311 return (int)$value;
312 }
313 }
314