respect-validation/tests/unit/Validators/FormattedTest.php
Henrique Moody dc0c0345c9
Create "Formatted" validator
The Formatted validator decorates another validator to transform how
input values appear in error messages, while still validating the
original unmodified input.

This is useful for improving the readability of error messages by
displaying values in a user-friendly formatd.

The validator accepts any Respect\StringFormatter\Formatter implementation,
allowing direct use of StringFormatter's fluent builder. As StringFormatter
expands with more formatters in future releases, users will automatically
benefit from the full range of formatting options.

Assisted-by: Claude Code (Opus 4.5)
2026-02-06 20:44:26 +01:00

66 lines
2 KiB
PHP

<?php
/*
* SPDX-License-Identifier: MIT
* SPDX-FileCopyrightText: (c) Respect Project Contributors
* SPDX-FileContributor: Henrique Moody <henriquemoody@gmail.com>
*/
declare(strict_types=1);
namespace Respect\Validation\Validators;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Test;
use Respect\Validation\Test\Formatters\FormatterStub;
use Respect\Validation\Test\TestCase;
use Respect\Validation\Test\Validators\Stub;
#[CoversClass(Formatted::class)]
final class FormattedTest extends TestCase
{
#[Test]
#[DataProvider('providerForNonStringValues')]
public function shouldNotValidateWhenInputIsNotStringValue(mixed $input): void
{
$this->assertInvalidInput(new Formatted(new FormatterStub('any'), Stub::any(1)), $input);
}
#[Test]
#[DataProvider('providerForStringValues')]
public function shouldFormatTheInputWhenInputIsStringValue(mixed $input): void
{
$formattedValue = 'formatted-value';
$formatter = new FormatterStub($formattedValue);
$stub = Stub::pass(2);
$comparableResult = $stub->evaluate($input);
$validator = new Formatted($formatter, $stub);
$result = $validator->evaluate($input);
self::assertSame($formattedValue, $result->input);
self::assertSame($comparableResult->hasPassed, $result->hasPassed);
self::assertSame($comparableResult->validator, $result->validator);
}
#[Test]
public function shouldPassValidationWhenInnerValidatorPasses(): void
{
$formatter = new FormatterStub('formatted');
$validator = new Formatted($formatter, Stub::pass(1));
$this->assertValidInput($validator, 'any-string');
}
#[Test]
public function shouldFailValidationWhenInnerValidatorFails(): void
{
$formatter = new FormatterStub('formatted');
$validator = new Formatted($formatter, Stub::fail(1));
$this->assertInvalidInput($validator, 'any-string');
}
}