Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"php": ">=8.5",
"php-di/php-di": "^7.1",
"psr/container": "^2.0",
"respect/string-formatter": "^1.6",
"respect/string-formatter": "^1.7",
"respect/stringifier": "^3.0",
"symfony/polyfill-intl-idn": "^1.33",
"symfony/polyfill-mbstring": "^1.33"
Expand Down
14 changes: 7 additions & 7 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion src/ContainerRegistry.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use Psr\Container\ContainerInterface;
use Respect\StringFormatter\BypassTranslator;
use Respect\StringFormatter\Modifier;
use Respect\StringFormatter\Modifiers\FormatterModifier;
use Respect\StringFormatter\Modifiers\ListModifier;
use Respect\StringFormatter\Modifiers\QuoteModifier;
use Respect\StringFormatter\Modifiers\RawModifier;
Expand Down Expand Up @@ -92,7 +93,7 @@ public static function createContainer(array $definitions = []): Container
new ListModifier(
new QuoteModifier(
new RawModifier(
new StringifyModifier($container->get(Stringifier::class)),
new FormatterModifier(new StringifyModifier($container->get(Stringifier::class))),
),
),
$container->get(TranslatorInterface::class),
Expand Down
74 changes: 74 additions & 0 deletions tests/feature/FormatterModifierTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?php

/*
* SPDX-License-Identifier: MIT
* SPDX-FileCopyrightText: (c) Respect Project Contributors
* SPDX-FileContributor: Henrique Moody <henriquemoody@gmail.com>
*/

declare(strict_types=1);

test('uppercase modifier', catchMessage(
fn() => v::templated('{{input|uppercase}} is not valid', v::email())->assert('not an email'),
fn(string $message) => expect($message)->toBe('NOT AN EMAIL is not valid'),
));

test('lowercase modifier', catchMessage(
fn() => v::templated('{{input|lowercase}} is not valid', v::email())->assert('NOT AN EMAIL'),
fn(string $message) => expect($message)->toBe('not an email is not valid'),
));

test('mask modifier', catchMessage(
fn() => v::templated('{{input|mask:1-4}} is masked', v::alwaysInvalid())->assert('secret'),
fn(string $message) => expect($message)->toBe('****et is masked'),
));

test('mask modifier with custom replacement', catchMessage(
fn() => v::templated('{{input|mask:1-4:X}} is masked', v::alwaysInvalid())->assert('secret'),
fn(string $message) => expect($message)->toBe('XXXXet is masked'),
));

test('pattern modifier', catchMessage(
fn() => v::templated('Formatted: {{input|pattern:###-####}}', v::alwaysInvalid())->assert('1234567'),
fn(string $message) => expect($message)->toBe('Formatted: 123-4567'),
));

test('date modifier', catchMessage(
fn() => v::templated('Date: {{input|date:d/m/Y}}', v::alwaysInvalid())->assert('2024-01-15'),
fn(string $message) => expect($message)->toBe('Date: 15/01/2024'),
));

test('number modifier', catchMessage(
fn() => v::templated('Value: {{input|number:2}}', v::alwaysInvalid())->assert('1234567.89'),
fn(string $message) => expect($message)->toBe('Value: 1,234,567.89'),
));

test('creditCard modifier', catchMessage(
fn() => v::templated('Card: {{input|creditCard}}', v::alwaysInvalid())->assert('4532015112830366'),
fn(string $message) => expect($message)->toBe('Card: 4532 0151 1283 0366'),
));

test('secureCreditCard modifier', catchMessage(
fn() => v::templated('Card: {{input|secureCreditCard}}', v::alwaysInvalid())->assert('4532015112830366'),
fn(string $message) => expect($message)->toBe('Card: 4532 **** **** 0366'),
));

test('trim modifier', catchMessage(
fn() => v::templated('{{input|trim}} is not valid', v::email())->assert(' not-email '),
fn(string $message) => expect($message)->toBe('not-email is not valid'),
));

test('metric modifier', catchMessage(
fn() => v::templated('Distance: {{input|metric:mm}}', v::alwaysInvalid())->assert('5000'),
fn(string $message) => expect($message)->toBe('Distance: 5m'),
));

test('custom parameter with modifier', catchMessage(
fn() => v::templated('Name: {{name|uppercase}}', v::alwaysInvalid(), ['name' => 'john'])->assert(1),
fn(string $message) => expect($message)->toBe('Name: JOHN'),
));

test('chained modifiers', catchMessage(
fn() => v::templated('{{input|mask:1-4|uppercase}}', v::alwaysInvalid())->assert('secret'),
fn(string $message) => expect($message)->toBe('****ET'),
));
64 changes: 64 additions & 0 deletions tests/feature/Validators/FormattedTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,67 @@
->and($fullMessage)->toBe('- "1234 1234 1234 1234" must be a credit card number')
->and($messages)->toBe(['creditCard' => '"1234 1234 1234 1234" must be a credit card number']),
));

test('failed validator with uppercase formatted input', catchAll(
fn() => v::formatted(f::uppercase(), v::email())->assert('not an email'),
fn(string $message, string $fullMessage, array $messages) => expect()
->and($message)->toBe('"NOT AN EMAIL" must be an email address')
->and($fullMessage)->toBe('- "NOT AN EMAIL" must be an email address')
->and($messages)->toBe(['email' => '"NOT AN EMAIL" must be an email address']),
));

test('failed validator with lowercase formatted input', catchAll(
fn() => v::formatted(f::lowercase(), v::email())->assert('NOT AN EMAIL'),
fn(string $message, string $fullMessage, array $messages) => expect()
->and($message)->toBe('"not an email" must be an email address')
->and($fullMessage)->toBe('- "not an email" must be an email address')
->and($messages)->toBe(['email' => '"not an email" must be an email address']),
));

test('failed validator with trimmed input', catchAll(
fn() => v::formatted(f::trim('both', null), v::email())->assert(' not-email '),
fn(string $message, string $fullMessage, array $messages) => expect()
->and($message)->toBe('"not-email" must be an email address')
->and($fullMessage)->toBe('- "not-email" must be an email address')
->and($messages)->toBe(['email' => '"not-email" must be an email address']),
));

test('failed validator with number formatted input', catchAll(
fn() => v::formatted(f::number(2, '.', ','), v::email())->assert('1234567.89'),
fn(string $message, string $fullMessage, array $messages) => expect()
->and($message)->toBe('"1,234,567.89" must be an email address')
->and($fullMessage)->toBe('- "1,234,567.89" must be an email address')
->and($messages)->toBe(['email' => '"1,234,567.89" must be an email address']),
));

test('failed validator with date formatted input', catchAll(
fn() => v::formatted(f::date('d/m/Y'), v::email())->assert('2024-01-15'),
fn(string $message, string $fullMessage, array $messages) => expect()
->and($message)->toBe('"15/01/2024" must be an email address')
->and($fullMessage)->toBe('- "15/01/2024" must be an email address')
->and($messages)->toBe(['email' => '"15/01/2024" must be an email address']),
));

test('failed validator with credit card formatted input', catchAll(
fn() => v::formatted(f::creditCard(), v::creditCard())->assert('1234567890123456'),
fn(string $message, string $fullMessage, array $messages) => expect()
->and($message)->toBe('"1234 5678 9012 3456" must be a credit card number')
->and($fullMessage)->toBe('- "1234 5678 9012 3456" must be a credit card number')
->and($messages)->toBe(['creditCard' => '"1234 5678 9012 3456" must be a credit card number']),
));

test('failed validator with secure credit card formatted input', catchAll(
fn() => v::formatted(f::secureCreditCard(), v::creditCard())->assert('1234567890123456'),
fn(string $message, string $fullMessage, array $messages) => expect()
->and($message)->toBe('"1234 **** **** 3456" must be a credit card number')
->and($fullMessage)->toBe('- "1234 **** **** 3456" must be a credit card number')
->and($messages)->toBe(['creditCard' => '"1234 **** **** 3456" must be a credit card number']),
));

test('failed validator with chained formatters', catchAll(
fn() => v::formatted(f::trim('both', null)->uppercase(), v::email())->assert(' not an email '),
fn(string $message, string $fullMessage, array $messages) => expect()
->and($message)->toBe('"NOT AN EMAIL" must be an email address')
->and($fullMessage)->toBe('- "NOT AN EMAIL" must be an email address')
->and($messages)->toBe(['email' => '"NOT AN EMAIL" must be an email address']),
));