summaryrefslogtreecommitdiff
path: root/www/wiki/tests/phpunit/includes/import/ImportTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/tests/phpunit/includes/import/ImportTest.php')
-rw-r--r--www/wiki/tests/phpunit/includes/import/ImportTest.php329
1 files changed, 329 insertions, 0 deletions
diff --git a/www/wiki/tests/phpunit/includes/import/ImportTest.php b/www/wiki/tests/phpunit/includes/import/ImportTest.php
new file mode 100644
index 00000000..3b91f5b3
--- /dev/null
+++ b/www/wiki/tests/phpunit/includes/import/ImportTest.php
@@ -0,0 +1,329 @@
+<?php
+use MediaWiki\MediaWikiServices;
+
+/**
+ * Test class for Import methods.
+ *
+ * @group Database
+ *
+ * @author Sebastian Brückner < sebastian.brueckner@student.hpi.uni-potsdam.de >
+ */
+class ImportTest extends MediaWikiLangTestCase {
+
+ private function getDataSource( $xml ) {
+ return new ImportStringSource( $xml );
+ }
+
+ /**
+ * @covers WikiImporter
+ * @dataProvider getUnknownTagsXML
+ * @param string $xml
+ * @param string $text
+ * @param string $title
+ */
+ public function testUnknownXMLTags( $xml, $text, $title ) {
+ $source = $this->getDataSource( $xml );
+
+ $importer = new WikiImporter(
+ $source,
+ MediaWikiServices::getInstance()->getMainConfig()
+ );
+
+ $importer->doImport();
+ $title = Title::newFromText( $title );
+ $this->assertTrue( $title->exists() );
+
+ $this->assertEquals( WikiPage::factory( $title )->getContent()->getNativeData(), $text );
+ }
+
+ public function getUnknownTagsXML() {
+ // phpcs:disable Generic.Files.LineLength
+ return [
+ [
+ <<< EOF
+<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">
+ <page unknown="123" dontknow="533">
+ <title>TestImportPage</title>
+ <unknowntag>Should be ignored</unknowntag>
+ <ns>0</ns>
+ <id unknown="123" dontknow="533">14</id>
+ <revision>
+ <id unknown="123" dontknow="533">15</id>
+ <unknowntag>Should be ignored</unknowntag>
+ <timestamp>2016-01-03T11:18:43Z</timestamp>
+ <contributor>
+ <unknowntag>Should be ignored</unknowntag>
+ <username unknown="123" dontknow="533">Admin</username>
+ <id>1</id>
+ </contributor>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
+ <text xml:space="preserve" bytes="0">noitazinagro tseb eht si ikiWaideM</text>
+ <sha1>phoiac9h4m842xq45sp7s6u21eteeq1</sha1>
+ <unknowntag>Should be ignored</unknowntag>
+ </revision>
+ </page>
+ <unknowntag>Should be ignored</unknowntag>
+</mediawiki>
+EOF
+ ,
+ 'noitazinagro tseb eht si ikiWaideM',
+ 'TestImportPage'
+ ]
+ ];
+ // phpcs:enable
+ }
+
+ /**
+ * @covers WikiImporter::handlePage
+ * @dataProvider getRedirectXML
+ * @param string $xml
+ * @param string|null $redirectTitle
+ */
+ public function testHandlePageContainsRedirect( $xml, $redirectTitle ) {
+ $source = $this->getDataSource( $xml );
+
+ $redirect = null;
+ $callback = function ( Title $title, ForeignTitle $foreignTitle, $revCount,
+ $sRevCount, $pageInfo ) use ( &$redirect ) {
+ if ( array_key_exists( 'redirect', $pageInfo ) ) {
+ $redirect = $pageInfo['redirect'];
+ }
+ };
+
+ $importer = new WikiImporter(
+ $source,
+ MediaWikiServices::getInstance()->getMainConfig()
+ );
+ $importer->setPageOutCallback( $callback );
+ $importer->doImport();
+
+ $this->assertEquals( $redirectTitle, $redirect );
+ }
+
+ public function getRedirectXML() {
+ // phpcs:disable Generic.Files.LineLength
+ return [
+ [
+ <<< EOF
+<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">
+ <page>
+ <title>Test</title>
+ <ns>0</ns>
+ <id>21</id>
+ <redirect title="Test22"/>
+ <revision>
+ <id>20</id>
+ <timestamp>2014-05-27T10:00:00Z</timestamp>
+ <contributor>
+ <username>Admin</username>
+ <id>10</id>
+ </contributor>
+ <comment>Admin moved page [[Test]] to [[Test22]]</comment>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
+ <text xml:space="preserve" bytes="20">#REDIRECT [[Test22]]</text>
+ <sha1>tq456o9x3abm7r9ozi6km8yrbbc56o6</sha1>
+ </revision>
+ </page>
+</mediawiki>
+EOF
+ ,
+ 'Test22'
+ ],
+ [
+ <<< EOF
+<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">
+ <page>
+ <title>Test</title>
+ <ns>0</ns>
+ <id>42</id>
+ <revision>
+ <id>421</id>
+ <timestamp>2014-05-27T11:00:00Z</timestamp>
+ <contributor>
+ <username>Admin</username>
+ <id>10</id>
+ </contributor>
+ <text xml:space="preserve" bytes="4">Abcd</text>
+ <sha1>n7uomjq96szt60fy5w3x7ahf7q8m8rh</sha1>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
+ </revision>
+ </page>
+</mediawiki>
+EOF
+ ,
+ null
+ ],
+ ];
+ // phpcs:enable
+ }
+
+ /**
+ * @covers WikiImporter::handleSiteInfo
+ * @dataProvider getSiteInfoXML
+ * @param string $xml
+ * @param array|null $namespaces
+ */
+ public function testSiteInfoContainsNamespaces( $xml, $namespaces ) {
+ $source = $this->getDataSource( $xml );
+
+ $importNamespaces = null;
+ $callback = function ( array $siteinfo, $innerImporter ) use ( &$importNamespaces ) {
+ $importNamespaces = $siteinfo['_namespaces'];
+ };
+
+ $importer = new WikiImporter(
+ $source,
+ MediaWikiServices::getInstance()->getMainConfig()
+ );
+ $importer->setSiteInfoCallback( $callback );
+ $importer->doImport();
+
+ $this->assertEquals( $importNamespaces, $namespaces );
+ }
+
+ public function getSiteInfoXML() {
+ // phpcs:disable Generic.Files.LineLength
+ return [
+ [
+ <<< EOF
+<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">
+ <siteinfo>
+ <namespaces>
+ <namespace key="-2" case="first-letter">Media</namespace>
+ <namespace key="-1" case="first-letter">Special</namespace>
+ <namespace key="0" case="first-letter" />
+ <namespace key="1" case="first-letter">Talk</namespace>
+ <namespace key="2" case="first-letter">User</namespace>
+ <namespace key="3" case="first-letter">User talk</namespace>
+ <namespace key="100" case="first-letter">Portal</namespace>
+ <namespace key="101" case="first-letter">Portal talk</namespace>
+ </namespaces>
+ </siteinfo>
+</mediawiki>
+EOF
+ ,
+ [
+ '-2' => 'Media',
+ '-1' => 'Special',
+ '0' => '',
+ '1' => 'Talk',
+ '2' => 'User',
+ '3' => 'User talk',
+ '100' => 'Portal',
+ '101' => 'Portal talk',
+ ]
+ ],
+ ];
+ // phpcs:enable
+ }
+
+ /**
+ * @dataProvider provideUnknownUserHandling
+ * @param bool $assign
+ * @param bool $create
+ */
+ public function testUnknownUserHandling( $assign, $create ) {
+ $hookId = -99;
+ $this->setMwGlobals( 'wgHooks', [
+ 'ImportHandleUnknownUser' => [ function ( $name ) use ( $assign, $create, &$hookId ) {
+ if ( !$assign ) {
+ $this->fail( 'ImportHandleUnknownUser was called unexpectedly' );
+ }
+
+ $this->assertEquals( 'UserDoesNotExist', $name );
+ if ( $create ) {
+ $user = User::createNew( $name );
+ $this->assertNotNull( $user );
+ $hookId = $user->getId();
+ return false;
+ }
+ return true;
+ } ]
+ ] );
+
+ $user = $this->getTestUser()->getUser();
+
+ $n = ( $assign ? 1 : 0 ) + ( $create ? 2 : 0 );
+
+ // phpcs:disable Generic.Files.LineLength
+ $source = $this->getDataSource( <<<EOF
+<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">
+ <page>
+ <title>TestImportPage</title>
+ <ns>0</ns>
+ <id>14</id>
+ <revision>
+ <id>15</id>
+ <timestamp>2016-01-01T0$n:00:00Z</timestamp>
+ <contributor>
+ <username>UserDoesNotExist</username>
+ <id>1</id>
+ </contributor>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
+ <text xml:space="preserve" bytes="3">foo</text>
+ <sha1>1e6gpc3ehk0mu2jqu8cg42g009s796b</sha1>
+ </revision>
+ <revision>
+ <id>16</id>
+ <timestamp>2016-01-01T0$n:00:01Z</timestamp>
+ <contributor>
+ <username>{$user->getName()}</username>
+ <id>{$user->getId()}</id>
+ </contributor>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
+ <text xml:space="preserve" bytes="3">bar</text>
+ <sha1>bjhlo6dxh5wivnszm93u4b78fheiy4t</sha1>
+ </revision>
+ </page>
+</mediawiki>
+EOF
+ );
+ // phpcs:enable
+
+ $importer = new WikiImporter( $source, MediaWikiServices::getInstance()->getMainConfig() );
+ $importer->setUsernamePrefix( 'Xxx', $assign );
+ $importer->doImport();
+
+ $db = wfGetDB( DB_MASTER );
+ $revQuery = Revision::getQueryInfo();
+
+ $row = $db->selectRow(
+ $revQuery['tables'],
+ $revQuery['fields'],
+ [ 'rev_timestamp' => $db->timestamp( "201601010{$n}0000" ) ],
+ __METHOD__,
+ [],
+ $revQuery['joins']
+ );
+ $this->assertSame(
+ $assign && $create ? 'UserDoesNotExist' : 'Xxx>UserDoesNotExist',
+ $row->rev_user_text
+ );
+ $this->assertSame( $assign && $create ? $hookId : 0, (int)$row->rev_user );
+
+ $row = $db->selectRow(
+ $revQuery['tables'],
+ $revQuery['fields'],
+ [ 'rev_timestamp' => $db->timestamp( "201601010{$n}0001" ) ],
+ __METHOD__,
+ [],
+ $revQuery['joins']
+ );
+ $this->assertSame( ( $assign ? '' : 'Xxx>' ) . $user->getName(), $row->rev_user_text );
+ $this->assertSame( $assign ? $user->getId() : 0, (int)$row->rev_user );
+ }
+
+ public static function provideUnknownUserHandling() {
+ return [
+ 'no assign' => [ false, false ],
+ 'assign, no create' => [ true, false ],
+ 'assign, create' => [ true, true ],
+ ];
+ }
+
+}