]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - tests/phpunit/includes/api/ApiContinuationManagerTest.php
MediaWiki 1.30.2
[autoinstalls/mediawiki.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', $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 }