summaryrefslogtreecommitdiff
path: root/www/wiki/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php')
-rw-r--r--www/wiki/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php142
1 files changed, 142 insertions, 0 deletions
diff --git a/www/wiki/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php b/www/wiki/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php
new file mode 100644
index 00000000..9beea5b6
--- /dev/null
+++ b/www/wiki/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php
@@ -0,0 +1,142 @@
+<?php
+
+/**
+ * @covers MigrateFileRepoLayout
+ */
+class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
+ protected $tmpPrefix;
+ protected $migratorMock;
+ protected $tmpFilepath;
+ protected $text = 'testing';
+
+ protected function setUp() {
+ parent::setUp();
+
+ $filename = 'Foo.png';
+
+ $this->tmpPrefix = $this->getNewTempDirectory();
+
+ $backend = new FSFileBackend( [
+ 'name' => 'local-migratefilerepolayouttest',
+ 'wikiId' => wfWikiID(),
+ 'containerPaths' => [
+ 'migratefilerepolayouttest-original' => "{$this->tmpPrefix}-original",
+ 'migratefilerepolayouttest-public' => "{$this->tmpPrefix}-public",
+ 'migratefilerepolayouttest-thumb' => "{$this->tmpPrefix}-thumb",
+ 'migratefilerepolayouttest-temp' => "{$this->tmpPrefix}-temp",
+ 'migratefilerepolayouttest-deleted' => "{$this->tmpPrefix}-deleted",
+ ]
+ ] );
+
+ $dbMock = $this->getMockBuilder( Wikimedia\Rdbms\DatabaseMysqli::class )
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $imageRow = new stdClass;
+ $imageRow->img_name = $filename;
+ $imageRow->img_sha1 = sha1( $this->text );
+
+ $dbMock->expects( $this->any() )
+ ->method( 'select' )
+ ->will( $this->onConsecutiveCalls(
+ new FakeResultWrapper( [ $imageRow ] ), // image
+ new FakeResultWrapper( [] ), // image
+ new FakeResultWrapper( [] ) // filearchive
+ ) );
+
+ $repoMock = $this->getMockBuilder( LocalRepo::class )
+ ->setMethods( [ 'getMasterDB' ] )
+ ->setConstructorArgs( [ [
+ 'name' => 'migratefilerepolayouttest',
+ 'backend' => $backend
+ ] ] )
+ ->getMock();
+
+ $repoMock
+ ->expects( $this->any() )
+ ->method( 'getMasterDB' )
+ ->will( $this->returnValue( $dbMock ) );
+
+ $this->migratorMock = $this->getMockBuilder( MigrateFileRepoLayout::class )
+ ->setMethods( [ 'getRepo' ] )->getMock();
+ $this->migratorMock
+ ->expects( $this->any() )
+ ->method( 'getRepo' )
+ ->will( $this->returnValue( $repoMock ) );
+
+ $this->tmpFilepath = TempFSFile::factory(
+ 'migratefilelayout-test-', 'png', wfTempDir() )->getPath();
+
+ file_put_contents( $this->tmpFilepath, $this->text );
+
+ $hashPath = $repoMock->getHashPath( $filename );
+
+ $status = $repoMock->store(
+ $this->tmpFilepath,
+ 'public',
+ $hashPath . $filename,
+ FileRepo::OVERWRITE
+ );
+ }
+
+ protected function deleteFilesRecursively( $directory ) {
+ foreach ( glob( $directory . '/*' ) as $file ) {
+ if ( is_dir( $file ) ) {
+ $this->deleteFilesRecursively( $file );
+ } else {
+ unlink( $file );
+ }
+ }
+
+ rmdir( $directory );
+ }
+
+ protected function tearDown() {
+ foreach ( glob( $this->tmpPrefix . '*' ) as $directory ) {
+ $this->deleteFilesRecursively( $directory );
+ }
+
+ unlink( $this->tmpFilepath );
+
+ parent::tearDown();
+ }
+
+ public function testMigration() {
+ $this->migratorMock->loadParamsAndArgs(
+ null,
+ [ 'oldlayout' => 'name', 'newlayout' => 'sha1' ]
+ );
+
+ ob_start();
+
+ $this->migratorMock->execute();
+
+ ob_end_clean();
+
+ $sha1 = sha1( $this->text );
+
+ $expectedOriginalFilepath = $this->tmpPrefix
+ . '-original/'
+ . substr( $sha1, 0, 1 )
+ . '/'
+ . substr( $sha1, 1, 1 )
+ . '/'
+ . substr( $sha1, 2, 1 )
+ . '/'
+ . $sha1;
+
+ $this->assertEquals(
+ file_get_contents( $expectedOriginalFilepath ),
+ $this->text,
+ 'New sha1 file should be exist and have the right contents'
+ );
+
+ $expectedPublicFilepath = $this->tmpPrefix . '-public/f/f8/Foo.png';
+
+ $this->assertEquals(
+ file_get_contents( $expectedPublicFilepath ),
+ $this->text,
+ 'Existing name file should still and have the right contents'
+ );
+ }
+}