|
573 | 573 | // Empty string nullified, then fails required validation |
574 | 574 | $validator->validate(''); |
575 | 575 | })->throws(ValidationException::class, 'Field cannot be empty'); |
| 576 | + |
| 577 | +it('should apply default before required check for null input', function () { |
| 578 | + $validator = Validator::isString()->default('fallback')->required(); |
| 579 | + |
| 580 | + expect($validator->validate(null))->toBe('fallback'); |
| 581 | + expect($validator->validate('actual'))->toBe('actual'); |
| 582 | +}); |
| 583 | + |
| 584 | +it('should apply default after pipeline nullifies value', function () { |
| 585 | + $validator = Validator::isString() |
| 586 | + ->pipe('trim') |
| 587 | + ->nullifyEmpty() |
| 588 | + ->default('fallback') |
| 589 | + ->required(); |
| 590 | + |
| 591 | + expect($validator->validate(' '))->toBe('fallback'); |
| 592 | + expect($validator->validate('hello'))->toBe('hello'); |
| 593 | +}); |
| 594 | + |
| 595 | +it('should fail required when no default catches null', function () { |
| 596 | + $validator = Validator::isString() |
| 597 | + ->pipe('trim') |
| 598 | + ->nullifyEmpty() |
| 599 | + ->required('Cannot be blank'); |
| 600 | + |
| 601 | + $validator->validate(' '); |
| 602 | +})->throws(ValidationException::class, 'Cannot be blank'); |
| 603 | + |
| 604 | +it('should apply default after transform with skipNull false produces null', function () { |
| 605 | + $validator = Validator::isString() |
| 606 | + ->transform(fn($v) => null, skipNull: false) |
| 607 | + ->default('rescued'); |
| 608 | + |
| 609 | + expect($validator->validate(null))->toBe('rescued'); |
| 610 | + expect($validator->validate('anything'))->toBe('rescued'); |
| 611 | +}); |
| 612 | + |
| 613 | +it('should fail required after transform with skipNull false produces null and no default', function () { |
| 614 | + $validator = Validator::isString() |
| 615 | + ->transform(fn($v) => null, skipNull: false) |
| 616 | + ->required('Still needed'); |
| 617 | + |
| 618 | + $validator->validate('anything'); |
| 619 | +})->throws(ValidationException::class, 'Still needed'); |
| 620 | + |
| 621 | +it('should apply default from transform with skipNull false then pass required', function () { |
| 622 | + $validator = Validator::isString() |
| 623 | + ->transform(fn($v) => $v ?? 'from-transform', skipNull: false) |
| 624 | + ->required(); |
| 625 | + |
| 626 | + expect($validator->validate(null))->toBe('from-transform'); |
| 627 | +}); |
0 commit comments