* Make tests work better together. Tests are now skipped or marked incomplete.
* Make it possible to call deleteArchived{Revisions,Files} from within tests to do cleanup.
This commit is contained in:
parent
dd8f9c128a
commit
04b2413aac
9 changed files with 248 additions and 130 deletions
62
maintenance/deleteArchivedFiles.inc
Normal file
62
maintenance/deleteArchivedFiles.inc
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
/**
|
||||
* Core functions for deleteArchivedFiles.php
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* http://www.gnu.org/copyleft/gpl.html
|
||||
*
|
||||
* @ingroup Maintenance
|
||||
*/
|
||||
|
||||
class DeleteArchivedFilesImplementation {
|
||||
static public function doDelete($output, $force) {
|
||||
# Data should come off the master, wrapped in a transaction
|
||||
$dbw = wfGetDB( DB_MASTER );
|
||||
$dbw->begin();
|
||||
$tbl_arch = $dbw->tableName( 'filearchive' );
|
||||
$repo = RepoGroup::singleton()->getLocalRepo();
|
||||
# Get "active" revisions from the filearchive table
|
||||
$output->handleOutput( "Searching for and deleting archived files...\n" );
|
||||
$res = $dbw->query( "SELECT fa_id,fa_storage_group,fa_storage_key FROM $tbl_arch" );
|
||||
$count = 0;
|
||||
foreach( $res as $row ) {
|
||||
$key = $row->fa_storage_key;
|
||||
$group = $row->fa_storage_group;
|
||||
$id = $row->fa_id;
|
||||
$path = $repo->getZonePath( 'deleted' ).'/'.$repo->getDeletedHashPath($key).$key;
|
||||
$sha1 = substr( $key, 0, strcspn( $key, '.' ) );
|
||||
// Check if the file is used anywhere...
|
||||
$inuse = $dbw->selectField( 'oldimage', '1',
|
||||
array( 'oi_sha1' => $sha1,
|
||||
'oi_deleted & '.File::DELETED_FILE => File::DELETED_FILE ),
|
||||
__METHOD__,
|
||||
array( 'FOR UPDATE' )
|
||||
);
|
||||
if ( $path && file_exists($path) && !$inuse ) {
|
||||
unlink($path); // delete
|
||||
$count++;
|
||||
$dbw->query( "DELETE FROM $tbl_arch WHERE fa_id = $id" );
|
||||
} else {
|
||||
$output->handleOutput( "Notice - file '$key' not found in group '$group'\n" );
|
||||
if ( $force ) {
|
||||
$outpu->handleOutput( "Got --force, deleting DB entry\n" );
|
||||
$dbw->query( "DELETE FROM $tbl_arch WHERE fa_id = $id" );
|
||||
}
|
||||
}
|
||||
}
|
||||
$dbw->commit();
|
||||
$output->handleOutput( "Done! [$count file(s)]\n" );
|
||||
}
|
||||
}
|
||||
|
|
@ -24,6 +24,7 @@
|
|||
*/
|
||||
|
||||
require_once( dirname(__FILE__) . '/Maintenance.php' );
|
||||
require_once( dirname(__FILE__) . '/deleteArchivedFiles.inc' );
|
||||
|
||||
class DeleteArchivedFiles extends Maintenance {
|
||||
public function __construct() {
|
||||
|
|
@ -33,48 +34,17 @@ class DeleteArchivedFiles extends Maintenance {
|
|||
$this->addOption( 'force', 'Force deletion of rows from filearchive' );
|
||||
}
|
||||
|
||||
public function handleOutput($str) {
|
||||
return $this->output($str);
|
||||
}
|
||||
|
||||
public function execute() {
|
||||
if( !$this->hasOption('delete') ) {
|
||||
$this->output( "Use --delete to actually confirm this script\n" );
|
||||
return;
|
||||
}
|
||||
$force = $this->hasOption( 'force' );
|
||||
# Data should come off the master, wrapped in a transaction
|
||||
$dbw = wfGetDB( DB_MASTER );
|
||||
$dbw->begin();
|
||||
$tbl_arch = $dbw->tableName( 'filearchive' );
|
||||
$repo = RepoGroup::singleton()->getLocalRepo();
|
||||
# Get "active" revisions from the filearchive table
|
||||
$this->output( "Searching for and deleting archived files...\n" );
|
||||
$res = $dbw->query( "SELECT fa_id,fa_storage_group,fa_storage_key FROM $tbl_arch" );
|
||||
$count = 0;
|
||||
foreach( $res as $row ) {
|
||||
$key = $row->fa_storage_key;
|
||||
$group = $row->fa_storage_group;
|
||||
$id = $row->fa_id;
|
||||
$path = $repo->getZonePath( 'deleted' ).'/'.$repo->getDeletedHashPath($key).$key;
|
||||
$sha1 = substr( $key, 0, strcspn( $key, '.' ) );
|
||||
// Check if the file is used anywhere...
|
||||
$inuse = $dbw->selectField( 'oldimage', '1',
|
||||
array( 'oi_sha1' => $sha1,
|
||||
'oi_deleted & '.File::DELETED_FILE => File::DELETED_FILE ),
|
||||
__METHOD__,
|
||||
array( 'FOR UPDATE' )
|
||||
);
|
||||
if ( $path && file_exists($path) && !$inuse ) {
|
||||
unlink($path); // delete
|
||||
$count++;
|
||||
$dbw->query( "DELETE FROM $tbl_arch WHERE fa_id = $id" );
|
||||
} else {
|
||||
$this->output( "Notice - file '$key' not found in group '$group'\n" );
|
||||
if ( $force ) {
|
||||
$this->output( "Got --force, deleting DB entry\n" );
|
||||
$dbw->query( "DELETE FROM $tbl_arch WHERE fa_id = $id" );
|
||||
}
|
||||
}
|
||||
}
|
||||
$dbw->commit();
|
||||
$this->output( "Done! [$count file(s)]\n" );
|
||||
DeleteArchivedFilesImplementation::doDelete($this, $force);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
49
maintenance/deleteArchivedRevisions.inc
Normal file
49
maintenance/deleteArchivedRevisions.inc
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Delete archived (deleted from public) revisions from the database
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* http://www.gnu.org/copyleft/gpl.html
|
||||
*
|
||||
* @ingroup Maintenance
|
||||
*/
|
||||
|
||||
class DeleteArchivedRevisionsImplementation {
|
||||
|
||||
static public function doDelete($output) {
|
||||
$dbw = wfGetDB( DB_MASTER );
|
||||
|
||||
$dbw->begin();
|
||||
|
||||
$tbl_arch = $dbw->tableName( 'archive' );
|
||||
|
||||
# Delete as appropriate
|
||||
$output->handleOutput( "Deleting archived revisions... " );
|
||||
$dbw->query( "TRUNCATE TABLE $tbl_arch" );
|
||||
|
||||
$count = $dbw->affectedRows();
|
||||
$deletedRows = $count != 0;
|
||||
|
||||
$output->handleOutput( "done. $count revisions deleted.\n" );
|
||||
|
||||
# This bit's done
|
||||
# Purge redundant text records
|
||||
$dbw->commit();
|
||||
if( $deletedRows ) {
|
||||
$output->purgeRedundantText( true );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -24,6 +24,7 @@
|
|||
*/
|
||||
|
||||
require_once( dirname(__FILE__) . '/Maintenance.php' );
|
||||
require_once( dirname(__FILE__) . '/deleteArchivedRevisions.inc' );
|
||||
|
||||
class DeleteArchivedRevisions extends Maintenance {
|
||||
public function __construct() {
|
||||
|
|
@ -32,31 +33,17 @@ class DeleteArchivedRevisions extends Maintenance {
|
|||
$this->addOption( 'delete', 'Performs the deletion' );
|
||||
}
|
||||
|
||||
public function handleOutput($str) {
|
||||
$this->output($str);
|
||||
}
|
||||
|
||||
public function execute() {
|
||||
$this->output( "Delete archived revisions\n\n" );
|
||||
# Data should come off the master, wrapped in a transaction
|
||||
$dbw = wfGetDB( DB_MASTER );
|
||||
if( $this->hasOption('delete') ) {
|
||||
$dbw->begin();
|
||||
|
||||
$tbl_arch = $dbw->tableName( 'archive' );
|
||||
|
||||
# Delete as appropriate
|
||||
$this->output( "Deleting archived revisions... " );
|
||||
$dbw->query( "TRUNCATE TABLE $tbl_arch" );
|
||||
|
||||
$count = $dbw->affectedRows();
|
||||
$deletedRows = $count != 0;
|
||||
|
||||
$this->output( "done. $count revisions deleted.\n" );
|
||||
|
||||
# This bit's done
|
||||
# Purge redundant text records
|
||||
$dbw->commit();
|
||||
if( $deletedRows ) {
|
||||
$this->purgeRedundantText( true );
|
||||
}
|
||||
DeleteArchivedRevisionsImplementation::doDelete($this);
|
||||
} else {
|
||||
$dbw = wfGetDB( DB_MASTER );
|
||||
$res = $dbw->selectRow( 'archive', 'COUNT(*) as count', array(), __FUNCTION__ );
|
||||
$this->output( "Found {$res->count} revisions to delete.\n" );
|
||||
$this->output( "Please run the script again with the --delete option to really delete the revisions.\n" );
|
||||
|
|
|
|||
|
|
@ -57,8 +57,9 @@ class ApiTest extends ApiSetup {
|
|||
}
|
||||
|
||||
function testApi() {
|
||||
global $wgServerName, $wgServer;
|
||||
global $wgServerName, $wgServer, $wgDBprefix;
|
||||
|
||||
if($wgDBprefix === "parsertest_") $this->markTestSkipped("This test can't (yet?) be run with the parser tests");
|
||||
if(!isset($wgServerName) || !isset($wgServer)) {
|
||||
$this->markTestIncomplete('This test needs $wgServerName and $wgServer to '.
|
||||
'be set in LocalSettings.php');
|
||||
|
|
@ -73,8 +74,9 @@ class ApiTest extends ApiSetup {
|
|||
}
|
||||
|
||||
function testApiLoginNoName() {
|
||||
global $wgServerName, $wgServer;
|
||||
global $wgServerName, $wgServer, $wgDBprefix;
|
||||
|
||||
if($wgDBprefix === "parsertest_") $this->markTestSkipped("This test can't (yet?) be run with the parser tests");
|
||||
if(!isset($wgServerName) || !isset($wgServer)) {
|
||||
$this->markTestIncomplete('This test needs $wgServerName and $wgServer to '.
|
||||
'be set in LocalSettings.php');
|
||||
|
|
@ -92,8 +94,9 @@ class ApiTest extends ApiSetup {
|
|||
}
|
||||
|
||||
function testApiLoginBadPass() {
|
||||
global $wgServerName, $wgServer;
|
||||
global $wgServerName, $wgServer, $wgDBprefix;
|
||||
|
||||
if($wgDBprefix === "parsertest_") $this->markTestSkipped("This test can't (yet?) be run with the parser tests");
|
||||
if(!isset($wgServerName) || !isset($wgServer)) {
|
||||
$this->markTestIncomplete('This test needs $wgServerName and $wgServer to '.
|
||||
'be set in LocalSettings.php');
|
||||
|
|
@ -111,8 +114,9 @@ class ApiTest extends ApiSetup {
|
|||
}
|
||||
|
||||
function testApiLoginGoodPass() {
|
||||
global $wgServerName, $wgServer;
|
||||
global $wgServerName, $wgServer, $wgDBprefix;
|
||||
|
||||
if($wgDBprefix === "parsertest_") $this->markTestSkipped("This test can't (yet?) be run with the parser tests");
|
||||
if(!isset($wgServerName) || !isset($wgServer)) {
|
||||
$this->markTestIncomplete('This test needs $wgServerName and $wgServer to '.
|
||||
'be set in LocalSettings.php');
|
||||
|
|
@ -130,8 +134,9 @@ class ApiTest extends ApiSetup {
|
|||
}
|
||||
|
||||
function testApiGotCookie() {
|
||||
global $wgServerName, $wgServer, $wgScriptPath;
|
||||
global $wgServerName, $wgServer, $wgScriptPath, $wgDBprefix;
|
||||
|
||||
if($wgDBprefix === "parsertest_") $this->markTestSkipped("This test can't (yet?) be run with the parser tests");
|
||||
if(!isset($wgServerName) || !isset($wgServer)) {
|
||||
$this->markTestIncomplete('This test needs $wgServerName and $wgServer to '.
|
||||
'be set in LocalSettings.php');
|
||||
|
|
@ -154,8 +159,9 @@ class ApiTest extends ApiSetup {
|
|||
*/
|
||||
function testApiListPages(CookieJar $cj) {
|
||||
$this->markTestIncomplete("Not done with this yet");
|
||||
global $wgServerName, $wgServer;
|
||||
global $wgServerName, $wgServer, $wgDBprefix;
|
||||
|
||||
if($wgDBprefix === "parsertest_") $this->markTestSkipped("This test can't (yet?) be run with the parser tests");
|
||||
if($wgServerName == "localhost" || $wgServer == "http://localhost") {
|
||||
$this->markTestIncomplete('This test needs $wgServerName and $wgServer to '.
|
||||
'be set in LocalSettings.php');
|
||||
|
|
|
|||
|
|
@ -18,14 +18,23 @@ class PHPUnitTestRecorder extends TestRecorder {
|
|||
}
|
||||
|
||||
class MediaWikiParserTestSuite extends PHPUnit_Framework_TestSuite {
|
||||
#implements PHPUnit_Framework_SelfDescribing {
|
||||
static private $count;
|
||||
static public $parser;
|
||||
static public $iter;
|
||||
|
||||
public static function addTables(&$tables) {
|
||||
$tables[] = 'user_properties';
|
||||
$tables[] = 'filearchive';
|
||||
$tables[] = 'logging';
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function suite() {
|
||||
$suite = new PHPUnit_Framework_TestSuite();
|
||||
|
||||
global $wgHooks;
|
||||
$wgHooks['ParserTestTables'][] = "MediaWikiParserTestSuite::addTables";
|
||||
|
||||
self::$iter = new TestFileIterator( PARSER_TESTS );
|
||||
|
||||
foreach(self::$iter as $i => $test) {
|
||||
|
|
@ -57,12 +66,12 @@ class MediaWikiParserTestSuite extends PHPUnit_Framework_TestSuite {
|
|||
$wgLocalFileRepo = array(
|
||||
'class' => 'LocalRepo',
|
||||
'name' => 'local',
|
||||
'directory' => '',
|
||||
'directory' => 'test-repo',
|
||||
'url' => 'http://example.com/images',
|
||||
'hashLevels' => 2,
|
||||
'transformVia404' => false,
|
||||
);
|
||||
$wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
|
||||
$wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
|
||||
$wgNamespaceAliases['Image'] = NS_FILE;
|
||||
$wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
|
||||
|
||||
|
|
@ -88,12 +97,12 @@ class MediaWikiParserTestSuite extends PHPUnit_Framework_TestSuite {
|
|||
return $suite;
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
$this->teardownDatabase();
|
||||
$this->recorder->report();
|
||||
$this->recorder->end();
|
||||
$this->teardownUploadDir($this->uploadDir);
|
||||
}
|
||||
/* public function tearDown() { */
|
||||
/* $this->teardownDatabase(); */
|
||||
/* $this->recorder->report(); */
|
||||
/* $this->recorder->end(); */
|
||||
/* $this->teardownUploadDir($this->uploadDir); */
|
||||
/* } */
|
||||
|
||||
public function count() {return self::$count;}
|
||||
|
||||
|
|
@ -102,7 +111,6 @@ class MediaWikiParserTestSuite extends PHPUnit_Framework_TestSuite {
|
|||
}
|
||||
|
||||
|
||||
private $db;
|
||||
private $uploadDir;
|
||||
private $keepUploads;
|
||||
/**
|
||||
|
|
@ -198,11 +206,18 @@ class MediaWikiParserTestSuite extends PHPUnit_Framework_TestSuite {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @group Stub
|
||||
*/
|
||||
class ParserUnitTest extends PHPUnit_Framework_TestCase {
|
||||
private $number = 0;
|
||||
private $test = "";
|
||||
|
||||
public function __construct($number, $test) {
|
||||
public function testBogus() {
|
||||
$this->markTestSkipped("This is a stub");
|
||||
}
|
||||
|
||||
public function __construct($number = null, $test = null) {
|
||||
$this->number = $number;
|
||||
$this->test = $test;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,9 @@ class SearchMySQLTest extends SearchEngineTest {
|
|||
var $db;
|
||||
|
||||
function setUp() {
|
||||
global $wgDBprefix;
|
||||
if($wgDBprefix === "parsertest_") $this->markTestSkipped("This test can't (yet?) be run with the parser tests");
|
||||
|
||||
$GLOBALS['wgContLang'] = new Language;
|
||||
$this->db = $this->buildTestDatabase(
|
||||
array( 'page', 'revision', 'text', 'searchindex', 'user' ) );
|
||||
|
|
|
|||
|
|
@ -1,6 +1,10 @@
|
|||
<?php
|
||||
|
||||
require_once( "ApiSetup.php" );
|
||||
require_once( dirname( dirname( __FILE__ ) )."/deleteArchivedFiles.inc" );
|
||||
require_once( dirname( dirname( __FILE__ ) )."/deleteArchivedRevisions.inc" );
|
||||
|
||||
class nullClass {public function handleOutput(){}}
|
||||
|
||||
class UploadFromChunksTest extends ApiSetup {
|
||||
|
||||
|
|
@ -9,6 +13,14 @@ class UploadFromChunksTest extends ApiSetup {
|
|||
|
||||
$wgEnableUploads = true;
|
||||
parent::setup();
|
||||
$wgLocalFileRepo = array(
|
||||
'class' => 'LocalRepo',
|
||||
'name' => 'local',
|
||||
'directory' => 'test-repo',
|
||||
'url' => 'http://example.com/images',
|
||||
'hashLevels' => 2,
|
||||
'transformVia404' => false,
|
||||
);
|
||||
|
||||
ini_set( 'file_loads', 1 );
|
||||
ini_set( 'log_errors', 1 );
|
||||
|
|
@ -64,6 +76,7 @@ class UploadFromChunksTest extends ApiSetup {
|
|||
'action' => 'login',
|
||||
'lgname' => self::$userName,
|
||||
'lgpassword' => self::$passWord ) );
|
||||
|
||||
$this->assertArrayHasKey( "login", $data[0] );
|
||||
$this->assertArrayHasKey( "result", $data[0]['login'] );
|
||||
$this->assertEquals( "Success", $data[0]['login']['result'] );
|
||||
|
|
@ -199,57 +212,6 @@ class UploadFromChunksTest extends ApiSetup {
|
|||
$this->assertTrue( $gotException );
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testLogin
|
||||
*/
|
||||
function testUploadChunkDoneDuplicate( $data ) {
|
||||
global $wgUser, $wgVerifyMimeType;
|
||||
|
||||
$wgVerifyMimeType = false;
|
||||
$wgUser = User::newFromName( self::$userName );
|
||||
$data[2]['wsEditToken'] = $data[2]['wsToken'];
|
||||
$token = md5( $data[2]['wsToken'] ) . EDIT_TOKEN_SUFFIX;
|
||||
$data = $this->doApiRequest( array(
|
||||
'filename' => 'tmp.png',
|
||||
'action' => 'upload',
|
||||
'enablechunks' => true,
|
||||
'token' => $token ), $data );
|
||||
|
||||
$url = $data[0]['uploadUrl'];
|
||||
$params = wfCgiToArray( substr( $url, strpos( $url, "?" ) ) );
|
||||
$size = 0;
|
||||
for ( $i = 0; $i < 4; $i++ ) {
|
||||
$this->makeChunk( "123" );
|
||||
$size += $_FILES['chunk']['size'];
|
||||
|
||||
$data = $this->doApiRequest( $params, $data );
|
||||
$this->assertArrayHasKey( "result", $data[0] );
|
||||
$this->assertTrue( (bool)$data[0]["result"] );
|
||||
|
||||
$this->assertArrayHasKey( "filesize", $data[0] );
|
||||
$this->assertEquals( $size, $data[0]['filesize'] );
|
||||
|
||||
$this->cleanChunk();
|
||||
}
|
||||
|
||||
$params['done'] = true;
|
||||
|
||||
$this->makeChunk( "123" );
|
||||
$data = $this->doApiRequest( $params, $data );
|
||||
$this->cleanChunk();
|
||||
|
||||
$this->assertArrayHasKey( 'upload', $data[0] );
|
||||
$this->assertArrayHasKey( 'result', $data[0]['upload'] );
|
||||
$this->assertEquals( 'Warning', $data[0]['upload']['result'] );
|
||||
|
||||
$this->assertArrayHasKey( 'warnings', $data[0]['upload'] );
|
||||
$this->assertArrayHasKey( 'exists',
|
||||
$data[0]['upload']['warnings'] );
|
||||
$this->assertEquals( 'Tmp.png',
|
||||
$data[0]['upload']['warnings']['exists'] );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testLogin
|
||||
*/
|
||||
|
|
@ -257,17 +219,25 @@ class UploadFromChunksTest extends ApiSetup {
|
|||
global $wgUser, $wgVerifyMimeType;
|
||||
$wgVerifyMimeType = false;
|
||||
|
||||
$id = Title::newFromText( "Twar.png", NS_FILE )->getArticleID();
|
||||
DeleteArchivedFilesImplementation::doDelete(new nullClass, true);
|
||||
DeleteArchivedRevisionsImplementation::doDelete(new nullClass);
|
||||
|
||||
$id = Title::newFromText( "Twar.png", NS_FILE )->getArticleID();
|
||||
$oldFile = Article::newFromID( $id );
|
||||
if ( $oldFile ) {
|
||||
$oldFile->doDeleteArticle();
|
||||
$oldFile->doPurge();
|
||||
}
|
||||
|
||||
$oldFile = wfFindFile( "Twar.png" );
|
||||
if ( $oldFile ) {
|
||||
$oldFile->delete();
|
||||
}
|
||||
$id = Title::newFromText( "Twar.png", NS_FILE )->getArticleID();
|
||||
$this->assertEquals(0, $id);
|
||||
|
||||
$oldFile = Article::newFromID( $id );
|
||||
$this->assertEquals(null, $oldFile);
|
||||
|
||||
$wgUser = User::newFromName( self::$userName );
|
||||
$data[2]['wsEditToken'] = $data[2]['wsToken'];
|
||||
|
|
@ -301,11 +271,6 @@ class UploadFromChunksTest extends ApiSetup {
|
|||
$data = $this->doApiRequest( $params, $data );
|
||||
|
||||
$this->cleanChunk();
|
||||
|
||||
if ( isset( $data[0]['upload'] ) ) {
|
||||
$this->markTestSkipped( "Please run 'php maintenance/deleteArchivedFiles.php --delete --force' and 'php maintenance/deleteArchivedRevisions.php --delete'" );
|
||||
}
|
||||
|
||||
$this->assertArrayHasKey( 'result', $data[0] );
|
||||
$this->assertEquals( 1, $data[0]['result'] );
|
||||
|
||||
|
|
@ -315,4 +280,52 @@ class UploadFromChunksTest extends ApiSetup {
|
|||
$this->assertArrayHasKey( 'resultUrl', $data[0] );
|
||||
$this->assertRegExp( '/File:Twar.png/', $data[0]['resultUrl'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testLogin
|
||||
*/
|
||||
function testUploadChunkDoneDuplicate( $data ) {
|
||||
global $wgUser, $wgVerifyMimeType;
|
||||
|
||||
$this->markTestIncomplete("Not working yet");
|
||||
|
||||
$wgVerifyMimeType = false;
|
||||
$wgUser = User::newFromName( self::$userName );
|
||||
$data[2]['wsEditToken'] = $data[2]['wsToken'];
|
||||
$token = md5( $data[2]['wsToken'] ) . EDIT_TOKEN_SUFFIX;
|
||||
$data = $this->doApiRequest( array(
|
||||
'filename' => 'twar.png',
|
||||
'action' => 'upload',
|
||||
'enablechunks' => true,
|
||||
'token' => $token ), $data );
|
||||
|
||||
$url = $data[0]['uploadUrl'];
|
||||
$params = wfCgiToArray( substr( $url, strpos( $url, "?" ) ) );
|
||||
$size = 0;
|
||||
$gotException = false;
|
||||
for ( $i = 0; $i < 30; $i++ ) {
|
||||
$this->makeChunk( "123" );
|
||||
$size += $_FILES['chunk']['size'];
|
||||
try {
|
||||
$data = $this->doApiRequest( $params, $data );
|
||||
} catch (UsageException $e) {
|
||||
$arr = $e->getMessageArray();
|
||||
$this->assertArrayHasKey( "code", $arr );
|
||||
$this->assertEquals( "internal-error", $arr['code'] );
|
||||
|
||||
$this->assertEquals( "fileexistserror", $arr[0][0] );
|
||||
$gotException = true;
|
||||
}
|
||||
}
|
||||
$this->cleanChunk();
|
||||
$this->assertTrue($gotException);
|
||||
}
|
||||
|
||||
function testCleanup() {
|
||||
$dbw = wfGetDB( DB_MASTER );
|
||||
$dbw->begin();
|
||||
$dbw->delete("image", array('img_user_text' => self::$userName ));
|
||||
$dbw->commit();
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,19 @@
|
|||
<!-- convertWarningsToExceptions="true" -->
|
||||
<testsuite name="MediaWiki Test Suite">
|
||||
<directory>.</directory>
|
||||
<!-- <file>HttpTest.php</file> -->
|
||||
<!-- <file>SearchEngineTest.php</file> -->
|
||||
<!-- <file>SiteConfigurationTest.php</file> -->
|
||||
<!-- <file>RevisionTest.php</file> -->
|
||||
<!-- <file>XmlTest.php</file> -->
|
||||
<!-- <file>TimeAdjustTest.php</file> -->
|
||||
<!-- <file>ApiTest.php</file> -->
|
||||
<!-- <file>LanguageConverterTest.php</file> -->
|
||||
<!-- <file>TitleTest.php</file> -->
|
||||
<!-- <file>UploadFromChunksTest.php</file> -->
|
||||
<!-- <file>LocalFileTest.php</file> -->
|
||||
<!-- <file>XmlTest.php</file> -->
|
||||
<!-- <file>MediaWikiParserTest.php</file> -->
|
||||
</testsuite>
|
||||
<groups>
|
||||
<exclude>
|
||||
|
|
|
|||
Loading…
Reference in a new issue