ApiPageSetTest.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <?php
  2. /**
  3. * @group API
  4. * @group medium
  5. * @group Database
  6. * @covers ApiPageSet
  7. */
  8. class ApiPageSetTest extends ApiTestCase {
  9. public static function provideRedirectMergePolicy() {
  10. return [
  11. 'By default nothing is merged' => [
  12. null,
  13. []
  14. ],
  15. 'A simple merge policy adds the redirect data in' => [
  16. function ( $current, $new ) {
  17. if ( !isset( $current['index'] ) || $new['index'] < $current['index'] ) {
  18. $current['index'] = $new['index'];
  19. }
  20. return $current;
  21. },
  22. [ 'index' => 1 ],
  23. ],
  24. ];
  25. }
  26. /**
  27. * @dataProvider provideRedirectMergePolicy
  28. */
  29. public function testRedirectMergePolicyWithArrayResult( $mergePolicy, $expect ) {
  30. list( $target, $pageSet ) = $this->createPageSetWithRedirect();
  31. $pageSet->setRedirectMergePolicy( $mergePolicy );
  32. $result = [
  33. $target->getArticleID() => []
  34. ];
  35. $pageSet->populateGeneratorData( $result );
  36. $this->assertEquals( $expect, $result[$target->getArticleID()] );
  37. }
  38. /**
  39. * @dataProvider provideRedirectMergePolicy
  40. */
  41. public function testRedirectMergePolicyWithApiResult( $mergePolicy, $expect ) {
  42. list( $target, $pageSet ) = $this->createPageSetWithRedirect();
  43. $pageSet->setRedirectMergePolicy( $mergePolicy );
  44. $result = new ApiResult( false );
  45. $result->addValue( null, 'pages', [
  46. $target->getArticleID() => []
  47. ] );
  48. $pageSet->populateGeneratorData( $result, [ 'pages' ] );
  49. $this->assertEquals(
  50. $expect,
  51. $result->getResultData( [ 'pages', $target->getArticleID() ] )
  52. );
  53. }
  54. protected function createPageSetWithRedirect() {
  55. $target = Title::makeTitle( NS_MAIN, 'UTRedirectTarget' );
  56. $sourceA = Title::makeTitle( NS_MAIN, 'UTRedirectSourceA' );
  57. $sourceB = Title::makeTitle( NS_MAIN, 'UTRedirectSourceB' );
  58. self::editPage( 'UTRedirectTarget', 'api page set test' );
  59. self::editPage( 'UTRedirectSourceA', '#REDIRECT [[UTRedirectTarget]]' );
  60. self::editPage( 'UTRedirectSourceB', '#REDIRECT [[UTRedirectTarget]]' );
  61. $request = new FauxRequest( [ 'redirects' => 1 ] );
  62. $context = new RequestContext();
  63. $context->setRequest( $request );
  64. $main = new ApiMain( $context );
  65. $pageSet = new ApiPageSet( $main );
  66. $pageSet->setGeneratorData( $sourceA, [ 'index' => 1 ] );
  67. $pageSet->setGeneratorData( $sourceB, [ 'index' => 3 ] );
  68. $pageSet->populateFromTitles( [ $sourceA, $sourceB ] );
  69. return [ $target, $pageSet ];
  70. }
  71. public function testHandleNormalization() {
  72. $context = new RequestContext();
  73. $context->setRequest( new FauxRequest( [ 'titles' => "a|B|a\xcc\x8a" ] ) );
  74. $main = new ApiMain( $context );
  75. $pageSet = new ApiPageSet( $main );
  76. $pageSet->execute();
  77. $this->assertSame(
  78. [ 0 => [ 'A' => -1, 'B' => -2, 'Å' => -3 ] ],
  79. $pageSet->getAllTitlesByNamespace()
  80. );
  81. $this->assertSame(
  82. [
  83. [ 'fromencoded' => true, 'from' => 'a%CC%8A', 'to' => 'å' ],
  84. [ 'fromencoded' => false, 'from' => 'a', 'to' => 'A' ],
  85. [ 'fromencoded' => false, 'from' => 'å', 'to' => 'Å' ],
  86. ],
  87. $pageSet->getNormalizedTitlesAsResult()
  88. );
  89. }
  90. public function testSpecialRedirects() {
  91. $id1 = self::editPage( 'UTApiPageSet', 'UTApiPageSet in the default language' )
  92. ->value['revision']->getTitle()->getArticleID();
  93. $id2 = self::editPage( 'UTApiPageSet/de', 'UTApiPageSet in German' )
  94. ->value['revision']->getTitle()->getArticleID();
  95. $user = $this->getTestUser()->getUser();
  96. $userName = $user->getName();
  97. $userDbkey = str_replace( ' ', '_', $userName );
  98. $request = new FauxRequest( [
  99. 'titles' => implode( '|', [
  100. 'Special:MyContributions',
  101. 'Special:MyPage',
  102. 'Special:MyTalk/subpage',
  103. 'Special:MyLanguage/UTApiPageSet',
  104. ] ),
  105. ] );
  106. $context = new RequestContext();
  107. $context->setRequest( $request );
  108. $context->setUser( $user );
  109. $main = new ApiMain( $context );
  110. $pageSet = new ApiPageSet( $main );
  111. $pageSet->execute();
  112. $this->assertEquals( [
  113. ], $pageSet->getRedirectTitlesAsResult() );
  114. $this->assertEquals( [
  115. [ 'ns' => -1, 'title' => 'Special:MyContributions', 'special' => true ],
  116. [ 'ns' => -1, 'title' => 'Special:MyPage', 'special' => true ],
  117. [ 'ns' => -1, 'title' => 'Special:MyTalk/subpage', 'special' => true ],
  118. [ 'ns' => -1, 'title' => 'Special:MyLanguage/UTApiPageSet', 'special' => true ],
  119. ], $pageSet->getInvalidTitlesAndRevisions() );
  120. $this->assertEquals( [
  121. ], $pageSet->getAllTitlesByNamespace() );
  122. $request->setVal( 'redirects', 1 );
  123. $main = new ApiMain( $context );
  124. $pageSet = new ApiPageSet( $main );
  125. $pageSet->execute();
  126. $this->assertEquals( [
  127. [ 'from' => 'Special:MyPage', 'to' => "User:$userName" ],
  128. [ 'from' => 'Special:MyTalk/subpage', 'to' => "User talk:$userName/subpage" ],
  129. [ 'from' => 'Special:MyLanguage/UTApiPageSet', 'to' => 'UTApiPageSet' ],
  130. ], $pageSet->getRedirectTitlesAsResult() );
  131. $this->assertEquals( [
  132. [ 'ns' => -1, 'title' => 'Special:MyContributions', 'special' => true ],
  133. [ 'ns' => 2, 'title' => "User:$userName", 'missing' => true ],
  134. [ 'ns' => 3, 'title' => "User talk:$userName/subpage", 'missing' => true ],
  135. ], $pageSet->getInvalidTitlesAndRevisions() );
  136. $this->assertEquals( [
  137. 0 => [ 'UTApiPageSet' => $id1 ],
  138. 2 => [ $userDbkey => -2 ],
  139. 3 => [ "$userDbkey/subpage" => -3 ],
  140. ], $pageSet->getAllTitlesByNamespace() );
  141. $context->setLanguage( 'de' );
  142. $main = new ApiMain( $context );
  143. $pageSet = new ApiPageSet( $main );
  144. $pageSet->execute();
  145. $this->assertEquals( [
  146. [ 'from' => 'Special:MyPage', 'to' => "User:$userName" ],
  147. [ 'from' => 'Special:MyTalk/subpage', 'to' => "User talk:$userName/subpage" ],
  148. [ 'from' => 'Special:MyLanguage/UTApiPageSet', 'to' => 'UTApiPageSet/de' ],
  149. ], $pageSet->getRedirectTitlesAsResult() );
  150. $this->assertEquals( [
  151. [ 'ns' => -1, 'title' => 'Special:MyContributions', 'special' => true ],
  152. [ 'ns' => 2, 'title' => "User:$userName", 'missing' => true ],
  153. [ 'ns' => 3, 'title' => "User talk:$userName/subpage", 'missing' => true ],
  154. ], $pageSet->getInvalidTitlesAndRevisions() );
  155. $this->assertEquals( [
  156. 0 => [ 'UTApiPageSet/de' => $id2 ],
  157. 2 => [ $userDbkey => -2 ],
  158. 3 => [ "$userDbkey/subpage" => -3 ],
  159. ], $pageSet->getAllTitlesByNamespace() );
  160. }
  161. }