/tests/phpunit/includes/upload/UploadFromUrlTest.php

https://github.com/daevid/MWFork · PHP · 348 lines · 242 code · 61 blank · 45 comment · 6 complexity · 6abda16b079df48cb855250361d20251 MD5 · raw file

  1. <?php
  2. /**
  3. * @group Broken
  4. * @group Upload
  5. */
  6. class UploadFromUrlTest extends ApiTestCase {
  7. public function setUp() {
  8. global $wgEnableUploads, $wgAllowCopyUploads, $wgAllowAsyncCopyUploads;
  9. parent::setUp();
  10. $wgEnableUploads = true;
  11. $wgAllowCopyUploads = true;
  12. $wgAllowAsyncCopyUploads = true;
  13. wfSetupSession();
  14. if ( wfLocalFile( 'UploadFromUrlTest.png' )->exists() ) {
  15. $this->deleteFile( 'UploadFromUrlTest.png' );
  16. }
  17. }
  18. protected function doApiRequest( $params, $unused = null, $appendModule = false ) {
  19. $sessionId = session_id();
  20. session_write_close();
  21. $req = new FauxRequest( $params, true, $_SESSION );
  22. $module = new ApiMain( $req, true );
  23. $module->execute();
  24. wfSetupSession( $sessionId );
  25. return array( $module->getResultData(), $req );
  26. }
  27. /**
  28. * Ensure that the job queue is empty before continuing
  29. */
  30. public function testClearQueue() {
  31. while ( $job = Job::pop() ) { }
  32. $this->assertFalse( $job );
  33. }
  34. /**
  35. * @todo Document why we test login, since the $wgUser hack used doesn't
  36. * require login
  37. */
  38. public function testLogin() {
  39. $data = $this->doApiRequest( array(
  40. 'action' => 'login',
  41. 'lgname' => $this->user->userName,
  42. 'lgpassword' => $this->user->passWord ) );
  43. $this->assertArrayHasKey( "login", $data[0] );
  44. $this->assertArrayHasKey( "result", $data[0]['login'] );
  45. $this->assertEquals( "NeedToken", $data[0]['login']['result'] );
  46. $token = $data[0]['login']['token'];
  47. $data = $this->doApiRequest( array(
  48. 'action' => 'login',
  49. "lgtoken" => $token,
  50. 'lgname' => $this->user->userName,
  51. 'lgpassword' => $this->user->passWord ) );
  52. $this->assertArrayHasKey( "login", $data[0] );
  53. $this->assertArrayHasKey( "result", $data[0]['login'] );
  54. $this->assertEquals( "Success", $data[0]['login']['result'] );
  55. $this->assertArrayHasKey( 'lgtoken', $data[0]['login'] );
  56. return $data;
  57. }
  58. /**
  59. * @depends testLogin
  60. * @depends testClearQueue
  61. */
  62. public function testSetupUrlDownload( $data ) {
  63. $token = $this->user->editToken();
  64. $exception = false;
  65. try {
  66. $this->doApiRequest( array(
  67. 'action' => 'upload',
  68. ) );
  69. } catch ( UsageException $e ) {
  70. $exception = true;
  71. $this->assertEquals( "The token parameter must be set", $e->getMessage() );
  72. }
  73. $this->assertTrue( $exception, "Got exception" );
  74. $exception = false;
  75. try {
  76. $this->doApiRequest( array(
  77. 'action' => 'upload',
  78. 'token' => $token,
  79. ), $data );
  80. } catch ( UsageException $e ) {
  81. $exception = true;
  82. $this->assertEquals( "One of the parameters sessionkey, file, url, statuskey is required",
  83. $e->getMessage() );
  84. }
  85. $this->assertTrue( $exception, "Got exception" );
  86. $exception = false;
  87. try {
  88. $this->doApiRequest( array(
  89. 'action' => 'upload',
  90. 'url' => 'http://www.example.com/test.png',
  91. 'token' => $token,
  92. ), $data );
  93. } catch ( UsageException $e ) {
  94. $exception = true;
  95. $this->assertEquals( "The filename parameter must be set", $e->getMessage() );
  96. }
  97. $this->assertTrue( $exception, "Got exception" );
  98. $this->user->removeGroup( 'sysop' );
  99. $exception = false;
  100. try {
  101. $this->doApiRequest( array(
  102. 'action' => 'upload',
  103. 'url' => 'http://www.example.com/test.png',
  104. 'filename' => 'UploadFromUrlTest.png',
  105. 'token' => $token,
  106. ), $data );
  107. } catch ( UsageException $e ) {
  108. $exception = true;
  109. $this->assertEquals( "Permission denied", $e->getMessage() );
  110. }
  111. $this->assertTrue( $exception, "Got exception" );
  112. $this->user->addGroup( 'sysop' );
  113. $data = $this->doApiRequest( array(
  114. 'action' => 'upload',
  115. 'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
  116. 'asyncdownload' => 1,
  117. 'filename' => 'UploadFromUrlTest.png',
  118. 'token' => $token,
  119. ), $data );
  120. $this->assertEquals( $data[0]['upload']['result'], 'Queued', 'Queued upload' );
  121. $job = Job::pop();
  122. $this->assertThat( $job, $this->isInstanceOf( 'UploadFromUrlJob' ), 'Queued upload inserted' );
  123. }
  124. /**
  125. * @depends testLogin
  126. * @depends testClearQueue
  127. */
  128. public function testAsyncUpload( $data ) {
  129. $token = $this->user->editToken();
  130. $this->user->addGroup( 'users' );
  131. $data = $this->doAsyncUpload( $token, true );
  132. $this->assertEquals( $data[0]['upload']['result'], 'Success' );
  133. $this->assertEquals( $data[0]['upload']['filename'], 'UploadFromUrlTest.png' );
  134. $this->assertTrue( wfLocalFile( $data[0]['upload']['filename'] )->exists() );
  135. $this->deleteFile( 'UploadFromUrlTest.png' );
  136. return $data;
  137. }
  138. /**
  139. * @depends testLogin
  140. * @depends testClearQueue
  141. */
  142. public function testAsyncUploadWarning( $data ) {
  143. $token = $this->user->editToken();
  144. $this->user->addGroup( 'users' );
  145. $data = $this->doAsyncUpload( $token );
  146. $this->assertEquals( $data[0]['upload']['result'], 'Warning' );
  147. $this->assertTrue( isset( $data[0]['upload']['sessionkey'] ) );
  148. $data = $this->doApiRequest( array(
  149. 'action' => 'upload',
  150. 'sessionkey' => $data[0]['upload']['sessionkey'],
  151. 'filename' => 'UploadFromUrlTest.png',
  152. 'ignorewarnings' => 1,
  153. 'token' => $token,
  154. ) );
  155. $this->assertEquals( $data[0]['upload']['result'], 'Success' );
  156. $this->assertEquals( $data[0]['upload']['filename'], 'UploadFromUrlTest.png' );
  157. $this->assertTrue( wfLocalFile( $data[0]['upload']['filename'] )->exists() );
  158. $this->deleteFile( 'UploadFromUrlTest.png' );
  159. return $data;
  160. }
  161. /**
  162. * @depends testLogin
  163. * @depends testClearQueue
  164. */
  165. public function testSyncDownload( $data ) {
  166. $token = $this->user->editToken();
  167. $job = Job::pop();
  168. $this->assertFalse( $job, 'Starting with an empty jobqueue' );
  169. $this->user->addGroup( 'users' );
  170. $data = $this->doApiRequest( array(
  171. 'action' => 'upload',
  172. 'filename' => 'UploadFromUrlTest.png',
  173. 'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
  174. 'ignorewarnings' => true,
  175. 'token' => $token,
  176. ), $data );
  177. $job = Job::pop();
  178. $this->assertFalse( $job );
  179. $this->assertEquals( 'Success', $data[0]['upload']['result'] );
  180. $this->deleteFile( 'UploadFromUrlTest.png' );
  181. return $data;
  182. }
  183. public function testLeaveMessage() {
  184. $token = $this->user->user->editToken();
  185. $talk = $this->user->user->getTalkPage();
  186. if ( $talk->exists() ) {
  187. $a = new Article( $talk );
  188. $a->doDeleteArticle( '' );
  189. }
  190. $this->assertFalse( (bool)$talk->getArticleId( Title::GAID_FOR_UPDATE ), 'User talk does not exist' );
  191. $data = $this->doApiRequest( array(
  192. 'action' => 'upload',
  193. 'filename' => 'UploadFromUrlTest.png',
  194. 'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
  195. 'asyncdownload' => 1,
  196. 'token' => $token,
  197. 'leavemessage' => 1,
  198. 'ignorewarnings' => 1,
  199. ) );
  200. $job = Job::pop();
  201. $this->assertEquals( 'UploadFromUrlJob', get_class( $job ) );
  202. $job->run();
  203. $this->assertTrue( wfLocalFile( 'UploadFromUrlTest.png' )->exists() );
  204. $this->assertTrue( (bool)$talk->getArticleId( Title::GAID_FOR_UPDATE ), 'User talk exists' );
  205. $this->deleteFile( 'UploadFromUrlTest.png' );
  206. $talkRev = Revision::newFromTitle( $talk );
  207. $talkSize = $talkRev->getSize();
  208. $exception = false;
  209. try {
  210. $data = $this->doApiRequest( array(
  211. 'action' => 'upload',
  212. 'filename' => 'UploadFromUrlTest.png',
  213. 'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
  214. 'asyncdownload' => 1,
  215. 'token' => $token,
  216. 'leavemessage' => 1,
  217. ) );
  218. } catch ( UsageException $e ) {
  219. $exception = true;
  220. $this->assertEquals( 'Using leavemessage without ignorewarnings is not supported', $e->getMessage() );
  221. }
  222. $this->assertTrue( $exception );
  223. $job = Job::pop();
  224. $this->assertFalse( $job );
  225. return;
  226. /**
  227. // Broken until using leavemessage with ignorewarnings is supported
  228. $job->run();
  229. $this->assertFalse( wfLocalFile( 'UploadFromUrlTest.png' )->exists() );
  230. $talkRev = Revision::newFromTitle( $talk );
  231. $this->assertTrue( $talkRev->getSize() > $talkSize, 'New message left' );
  232. */
  233. }
  234. /**
  235. * Helper function to perform an async upload, execute the job and fetch
  236. * the status
  237. *
  238. * @return array The result of action=upload&statuskey=key
  239. */
  240. private function doAsyncUpload( $token, $ignoreWarnings = false, $leaveMessage = false ) {
  241. $params = array(
  242. 'action' => 'upload',
  243. 'filename' => 'UploadFromUrlTest.png',
  244. 'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
  245. 'asyncdownload' => 1,
  246. 'token' => $token,
  247. );
  248. if ( $ignoreWarnings ) {
  249. $params['ignorewarnings'] = 1;
  250. }
  251. if ( $leaveMessage ) {
  252. $params['leavemessage'] = 1;
  253. }
  254. $data = $this->doApiRequest( $params );
  255. $this->assertEquals( $data[0]['upload']['result'], 'Queued' );
  256. $this->assertTrue( isset( $data[0]['upload']['statuskey'] ) );
  257. $statusKey = $data[0]['upload']['statuskey'];
  258. $job = Job::pop();
  259. $this->assertEquals( 'UploadFromUrlJob', get_class( $job ) );
  260. $status = $job->run();
  261. $this->assertTrue( $status );
  262. $data = $this->doApiRequest( array(
  263. 'action' => 'upload',
  264. 'statuskey' => $statusKey,
  265. 'token' => $token,
  266. ) );
  267. return $data;
  268. }
  269. /**
  270. *
  271. */
  272. protected function deleteFile( $name ) {
  273. $t = Title::newFromText( $name, NS_FILE );
  274. $this->assertTrue($t->exists(), "File '$name' exists");
  275. if ( $t->exists() ) {
  276. $file = wfFindFile( $name, array( 'ignoreRedirect' => true ) );
  277. $empty = "";
  278. FileDeleteForm::doDelete( $t, $file, $empty, "none", true );
  279. $a = new Article ( $t );
  280. $a->doDeleteArticle( "testing" );
  281. }
  282. $t = Title::newFromText( $name, NS_FILE );
  283. $this->assertFalse($t->exists(), "File '$name' was deleted");
  284. }
  285. }