diff --git a/src/Bridge/Symfony/Bundle/Command/SwaggerCommand.php b/src/Bridge/Symfony/Bundle/Command/SwaggerCommand.php index 71722613f13..9c220501e60 100644 --- a/src/Bridge/Symfony/Bundle/Command/SwaggerCommand.php +++ b/src/Bridge/Symfony/Bundle/Command/SwaggerCommand.php @@ -92,7 +92,9 @@ protected function execute(InputInterface $input, OutputInterface $output) $documentation = new Documentation($this->resourceNameCollectionFactory->create(), $this->apiTitle, $this->apiDescription, $this->apiVersion, $this->apiFormats); $data = $this->normalizer->normalize($documentation, DocumentationNormalizer::FORMAT, ['spec_version' => (int) $version, ApiGatewayNormalizer::API_GATEWAY => $input->getOption('api-gateway')]); - $content = $input->getOption('yaml') ? Yaml::dump($data, 10, 2, Yaml::DUMP_OBJECT_AS_MAP | Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE | Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK) : (json_encode($data, JSON_PRETTY_PRINT) ?: ''); + $content = $input->getOption('yaml') + ? Yaml::dump($data, 10, 2, Yaml::DUMP_OBJECT_AS_MAP | Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE | Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK) + : (json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) ?: ''); if (!empty($filename = $input->getOption('output')) && \is_string($filename)) { file_put_contents($filename, $content); diff --git a/tests/Bridge/Symfony/Bundle/Command/SwaggerCommandUnitTest.php b/tests/Bridge/Symfony/Bundle/Command/SwaggerCommandUnitTest.php new file mode 100644 index 00000000000..6259f192a40 --- /dev/null +++ b/tests/Bridge/Symfony/Bundle/Command/SwaggerCommandUnitTest.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Core\Tests\Bridge\Symfony\Bundle\Command; + +use ApiPlatform\Core\Bridge\Symfony\Bundle\Command\SwaggerCommand; +use ApiPlatform\Core\Documentation\Documentation; +use ApiPlatform\Core\Metadata\Resource\Factory\ResourceNameCollectionFactoryInterface; +use ApiPlatform\Core\Metadata\Resource\ResourceNameCollection; +use PHPUnit\Framework\MockObject\MockObject; +use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use Symfony\Component\Console\Input\ArrayInput; +use Symfony\Component\Console\Output\BufferedOutput; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; + +class SwaggerCommandUnitTest extends KernelTestCase +{ + /** @var MockObject&NormalizerInterface */ + private $normalizer; + + /** @var ResourceNameCollectionFactoryInterface&MockObject */ + private $resources; + + /** @var SwaggerCommand */ + private $command; + + protected function setUp(): void + { + $this->normalizer = $this->createMock(NormalizerInterface::class); + $this->resources = $this->createMock(ResourceNameCollectionFactoryInterface::class); + $this->command = new SwaggerCommand( + $this->normalizer, + $this->resources, + 'My API', + 'I told you already: it is my API', + 'one-zero-zero' + ); + + $this->resources->method('create') + ->willReturn(new ResourceNameCollection()); + } + + public function testDocumentationJsonDoesNotUseEscapedSlashes(): void + { + $this->normalizer->method('normalize') + ->with(self::isInstanceOf(Documentation::class)) + ->willReturn(['a-jsonable-documentation' => 'containing/some/slashes']); + + $output = new BufferedOutput(); + + $this->command->run(new ArrayInput([]), $output); + + $jsonOutput = $output->fetch(); + + self::assertJson($jsonOutput); + self::assertStringNotContainsString('containing\/some\/slashes', $jsonOutput); + self::assertStringContainsString('containing/some/slashes', $jsonOutput); + } +}