MediaWiki REL1_31
ApiContinuationManagerTest.php
Go to the documentation of this file.
1<?php
2
8
9 private static function getManager( $continue, $allModules, $generatedModules ) {
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}
static getManager( $continue, $allModules, $generatedModules)
This manages continuation state.
This is the main API class, used for both external and internal processing.
Definition ApiMain.php:43
This class represents the result of the API operations.
Definition ApiResult.php:33
static apiExceptionHasCode(ApiUsageException $ex, $code)
Exception used to abort API execution with an error.
An IContextSource implementation which will inherit context from another source but allow individual ...
WebRequest clone which takes values from a provided array.
static getMain()
Get the RequestContext object associated with the main request.
do that in ParserLimitReportFormat instead use this to modify the parameters of the image all existing parser cache entries will be invalid To avoid you ll need to handle that somehow(e.g. with the RejectParserCacheValue hook) because MediaWiki won 't do it for you. & $defaults also a ContextSource after deleting those rows but within the same transaction you ll probably need to make sure the header is varied on and they can depend only on the ResourceLoaderContext $context
Definition hooks.txt:2811