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