From: Kunal Mehta Date: Sun, 28 Feb 2016 09:19:14 +0000 (-0800) Subject: Add a structure test to validate all extension.json files X-Git-Tag: 1.31.0-rc.0~7621^2 X-Git-Url: http://git.cyclocoop.org/%7B%24www_url%7Dadmin/membres//%22%7B%24url%7D?a=commitdiff_plain;h=8aa43b4df93be69a054442a64712b6c17015b100;p=lhc%2Fweb%2Fwiklou.git 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 --- 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 ); + } + } +}