ValidationExceptionTest.php 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. <?php
  2. declare(strict_types=1);
  3. namespace ShlinkioTest\Shlink\Core\Exception;
  4. use Fig\Http\Message\StatusCodeInterface;
  5. use Laminas\InputFilter\InputFilterInterface;
  6. use LogicException;
  7. use PHPUnit\Framework\TestCase;
  8. use RuntimeException;
  9. use Shlinkio\Shlink\Core\Exception\ValidationException;
  10. use Throwable;
  11. use function array_keys;
  12. use function print_r;
  13. class ValidationExceptionTest extends TestCase
  14. {
  15. /**
  16. * @test
  17. * @dataProvider provideExceptions
  18. */
  19. public function createsExceptionFromInputFilter(?Throwable $prev): void
  20. {
  21. $invalidData = [
  22. 'foo' => 'bar',
  23. 'something' => ['baz', 'foo'],
  24. ];
  25. $barValue = print_r(['baz', 'foo'], true);
  26. $expectedStringRepresentation = <<<EOT
  27. 'foo' => bar
  28. 'something' => {$barValue}
  29. EOT;
  30. $inputFilter = $this->prophesize(InputFilterInterface::class);
  31. $getMessages = $inputFilter->getMessages()->willReturn($invalidData);
  32. $e = ValidationException::fromInputFilter($inputFilter->reveal());
  33. $this->assertEquals($invalidData, $e->getInvalidElements());
  34. $this->assertEquals(['invalidElements' => array_keys($invalidData)], $e->getAdditionalData());
  35. $this->assertEquals('Provided data is not valid', $e->getMessage());
  36. $this->assertEquals(StatusCodeInterface::STATUS_BAD_REQUEST, $e->getCode());
  37. $this->assertEquals($prev, $e->getPrevious());
  38. $this->assertStringContainsString($expectedStringRepresentation, (string) $e);
  39. $getMessages->shouldHaveBeenCalledOnce();
  40. }
  41. public function provideExceptions(): iterable
  42. {
  43. return [[null, new RuntimeException(), new LogicException()]];
  44. }
  45. }