| Current File : /home/jvzmxxx/wiki1/extensions/Wikibase/repo/tests/phpunit/includes/Api/ApiConventionsTest.php |
<?php
namespace Wikibase\Test\Repo\Api;
use ApiBase;
use ApiMain;
use FauxRequest;
use Message;
use ReflectionMethod;
/**
* @group Wikibase
* @group WikibaseRepo
* @group WikibaseAPI
* @group Database
*
* @group medium
*
* @license GPL-2.0+
* @author Lucie-Aimée Kaffee
*/
class ApiConventionsTest extends \MediaWikiTestCase {
public function wikibaseApiModuleProvider() {
$argList = array();
foreach ( $GLOBALS['wgAPIModules'] as $moduleClass ) {
// Make sure to only test Wikibase Api modules
// This works as long as Wikibase modules are always defined as a class name string.
// @todo adjust this if we ever define our api modules differently.
if ( is_string( $moduleClass ) && strpos( $moduleClass, 'Wikibase' ) !== false ) {
$argList[] = array( $moduleClass );
}
}
return $argList;
}
/**
* Connects the assertions for the different methods and iterates through the api modules
*
* @dataProvider wikibaseApiModuleProvider
*/
public function testApiConventions( $moduleClass ) {
$params = array();
$user = $GLOBALS['wgUser'];
$request = new FauxRequest( $params, true );
$main = new ApiMain( $request );
$main->getContext()->setUser( $user );
$module = new $moduleClass( $main, 'moduleClass' );
$this->assertGetFinalParamDescription( $moduleClass, $module );
$this->assertGetFinalDescription( $moduleClass, $module );
$this->assertGetExamplesMessages( $moduleClass, $module );
}
/**
* This method is for the assertions in particular for getFinalDescription as defined in ApiBase
*
* @param string $moduleClass One of the modules in $GLOBALS['wgAPIModules'], only in this
* function for the error messages.
* @param ApiBase $module is an instance of $moduleClass
**/
private function assertGetFinalDescription( $moduleClass, ApiBase $module ) {
$method = 'getFinalDescription';
$descArray = $module->$method();
$rMethod = new ReflectionMethod( $module, $method );
$this->assertTrue( $rMethod->isPublic(), 'the method ' . $method . ' of module '
. $moduleClass . ' is not public' );
$this->assertNotEmpty( $module->$method(), 'the Module ' . $moduleClass
. ' does not have the method ' . $method );
$this->assertNotEmpty( $descArray, 'the array returned by the method ' . $method
. ' of module ' . $moduleClass . ' is empty' );
foreach ( $descArray as $desc ) {
$this->assertInstanceOf( Message::class, $desc, 'the value returned by the method '
. $method . ' of the module ' . $moduleClass . ' is not a Message object' );
}
}
/**
* This method is for the assertions for getFinalParamDescription as defined in ApiBase,
* depending on getFinalParams.
*
* @param string $moduleClass One of the modules in $GLOBALS['wgAPIModules'], only in this
* function for the error messages.
* @param ApiBase $module is an instance of $moduleClass
**/
private function assertGetFinalParamDescription( $moduleClass, ApiBase $module ) {
$parameters = $module->getFinalParams();
if ( !empty( $parameters ) ) {
$descriptions = $module->getFinalParamDescription();
$this->assertNotEmpty(
$descriptions,
'the array returned by the method getFinalParamDescription of module '
. $moduleClass . ' is empty'
);
// Comparing the keys of the arrays of getParamDescription and getParams
$arrayKeysMatch = !array_diff_key( $descriptions, $parameters )
&& !array_diff_key( $parameters, $descriptions );
$this->assertTrue( $arrayKeysMatch, 'keys different at ' . $moduleClass );
}
}
/**
* This method is for the assertions of getExamplesMessages/ getExamples as defined in ApiBase
*
* @param string $moduleClass One of the modules in $GLOBALS['wgAPIModules'], only in this
* function for the error messages.
* @param ApiBase $module is an instance of $moduleClass
**/
private function assertGetExamplesMessages( $moduleClass, ApiBase $module ) {
$method = new ReflectionMethod( $moduleClass, 'getExamplesMessages' );
$method->setAccessible( true );
$examples = $method->invoke( $module );
$this->assertNotEmpty( $examples, 'there are no examples for ' . $moduleClass );
foreach ( $examples as $url => $example ) {
$this->assertRegExp(
'/^action=\w/',
$url,
'the key ' . $url . ' is not an url at ' . $moduleClass
);
if ( is_string( $example ) ) {
$this->assertTrue(
wfMessage( $example )->exists(),
"message ($example) for $url doesn't exist"
);
} else {
$this->assertInstanceOf(
Message::class,
$example,
'the value of the example for ' . $url . ' in ' . $moduleClass
. ' is not a Message'
);
}
}
}
}