respect-validation/tests/feature/ValidationExceptionStackTraceTest.php
Henrique Moody fd7438f9c7
Use a DI container to create instances of Validator
The `ValidatorDefaults` is cumbersome, and customising it can be
annoying. Most projects use some sort of dependency injection container,
and by integrating the creation of the `Validator` with the PSR-11, we
allow users to easily customise how they create validators.

Some tasks, like overwriting the `Translator`, become a bit more
verbose, if the user is not already using a PSR-11 container, but I
think that’s a good tradeoff.
2025-12-22 13:12:04 +01:00

68 lines
2.1 KiB
PHP

<?php
/*
* Copyright (c) Alexandre Gomes Gaigalas <alganet@gmail.com>
* SPDX-License-Identifier: MIT
*/
declare(strict_types=1);
use Respect\Validation\Exceptions\ValidationException;
use Respect\Validation\Test\Stubs\MyValidator;
test('Should overwrite file and line in the Validator class', function (): void {
try {
v::intType()->assert('string');
} catch (ValidationException $e) {
expect($e->getFile())->toBe(__FILE__);
expect($e->getLine())->toBe(__LINE__ - 3);
}
});
test('Should overwrite file and line in ValidationException', function (): void {
try {
MyValidator::assertIntType('string');
} catch (ValidationException $e) {
expect($e->getFile())->toBe(__FILE__);
expect($e->getLine())->toBe(__LINE__ - 3);
}
});
test('Should not overwrite file and line when created manually', function (): void {
try {
throw new ValidationException('message', 'fullMessage', ['id' => 'message']);
} catch (ValidationException $e) {
expect($e->getFile())->toBe(__FILE__);
expect($e->getLine())->toBe(__LINE__ - 3);
}
});
test('Should not overwrite file and line when file cannot be ever traced', function (): void {
try {
throw new ValidationException('message', 'fullMessage', ['id' => 'message'], ['/tmp/unknown']);
} catch (ValidationException $e) {
expect($e->getFile())->toBe(__FILE__);
expect($e->getLine())->toBe(__LINE__ - 3);
}
});
test('Should go not overwrite file and line when it runs out of choices', function (): void {
try {
$trace = array_unique(
array_filter(
array_map(
fn($trace) => $trace['file'] ?? null,
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS),
),
),
);
$trace[] = __FILE__;
throw new ValidationException('message', 'fullMessage', ['id' => 'message'], $trace);
} catch (ValidationException $e) {
expect($e->getFile())->toBe(__FILE__);
expect($e->getLine())->toBe(__LINE__ - 3);
}
});