MediaWiki  REL1_21
ApiQueryTestBase.php
Go to the documentation of this file.
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 }