diff --git a/sonar-project.properties b/sonar-project.properties index 00f6d63d..55b6ed7e 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -2,6 +2,6 @@ sonar.projectKey=SMillerDev_phpdraft sonar.projectName=PHPDraft sonar.organization=smillerdev-github sonar.sources=src/PHPDraft -sonar.php.coverage.reportPaths=coverage/coverage.xml +sonar.php.coverage.reportPaths=coverage.xml sonar.exclusions=src/PHPDraft/**/Tests/**, tests/** sonar.coverage.exclusions=src/PHPDraft/Out/HTML/** diff --git a/src/PHPDraft/Model/Elements/Tests/ElementStructureElementTest.php b/src/PHPDraft/Model/Elements/Tests/ElementStructureElementTest.php new file mode 100644 index 00000000..8d4f45b1 --- /dev/null +++ b/src/PHPDraft/Model/Elements/Tests/ElementStructureElementTest.php @@ -0,0 +1,110 @@ +class = new ElementStructureElement(); + $this->reflection = new ReflectionClass('PHPDraft\Model\Elements\ElementStructureElement'); + } + + /** + * Tear down + */ + public function tearDown(): void + { + unset($this->class); + unset($this->reflection); + } + + /** + * @covers \PHPDraft\Model\Elements\ElementStructureElement::parse + */ + public function testParse() + { + $json = '{"element": "Cow", "content": "stuff", "meta": {"description": {"content": "desc"}}}'; + $dep = []; + $this->class->parse(json_decode($json), $dep); + + $this->assertPropertySame('type', 'Cow'); + $this->assertPropertySame('value', 'stuff'); + $this->assertPropertySame('description', 'desc'); + $this->assertSame(['Cow'], $dep); + } + + /** + * @covers \PHPDraft\Model\Elements\ElementStructureElement::string_value + */ + public function testStringValue() + { + $this->assertSame('
  • ', $this->class->string_value()); + } + + /** + * @covers \PHPDraft\Model\Elements\ElementStructureElement::__toString + */ + public function testToString() + { + $this->set_reflection_property_value('type', 'string'); + + $this->assertSame('
  • string
  • ', $this->class->__toString()); + } + + /** + * @covers \PHPDraft\Model\Elements\ElementStructureElement::__toString + */ + public function testToStringCustomType() + { + $this->set_reflection_property_value('type', 'Cow'); + + $this->assertSame('
  • Cow
  • ', $this->class->__toString()); + } + + /** + * @covers \PHPDraft\Model\Elements\ElementStructureElement::__toString + */ + public function testToStringDescription() + { + $this->set_reflection_property_value('type', 'Cow'); + $this->set_reflection_property_value('description', 'Something'); + + $this->assertSame('
  • Cow - Something
  • ', $this->class->__toString()); + } + + /** + * @covers \PHPDraft\Model\Elements\ElementStructureElement::__toString + */ + public function testToStringValue() + { + $this->set_reflection_property_value('type', 'Cow'); + $this->set_reflection_property_value('value', 'stuff'); + + $this->assertSame('
  • Cow - stuff
  • ', $this->class->__toString()); + } + + /** + * @covers \PHPDraft\Model\Elements\ElementStructureElement::__toString + */ + public function testToStringDescriptionAndValue() + { + $this->set_reflection_property_value('type', 'Cow'); + $this->set_reflection_property_value('value', 'stuff'); + $this->set_reflection_property_value('description', 'Something'); + + $this->assertSame('
  • Cow - Something - stuff
  • ', $this->class->__toString()); + } +} diff --git a/src/PHPDraft/Out/Sorting.php b/src/PHPDraft/Out/Sorting.php index 246e5e27..7da422f1 100644 --- a/src/PHPDraft/Out/Sorting.php +++ b/src/PHPDraft/Out/Sorting.php @@ -22,28 +22,28 @@ class Sorting * * @var int */ - public static $PHPD_SORT_ALL = 3; + public const PHPD_SORT_ALL = 3; /** * Sets sorting to all webservices. * * @var int */ - public static $PHPD_SORT_WEBSERVICES = 2; + public const PHPD_SORT_WEBSERVICES = 2; /** * Sets sorting to all data structures. * * @var int */ - public static $PHPD_SORT_STRUCTURES = 1; + public const PHPD_SORT_STRUCTURES = 1; /** * Sets sorting to no data structures. * * @var int */ - public static $PHPD_SORT_NONE = -1; + public const PHPD_SORT_NONE = -1; /** * Check if structures should be sorted. @@ -54,7 +54,7 @@ class Sorting */ public static function sortStructures(int $sort): bool { - return $sort === self::$PHPD_SORT_ALL || $sort === self::$PHPD_SORT_STRUCTURES; + return $sort === self::PHPD_SORT_ALL || $sort === self::PHPD_SORT_STRUCTURES; } /** @@ -66,6 +66,6 @@ public static function sortStructures(int $sort): bool */ public static function sortServices(int $sort): bool { - return $sort === self::$PHPD_SORT_ALL || $sort === self::$PHPD_SORT_WEBSERVICES; + return $sort === self::PHPD_SORT_ALL || $sort === self::PHPD_SORT_WEBSERVICES; } } diff --git a/src/PHPDraft/Out/TemplateGenerator.php b/src/PHPDraft/Out/TemplateGenerator.php index 342397f5..e9b8f393 100644 --- a/src/PHPDraft/Out/TemplateGenerator.php +++ b/src/PHPDraft/Out/TemplateGenerator.php @@ -89,7 +89,7 @@ public function __construct(string $template, ?string $image) $this->base_data['COLOR_2'] = $template_parts[2] ?? 'light_green'; $this->image = $image; $this->http_status = new Httpstatus(); - $this->sorting = Sorting::$PHPD_SORT_NONE; + $this->sorting = Sorting::PHPD_SORT_NONE; } /** diff --git a/src/PHPDraft/Out/Tests/SortingTest.php b/src/PHPDraft/Out/Tests/SortingTest.php new file mode 100644 index 00000000..941b5eb7 --- /dev/null +++ b/src/PHPDraft/Out/Tests/SortingTest.php @@ -0,0 +1,52 @@ + + */ + +namespace PHPDraft\Out\Tests; + +use Lunr\Halo\LunrBaseTest; +use PHPDraft\Out\Sorting; +use PHPDraft\Out\Version; +use ReflectionClass; + +/** + * Class SortingTest + * + * @covers \PHPDraft\Out\Sorting + */ +class SortingTest extends LunrBaseTest +{ + + /** + * Test if service sorting is determined correctly. + * + * @covers \PHPDraft\Out\Sorting::sortServices + */ + public function testSortsServicesIfNeeded(): void + { + $this->assertTrue(Sorting::sortServices(3)); + $this->assertTrue(Sorting::sortServices(2)); + $this->assertFalse(Sorting::sortServices(-1)); + $this->assertFalse(Sorting::sortServices(1)); + $this->assertFalse(Sorting::sortServices(0)); + } + + /** + * Test if structure sorting is determined correctly. + * + * @covers \PHPDraft\Out\Sorting::sortStructures + */ + public function testSortsStructureIfNeeded(): void + { + $this->assertTrue(Sorting::sortStructures(3)); + $this->assertTrue(Sorting::sortStructures(1)); + $this->assertFalse(Sorting::sortStructures(-1)); + $this->assertFalse(Sorting::sortStructures(2)); + $this->assertFalse(Sorting::sortStructures(0)); + } +} diff --git a/src/PHPDraft/Parse/BaseHtmlGenerator.php b/src/PHPDraft/Parse/BaseHtmlGenerator.php index 7340769f..216d795c 100644 --- a/src/PHPDraft/Parse/BaseHtmlGenerator.php +++ b/src/PHPDraft/Parse/BaseHtmlGenerator.php @@ -35,6 +35,8 @@ abstract class BaseHtmlGenerator * JsonToHTML constructor. * * @param object $json JSON representation of an API Blueprint + * + * @return self */ public function init(object $json): self { diff --git a/src/PHPDraft/Parse/LegacyDrafter.php b/src/PHPDraft/Parse/LegacyDrafter.php deleted file mode 100644 index 999a6c04..00000000 --- a/src/PHPDraft/Parse/LegacyDrafter.php +++ /dev/null @@ -1,77 +0,0 @@ - - */ - -namespace PHPDraft\Parse; - -use PHPDraft\In\ApibFileParser; - -/** - * Class LegacyDrafter - * - * @deprecated No longer supported - */ -class LegacyDrafter extends BaseParser -{ - /** - * The location of the drafter executable. - * - * @var string - */ - protected $drafter; - - /** - * ApibToJson constructor. - * - * @param ApibFileParser $apib API Blueprint text - * - * @return \PHPDraft\Parse\BaseParser - */ - public function init(ApibFileParser $apib): BaseParser - { - parent::init($apib); - $this->drafter = self::location(); - - return $this; - } - - /** - * Return drafter location if found. - * - * @return bool|string - */ - public static function location() - { - return false; - } - - /** - * Check if a given parser is available. - * - * @deprecated V2 doesn't support drafter 3. - * - * @return bool - */ - public static function available(): bool - { - return false; - } - - /** - * Parses the apib for the selected method. - * - * @return void - */ - protected function parse(): void - { - return; - } -} diff --git a/src/PHPDraft/Parse/ParserFactory.php b/src/PHPDraft/Parse/ParserFactory.php index 1b6b2176..20271564 100644 --- a/src/PHPDraft/Parse/ParserFactory.php +++ b/src/PHPDraft/Parse/ParserFactory.php @@ -12,7 +12,7 @@ class ParserFactory /** * Get the applicable Drafter parser. * - * @return \PHPDraft\Parse\BaseParser The parser that can be used + * @return BaseParser The parser that can be used */ public static function getDrafter(): BaseParser { @@ -22,26 +22,20 @@ public static function getDrafter(): BaseParser if (DrafterAPI::available()) { return new DrafterAPI(); } - if (LegacyDrafter::available()) { - throw new ResourceException('Drafter 3.x is no longer supported', 100); - } - throw new ResourceException("Couldn't get an apib parser", 255); + throw new ResourceException("Couldn't get an APIB parser", 255); } /** * Get the applicable JSON parser. * - * @return \PHPDraft\Parse\BaseHtmlGenerator The parser that can be used + * @return BaseHtmlGenerator The parser that can be used */ public static function getJson(): BaseHtmlGenerator { if (Drafter::available() || DrafterAPI::available()) { return new HtmlGenerator(); } - if (LegacyDrafter::available()) { - throw new ResourceException('Drafter 3.x is no longer supported', 100); - } throw new ResourceException("Couldn't get a JSON parser", 255); } diff --git a/src/PHPDraft/Parse/Tests/BaseHtmlGeneratorTest.php b/src/PHPDraft/Parse/Tests/BaseHtmlGeneratorTest.php new file mode 100644 index 00000000..31f794f0 --- /dev/null +++ b/src/PHPDraft/Parse/Tests/BaseHtmlGeneratorTest.php @@ -0,0 +1,45 @@ +class = $this->getMockForAbstractClass('PHPDraft\Parse\BaseHtmlGenerator'); + $this->reflection = new ReflectionClass('PHPDraft\Parse\BaseHtmlGenerator'); + } + + /** + * Tear down + */ + public function tearDown(): void + { + unset($this->class); + unset($this->reflection); + } + + /** + * * @covers \PHPDraft\Parse\BaseHtmlGenerator::init + */ + public function testInit() + { + $data = json_decode(file_get_contents(TEST_STATICS . '/drafter/json/index.json')); + $init = $this->class->init($data); + + $this->assertPropertySame('object', $data); + } +} diff --git a/src/PHPDraft/Parse/Tests/ParserFactoryTest.php b/src/PHPDraft/Parse/Tests/ParserFactoryTest.php new file mode 100644 index 00000000..a65241af --- /dev/null +++ b/src/PHPDraft/Parse/Tests/ParserFactoryTest.php @@ -0,0 +1,104 @@ +mock_method(['\PHPDraft\Parse\Drafter', 'available'], function () { + return true; + }); + + $this->assertInstanceOf('\PHPDraft\Parse\Drafter', ParserFactory::getDrafter()); + + $this->unmock_method(['\PHPDraft\Parse\Drafter', 'available']); + } + + /** + * @covers \PHPDraft\Parse\ParserFactory::getDrafter + */ + public function testGetDrafterAPI() + { + $this->mock_method(['\PHPDraft\Parse\Drafter', 'available'], function () { + return false; + }); + $this->mock_method(['\PHPDraft\Parse\DrafterAPI', 'available'], function () { + return true; + }); + + $this->assertInstanceOf('\PHPDraft\Parse\DrafterAPI', ParserFactory::getDrafter()); + + $this->unmock_method(['\PHPDraft\Parse\Drafter', 'available']); + $this->unmock_method(['\PHPDraft\Parse\DrafterAPI', 'available']); + } + + /** + * @covers \PHPDraft\Parse\ParserFactory::getDrafter + */ + public function testGetDrafterFails() + { + $this->expectException('\PHPDraft\Parse\ResourceException'); + $this->expectExceptionMessage('Couldn\'t get an APIB parser'); + $this->mock_method(['\PHPDraft\Parse\Drafter', 'available'], function () { + return false; + }); + $this->mock_method(['\PHPDraft\Parse\DrafterAPI', 'available'], function () { + return false; + }); + + ParserFactory::getDrafter(); + + $this->unmock_method(['\PHPDraft\Parse\Drafter', 'available']); + $this->unmock_method(['\PHPDraft\Parse\DrafterAPI', 'available']); + } + + /** + * @covers \PHPDraft\Parse\ParserFactory::getJson + */ + public function testGetJson() + { + $this->mock_method(['\PHPDraft\Parse\Drafter', 'available'], function () { + return false; + }); + $this->mock_method(['\PHPDraft\Parse\DrafterAPI', 'available'], function () { + return true; + }); + + $this->assertInstanceOf('\PHPDraft\Parse\HtmlGenerator', ParserFactory::getJson()); + + $this->unmock_method(['\PHPDraft\Parse\Drafter', 'available']); + $this->unmock_method(['\PHPDraft\Parse\DrafterAPI', 'available']); + } + + /** + * @covers \PHPDraft\Parse\ParserFactory::getJson + */ + public function testGetJsonFails() + { + $this->expectException('\PHPDraft\Parse\ResourceException'); + $this->expectExceptionMessage('Couldn\'t get a JSON parser'); + $this->mock_method(['\PHPDraft\Parse\Drafter', 'available'], function () { + return false; + }); + $this->mock_method(['\PHPDraft\Parse\DrafterAPI', 'available'], function () { + return false; + }); + + ParserFactory::getJson(); + + $this->unmock_method(['\PHPDraft\Parse\Drafter', 'available']); + $this->unmock_method(['\PHPDraft\Parse\DrafterAPI', 'available']); + } +} diff --git a/tests/phpunit.xml b/tests/phpunit.xml index 552b040d..7adb8b1e 100755 --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -15,6 +15,8 @@ ../src/PHPDraft/Parse/Tests/DrafterTest.php ../src/PHPDraft/Parse/Tests/DrafterAPITest.php ../src/PHPDraft/Parse/Tests/HtmlGeneratorTest.php + ../src/PHPDraft/Parse/Tests/BaseHtmlGeneratorTest.php + ../src/PHPDraft/Parse/Tests/ParserFactoryTest.php ../src/PHPDraft/Model/Tests/CategoryTest.php @@ -28,12 +30,14 @@ ../src/PHPDraft/Model/Elements/Tests/ObjectStructureElementTest.php ../src/PHPDraft/Model/Elements/Tests/ArrayStructureElementTest.php ../src/PHPDraft/Model/Elements/Tests/RequestBodyElementTest.php + ../src/PHPDraft/Model/Elements/Tests/ElementStructureElementTest.php ../src/PHPDraft/In/Tests/ApibFileParserTest.php ../src/PHPDraft/Out/Tests/VersionTest.php + ../src/PHPDraft/Out/Tests/SortingTest.php ../src/PHPDraft/Out/Tests/TemplateGeneratorTest.php