3 use MediaWiki\MediaWikiServices
;
6 * Test class for Import methods.
10 * @author Sebastian Brückner < sebastian.brueckner@student.hpi.uni-potsdam.de >
12 class ImportTest
extends MediaWikiLangTestCase
{
14 private function getDataSource( $xml ) {
15 return new ImportStringSource( $xml );
19 * @covers WikiImporter
20 * @dataProvider getUnknownTagsXML
23 * @param string $title
25 public function testUnknownXMLTags( $xml, $text, $title ) {
26 $source = $this->getDataSource( $xml );
28 $importer = new WikiImporter(
30 MediaWikiServices
::getInstance()->getMainConfig()
33 $importer->doImport();
34 $title = Title
::newFromText( $title );
35 $this->assertTrue( $title->exists() );
37 $this->assertEquals( WikiPage
::factory( $title )->getContent()->getText(), $text );
40 public function getUnknownTagsXML() {
41 // phpcs:disable Generic.Files.LineLength
45 <mediawiki xmlns
="http://www.mediawiki.org/xml/export-0.10/" xmlns
:xsi
="http://www.w3.org/2001/XMLSchema-instance" xsi
:schemaLocation
="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version
="0.10" xml
:lang
="en">
46 <page unknown
="123" dontknow
="533">
47 <title
>TestImportPage
</title
>
48 <unknowntag
>Should be ignored
</unknowntag
>
50 <id unknown
="123" dontknow
="533">14</id
>
52 <id unknown
="123" dontknow
="533">15</id
>
53 <unknowntag
>Should be ignored
</unknowntag
>
54 <timestamp
>2016-01-03T11
:18:43Z
</timestamp
>
56 <unknowntag
>Should be ignored
</unknowntag
>
57 <username unknown
="123" dontknow
="533">Admin
</username
>
60 <model
>wikitext
</model
>
61 <format
>text
/x
-wiki
</format
>
62 <text xml
:space
="preserve" bytes
="0">noitazinagro tseb eht si ikiWaideM
</text
>
63 <sha1
>phoiac9h4m842xq45sp7s6u21eteeq1
</sha1
>
64 <unknowntag
>Should be ignored
</unknowntag
>
67 <unknowntag
>Should be ignored
</unknowntag
>
71 'noitazinagro tseb eht si ikiWaideM',
79 * @covers WikiImporter::handlePage
80 * @dataProvider getRedirectXML
82 * @param string|null $redirectTitle
84 public function testHandlePageContainsRedirect( $xml, $redirectTitle ) {
85 $source = $this->getDataSource( $xml );
88 $callback = function ( Title
$title, ForeignTitle
$foreignTitle, $revCount,
89 $sRevCount, $pageInfo ) use ( &$redirect ) {
90 if ( array_key_exists( 'redirect', $pageInfo ) ) {
91 $redirect = $pageInfo['redirect'];
95 $importer = new WikiImporter(
97 MediaWikiServices
::getInstance()->getMainConfig()
99 $importer->setPageOutCallback( $callback );
100 $importer->doImport();
102 $this->assertEquals( $redirectTitle, $redirect );
105 public function getRedirectXML() {
106 // phpcs:disable Generic.Files.LineLength
110 <mediawiki xmlns
="http://www.mediawiki.org/xml/export-0.10/" xmlns
:xsi
="http://www.w3.org/2001/XMLSchema-instance" xsi
:schemaLocation
="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version
="0.10" xml
:lang
="en">
115 <redirect title
="Test22"/>
118 <timestamp
>2014-05-27T10
:00:00Z
</timestamp
>
120 <username
>Admin
</username
>
123 <comment
>Admin moved page
[[Test
]] to
[[Test22
]]</comment
>
124 <model
>wikitext
</model
>
125 <format
>text
/x
-wiki
</format
>
126 <text xml
:space
="preserve" bytes
="20">#REDIRECT [[Test22]]</text>
127 <sha1
>tq456o9x3abm7r9ozi6km8yrbbc56o6
</sha1
>
137 <mediawiki xmlns
="http://www.mediawiki.org/xml/export-0.9/" xmlns
:xsi
="http://www.w3.org/2001/XMLSchema-instance" xsi
:schemaLocation
="http://www.mediawiki.org/xml/export-0.9/ http://www.mediawiki.org/xml/export-0.9.xsd" version
="0.9" xml
:lang
="en">
144 <timestamp
>2014-05-27T11
:00:00Z
</timestamp
>
146 <username
>Admin
</username
>
149 <text xml
:space
="preserve" bytes
="4">Abcd
</text
>
150 <sha1
>n7uomjq96szt60fy5w3x7ahf7q8m8rh
</sha1
>
151 <model
>wikitext
</model
>
152 <format
>text
/x
-wiki
</format
>
165 * @covers WikiImporter::handleSiteInfo
166 * @dataProvider getSiteInfoXML
168 * @param array|null $namespaces
170 public function testSiteInfoContainsNamespaces( $xml, $namespaces ) {
171 $source = $this->getDataSource( $xml );
173 $importNamespaces = null;
174 $callback = function ( array $siteinfo, $innerImporter ) use ( &$importNamespaces ) {
175 $importNamespaces = $siteinfo['_namespaces'];
178 $importer = new WikiImporter(
180 MediaWikiServices
::getInstance()->getMainConfig()
182 $importer->setSiteInfoCallback( $callback );
183 $importer->doImport();
185 $this->assertEquals( $importNamespaces, $namespaces );
188 public function getSiteInfoXML() {
189 // phpcs:disable Generic.Files.LineLength
193 <mediawiki xmlns
="http://www.mediawiki.org/xml/export-0.10/" xmlns
:xsi
="http://www.w3.org/2001/XMLSchema-instance" xsi
:schemaLocation
="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version
="0.10" xml
:lang
="en">
196 <namespace key
="-2" case="first-letter">Media
</namespace>
197 <namespace key
="-1" case="first-letter">Special
</namespace>
198 <namespace key
="0" case="first-letter" />
199 <namespace key
="1" case="first-letter">Talk
</namespace>
200 <namespace key
="2" case="first-letter">User
</namespace>
201 <namespace key
="3" case="first-letter">User talk
</namespace>
202 <namespace key
="100" case="first-letter">Portal
</namespace>
203 <namespace key
="101" case="first-letter">Portal talk
</namespace>
217 '101' => 'Portal talk',
225 * @dataProvider provideUnknownUserHandling
226 * @covers WikiImporter::setUsernamePrefix
227 * @covers ExternalUserNames::addPrefix
228 * @covers ExternalUserNames::applyPrefix
229 * @param bool $assign
230 * @param bool $create
232 public function testUnknownUserHandling( $assign, $create ) {
234 $this->setMwGlobals( 'wgHooks', [
235 'ImportHandleUnknownUser' => [ function ( $name ) use ( $assign, $create, &$hookId ) {
237 $this->fail( 'ImportHandleUnknownUser was called unexpectedly' );
240 $this->assertEquals( 'UserDoesNotExist', $name );
242 $user = User
::createNew( $name );
243 $this->assertNotNull( $user );
244 $hookId = $user->getId();
251 $user = $this->getTestUser()->getUser();
253 $n = ( $assign ?
1 : 0 ) +
( $create ?
2 : 0 );
255 // phpcs:disable Generic.Files.LineLength
256 $source = $this->getDataSource( <<<EOF
257 <mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="en">
259 <title>TestImportPage</title>
264 <timestamp>2016-01-01T0$n:00:00Z</timestamp>
266 <username>UserDoesNotExist</username>
269 <model>wikitext</model>
270 <format>text/x-wiki</format>
271 <text xml:space="preserve" bytes="3">foo</text>
272 <sha1>1e6gpc3ehk0mu2jqu8cg42g009s796b</sha1>
276 <timestamp>2016-01-01T0$n:00:01Z</timestamp>
278 <username>{$user->getName()}</username>
279 <id>{$user->getId()}</id>
281 <model>wikitext</model>
282 <format>text/x-wiki</format>
283 <text xml:space="preserve" bytes="3">bar</text>
284 <sha1>bjhlo6dxh5wivnszm93u4b78fheiy4t</sha1>
292 $importer = new WikiImporter( $source, MediaWikiServices
::getInstance()->getMainConfig() );
293 $importer->setUsernamePrefix( 'Xxx', $assign );
294 $importer->doImport();
296 $db = wfGetDB( DB_MASTER
);
297 $revQuery = Revision
::getQueryInfo();
299 $row = $db->selectRow(
302 [ 'rev_timestamp' => $db->timestamp( "201601010{$n}0000" ) ],
308 $assign && $create ?
'UserDoesNotExist' : 'Xxx>UserDoesNotExist',
311 $this->assertSame( $assign && $create ?
$hookId : 0, (int)$row->rev_user
);
313 $row = $db->selectRow(
316 [ 'rev_timestamp' => $db->timestamp( "201601010{$n}0001" ) ],
321 $this->assertSame( ( $assign ?
'' : 'Xxx>' ) . $user->getName(), $row->rev_user_text
);
322 $this->assertSame( $assign ?
$user->getId() : 0, (int)$row->rev_user
);
325 public static function provideUnknownUserHandling() {
327 'no assign' => [ false, false ],
328 'assign, no create' => [ true, false ],
329 'assign, create' => [ true, true ],