3 require_once dirname( __FILE__
) . '/api/ApiSetup.php';
9 class UploadFromUrlTest
extends ApiTestSetup
{
11 public function setUp() {
12 global $wgEnableUploads, $wgAllowCopyUploads, $wgAllowAsyncCopyUploads;
15 $wgEnableUploads = true;
16 $wgAllowCopyUploads = true;
17 $wgAllowAsyncCopyUploads = true;
20 ini_set( 'log_errors', 1 );
21 ini_set( 'error_reporting', 1 );
22 ini_set( 'display_errors', 1 );
24 if ( wfLocalFile( 'UploadFromUrlTest.png' )->exists() ) {
25 $this->deleteFile( 'UploadFromUrlTest.png' );
29 protected function doApiRequest( $params, $unused = null, $appendModule = false ) {
30 $sessionId = session_id();
31 session_write_close();
33 $req = new FauxRequest( $params, true, $_SESSION );
34 $module = new ApiMain( $req, true );
37 wfSetupSession( $sessionId );
38 return array( $module->getResultData(), $req );
42 * Ensure that the job queue is empty before continuing
44 public function testClearQueue() {
45 while ( $job = Job
::pop() ) { }
46 $this->assertFalse( $job );
50 * @todo Document why we test login, since the $wgUser hack used doesn't
53 public function testLogin() {
54 $data = $this->doApiRequest( array(
56 'lgname' => $this->user
->userName
,
57 'lgpassword' => $this->user
->passWord
) );
58 $this->assertArrayHasKey( "login", $data[0] );
59 $this->assertArrayHasKey( "result", $data[0]['login'] );
60 $this->assertEquals( "NeedToken", $data[0]['login']['result'] );
61 $token = $data[0]['login']['token'];
63 $data = $this->doApiRequest( array(
66 'lgname' => $this->user
->userName
,
67 'lgpassword' => $this->user
->passWord
) );
69 $this->assertArrayHasKey( "login", $data[0] );
70 $this->assertArrayHasKey( "result", $data[0]['login'] );
71 $this->assertEquals( "Success", $data[0]['login']['result'] );
72 $this->assertArrayHasKey( 'lgtoken', $data[0]['login'] );
79 * @depends testClearQueue
81 public function testSetupUrlDownload( $data ) {
82 $token = $this->user
->editToken();
86 $this->doApiRequest( array(
89 } catch ( UsageException
$e ) {
91 $this->assertEquals( "The token parameter must be set", $e->getMessage() );
93 $this->assertTrue( $exception, "Got exception" );
97 $this->doApiRequest( array(
101 } catch ( UsageException
$e ) {
103 $this->assertEquals( "One of the parameters sessionkey, file, url, statuskey is required",
106 $this->assertTrue( $exception, "Got exception" );
110 $this->doApiRequest( array(
111 'action' => 'upload',
112 'url' => 'http://www.example.com/test.png',
115 } catch ( UsageException
$e ) {
117 $this->assertEquals( "The filename parameter must be set", $e->getMessage() );
119 $this->assertTrue( $exception, "Got exception" );
121 $this->user
->removeGroup( 'sysop' );
124 $this->doApiRequest( array(
125 'action' => 'upload',
126 'url' => 'http://www.example.com/test.png',
127 'filename' => 'UploadFromUrlTest.png',
130 } catch ( UsageException
$e ) {
132 $this->assertEquals( "Permission denied", $e->getMessage() );
134 $this->assertTrue( $exception, "Got exception" );
136 $this->user
->addGroup( 'sysop' );
137 $data = $this->doApiRequest( array(
138 'action' => 'upload',
139 'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
140 'asyncdownload' => 1,
141 'filename' => 'UploadFromUrlTest.png',
145 $this->assertEquals( $data[0]['upload']['result'], 'Queued', 'Queued upload' );
148 $this->assertThat( $job, $this->isInstanceOf( 'UploadFromUrlJob' ), 'Queued upload inserted' );
153 * @depends testClearQueue
155 public function testAsyncUpload( $data ) {
156 $token = $this->user
->editToken();
158 $this->user
->addGroup( 'users' );
160 $data = $this->doAsyncUpload( $token, true );
161 $this->assertEquals( $data[0]['upload']['result'], 'Success' );
162 $this->assertEquals( $data[0]['upload']['filename'], 'UploadFromUrlTest.png' );
163 $this->assertTrue( wfLocalFile( $data[0]['upload']['filename'] )->exists() );
165 $this->deleteFile( 'UploadFromUrlTest.png' );
172 * @depends testClearQueue
174 public function testAsyncUploadWarning( $data ) {
175 $token = $this->user
->editToken();
177 $this->user
->addGroup( 'users' );
180 $data = $this->doAsyncUpload( $token );
182 $this->assertEquals( $data[0]['upload']['result'], 'Warning' );
183 $this->assertTrue( isset( $data[0]['upload']['sessionkey'] ) );
185 $data = $this->doApiRequest( array(
186 'action' => 'upload',
187 'sessionkey' => $data[0]['upload']['sessionkey'],
188 'filename' => 'UploadFromUrlTest.png',
189 'ignorewarnings' => 1,
192 $this->assertEquals( $data[0]['upload']['result'], 'Success' );
193 $this->assertEquals( $data[0]['upload']['filename'], 'UploadFromUrlTest.png' );
194 $this->assertTrue( wfLocalFile( $data[0]['upload']['filename'] )->exists() );
196 $this->deleteFile( 'UploadFromUrlTest.png' );
203 * @depends testClearQueue
205 public function testSyncDownload( $data ) {
206 $token = $this->user
->editToken();
209 $this->assertFalse( $job, 'Starting with an empty jobqueue' );
211 $this->user
->addGroup( 'users' );
212 $data = $this->doApiRequest( array(
213 'action' => 'upload',
214 'filename' => 'UploadFromUrlTest.png',
215 'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
216 'ignorewarnings' => true,
221 $this->assertFalse( $job );
223 $this->assertEquals( 'Success', $data[0]['upload']['result'] );
224 $this->deleteFile( 'UploadFromUrlTest.png' );
229 public function testLeaveMessage() {
230 $token = $this->user
->user
->editToken();
232 $talk = $this->user
->user
->getTalkPage();
233 if ( $talk->exists() ) {
234 $a = new Article( $talk );
235 $a->doDeleteArticle( '' );
238 $this->assertFalse( (bool)$talk->getArticleId( Title
::GAID_FOR_UPDATE
), 'User talk does not exist' );
240 $data = $this->doApiRequest( array(
241 'action' => 'upload',
242 'filename' => 'UploadFromUrlTest.png',
243 'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
244 'asyncdownload' => 1,
247 'ignorewarnings' => 1,
251 $this->assertEquals( 'UploadFromUrlJob', get_class( $job ) );
254 $this->assertTrue( wfLocalFile( 'UploadFromUrlTest.png' )->exists() );
255 $this->assertTrue( (bool)$talk->getArticleId( Title
::GAID_FOR_UPDATE
), 'User talk exists' );
257 $this->deleteFile( 'UploadFromUrlTest.png' );
259 $talkRev = Revision
::newFromTitle( $talk );
260 $talkSize = $talkRev->getSize();
264 $data = $this->doApiRequest( array(
265 'action' => 'upload',
266 'filename' => 'UploadFromUrlTest.png',
267 'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
268 'asyncdownload' => 1,
272 } catch ( UsageException
$e ) {
274 $this->assertEquals( 'Using leavemessage without ignorewarnings is not supported', $e->getMessage() );
276 $this->assertTrue( $exception );
279 $this->assertFalse( $job );
284 // Broken until using leavemessage with ignorewarnings is supported
287 $this->assertFalse( wfLocalFile( 'UploadFromUrlTest.png' )->exists() );
289 $talkRev = Revision::newFromTitle( $talk );
290 $this->assertTrue( $talkRev->getSize() > $talkSize, 'New message left' );
295 * Helper function to perform an async upload, execute the job and fetch
298 * @return array The result of action=upload&statuskey=key
300 private function doAsyncUpload( $token, $ignoreWarnings = false, $leaveMessage = false ) {
302 'action' => 'upload',
303 'filename' => 'UploadFromUrlTest.png',
304 'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
305 'asyncdownload' => 1,
308 if ( $ignoreWarnings ) {
309 $params['ignorewarnings'] = 1;
311 if ( $leaveMessage ) {
312 $params['leavemessage'] = 1;
315 $data = $this->doApiRequest( $params );
316 $this->assertEquals( $data[0]['upload']['result'], 'Queued' );
317 $this->assertTrue( isset( $data[0]['upload']['statuskey'] ) );
318 $statusKey = $data[0]['upload']['statuskey'];
321 $this->assertEquals( 'UploadFromUrlJob', get_class( $job ) );
323 $status = $job->run();
324 $this->assertTrue( $status );
326 $data = $this->doApiRequest( array(
327 'action' => 'upload',
328 'statuskey' => $statusKey,
339 protected function deleteFile( $name ) {
340 $t = Title
::newFromText( $name, NS_FILE
);
341 $this->assertTrue($t->exists(), "File '$name' exists");
343 if ( $t->exists() ) {
344 $file = wfFindFile( $name, array( 'ignoreRedirect' => true ) );
346 FileDeleteForm
::doDelete( $t, $file, $empty, "none", true );
347 $a = new Article ( $t );
348 $a->doDeleteArticle( "testing" );
350 $t = Title
::newFromText( $name, NS_FILE
);
352 $this->assertFalse($t->exists(), "File '$name' was deleted");