Merge "PHPUnit: Added test for unknown tags"
[lhc/web/wiklou.git] / tests / phpunit / includes / import / ImportTest.php
1 <?php
2
3 /**
4 * Test class for Import methods.
5 *
6 * @group Database
7 *
8 * @author Sebastian Brückner < sebastian.brueckner@student.hpi.uni-potsdam.de >
9 */
10 class ImportTest extends MediaWikiLangTestCase {
11
12 private function getDataSource( $xml ) {
13 return new ImportStringSource( $xml );
14 }
15
16 /**
17 * @covers WikiImporter
18 * @dataProvider getUnknownTagsXML
19 * @param string $xml
20 * @param string $text
21 * @param string $title
22 */
23 public function testUnknownXMLTags( $xml, $text, $title ) {
24 $source = $this->getDataSource( $xml );
25
26 $importer = new WikiImporter(
27 $source,
28 ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
29 );
30
31 $importer->doImport();
32 $title = Title::newFromText( $title );
33 $this->assertTrue( $title->exists() );
34
35 $this->assertEquals( WikiPage::factory( $title )->getContent()->getNativeData(), $text );
36 }
37
38 public function getUnknownTagsXML() {
39 // @codingStandardsIgnoreStart Generic.Files.LineLength
40 return array(
41 array(
42 <<< EOF
43 <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">
44 <page unknown="123" dontknow="533">
45 <title>TestImportPage</title>
46 <unknowntag>Should be ignored</unknowntag>
47 <ns>0</ns>
48 <id unknown="123" dontknow="533">14</id>
49 <revision>
50 <id unknown="123" dontknow="533">15</id>
51 <unknowntag>Should be ignored</unknowntag>
52 <timestamp>2016-01-03T11:18:43Z</timestamp>
53 <contributor>
54 <unknowntag>Should be ignored</unknowntag>
55 <username unknown="123" dontknow="533">Admin</username>
56 <id>1</id>
57 </contributor>
58 <model>wikitext</model>
59 <format>text/x-wiki</format>
60 <text xml:space="preserve" bytes="0">noitazinagro tseb eht si ikiWaideM</text>
61 <sha1>phoiac9h4m842xq45sp7s6u21eteeq1</sha1>
62 <unknowntag>Should be ignored</unknowntag>
63 </revision>
64 </page>
65 <unknowntag>Should be ignored</unknowntag>
66 </mediawiki>
67 EOF
68 ,
69 'noitazinagro tseb eht si ikiWaideM',
70 'TestImportPage'
71 )
72 );
73 // @codingStandardsIgnoreEnd
74 }
75
76 /**
77 * @covers WikiImporter::handlePage
78 * @dataProvider getRedirectXML
79 * @param string $xml
80 * @param string|null $redirectTitle
81 */
82 public function testHandlePageContainsRedirect( $xml, $redirectTitle ) {
83 $source = $this->getDataSource( $xml );
84
85 $redirect = null;
86 $callback = function ( Title $title, ForeignTitle $foreignTitle, $revCount,
87 $sRevCount, $pageInfo ) use ( &$redirect ) {
88 if ( array_key_exists( 'redirect', $pageInfo ) ) {
89 $redirect = $pageInfo['redirect'];
90 }
91 };
92
93 $importer = new WikiImporter(
94 $source,
95 ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
96 );
97 $importer->setPageOutCallback( $callback );
98 $importer->doImport();
99
100 $this->assertEquals( $redirectTitle, $redirect );
101 }
102
103 public function getRedirectXML() {
104 // @codingStandardsIgnoreStart Generic.Files.LineLength
105 return array(
106 array(
107 <<< EOF
108 <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">
109 <page>
110 <title>Test</title>
111 <ns>0</ns>
112 <id>21</id>
113 <redirect title="Test22"/>
114 <revision>
115 <id>20</id>
116 <timestamp>2014-05-27T10:00:00Z</timestamp>
117 <contributor>
118 <username>Admin</username>
119 <id>10</id>
120 </contributor>
121 <comment>Admin moved page [[Test]] to [[Test22]]</comment>
122 <model>wikitext</model>
123 <format>text/x-wiki</format>
124 <text xml:space="preserve" bytes="20">#REDIRECT [[Test22]]</text>
125 <sha1>tq456o9x3abm7r9ozi6km8yrbbc56o6</sha1>
126 </revision>
127 </page>
128 </mediawiki>
129 EOF
130 ,
131 'Test22'
132 ),
133 array(
134 <<< EOF
135 <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">
136 <page>
137 <title>Test</title>
138 <ns>0</ns>
139 <id>42</id>
140 <revision>
141 <id>421</id>
142 <timestamp>2014-05-27T11:00:00Z</timestamp>
143 <contributor>
144 <username>Admin</username>
145 <id>10</id>
146 </contributor>
147 <text xml:space="preserve" bytes="4">Abcd</text>
148 <sha1>n7uomjq96szt60fy5w3x7ahf7q8m8rh</sha1>
149 <model>wikitext</model>
150 <format>text/x-wiki</format>
151 </revision>
152 </page>
153 </mediawiki>
154 EOF
155 ,
156 null
157 ),
158 );
159 // @codingStandardsIgnoreEnd
160 }
161
162 /**
163 * @covers WikiImporter::handleSiteInfo
164 * @dataProvider getSiteInfoXML
165 * @param string $xml
166 * @param array|null $namespaces
167 */
168 public function testSiteInfoContainsNamespaces( $xml, $namespaces ) {
169 $source = $this->getDataSource( $xml );
170
171 $importNamespaces = null;
172 $callback = function ( array $siteinfo, $innerImporter ) use ( &$importNamespaces ) {
173 $importNamespaces = $siteinfo['_namespaces'];
174 };
175
176 $importer = new WikiImporter(
177 $source,
178 ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
179 );
180 $importer->setSiteInfoCallback( $callback );
181 $importer->doImport();
182
183 $this->assertEquals( $importNamespaces, $namespaces );
184 }
185
186 public function getSiteInfoXML() {
187 // @codingStandardsIgnoreStart Generic.Files.LineLength
188 return array(
189 array(
190 <<< EOF
191 <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">
192 <siteinfo>
193 <namespaces>
194 <namespace key="-2" case="first-letter">Media</namespace>
195 <namespace key="-1" case="first-letter">Special</namespace>
196 <namespace key="0" case="first-letter" />
197 <namespace key="1" case="first-letter">Talk</namespace>
198 <namespace key="2" case="first-letter">User</namespace>
199 <namespace key="3" case="first-letter">User talk</namespace>
200 <namespace key="100" case="first-letter">Portal</namespace>
201 <namespace key="101" case="first-letter">Portal talk</namespace>
202 </namespaces>
203 </siteinfo>
204 </mediawiki>
205 EOF
206 ,
207 array(
208 '-2' => 'Media',
209 '-1' => 'Special',
210 '0' => '',
211 '1' => 'Talk',
212 '2' => 'User',
213 '3' => 'User talk',
214 '100' => 'Portal',
215 '101' => 'Portal talk',
216 )
217 ),
218 );
219 // @codingStandardsIgnoreEnd
220 }
221
222 }