mirror of
https://github.com/Respect/Validation.git
synced 2026-03-16 15:25:45 +01:00
Currently, the templates that a user provides when running `assert()` can significantly impact how the message is displayed. Because of this, the formatters become complex as they all need to handle similar conditions to format results. This commit changes this behaviour, letting only the `InterpolationRenderer` handle the templates. This makes the code simpler and allows people to use the `InterpolationRenderer` directly, without needing to figure out how to handle templates. Thinking about it further, I believe handling templates is a concern for the `Renderer` anyway, and this will open the way to other improvements using the renderer. I also removed the exception that is thrown when the template is not a string, because I think that after validation has failed, we should not throw any other exceptions, as that could cause unexpected errors for users.
124 lines
5 KiB
PHP
124 lines
5 KiB
PHP
<?php
|
|
|
|
/*
|
|
* Copyright (c) Alexandre Gomes Gaigalas <alganet@gmail.com>
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
test('Default: fail, fail', catchAll(
|
|
fn() => v::allOf(v::intType(), v::negative())->assert('string'),
|
|
fn(string $message, string $fullMessage, array $messages) => expect()
|
|
->and($message)->toBe('"string" must be an integer')
|
|
->and($fullMessage)->toBe(<<<'FULL_MESSAGE'
|
|
- "string" must pass all the rules
|
|
- "string" must be an integer
|
|
- "string" must be a negative number
|
|
FULL_MESSAGE)
|
|
->and($messages)->toBe([
|
|
'__root__' => '"string" must pass all the rules',
|
|
'intType' => '"string" must be an integer',
|
|
'negative' => '"string" must be a negative number',
|
|
]),
|
|
));
|
|
|
|
test('Default: fail, pass', catchAll(
|
|
fn() => v::allOf(v::intType(), v::stringType())->assert('string'),
|
|
fn(string $message, string $fullMessage, array $messages) => expect()
|
|
->and($message)->toBe('"string" must be an integer')
|
|
->and($fullMessage)->toBe('- "string" must be an integer')
|
|
->and($messages)->toBe(['intType' => '"string" must be an integer']),
|
|
));
|
|
|
|
test('Default: fail, fail, pass', catchAll(
|
|
fn() => v::allOf(v::intType(), v::positive(), v::stringType())->assert('string'),
|
|
fn(string $message, string $fullMessage, array $messages) => expect()
|
|
->and($message)->toBe('"string" must be an integer')
|
|
->and($fullMessage)->toBe(<<<'FULL_MESSAGE'
|
|
- "string" must pass the rules
|
|
- "string" must be an integer
|
|
- "string" must be a positive number
|
|
FULL_MESSAGE)
|
|
->and($messages)->toBe([
|
|
'__root__' => '"string" must pass the rules',
|
|
'intType' => '"string" must be an integer',
|
|
'positive' => '"string" must be a positive number',
|
|
]),
|
|
));
|
|
|
|
test('Inverted: pass, pass', catchAll(
|
|
fn() => v::not(v::allOf(v::intType(), v::negative()))->assert(-1),
|
|
fn(string $message, string $fullMessage, array $messages) => expect()
|
|
->and($message)->toBe('-1 must not be an integer')
|
|
->and($fullMessage)->toBe(<<<'FULL_MESSAGE'
|
|
- -1 must pass the rules
|
|
- -1 must not be an integer
|
|
- -1 must not be a negative number
|
|
FULL_MESSAGE)
|
|
->and($messages)->toBe([
|
|
'__root__' => '-1 must pass the rules',
|
|
'intType' => '-1 must not be an integer',
|
|
'negative' => '-1 must not be a negative number',
|
|
]),
|
|
));
|
|
|
|
test('Inverted: pass, fail, fail', catchAll(
|
|
fn() => v::allOf(v::intType(), v::alpha(), v::stringType())->assert(2),
|
|
fn(string $message, string $fullMessage, array $messages) => expect()
|
|
->and($message)->toBe('2 must contain only letters (a-z)')
|
|
->and($fullMessage)->toBe(<<<'FULL_MESSAGE'
|
|
- 2 must pass the rules
|
|
- 2 must contain only letters (a-z)
|
|
- 2 must be a string
|
|
FULL_MESSAGE)
|
|
->and($messages)->toBe([
|
|
'__root__' => '2 must pass the rules',
|
|
'alpha' => '2 must contain only letters (a-z)',
|
|
'stringType' => '2 must be a string',
|
|
]),
|
|
));
|
|
|
|
test('Wrapping "not"', catchAll(
|
|
fn() => v::allOf(v::not(v::intType()), v::greaterThan(2))->assert(4),
|
|
fn(string $message, string $fullMessage, array $messages) => expect()
|
|
->and($message)->toBe('4 must not be an integer')
|
|
->and($fullMessage)->toBe('- 4 must not be an integer')
|
|
->and($messages)->toBe(['notIntType' => '4 must not be an integer']),
|
|
));
|
|
|
|
test('With a single template', catchAll(
|
|
fn() => v::allOf(v::stringType(), v::arrayType())->assert(5, 'This is a single template'),
|
|
fn(string $message, string $fullMessage, array $messages) => expect()
|
|
->and($message)->toBe('This is a single template')
|
|
->and($fullMessage)->toBe(<<<'FULL_MESSAGE'
|
|
- This is a single template
|
|
- 5 must be a string
|
|
- 5 must be an array
|
|
FULL_MESSAGE)
|
|
->and($messages)->toBe([
|
|
'__root__' => 'This is a single template',
|
|
'stringType' => '5 must be a string',
|
|
'arrayType' => '5 must be an array',
|
|
]),
|
|
));
|
|
|
|
test('With multiple templates', catchAll(
|
|
fn() => v::allOf(v::stringType(), v::uppercase())->assert(5, [
|
|
'__root__' => 'Two things are wrong',
|
|
'stringType' => 'Template for "stringType"',
|
|
'uppercase' => 'Template for "uppercase"',
|
|
]),
|
|
fn(string $message, string $fullMessage, array $messages) => expect()
|
|
->and($message)->toBe('Template for "stringType"')
|
|
->and($fullMessage)->toBe(<<<'FULL_MESSAGE'
|
|
- Two things are wrong
|
|
- Template for "stringType"
|
|
- Template for "uppercase"
|
|
FULL_MESSAGE)
|
|
->and($messages)->toBe([
|
|
'__root__' => 'Two things are wrong',
|
|
'stringType' => 'Template for "stringType"',
|
|
'uppercase' => 'Template for "uppercase"',
|
|
]),
|
|
));
|