From 8aa43b4df93be69a054442a64712b6c17015b100 Mon Sep 17 00:00:00 2001 From: Kunal Mehta Date: Sun, 28 Feb 2016 01:19:14 -0800 Subject: [PATCH] Add a structure test to validate all extension.json files Adds a structure test to validate that all loaded extension.json and skin.json files validate against the schema at docs/extension.schema.json. Bug: T128307 Change-Id: I2fd1caaa50c288821ab6847dc29d60e6554d9df5 --- .../structure/ExtensionJsonValidationTest.php | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 tests/phpunit/structure/ExtensionJsonValidationTest.php diff --git a/tests/phpunit/structure/ExtensionJsonValidationTest.php b/tests/phpunit/structure/ExtensionJsonValidationTest.php new file mode 100644 index 0000000000..275c0d1794 --- /dev/null +++ b/tests/phpunit/structure/ExtensionJsonValidationTest.php @@ -0,0 +1,93 @@ +markTestSkipped( + 'The JsonSchema library cannot be found,' . + ' please install it through composer to run extension.json validation tests.' + ); + } + + if ( !ExtensionRegistry::getInstance()->getAllThings() ) { + $this->markTestSkipped( + 'There are no extensions or skins loaded via the ExtensionRegistry' + ); + } + } + + public static function providePassesValidation() { + $values = []; + foreach ( ExtensionRegistry::getInstance()->getAllThings() as $thing ) { + $values[] = [ $thing['path'] ]; + } + + return $values; + } + + /** + * @dataProvider providePassesValidation + * @param string $path Path to thing's json file + */ + public function testPassesValidation( $path ) { + $data = json_decode( file_get_contents( $path ) ); + $this->assertInstanceOf( 'stdClass', $data, "$path is not valid JSON" ); + + $this->assertObjectHasAttribute( 'manifest_version', $data, + "$path does not have manifest_version set." ); + $version = $data->manifest_version; + if ( $version !== ExtensionRegistry::MANIFEST_VERSION ) { + $schemaPath = __DIR__ . "/../../../docs/extension.schema.v$version.json"; + } else { + $schemaPath = __DIR__ . '/../../../docs/extension.schema.json'; + } + + // Not too old + $this->assertTrue( + $version >= ExtensionRegistry::OLDEST_MANIFEST_VERSION, + "$path is using a non-supported schema version" + ); + // Not too new + $this->assertTrue( + $version <= ExtensionRegistry::MANIFEST_VERSION, + "$path is using a non-supported schema version" + ); + $retriever = new JsonSchema\Uri\UriRetriever(); + $schema = $retriever->retrieve( 'file://' . $schemaPath ); + + $validator = new JsonSchema\Validator(); + $validator->check( $data, $schema ); + if ( $validator->isValid() ) { + // All good. + $this->assertTrue( true ); + } else { + $out = "$path did pass validation.\n"; + foreach ( $validator->getErrors() as $error ) { + $out .= "[{$error['property']}] {$error['message']}\n"; + } + $this->assertTrue( false, $out ); + } + } +} -- 2.20.1