X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php diff --git a/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php b/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php new file mode 100644 index 00000000..800c2fc7 --- /dev/null +++ b/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php @@ -0,0 +1,139 @@ +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( 'DatabaseMysqli' ) + ->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' ) + ->setMethods( [ 'getMasterDB' ] ) + ->setConstructorArgs( [ [ + 'name' => 'migratefilerepolayouttest', + 'backend' => $backend + ] ] ) + ->getMock(); + + $repoMock + ->expects( $this->any() ) + ->method( 'getMasterDB' ) + ->will( $this->returnValue( $dbMock ) ); + + $this->migratorMock = $this->getMockBuilder( 'MigrateFileRepoLayout' ) + ->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' + ); + } +}