9 * n.b. Ensure that you can write to the images/ directory as the
10 * user that will run tests.
13 // Note for reviewers: this intentionally duplicates functionality already in "ApiSetup" and so on.
14 // This framework works better IMO and has less strangeness (such as test cases inheriting from "ApiSetup"...)
15 // (and in the case of the other Upload tests, this flat out just actually works... )
17 // TODO: port the other Upload tests, and other API tests to this framework
19 require_once( 'ApiTestCaseUpload.php' );
25 * This is pretty sucky... needs to be prettified.
27 class ApiUploadTest
extends ApiTestCaseUpload
{
31 * XXX this is a funny way of getting session context
33 function testLogin() {
34 $user = self
::$users['uploader'];
38 'lgname' => $user->username
,
39 'lgpassword' => $user->password
41 list( $result, , $session ) = $this->doApiRequest( $params );
42 $this->assertArrayHasKey( "login", $result );
43 $this->assertArrayHasKey( "result", $result['login'] );
44 $this->assertEquals( "NeedToken", $result['login']['result'] );
45 $token = $result['login']['token'];
50 'lgname' => $user->username
,
51 'lgpassword' => $user->password
53 list( $result, , $session ) = $this->doApiRequest( $params, $session );
54 $this->assertArrayHasKey( "login", $result );
55 $this->assertArrayHasKey( "result", $result['login'] );
56 $this->assertEquals( "Success", $result['login']['result'] );
57 $this->assertArrayHasKey( 'lgtoken', $result['login'] );
66 public function testUploadRequiresToken( $session ) {
69 $this->doApiRequest( array(
72 } catch ( UsageException
$e ) {
74 $this->assertEquals( "The token parameter must be set", $e->getMessage() );
76 $this->assertTrue( $exception, "Got exception" );
82 public function testUploadMissingParams( $session ) {
84 $wgUser = self
::$users['uploader']->user
;
88 $this->doApiRequestWithToken( array(
91 } catch ( UsageException
$e ) {
93 $this->assertEquals( "One of the parameters sessionkey, file, url, statuskey is required",
96 $this->assertTrue( $exception, "Got exception" );
103 public function testUpload( $session ) {
105 $wgUser = self
::$users['uploader']->user
;
108 $mimeType = 'image/png';
111 $randomImageGenerator = new RandomImageGenerator();
113 catch ( Exception
$e ) {
114 $this->markTestIncomplete( $e->getMessage() );
117 $filePaths = $randomImageGenerator->writeImages( 1, $extension, wfTempDir() );
118 $filePath = $filePaths[0];
119 $fileSize = filesize( $filePath );
120 $fileName = basename( $filePath );
122 $this->deleteFileByFileName( $fileName );
123 $this->deleteFileByContent( $filePath );
126 if (! $this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath ) ) {
127 $this->markTestIncomplete( "Couldn't upload file!\n" );
131 'action' => 'upload',
132 'filename' => $fileName,
133 'file' => 'dummy content',
134 'comment' => 'dummy comment',
135 'text' => "This is the page text for $fileName",
140 list( $result, , ) = $this->doApiRequestWithToken( $params, $session );
141 } catch ( UsageException
$e ) {
144 $this->assertTrue( isset( $result['upload'] ) );
145 $this->assertEquals( 'Success', $result['upload']['result'] );
146 $this->assertEquals( $fileSize, ( int )$result['upload']['imageinfo']['size'] );
147 $this->assertEquals( $mimeType, $result['upload']['imageinfo']['mime'] );
148 $this->assertFalse( $exception );
151 $this->deleteFileByFilename( $fileName );
159 public function testUploadZeroLength( $session ) {
161 $wgUser = self
::$users['uploader']->user
;
163 $mimeType = 'image/png';
165 $filePath = tempnam( wfTempDir(), "" );
166 $fileName = "apiTestUploadZeroLength.png";
168 $this->deleteFileByFileName( $fileName );
170 if (! $this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath ) ) {
171 $this->markTestIncomplete( "Couldn't upload file!\n" );
175 'action' => 'upload',
176 'filename' => $fileName,
177 'file' => 'dummy content',
178 'comment' => 'dummy comment',
179 'text' => "This is the page text for $fileName",
184 $this->doApiRequestWithToken( $params, $session );
185 } catch ( UsageException
$e ) {
186 $this->assertContains( 'The file you submitted was empty', $e->getMessage() );
189 $this->assertTrue( $exception );
192 $this->deleteFileByFilename( $fileName );
200 public function testUploadSameFileName( $session ) {
202 $wgUser = self
::$users['uploader']->user
;
205 $mimeType = 'image/png';
208 $randomImageGenerator = new RandomImageGenerator();
210 catch ( Exception
$e ) {
211 $this->markTestIncomplete( $e->getMessage() );
214 $filePaths = $randomImageGenerator->writeImages( 2, $extension, wfTempDir() );
215 // we'll reuse this filename
216 $fileName = basename( $filePaths[0] );
218 // clear any other files with the same name
219 $this->deleteFileByFileName( $fileName );
221 // we reuse these params
223 'action' => 'upload',
224 'filename' => $fileName,
225 'file' => 'dummy content',
226 'comment' => 'dummy comment',
227 'text' => "This is the page text for $fileName",
230 // first upload .... should succeed
232 if (! $this->fakeUploadFile( 'file', $fileName, $mimeType, $filePaths[0] ) ) {
233 $this->markTestIncomplete( "Couldn't upload file!\n" );
238 list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session );
239 } catch ( UsageException
$e ) {
242 $this->assertTrue( isset( $result['upload'] ) );
243 $this->assertEquals( 'Success', $result['upload']['result'] );
244 $this->assertFalse( $exception );
246 // second upload with the same name (but different content)
248 if (! $this->fakeUploadFile( 'file', $fileName, $mimeType, $filePaths[1] ) ) {
249 $this->markTestIncomplete( "Couldn't upload file!\n" );
254 list( $result, , ) = $this->doApiRequestWithToken( $params, $session );
255 } catch ( UsageException
$e ) {
258 $this->assertTrue( isset( $result['upload'] ) );
259 $this->assertEquals( 'Warning', $result['upload']['result'] );
260 $this->assertTrue( isset( $result['upload']['warnings'] ) );
261 $this->assertTrue( isset( $result['upload']['warnings']['exists'] ) );
262 $this->assertFalse( $exception );
265 $this->deleteFileByFilename( $fileName );
266 unlink( $filePaths[0] );
267 unlink( $filePaths[1] );
274 public function testUploadSameContent( $session ) {
276 $wgUser = self
::$users['uploader']->user
;
279 $mimeType = 'image/png';
282 $randomImageGenerator = new RandomImageGenerator();
284 catch ( Exception
$e ) {
285 $this->markTestIncomplete( $e->getMessage() );
287 $filePaths = $randomImageGenerator->writeImages( 1, $extension, wfTempDir() );
288 $fileNames[0] = basename( $filePaths[0] );
289 $fileNames[1] = "SameContentAs" . $fileNames[0];
291 // clear any other files with the same name or content
292 $this->deleteFileByContent( $filePaths[0] );
293 $this->deleteFileByFileName( $fileNames[0] );
294 $this->deleteFileByFileName( $fileNames[1] );
296 // first upload .... should succeed
299 'action' => 'upload',
300 'filename' => $fileNames[0],
301 'file' => 'dummy content',
302 'comment' => 'dummy comment',
303 'text' => "This is the page text for " . $fileNames[0],
306 if (! $this->fakeUploadFile( 'file', $fileNames[0], $mimeType, $filePaths[0] ) ) {
307 $this->markTestIncomplete( "Couldn't upload file!\n" );
312 list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session );
313 } catch ( UsageException
$e ) {
316 $this->assertTrue( isset( $result['upload'] ) );
317 $this->assertEquals( 'Success', $result['upload']['result'] );
318 $this->assertFalse( $exception );
321 // second upload with the same content (but different name)
323 if (! $this->fakeUploadFile( 'file', $fileNames[1], $mimeType, $filePaths[0] ) ) {
324 $this->markTestIncomplete( "Couldn't upload file!\n" );
328 'action' => 'upload',
329 'filename' => $fileNames[1],
330 'file' => 'dummy content',
331 'comment' => 'dummy comment',
332 'text' => "This is the page text for " . $fileNames[1],
337 list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session );
338 } catch ( UsageException
$e ) {
341 $this->assertTrue( isset( $result['upload'] ) );
342 $this->assertEquals( 'Warning', $result['upload']['result'] );
343 $this->assertTrue( isset( $result['upload']['warnings'] ) );
344 $this->assertTrue( isset( $result['upload']['warnings']['duplicate'] ) );
345 $this->assertFalse( $exception );
348 $this->deleteFileByFilename( $fileNames[0] );
349 $this->deleteFileByFilename( $fileNames[1] );
350 unlink( $filePaths[0] );
357 public function testUploadStash( $session ) {
359 $wgUser = self
::$users['uploader']->user
;
362 $mimeType = 'image/png';
365 $randomImageGenerator = new RandomImageGenerator();
367 catch ( Exception
$e ) {
368 $this->markTestIncomplete( $e->getMessage() );
371 $filePaths = $randomImageGenerator->writeImages( 1, $extension, wfTempDir() );
372 $filePath = $filePaths[0];
373 $fileSize = filesize( $filePath );
374 $fileName = basename( $filePath );
376 $this->deleteFileByFileName( $fileName );
377 $this->deleteFileByContent( $filePath );
379 if (! $this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath ) ) {
380 $this->markTestIncomplete( "Couldn't upload file!\n" );
384 'action' => 'upload',
386 'filename' => $fileName,
387 'file' => 'dummy content',
388 'comment' => 'dummy comment',
389 'text' => "This is the page text for $fileName",
394 list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session );
395 } catch ( UsageException
$e ) {
398 $this->assertFalse( $exception );
399 $this->assertTrue( isset( $result['upload'] ) );
400 $this->assertEquals( 'Success', $result['upload']['result'] );
401 $this->assertEquals( $fileSize, ( int )$result['upload']['imageinfo']['size'] );
402 $this->assertEquals( $mimeType, $result['upload']['imageinfo']['mime'] );
403 $this->assertTrue( isset( $result['upload']['sessionkey'] ) );
404 $sessionkey = $result['upload']['sessionkey'];
406 // it should be visible from Special:UploadStash
407 // XXX ...but how to test this, with a fake WebRequest with the session?
409 // now we should try to release the file from stash
411 'action' => 'upload',
412 'sessionkey' => $sessionkey,
413 'filename' => $fileName,
414 'comment' => 'dummy comment',
415 'text' => "This is the page text for $fileName, altered",
418 $this->clearFakeUploads();
421 list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session );
422 } catch ( UsageException
$e ) {
425 $this->assertTrue( isset( $result['upload'] ) );
426 $this->assertEquals( 'Success', $result['upload']['result'] );
427 $this->assertFalse( $exception );
430 $this->deleteFileByFilename( $fileName );