489 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			489 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Chumper\Zipper;
 | |
| 
 | |
| use Exception;
 | |
| use Illuminate\Filesystem\Filesystem;
 | |
| use InvalidArgumentException;
 | |
| use Mockery;
 | |
| use RuntimeException;
 | |
| 
 | |
| class ZipperTest extends \PHPUnit_Framework_TestCase
 | |
| {
 | |
|     /**
 | |
|      * @var \Chumper\Zipper\Zipper
 | |
|      */
 | |
|     public $archive;
 | |
| 
 | |
|     /**
 | |
|      * @var \Mockery\Mock
 | |
|      */
 | |
|     public $file;
 | |
| 
 | |
|     protected function setUp()
 | |
|     {
 | |
|         $this->file = Mockery::mock(new Filesystem());
 | |
|         $this->archive = new Zipper($this->file);
 | |
|         $this->archive->make('foo', new ArrayArchive('foo', true));
 | |
|     }
 | |
| 
 | |
|     protected function tearDown()
 | |
|     {
 | |
|         Mockery::close();
 | |
|     }
 | |
| 
 | |
|     public function testMake()
 | |
|     {
 | |
|         $this->assertSame('Chumper\\Zipper\\ArrayArchive', $this->archive->getArchiveType());
 | |
|         $this->assertSame('foo', $this->archive->getFilePath());
 | |
|     }
 | |
| 
 | |
|     public function testMakeThrowsExceptionWhenCouldNotCreateDirectory()
 | |
|     {
 | |
|         $path = getcwd().time();
 | |
| 
 | |
|         $this->file->shouldReceive('makeDirectory')
 | |
|             ->with($path, 0755, true)
 | |
|             ->andReturn(false);
 | |
| 
 | |
|         $zip = new Zipper($this->file);
 | |
| 
 | |
|         $this->expectException(RuntimeException::class);
 | |
|         $this->expectExceptionMessage('Failed to create folder');
 | |
| 
 | |
|         $zip->make($path.DIRECTORY_SEPARATOR.'createMe.zip');
 | |
|     }
 | |
| 
 | |
|     public function testAddAndGet()
 | |
|     {
 | |
|         $this->file->shouldReceive('isFile')->with('foo.bar')
 | |
|             ->times(1)->andReturn(true);
 | |
|         $this->file->shouldReceive('isFile')->with('foo')
 | |
|             ->times(1)->andReturn(true);
 | |
| 
 | |
|         $this->archive->add('foo.bar');
 | |
|         $this->archive->add('foo');
 | |
| 
 | |
|         $this->assertSame('foo', $this->archive->getFileContent('foo'));
 | |
|         $this->assertSame('foo.bar', $this->archive->getFileContent('foo.bar'));
 | |
|     }
 | |
| 
 | |
|     public function testAddAndGetWithArray()
 | |
|     {
 | |
|         $this->file->shouldReceive('isFile')->with('foo.bar')
 | |
|             ->times(1)->andReturn(true);
 | |
|         $this->file->shouldReceive('isFile')->with('foo')
 | |
|             ->times(1)->andReturn(true);
 | |
| 
 | |
|         /**Array**/
 | |
|         $this->archive->add([
 | |
|             'foo.bar',
 | |
|             'foo',
 | |
|         ]);
 | |
| 
 | |
|         $this->assertSame('foo', $this->archive->getFileContent('foo'));
 | |
|         $this->assertSame('foo.bar', $this->archive->getFileContent('foo.bar'));
 | |
|     }
 | |
|     
 | |
|     public function testAddAndGetWithCustomFilenameArray()
 | |
|     {
 | |
|         $this->file->shouldReceive('isFile')->with('foo.bar')
 | |
|             ->times(1)->andReturn(true);
 | |
|         $this->file->shouldReceive('isFile')->with('foo')
 | |
|             ->times(1)->andReturn(true);
 | |
| 
 | |
|         /**Array**/
 | |
|         $this->archive->add([
 | |
|             'custom.bar' => 'foo.bar',
 | |
|             'custom' => 'foo',
 | |
|         ]);
 | |
| 
 | |
|         $this->assertSame('custom', $this->archive->getFileContent('custom'));
 | |
|         $this->assertSame('custom.bar', $this->archive->getFileContent('custom.bar'));
 | |
|     }
 | |
| 
 | |
|     public function testAddAndGetWithSubFolder()
 | |
|     {
 | |
|         /*
 | |
|          * Add the local folder /path/to/fooDir as folder fooDir to the repository
 | |
|          * and make sure the folder structure within the repository is there.
 | |
|          */
 | |
|         $this->file->shouldReceive('isFile')->with('/path/to/fooDir')
 | |
|             ->once()->andReturn(false);
 | |
| 
 | |
|         $this->file->shouldReceive('files')->with('/path/to/fooDir')
 | |
|             ->once()->andReturn(['fileInFooDir.bar', 'fileInFooDir.foo']);
 | |
| 
 | |
|         $this->file->shouldReceive('directories')->with('/path/to/fooDir')
 | |
|             ->once()->andReturn(['fooSubdir']);
 | |
| 
 | |
|         $this->file->shouldReceive('files')->with('/path/to/fooDir/fooSubdir')
 | |
|             ->once()->andReturn(['fileInFooDir.bar']);
 | |
|         $this->file->shouldReceive('directories')->with('/path/to/fooDir/fooSubdir')
 | |
|             ->once()->andReturn([]);
 | |
| 
 | |
|         $this->archive->folder('fooDir')
 | |
|             ->add('/path/to/fooDir');
 | |
| 
 | |
|         $this->assertSame('fooDir/fileInFooDir.bar', $this->archive->getFileContent('fooDir/fileInFooDir.bar'));
 | |
|         $this->assertSame('fooDir/fileInFooDir.foo', $this->archive->getFileContent('fooDir/fileInFooDir.foo'));
 | |
|         $this->assertSame('fooDir/fooSubdir/fileInFooDir.bar', $this->archive->getFileContent('fooDir/fooSubdir/fileInFooDir.bar'));
 | |
|     }
 | |
| 
 | |
|     public function testGetFileContent()
 | |
|     {
 | |
|         $this->expectException(Exception::class);
 | |
|         $this->expectExceptionMessage('The file "baz" cannot be found');
 | |
| 
 | |
|         $this->archive->getFileContent('baz');
 | |
|     }
 | |
| 
 | |
|     public function testRemove()
 | |
|     {
 | |
|         $this->file->shouldReceive('isFile')->with('foo')
 | |
|             ->andReturn(true);
 | |
| 
 | |
|         $this->archive->add('foo');
 | |
| 
 | |
|         $this->assertTrue($this->archive->contains('foo'));
 | |
| 
 | |
|         $this->archive->remove('foo');
 | |
| 
 | |
|         $this->assertFalse($this->archive->contains('foo'));
 | |
| 
 | |
|         //----
 | |
| 
 | |
|         $this->file->shouldReceive('isFile')->with('foo')
 | |
|             ->andReturn(true);
 | |
|         $this->file->shouldReceive('isFile')->with('fooBar')
 | |
|             ->andReturn(true);
 | |
| 
 | |
|         $this->archive->add(['foo', 'fooBar']);
 | |
| 
 | |
|         $this->assertTrue($this->archive->contains('foo'));
 | |
|         $this->assertTrue($this->archive->contains('fooBar'));
 | |
| 
 | |
|         $this->archive->remove(['foo', 'fooBar']);
 | |
| 
 | |
|         $this->assertFalse($this->archive->contains('foo'));
 | |
|         $this->assertFalse($this->archive->contains('fooBar'));
 | |
|     }
 | |
| 
 | |
|     public function testExtractWhiteList()
 | |
|     {
 | |
|         $this->file
 | |
|             ->shouldReceive('isFile')
 | |
|             ->with('foo')
 | |
|             ->andReturn(true);
 | |
| 
 | |
|         $this->file
 | |
|             ->shouldReceive('isFile')
 | |
|             ->with('foo.log')
 | |
|             ->andReturn(true);
 | |
| 
 | |
|         $this->archive
 | |
|             ->add('foo')
 | |
|             ->add('foo.log');
 | |
| 
 | |
|         $this->file
 | |
|             ->shouldReceive('put')
 | |
|             ->with(realpath(null).DIRECTORY_SEPARATOR.'foo', 'foo');
 | |
| 
 | |
|         $this->file
 | |
|             ->shouldReceive('put')
 | |
|             ->with(realpath(null).DIRECTORY_SEPARATOR.'foo.log', 'foo.log');
 | |
| 
 | |
|         $this->archive
 | |
|             ->extractTo(getcwd(), ['foo'], Zipper::WHITELIST);
 | |
|     }
 | |
| 
 | |
|     public function testExtractToThrowsExceptionWhenCouldNotCreateDirectory()
 | |
|     {
 | |
|         $path = getcwd().time();
 | |
| 
 | |
|         $this->file
 | |
|             ->shouldReceive('isFile')
 | |
|             ->with('foo.log')
 | |
|             ->andReturn(true);
 | |
| 
 | |
|         $this->file->shouldReceive('makeDirectory')
 | |
|             ->with($path, 0755, true)
 | |
|             ->andReturn(false);
 | |
| 
 | |
|         $this->archive->add('foo.log');
 | |
| 
 | |
|         $this->file->shouldNotReceive('put')
 | |
|             ->with(realpath(null).DIRECTORY_SEPARATOR.'foo.log', 'foo.log');
 | |
| 
 | |
|         $this->expectException(RuntimeException::class);
 | |
|         $this->expectExceptionMessage('Failed to create folder');
 | |
| 
 | |
|         $this->archive
 | |
|             ->extractTo($path, ['foo'], Zipper::WHITELIST);
 | |
|     }
 | |
| 
 | |
|     public function testExtractWhiteListFromSubDirectory()
 | |
|     {
 | |
|         $this->file->shouldReceive('isFile')->andReturn(true);
 | |
|         $this->file->shouldReceive('makeDirectory')->andReturn(true);
 | |
| 
 | |
|         $this->archive
 | |
|             ->folder('foo/bar')
 | |
|             ->add('baz')
 | |
|             ->add('baz.log');
 | |
| 
 | |
|         $this->file
 | |
|             ->shouldReceive('put')
 | |
|             ->with(realpath(null).DIRECTORY_SEPARATOR.'baz', 'foo/bar/baz');
 | |
| 
 | |
|         $this->file
 | |
|             ->shouldReceive('put')
 | |
|             ->with(realpath(null).DIRECTORY_SEPARATOR.'baz.log', 'foo/bar/baz.log');
 | |
| 
 | |
|         $this->archive
 | |
|             ->extractTo(getcwd(), ['baz'], Zipper::WHITELIST);
 | |
|     }
 | |
| 
 | |
|     public function testExtractWhiteListWithExactMatching()
 | |
|     {
 | |
|         $this->file->shouldReceive('isFile')->andReturn(true);
 | |
|         $this->file->shouldReceive('makeDirectory')->andReturn(true);
 | |
| 
 | |
|         $this->archive
 | |
|             ->folder('foo/bar')
 | |
|             ->add('baz')
 | |
|             ->add('baz.log');
 | |
| 
 | |
|         $this->file
 | |
|             ->shouldReceive('put')
 | |
|             ->with(realpath(null).DIRECTORY_SEPARATOR.'baz', 'foo/bar/baz');
 | |
| 
 | |
|         $this->archive
 | |
|             ->extractTo(getcwd(), ['baz'], Zipper::WHITELIST | Zipper::EXACT_MATCH);
 | |
|     }
 | |
| 
 | |
|     public function testExtractWhiteListWithExactMatchingFromSubDirectory()
 | |
|     {
 | |
|         $this->file->shouldReceive('isFile')->andReturn(true);
 | |
|         $this->file->shouldReceive('exists')->andReturn(false);
 | |
|         $this->file->shouldReceive('makeDirectory')->andReturn(true);
 | |
| 
 | |
|         $this->archive->folder('foo/bar/subDirectory')
 | |
|             ->add('bazInSubDirectory')
 | |
|             ->add('bazInSubDirectory.log');
 | |
| 
 | |
|         $this->archive->folder('foo/bar')
 | |
|             ->add('baz')
 | |
|             ->add('baz.log');
 | |
| 
 | |
|         $subDirectoryPath = realpath(null).DIRECTORY_SEPARATOR.'subDirectory';
 | |
|         $subDirectoryFilePath = $subDirectoryPath.'/bazInSubDirectory';
 | |
|         $this->file->shouldReceive('put')
 | |
|             ->with($subDirectoryFilePath, 'foo/bar/subDirectory/bazInSubDirectory');
 | |
| 
 | |
|         $this->archive
 | |
|             ->extractTo(getcwd(), ['subDirectory/bazInSubDirectory'], Zipper::WHITELIST | Zipper::EXACT_MATCH);
 | |
| 
 | |
|         $this->file->shouldHaveReceived('makeDirectory')->with($subDirectoryPath, 0755, true, true);
 | |
|     }
 | |
| 
 | |
|     public function testExtractToIgnoresBlackListFile()
 | |
|     {
 | |
|         $this->file->shouldReceive('isFile')->with('foo')
 | |
|             ->andReturn(true);
 | |
|         $this->file->shouldReceive('isFile')->with('bar')
 | |
|             ->andReturn(true);
 | |
|         $this->file->shouldReceive('makeDirectory')->andReturn(true);
 | |
| 
 | |
|         $this->archive->add('foo')
 | |
|             ->add('bar');
 | |
| 
 | |
|         $this->file->shouldReceive('put')->with(realpath(null).DIRECTORY_SEPARATOR.'foo', 'foo');
 | |
|         $this->file->shouldNotReceive('put')->with(realpath(null).DIRECTORY_SEPARATOR.'bar', 'bar');
 | |
| 
 | |
|         $this->archive->extractTo(getcwd(), ['bar'], Zipper::BLACKLIST);
 | |
|     }
 | |
| 
 | |
|     public function testExtractBlackListFromSubDirectory()
 | |
|     {
 | |
|         $currentDir = getcwd();
 | |
| 
 | |
|         $this->file->shouldReceive('isFile')->andReturn(true);
 | |
|         $this->file->shouldReceive('makeDirectory')->andReturn(true);
 | |
| 
 | |
|         $this->archive->add('rootLevelFile');
 | |
| 
 | |
|         $this->archive->folder('foo/bar/sub')
 | |
|             ->add('fileInSubSubDir');
 | |
| 
 | |
|         $this->archive->folder('foo/bar')
 | |
|             ->add('fileInSubDir')
 | |
|             ->add('fileBlackListedInSubDir');
 | |
| 
 | |
|         $this->file->shouldReceive('put')->with($currentDir.DIRECTORY_SEPARATOR.'fileInSubDir', 'foo/bar/fileInSubDir');
 | |
|         $this->file->shouldReceive('put')->with($currentDir.DIRECTORY_SEPARATOR.'sub/fileInSubSubDir', 'foo/bar/sub/fileInSubSubDir');
 | |
| 
 | |
|         $this->file->shouldNotReceive('put')->with($currentDir.DIRECTORY_SEPARATOR.'fileBlackListedInSubDir', 'fileBlackListedInSubDir');
 | |
|         $this->file->shouldNotReceive('put')->with($currentDir.DIRECTORY_SEPARATOR.'rootLevelFile', 'rootLevelFile');
 | |
| 
 | |
|         $this->archive->extractTo($currentDir, ['fileBlackListedInSubDir'], Zipper::BLACKLIST);
 | |
|     }
 | |
| 
 | |
|     public function testExtractBlackListFromSubDirectoryWithExactMatching()
 | |
|     {
 | |
|         $this->file->shouldReceive('isFile')->with('baz')
 | |
|             ->andReturn(true);
 | |
|         $this->file->shouldReceive('makeDirectory')->andReturn(true);
 | |
| 
 | |
|         $this->file->shouldReceive('isFile')->with('baz.log')
 | |
|             ->andReturn(true);
 | |
| 
 | |
|         $this->archive->folder('foo/bar')
 | |
|             ->add('baz')
 | |
|             ->add('baz.log');
 | |
| 
 | |
|         $this->file->shouldReceive('put')->with(realpath(null).DIRECTORY_SEPARATOR.'baz.log', 'foo/bar/baz.log');
 | |
| 
 | |
|         $this->archive->extractTo(getcwd(), ['baz'], Zipper::BLACKLIST | Zipper::EXACT_MATCH);
 | |
|     }
 | |
| 
 | |
|     public function testExtractMatchingRegexFromSubFolder()
 | |
|     {
 | |
|         $this->file->shouldReceive('isFile')->with('baz')->andReturn(true);
 | |
|         $this->file->shouldReceive('isFile')->with('baz.log')->andReturn(true);
 | |
|         $this->file->shouldReceive('isFile')->with('subFolderFileToIgnore')->andReturn(true);
 | |
|         $this->file->shouldReceive('isFile')->with('subFolderFileToExtract.log')->andReturn(true);
 | |
|         $this->file->shouldReceive('isFile')->with('rootLevelMustBeIgnored.log')->andReturn(true);
 | |
| 
 | |
|         $this->file->shouldReceive('makeDirectory')->andReturn(true);
 | |
| 
 | |
|         $this->archive->add('rootLevelMustBeIgnored.log');
 | |
| 
 | |
|         $this->archive->folder('foo/bar/subFolder')
 | |
|             ->add('subFolderFileToIgnore')
 | |
|             ->add('subFolderFileToExtract.log');
 | |
| 
 | |
|         $this->archive->folder('foo/bar')
 | |
|             ->add('baz')
 | |
|             ->add('baz.log');
 | |
| 
 | |
|         $this->file->shouldReceive('put')->with(realpath(null).DIRECTORY_SEPARATOR.'baz.log', 'foo/bar/baz.log');
 | |
|         $this->file->shouldReceive('put')->with(realpath(null).DIRECTORY_SEPARATOR.'subFolder/subFolderFileToExtract.log', 'foo/bar/subFolder/subFolderFileToExtract.log');
 | |
|         $this->file->shouldNotReceive('put')->with(realpath(null).DIRECTORY_SEPARATOR.'rootLevelMustBeIgnored.log', 'rootLevelMustBeIgnored.log');
 | |
|         $this->file->shouldNotReceive('put')->with(realpath(null).DIRECTORY_SEPARATOR.'baz', 'foo/bar/baz');
 | |
|         $this->file->shouldNotReceive('put')->with(realpath(null).DIRECTORY_SEPARATOR.'subFolder/subFolderFileToIgnore', 'foo/bar/subFolder/subFolderFileToIgnore');
 | |
| 
 | |
|         $this->archive->extractMatchingRegex(getcwd(), '/\.log$/i');
 | |
|     }
 | |
| 
 | |
|     public function testExtractMatchingRegexThrowsExceptionWhenRegexIsEmpty()
 | |
|     {
 | |
|         $this->expectException(InvalidArgumentException::class);
 | |
|         $this->expectExceptionMessage('Missing pass valid regex parameter');
 | |
|         $this->archive->extractMatchingRegex(getcwd(), '');
 | |
|     }
 | |
| 
 | |
|     public function testNavigationFolderAndHome()
 | |
|     {
 | |
|         $this->archive->folder('foo/bar');
 | |
|         $this->assertSame('foo/bar', $this->archive->getCurrentFolderPath());
 | |
| 
 | |
|         //----
 | |
| 
 | |
|         $this->file->shouldReceive('isFile')->with('foo')
 | |
|             ->andReturn(true);
 | |
| 
 | |
|         $this->archive->add('foo');
 | |
|         $this->assertSame('foo/bar/foo', $this->archive->getFileContent('foo/bar/foo'));
 | |
| 
 | |
|         //----
 | |
| 
 | |
|         $this->file->shouldReceive('isFile')->with('bar')
 | |
|             ->andReturn(true);
 | |
| 
 | |
|         $this->archive->home()->add('bar');
 | |
|         $this->assertSame('bar', $this->archive->getFileContent('bar'));
 | |
| 
 | |
|         //----
 | |
| 
 | |
|         $this->file->shouldReceive('isFile')->with('baz/bar/bing')
 | |
|             ->andReturn(true);
 | |
| 
 | |
|         $this->archive->folder('test')->add('baz/bar/bing');
 | |
|         $this->assertSame('test/bing', $this->archive->getFileContent('test/bing'));
 | |
|     }
 | |
| 
 | |
|     public function testListFiles()
 | |
|     {
 | |
|         // testing empty file
 | |
|         $this->file->shouldReceive('isFile')->with('foo.file')->andReturn(true);
 | |
|         $this->file->shouldReceive('isFile')->with('bar.file')->andReturn(true);
 | |
| 
 | |
|         $this->assertSame([], $this->archive->listFiles());
 | |
| 
 | |
|         // testing not empty file
 | |
|         $this->archive->add('foo.file');
 | |
|         $this->archive->add('bar.file');
 | |
| 
 | |
|         $this->assertSame(['foo.file', 'bar.file'], $this->archive->listFiles());
 | |
| 
 | |
|         // testing with a empty sub dir
 | |
|         $this->file->shouldReceive('isFile')->with('/path/to/subDirEmpty')->andReturn(false);
 | |
| 
 | |
|         $this->file->shouldReceive('files')->with('/path/to/subDirEmpty')->andReturn([]);
 | |
|         $this->file->shouldReceive('directories')->with('/path/to/subDirEmpty')->andReturn([]);
 | |
|         $this->archive->folder('subDirEmpty')->add('/path/to/subDirEmpty');
 | |
| 
 | |
|         $this->assertSame(['foo.file', 'bar.file'], $this->archive->listFiles());
 | |
| 
 | |
|         // testing with a not empty sub dir
 | |
|         $this->file->shouldReceive('isFile')->with('/path/to/subDir')->andReturn(false);
 | |
|         $this->file->shouldReceive('isFile')->with('sub.file')->andReturn(true);
 | |
| 
 | |
|         $this->file->shouldReceive('files')->with('/path/to/subDir')->andReturn(['sub.file']);
 | |
|         $this->file->shouldReceive('directories')->with('/path/to/subDir')->andReturn([]);
 | |
| 
 | |
|         $this->archive->folder('subDir')->add('/path/to/subDir');
 | |
| 
 | |
|         $this->assertSame(['foo.file', 'bar.file', 'subDir/sub.file'], $this->archive->listFiles());
 | |
|     }
 | |
| 
 | |
|     public function testListFilesWithRegexFilter()
 | |
|     {
 | |
|         // add 2 files to root level in zip
 | |
|         $this->file->shouldReceive('isFile')->with('foo.file')->andReturn(true);
 | |
|         $this->file->shouldReceive('isFile')->with('bar.log')->andReturn(true);
 | |
| 
 | |
|         $this->archive
 | |
|             ->add('foo.file')
 | |
|             ->add('bar.log');
 | |
| 
 | |
|         // add sub directory with 2 files inside
 | |
|         $this->file->shouldReceive('isFile')->with('/path/to/subDir')->andReturn(false);
 | |
|         $this->file->shouldReceive('isFile')->with('sub.file')->andReturn(true);
 | |
|         $this->file->shouldReceive('isFile')->with('anotherSub.log')->andReturn(true);
 | |
| 
 | |
|         $this->file->shouldReceive('files')->with('/path/to/subDir')->andReturn(['sub.file', 'anotherSub.log']);
 | |
|         $this->file->shouldReceive('directories')->with('/path/to/subDir')->andReturn([]);
 | |
| 
 | |
|         $this->archive->folder('subDir')->add('/path/to/subDir');
 | |
| 
 | |
|         $this->assertSame(
 | |
|             ['foo.file', 'subDir/sub.file'],
 | |
|             $this->archive->listFiles('/\.file$/i') // filter out files ending with ".file" pattern
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testListFilesThrowsExceptionWithInvalidRegexFilter()
 | |
|     {
 | |
|         $this->file->shouldReceive('isFile')->with('foo.file')->andReturn(true);
 | |
|         $this->archive->add('foo.file');
 | |
| 
 | |
|         $this->expectException(RuntimeException::class);
 | |
|         $this->expectExceptionMessage('regular expression match on \'foo.file\' failed with error. Please check if pattern is valid regular expression.');
 | |
| 
 | |
|         $invalidPattern = 'asdasd';
 | |
|         $this->archive->listFiles($invalidPattern);
 | |
|     }
 | |
| }
 | 
