Completed
Push — master ( 314506...335380 )
by mw
100:54 queued 62:54
created

MediaWiki/JobQueueDBIntegrationTest.php (1 issue)

Labels
Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace SMW\Tests\Integration\MediaWiki;
4
5
use Job;
6
use SMW\ApplicationFactory;
7
use SMW\Tests\MwDBaseUnitTestCase;
8
use SMW\Tests\Utils\UtilityFactory;
9
use Title;
10
11
/**
12
 * @group SMW
13
 * @group SMWExtension
14
 *
15
 * @group semantic-mediawiki-integration
16
 * @group mediawiki-database
17
 *
18
 * @group medium
19
 *
20
 * @license GNU GPL v2+
21
 * @since 1.9.0.1
22
 *
23
 * @author mwjames
24
 */
25
class JobQueueDBIntegrationTest extends MwDBaseUnitTestCase {
26
27
	private $job = null;
28
	private $applicationFactory;
29
30
	private $deletePoolOfPages = array();
31
	private $runnerFactory;
32
33
	private $mwHooksHandler;
34
	private $semanticDataValidator;
35
36
	private $pageDeleter;
37
	private $pageCreator;
38
39
	private $jobQueueRunner;
40
	private $jobQueueLookup;
41
42
	protected function setUp() {
43
		parent::setUp();
44
45
		$utilityFactory = UtilityFactory::getInstance();
46
47
		$this->mwHooksHandler = $utilityFactory->newMwHooksHandler();
48
49
		$this->mwHooksHandler
50
			->deregisterListedHooks()
51
			->invokeHooksFromRegistry();
52
53
		$this->semanticDataValidator = $utilityFactory->newValidatorFactory()->newSemanticDataValidator();
54
		$this->pageDeleter = $utilityFactory->newPageDeleter();
55
		$this->pageCreator = $utilityFactory->newPageCreator();
56
57
		$this->applicationFactory = ApplicationFactory::getInstance();
58
59
		// FIXME Because of SQLStore::Writer::changeTitle
60
		$GLOBALS['smwgEnableUpdateJobs'] = true;
61
62
		$settings = array(
63
			'smwgEnableUpdateJobs' => true,
64
			'smwgDeleteSubjectAsDeferredJob' => true,
65
			'smwgDeleteSubjectWithAssociatesRefresh' => true
66
		);
67
68
		foreach ( $settings as $key => $value ) {
69
			$this->applicationFactory->getSettings()->set( $key, $value );
70
		}
71
72
		$this->jobQueueLookup = $this->applicationFactory
73
			->newMwCollaboratorFactory()
74
			->newJobQueueLookup( $this->getStore()->getConnection( 'mw.db' ) );
75
76
		$this->jobQueueRunner = $utilityFactory->newRunnerFactory()->newJobQueueRunner();
77
78
		$this->jobQueueRunner
79
			->setDBConnectionProvider( $this->getDBConnectionProvider() )
80
			->deleteAllJobs();
81
	}
82
83
	protected function tearDown() {
84
85
		$this->pageDeleter->doDeletePoolOfPages(
86
			$this->deletePoolOfPages
87
		);
88
89
		$this->applicationFactory->clear();
90
		$this->mwHooksHandler->restoreListedHooks();
91
92
		parent::tearDown();
93
	}
94
95
	public function testPageMoveTriggersUpdateJob() {
96
97
		$oldTitle = Title::newFromText( __METHOD__ . '-old' );
98
		$newTitle = Title::newFromText( __METHOD__ . '-new' );
99
100
		$this->pageCreator
101
			->createPage( $oldTitle )
102
			->doEdit( '[[Has jobqueue test::UpdateJob]]' );
103
104
		$this->pageCreator
105
			->getPage()
106
			->getTitle()
107
			->moveTo( $newTitle, false, 'test', true );
108
109
		// Execute the job directly
110
		// $this->assertJob( 'SMW\UpdateJob' );
111
112
		$this->assertTrue(
113
			$oldTitle->isRedirect()
114
		);
115
116
		$this->pageDeleter->deletePage(
117
			$oldTitle
118
		);
119
	}
120
121
	public function testSQLStoreRefreshDataTriggersUpdateJob() {
122
123
		$index = 1; //pass-by-reference
124
125
		$this->getStore()->refreshData( $index, 1, false, true )->startRebuildWith( $index );
0 ignored issues
show
The method startRebuildWith cannot be called on $this->getStore()->refre...$index, 1, false, true) (of type double).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
126
		$this->assertJob( 'SMW\UpdateJob' );
127
	}
128
129
	/**
130
	 * @dataProvider jobFactoryProvider
131
	 */
132
	public function testJobFactory( $jobName, $type ) {
133
134
		$job = Job::factory(
135
			$jobName,
136
			Title::newFromText( __METHOD__ . $jobName ),
137
			array()
138
		);
139
140
		$this->assertJob( $type, $job );
141
	}
142
143
	public function jobFactoryProvider() {
144
145
		$provider = array();
146
147
		$provider[] = array( 'SMW\UpdateJob', 'SMW\UpdateJob' );
148
		$provider[] = array( 'SMWUpdateJob', 'SMW\UpdateJob' );
149
150
		$provider[] = array( 'SMW\RefreshJob', 'SMW\RefreshJob' );
151
		$provider[] = array( 'SMWRefreshJob', 'SMW\RefreshJob' );
152
153
		return $provider;
154
	}
155
156
	public function titleProvider() {
157
158
		$provider = array();
159
160
		// #0 Simple property reference
161
		$provider[] = array( array(
162
				'title' => Title::newFromText( __METHOD__ . '-foo' ),
163
				'edit'  => '{{#set:|DeferredJobFoo=DeferredJobBar}}'
164
			), array(
165
				'title' => Title::newFromText( __METHOD__ . '-bar' ),
166
				'edit'  => '{{#set:|DeferredJobFoo=DeferredJobBar}}'
167
			)
168
		);
169
170
		// #1 Source page in-property reference
171
		$title = Title::newFromText( __METHOD__ . '-foo' );
172
173
		$provider[] = array( array(
174
				'title' => $title,
175
				'edit'  => ''
176
			), array(
177
				'title' => Title::newFromText( __METHOD__ . '-bar' ),
178
				'edit'  => '{{#set:|DeferredJobFoo=' . $title->getPrefixedText() . '}}'
179
			)
180
		);
181
182
		return $provider;
183
	}
184
185
	protected function assertJob( $type, Job &$job = null ) {
186
187
		if ( $job === null ) {
188
			$job = $this->jobQueueRunner->pop_type( $type );
189
		}
190
191
		if ( !$job ) {
192
			$this->markTestSkipped( "Required a {$type} JobQueue entry" );
193
		}
194
195
		$this->job = $job;
196
197
		$this->assertInstanceOf( 'Job', $job );
198
		$this->assertTrue( $job->run() );
199
	}
200
201
	/**
202
	 * Issue 617
203
	 */
204
	public function testNoInfiniteUpdateJobsForCircularRedirect() {
205
206
		$this->skipTestForMediaWikiVersionLowerThan( '1.20' );
207
208
		$this->pageCreator
209
			->createPage( Title::newFromText( 'Foo-A' ) )
210
			->doEdit( '[[Foo-A::{{PAGENAME}}]] {{#ask: [[Foo-A::{{PAGENAME}}]] }}' )
211
			->doEdit( '#REDIRECT [[Foo-B]]' );
212
213
		$this->pageCreator
214
			->createPage( Title::newFromText( 'Foo-B' ) )
215
			->doEdit( '#REDIRECT [[Foo-C]]' );
216
217
		$this->pageCreator
218
			->createPage( Title::newFromText( 'Foo-C' ) )
219
			->doEdit( '#REDIRECT [[Foo-A]]' );
220
221
		$this->jobQueueRunner
222
			->setType( 'SMW\UpdateJob' )
223
			->run();
224
225
		foreach ( $this->jobQueueRunner->getStatus() as $status ) {
226
			$this->assertTrue( $status['status'] );
227
		}
228
229
		$this->assertTrue(
230
			Title::newFromText( 'Foo-A' )->isRedirect()
231
		);
232
233
		$this->deletePoolOfPages = array(
234
			Title::newFromText( 'Foo-A' ),
235
			Title::newFromText( 'Foo-B' ),
236
			Title::newFromText( 'Foo-C' )
237
		);
238
	}
239
240
	public function testPropertyTypeChangeToCreateUpdateJob() {
241
242
		$this->skipTestForDatabase( 'sqlite', 'No idea why SQLite fails here with "Failed asserting that 0 is greater than 0".' );
243
244
		$propertyPage = Title::newFromText( 'FooProperty', SMW_NS_PROPERTY );
245
246
		$this->pageCreator
247
			->createPage( $propertyPage )
248
			->doEdit( '[[Has type::Page]]' );
249
250
		$this->pageCreator
251
			->createPage( Title::newFromText( 'Foo', NS_MAIN ) )
252
			->doEdit( '[[FooProperty::SomePage]]' );
253
254
		$this->pageCreator
255
			->createPage( $propertyPage )
256
			->doEdit( '[[Has type::Number]]' );
257
258
		$this->testEnvironment->executePendingDeferredUpdates();
259
260
		// Secondary dispatch process
261
		$this->assertGreaterThan(
262
			0,
263
			$this->jobQueueLookup->estimateJobCountFor( 'SMW\UpdateDispatcherJob' )
264
		);
265
266
		$this->jobQueueRunner
267
			->setType( 'SMW\UpdateDispatcherJob' )
268
			->run();
269
270
		$this->assertGreaterThan(
271
			0,
272
			$this->jobQueueLookup->estimateJobCountFor( 'SMW\UpdateJob' )
273
		);
274
275
		$this->jobQueueRunner
276
			->setType( 'SMW\UpdateJob' )
277
			->run();
278
279
		foreach ( $this->jobQueueRunner->getStatus() as $status ) {
280
			$this->assertTrue( $status['status'] );
281
		}
282
283
		$this->deletePoolOfPages = array(
284
			$propertyPage,
285
			Title::newFromText( 'Foo' )
286
		);
287
	}
288
289
}
290