Merge "Fix sessionfailure i18n message during authentication"
[lhc/web/wiklou.git] / tests / phpunit / includes / api / ApiContinuationManagerTest.php
1 <?php
2
3 /**
4 * @covers ApiContinuationManager
5 * @group API
6 */
7 class ApiContinuationManagerTest extends MediaWikiTestCase {
8
9 private static function getManager( $continue, $allModules, $generatedModules ) {
10 $context = new DerivativeContext( RequestContext::getMain() );
11 $context->setRequest( new FauxRequest( [ 'continue' => $continue ] ) );
12 $main = new ApiMain( $context );
13 return new ApiContinuationManager( $main, $allModules, $generatedModules );
14 }
15
16 public function testContinuation() {
17 $allModules = [
18 new MockApiQueryBase( 'mock1' ),
19 new MockApiQueryBase( 'mock2' ),
20 new MockApiQueryBase( 'mocklist' ),
21 ];
22 $generator = new MockApiQueryBase( 'generator' );
23
24 $manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
25 $this->assertSame( ApiMain::class, $manager->getSource() );
26 $this->assertSame( false, $manager->isGeneratorDone() );
27 $this->assertSame( $allModules, $manager->getRunModules() );
28 $manager->addContinueParam( $allModules[0], 'm1continue', [ 1, 2 ] );
29 $manager->addContinueParam( $allModules[2], 'mlcontinue', 2 );
30 $manager->addGeneratorContinueParam( $generator, 'gcontinue', 3 );
31 $this->assertSame( [ [
32 'mlcontinue' => 2,
33 'm1continue' => '1|2',
34 'continue' => '||mock2',
35 ], false ], $manager->getContinuation() );
36 $this->assertSame( [
37 'mock1' => [ 'm1continue' => '1|2' ],
38 'mocklist' => [ 'mlcontinue' => 2 ],
39 'generator' => [ 'gcontinue' => 3 ],
40 ], $manager->getRawContinuation() );
41
42 $result = new ApiResult( 0 );
43 $manager->setContinuationIntoResult( $result );
44 $this->assertSame( [
45 'mlcontinue' => 2,
46 'm1continue' => '1|2',
47 'continue' => '||mock2',
48 ], $result->getResultData( 'continue' ) );
49 $this->assertSame( null, $result->getResultData( 'batchcomplete' ) );
50
51 $manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
52 $this->assertSame( false, $manager->isGeneratorDone() );
53 $this->assertSame( $allModules, $manager->getRunModules() );
54 $manager->addContinueParam( $allModules[0], 'm1continue', [ 1, 2 ] );
55 $manager->addGeneratorContinueParam( $generator, 'gcontinue', [ 3, 4 ] );
56 $this->assertSame( [ [
57 'm1continue' => '1|2',
58 'continue' => '||mock2|mocklist',
59 ], false ], $manager->getContinuation() );
60 $this->assertSame( [
61 'mock1' => [ 'm1continue' => '1|2' ],
62 'generator' => [ 'gcontinue' => '3|4' ],
63 ], $manager->getRawContinuation() );
64
65 $manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
66 $this->assertSame( false, $manager->isGeneratorDone() );
67 $this->assertSame( $allModules, $manager->getRunModules() );
68 $manager->addContinueParam( $allModules[2], 'mlcontinue', 2 );
69 $manager->addGeneratorContinueParam( $generator, 'gcontinue', 3 );
70 $this->assertSame( [ [
71 'mlcontinue' => 2,
72 'gcontinue' => 3,
73 'continue' => 'gcontinue||',
74 ], true ], $manager->getContinuation() );
75 $this->assertSame( [
76 'mocklist' => [ 'mlcontinue' => 2 ],
77 'generator' => [ 'gcontinue' => 3 ],
78 ], $manager->getRawContinuation() );
79
80 $result = new ApiResult( 0 );
81 $manager->setContinuationIntoResult( $result );
82 $this->assertSame( [
83 'mlcontinue' => 2,
84 'gcontinue' => 3,
85 'continue' => 'gcontinue||',
86 ], $result->getResultData( 'continue' ) );
87 $this->assertSame( true, $result->getResultData( 'batchcomplete' ) );
88
89 $manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
90 $this->assertSame( false, $manager->isGeneratorDone() );
91 $this->assertSame( $allModules, $manager->getRunModules() );
92 $manager->addGeneratorContinueParam( $generator, 'gcontinue', 3 );
93 $this->assertSame( [ [
94 'gcontinue' => 3,
95 'continue' => 'gcontinue||mocklist',
96 ], true ], $manager->getContinuation() );
97 $this->assertSame( [
98 'generator' => [ 'gcontinue' => 3 ],
99 ], $manager->getRawContinuation() );
100
101 $manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
102 $this->assertSame( false, $manager->isGeneratorDone() );
103 $this->assertSame( $allModules, $manager->getRunModules() );
104 $manager->addContinueParam( $allModules[0], 'm1continue', [ 1, 2 ] );
105 $manager->addContinueParam( $allModules[2], 'mlcontinue', 2 );
106 $this->assertSame( [ [
107 'mlcontinue' => 2,
108 'm1continue' => '1|2',
109 'continue' => '||mock2',
110 ], false ], $manager->getContinuation() );
111 $this->assertSame( [
112 'mock1' => [ 'm1continue' => '1|2' ],
113 'mocklist' => [ 'mlcontinue' => 2 ],
114 ], $manager->getRawContinuation() );
115
116 $manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
117 $this->assertSame( false, $manager->isGeneratorDone() );
118 $this->assertSame( $allModules, $manager->getRunModules() );
119 $manager->addContinueParam( $allModules[0], 'm1continue', [ 1, 2 ] );
120 $this->assertSame( [ [
121 'm1continue' => '1|2',
122 'continue' => '||mock2|mocklist',
123 ], false ], $manager->getContinuation() );
124 $this->assertSame( [
125 'mock1' => [ 'm1continue' => '1|2' ],
126 ], $manager->getRawContinuation() );
127
128 $manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
129 $this->assertSame( false, $manager->isGeneratorDone() );
130 $this->assertSame( $allModules, $manager->getRunModules() );
131 $manager->addContinueParam( $allModules[2], 'mlcontinue', 2 );
132 $this->assertSame( [ [
133 'mlcontinue' => 2,
134 'continue' => '-||mock1|mock2',
135 ], true ], $manager->getContinuation() );
136 $this->assertSame( [
137 'mocklist' => [ 'mlcontinue' => 2 ],
138 ], $manager->getRawContinuation() );
139
140 $manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
141 $this->assertSame( false, $manager->isGeneratorDone() );
142 $this->assertSame( $allModules, $manager->getRunModules() );
143 $this->assertSame( [ [], true ], $manager->getContinuation() );
144 $this->assertSame( [], $manager->getRawContinuation() );
145
146 $manager = self::getManager( '||mock2', $allModules, [ 'mock1', 'mock2' ] );
147 $this->assertSame( false, $manager->isGeneratorDone() );
148 $this->assertSame(
149 array_values( array_diff_key( $allModules, [ 1 => 1 ] ) ),
150 $manager->getRunModules()
151 );
152
153 $manager = self::getManager( '-||', $allModules, [ 'mock1', 'mock2' ] );
154 $this->assertSame( true, $manager->isGeneratorDone() );
155 $this->assertSame(
156 array_values( array_diff_key( $allModules, [ 0 => 0, 1 => 1 ] ) ),
157 $manager->getRunModules()
158 );
159
160 try {
161 self::getManager( 'foo', $allModules, [ 'mock1', 'mock2' ] );
162 $this->fail( 'Expected exception not thrown' );
163 } catch ( ApiUsageException $ex ) {
164 $this->assertTrue( ApiTestCase::apiExceptionHasCode( $ex, 'badcontinue' ),
165 'Expected exception'
166 );
167 }
168
169 $manager = self::getManager(
170 '||mock2',
171 array_slice( $allModules, 0, 2 ),
172 [ 'mock1', 'mock2' ]
173 );
174 try {
175 $manager->addContinueParam( $allModules[1], 'm2continue', 1 );
176 $this->fail( 'Expected exception not thrown' );
177 } catch ( UnexpectedValueException $ex ) {
178 $this->assertSame(
179 'Module \'mock2\' was not supposed to have been executed, ' .
180 'but it was executed anyway',
181 $ex->getMessage(),
182 'Expected exception'
183 );
184 }
185 try {
186 $manager->addContinueParam( $allModules[2], 'mlcontinue', 1 );
187 $this->fail( 'Expected exception not thrown' );
188 } catch ( UnexpectedValueException $ex ) {
189 $this->assertSame(
190 'Module \'mocklist\' called ApiContinuationManager::addContinueParam ' .
191 'but was not passed to ApiContinuationManager::__construct',
192 $ex->getMessage(),
193 'Expected exception'
194 );
195 }
196 }
197
198 }