MediaWiki REL1_31
ApiQueryTestBase.php
Go to the documentation of this file.
1<?php
25abstract class ApiQueryTestBase extends ApiTestCase {
26
27 const PARAM_ASSERT = <<<STR
28Each parameter must be an array of two elements,
29first - an array of params to the API call,
30and the second array - expected results as returned by the API
31STR;
32
38 protected function merge( /*...*/ ) {
39 $request = [];
40 $expected = [];
41 foreach ( func_get_args() as $v ) {
42 list( $req, $exp ) = $this->validateRequestExpectedPair( $v );
43 $request = array_merge_recursive( $request, $req );
44 $this->mergeExpected( $expected, $exp );
45 }
46
47 return [ $request, $expected ];
48 }
49
56 private function validateRequestExpectedPair( $v ) {
57 $this->assertInternalType( 'array', $v, self::PARAM_ASSERT );
58 $this->assertEquals( 2, count( $v ), self::PARAM_ASSERT );
59 $this->assertArrayHasKey( 0, $v, self::PARAM_ASSERT );
60 $this->assertArrayHasKey( 1, $v, self::PARAM_ASSERT );
61 $this->assertInternalType( 'array', $v[0], self::PARAM_ASSERT );
62 $this->assertInternalType( 'array', $v[1], self::PARAM_ASSERT );
63
64 return $v;
65 }
66
72 private function mergeExpected( &$all, $item ) {
73 foreach ( $item as $k => $v ) {
74 if ( array_key_exists( $k, $all ) ) {
75 if ( is_array( $all[$k] ) ) {
76 $this->mergeExpected( $all[$k], $v );
77 } else {
78 $this->assertEquals( $all[$k], $v );
79 }
80 } else {
81 $all[$k] = $v;
82 }
83 }
84 }
85
94 protected function check( $values, array $session = null,
95 $appendModule = false, User $user = null
96 ) {
97 list( $req, $exp ) = $this->validateRequestExpectedPair( $values );
98 if ( !array_key_exists( 'action', $req ) ) {
99 $req['action'] = 'query';
100 }
101 foreach ( $req as &$val ) {
102 if ( is_array( $val ) ) {
103 $val = implode( '|', array_unique( $val ) );
104 }
105 }
106 $result = $this->doApiRequest( $req, $session, $appendModule, $user );
107 $this->assertResult( [ 'batchcomplete' => true, 'query' => $exp ], $result[0], $req );
108 }
109
110 protected function assertResult( $exp, $result, $message = '' ) {
111 try {
112 $exp = self::sanitizeResultArray( $exp );
113 $result = self::sanitizeResultArray( $result );
114 $this->assertEquals( $exp, $result );
115 } catch ( PHPUnit_Framework_ExpectationFailedException $e ) {
116 if ( is_array( $message ) ) {
117 $message = http_build_query( $message );
118 }
119
120 // FIXME: once we migrate to phpunit 4.1+, hardcode ComparisonFailure exception use
121 $compEx = 'SebastianBergmann\Comparator\ComparisonFailure';
122 if ( !class_exists( $compEx ) ) {
123 $compEx = 'PHPUnit_Framework_ComparisonFailure';
124 }
125
126 throw new PHPUnit_Framework_ExpectationFailedException(
127 $e->getMessage() . "\nRequest: $message",
128 new $compEx(
129 $exp,
130 $result,
131 print_r( $exp, true ),
132 print_r( $result, true ),
133 false,
134 $e->getComparisonFailure()->getMessage() . "\nRequest: $message"
135 )
136 );
137 }
138 }
139
145 private static function sanitizeResultArray( $result ) {
146 unset( $result['pageid'] );
147 foreach ( $result as $key => $value ) {
148 if ( is_array( $value ) ) {
149 $result[$key] = self::sanitizeResultArray( $value );
150 }
151 }
152
153 // Sort the result by keys, then take advantage of how array_merge will
154 // renumber numeric keys while leaving others alone.
155 ksort( $result );
156 return array_merge( $result );
157 }
158}
This class has some common functionality for testing query module.
mergeExpected(&$all, $item)
Recursively merges the expected values in the $item into the $all.
check( $values, array $session=null, $appendModule=false, User $user=null)
Checks that the request's result matches the expected results.
assertResult( $exp, $result, $message='')
merge()
Merges all requests parameter + expected values into one.
validateRequestExpectedPair( $v)
Check that the parameter is a valid two element array, with the first element being API request and t...
static sanitizeResultArray( $result)
Recursively ksorts a result array and removes any 'pageid' keys.
doApiRequest(array $params, array $session=null, $appendModule=false, User $user=null, $tokenType=null)
Does the API request and returns the result.
The User object encapsulates all of the user-specific settings (user_id, name, rights,...
Definition User.php:53
deferred txt A few of the database updates required by various functions here can be deferred until after the result page is displayed to the user For updating the view updating the linked to tables after a etc PHP does not yet have any way to tell the server to actually return and disconnect while still running these but it might have such a feature in the future We handle these by creating a deferred update object and putting those objects on a global list
Definition deferred.txt:11
this hook is for auditing only $req
Definition hooks.txt:990
do that in ParserLimitReportFormat instead use this to modify the parameters of the image all existing parser cache entries will be invalid To avoid you ll need to handle that somehow(e.g. with the RejectParserCacheValue hook) because MediaWiki won 't do it for you. & $defaults also a ContextSource after deleting those rows but within the same transaction you ll probably need to make sure the header is varied on $request
Definition hooks.txt:2806
returning false will NOT prevent logging $e
Definition hooks.txt:2176