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
4 changes: 3 additions & 1 deletion src/Bridge/Symfony/Bundle/Command/SwaggerCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
69 changes: 69 additions & 0 deletions tests/Bridge/Symfony/Bundle/Command/SwaggerCommandUnitTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?php

/*
* This file is part of the API Platform project.
*
* (c) Kévin Dunglas <dunglas@gmail.com>
*
* 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

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: a unit test was much simpler and efficient to write - the current integration test is not something I could work with anyway, since I don't run MongoDB on any system I maintain (including my dev environment) by choice

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually there was a an attempt to remove the hard dev dependency to MongoDB (#2703), but it has been added again by #2843 (an issue with PHPStan it seems).

By default though, the Behat tests are run without MongoDB.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I hope that can be achieved again at some point: for now, I'm happy with adding a unit test, and providing more unit tests in future, shall I encounter isolated issues, like this one.

@teohhanhui teohhanhui Feb 17, 2020

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PHP extensions are no longer required to be loaded - thanks to Roave/BetterReflection and PhpStorm stubs!

https://github.com/phpstan/phpstan/releases/tag/0.12.4

We should be able to do this once we upgrade to phpstan ^0.12.4! 😄

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately, we still can't remove the MongoDB packages, because we'd get errors such as:

 ------ -------------------------------------------------------------------------------------------- 
  Line   src/Bridge/Doctrine/Common/Util/IdentifierManagerTrait.php (in context of anonymous class)  
 ------ -------------------------------------------------------------------------------------------- 
  47     Class Doctrine\ODM\MongoDB\DocumentManager not found.                                       
  86     Call to static method hasType() on an unknown class Doctrine\ODM\MongoDB\Types\Type.        
  87     Call to static method getType() on an unknown class Doctrine\ODM\MongoDB\Types\Type.        
 ------ --------------------------------------------------------------------------------------------

😞

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ondrejmirtes Do you perhaps have any suggestions on how this could be resolved? I see there are MongoDB ODM stubs in https://github.com/phpstan/phpstan-doctrine/tree/master/stubs

Is there a way to tell phpstan that these types "exist" purely based on the stubs?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See #3431 for an attempt.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way to tell phpstan that these types "exist" purely based on the stubs?

You'd have to make the class available for the autoloader. See: https://phpstan.org/user-guide/autoloading

{
/** @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);
}
}