MediaWiki
REL1_21
|
00001 <?php 00030 abstract class ApiQueryTestBase extends ApiTestCase { 00031 00032 const PARAM_ASSERT = <<<STR 00033 Each parameter must be an array of two elements, 00034 first - an array of params to the API call, 00035 and the second array - expected results as returned by the API 00036 STR; 00037 00043 protected function merge( /*...*/ ) { 00044 $request = array(); 00045 $expected = array(); 00046 foreach ( func_get_args() as $v ) { 00047 list( $req, $exp ) = $this->validateRequestExpectedPair( $v ); 00048 $request = array_merge_recursive( $request, $req ); 00049 $this->mergeExpected( $expected, $exp ); 00050 } 00051 return array( $request, $expected ); 00052 } 00053 00058 private function validateRequestExpectedPair( $v ) { 00059 $this->assertType( 'array', $v, self::PARAM_ASSERT ); 00060 $this->assertEquals( 2, count($v), self::PARAM_ASSERT ); 00061 $this->assertArrayHasKey( 0, $v, self::PARAM_ASSERT ); 00062 $this->assertArrayHasKey( 1, $v, self::PARAM_ASSERT ); 00063 $this->assertType( 'array', $v[0], self::PARAM_ASSERT ); 00064 $this->assertType( 'array', $v[1], self::PARAM_ASSERT ); 00065 return $v; 00066 } 00067 00071 private function mergeExpected( &$all, $item ) { 00072 foreach ( $item as $k => $v ) { 00073 if ( array_key_exists( $k, $all ) ) { 00074 if ( is_array ( $all[$k] ) ) { 00075 $this->mergeExpected( $all[$k], $v ); 00076 } else { 00077 $this->assertEquals( $all[$k], $v ); 00078 } 00079 } else { 00080 $all[$k] = $v; 00081 } 00082 } 00083 } 00084 00090 protected function check( $values ) { 00091 list( $req, $exp ) = $this->validateRequestExpectedPair( $values ); 00092 if ( !array_key_exists( 'action', $req ) ) { 00093 $req['action'] = 'query'; 00094 } 00095 foreach ( $req as &$val ) { 00096 if ( is_array( $val ) ) { 00097 $val = implode( '|', array_unique( $val ) ); 00098 } 00099 } 00100 $result = $this->doApiRequest( $req ); 00101 $this->assertResult( array( 'query' => $exp ), $result[0], $req ); 00102 } 00103 00104 protected function assertResult( $exp, $result, $message = '' ) { 00105 try { 00106 $this->assertResultRecursive( $exp, $result ); 00107 } catch ( Exception $e ) { 00108 if ( is_array( $message ) ) { 00109 $message = http_build_query( $message ); 00110 } 00111 print( "\nRequest: $message\n" ); 00112 print( "\nExpected:\n" ); 00113 print_r( $exp ); 00114 print( "\nResult:\n" ); 00115 print_r( $result ); 00116 throw $e; // rethrow it 00117 } 00118 } 00119 00125 private function assertResultRecursive( $expected, $result ) { 00126 reset( $expected ); 00127 reset( $result ); 00128 while ( true ) { 00129 $e = each( $expected ); 00130 $r = each( $result ); 00131 // If either of the arrays is shorter, abort. If both are done, success. 00132 $this->assertEquals( (bool)$e, (bool)$r ); 00133 if ( !$e ) { 00134 break; // done 00135 } 00136 // continue only if keys are identical or both keys are numeric 00137 $this->assertTrue( $e['key'] === $r['key'] || ( is_numeric( $e['key'] ) && is_numeric( $r['key'] ) ) ); 00138 // don't compare pageids 00139 if ( $e['key'] !== 'pageid' ) { 00140 // If values are arrays, compare recursively, otherwise compare with === 00141 if ( is_array( $e['value'] ) && is_array( $r['value'] ) ) { 00142 $this->assertResultRecursive( $e['value'], $r['value'] ); 00143 } else { 00144 $this->assertEquals( $e['value'], $r['value'] ); 00145 } 00146 } 00147 } 00148 } 00149 }