ZipFileAddDirTest.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. <?php
  2. namespace PhpZip;
  3. use PhpZip\Util\Iterator\IgnoreFilesFilterIterator;
  4. use PhpZip\Util\Iterator\IgnoreFilesRecursiveFilterIterator;
  5. /**
  6. * Test add directory to zip archive.
  7. */
  8. class ZipFileAddDirTest extends ZipTestCase
  9. {
  10. protected static $files = [
  11. '.hidden' => 'Hidden file',
  12. 'text file.txt' => 'Text file',
  13. 'Текстовый документ.txt' => 'Текстовый документ',
  14. 'empty dir/' => null,
  15. 'empty dir2/ещё пустой каталог/' => null,
  16. 'catalog/New File' => 'New Catalog File',
  17. 'catalog/New File 2' => 'New Catalog File 2',
  18. 'catalog/Empty Dir/' => null,
  19. 'category/list.txt' => 'Category list',
  20. 'category/Pictures/128x160/Car/01.jpg' => 'File 01.jpg',
  21. 'category/Pictures/128x160/Car/02.jpg' => 'File 02.jpg',
  22. 'category/Pictures/240x320/Car/01.jpg' => 'File 01.jpg',
  23. 'category/Pictures/240x320/Car/02.jpg' => 'File 02.jpg',
  24. ];
  25. /**
  26. * Before test
  27. */
  28. protected function setUp()
  29. {
  30. parent::setUp();
  31. $this->fillDirectory();
  32. }
  33. protected function fillDirectory()
  34. {
  35. foreach (self::$files as $name => $content) {
  36. $fullName = $this->outputDirname . '/' . $name;
  37. if ($content === null) {
  38. if (!is_dir($fullName)) {
  39. mkdir($fullName, 0755, true);
  40. }
  41. } else {
  42. $dirname = dirname($fullName);
  43. if (!is_dir($dirname)) {
  44. mkdir($dirname, 0755, true);
  45. }
  46. file_put_contents($fullName, $content);
  47. }
  48. }
  49. }
  50. protected static function assertFilesResult(ZipFileInterface $zipFile, array $actualResultFiles = [], $localPath = '/')
  51. {
  52. $localPath = rtrim($localPath, '/');
  53. $localPath = empty($localPath) ? "" : $localPath . '/';
  54. self::assertEquals(sizeof($zipFile), sizeof($actualResultFiles));
  55. $actualResultFiles = array_flip($actualResultFiles);
  56. foreach (self::$files as $file => $content) {
  57. $zipEntryName = $localPath . $file;
  58. if (isset($actualResultFiles[$file])) {
  59. self::assertTrue(isset($zipFile[$zipEntryName]));
  60. self::assertEquals($zipFile[$zipEntryName], $content);
  61. unset($actualResultFiles[$file]);
  62. } else {
  63. self::assertFalse(isset($zipFile[$zipEntryName]));
  64. }
  65. }
  66. self::assertEmpty($actualResultFiles);
  67. }
  68. public function testAddDirWithLocalPath()
  69. {
  70. $localPath = 'to/path';
  71. $zipFile = new ZipFile();
  72. $zipFile->addDir($this->outputDirname, $localPath);
  73. $zipFile->saveAsFile($this->outputFilename);
  74. $zipFile->close();
  75. self::assertCorrectZipArchive($this->outputFilename);
  76. $zipFile->openFile($this->outputFilename);
  77. self::assertFilesResult($zipFile, [
  78. '.hidden',
  79. 'text file.txt',
  80. 'Текстовый документ.txt',
  81. 'empty dir/',
  82. ], $localPath);
  83. $zipFile->close();
  84. }
  85. public function testAddDirWithoutLocalPath()
  86. {
  87. $zipFile = new ZipFile();
  88. $zipFile->addDir($this->outputDirname);
  89. $zipFile->saveAsFile($this->outputFilename);
  90. $zipFile->close();
  91. self::assertCorrectZipArchive($this->outputFilename);
  92. $zipFile->openFile($this->outputFilename);
  93. self::assertFilesResult($zipFile, [
  94. '.hidden',
  95. 'text file.txt',
  96. 'Текстовый документ.txt',
  97. 'empty dir/',
  98. ]);
  99. $zipFile->close();
  100. }
  101. public function testAddFilesFromIterator()
  102. {
  103. $localPath = 'to/project';
  104. $directoryIterator = new \DirectoryIterator($this->outputDirname);
  105. $zipFile = new ZipFile();
  106. $zipFile->addFilesFromIterator($directoryIterator, $localPath);
  107. $zipFile->saveAsFile($this->outputFilename);
  108. $zipFile->close();
  109. self::assertCorrectZipArchive($this->outputFilename);
  110. $zipFile->openFile($this->outputFilename);
  111. self::assertFilesResult($zipFile, [
  112. '.hidden',
  113. 'text file.txt',
  114. 'Текстовый документ.txt',
  115. 'empty dir/',
  116. ], $localPath);
  117. $zipFile->close();
  118. }
  119. public function testAddFilesFromIteratorEmptyLocalPath()
  120. {
  121. $localPath = '';
  122. $directoryIterator = new \DirectoryIterator($this->outputDirname);
  123. $zipFile = new ZipFile();
  124. $zipFile->addFilesFromIterator($directoryIterator, $localPath);
  125. $zipFile->saveAsFile($this->outputFilename);
  126. $zipFile->close();
  127. self::assertCorrectZipArchive($this->outputFilename);
  128. $zipFile->openFile($this->outputFilename);
  129. self::assertFilesResult($zipFile, [
  130. '.hidden',
  131. 'text file.txt',
  132. 'Текстовый документ.txt',
  133. 'empty dir/',
  134. ]);
  135. $zipFile->close();
  136. }
  137. public function testAddFilesFromRecursiveIterator()
  138. {
  139. $localPath = 'to/project';
  140. $directoryIterator = new \RecursiveDirectoryIterator($this->outputDirname);
  141. $zipFile = new ZipFile();
  142. $zipFile->addFilesFromIterator($directoryIterator, $localPath);
  143. $zipFile->saveAsFile($this->outputFilename);
  144. $zipFile->close();
  145. self::assertCorrectZipArchive($this->outputFilename);
  146. $zipFile->openFile($this->outputFilename);
  147. self::assertFilesResult($zipFile, array_keys(self::$files), $localPath);
  148. $zipFile->close();
  149. }
  150. public function testAddRecursiveDirWithLocalPath()
  151. {
  152. $localPath = 'to/path';
  153. $zipFile = new ZipFile();
  154. $zipFile->addDirRecursive($this->outputDirname, $localPath);
  155. $zipFile->saveAsFile($this->outputFilename);
  156. $zipFile->close();
  157. self::assertCorrectZipArchive($this->outputFilename);
  158. $zipFile->openFile($this->outputFilename);
  159. self::assertFilesResult($zipFile, array_keys(self::$files), $localPath);
  160. $zipFile->close();
  161. }
  162. public function testAddRecursiveDirWithoutLocalPath()
  163. {
  164. $zipFile = new ZipFile();
  165. $zipFile->addDirRecursive($this->outputDirname);
  166. $zipFile->saveAsFile($this->outputFilename);
  167. $zipFile->close();
  168. self::assertCorrectZipArchive($this->outputFilename);
  169. $zipFile->openFile($this->outputFilename);
  170. self::assertFilesResult($zipFile, array_keys(self::$files));
  171. $zipFile->close();
  172. }
  173. public function testAddFilesFromIteratorWithIgnoreFiles()
  174. {
  175. $localPath = 'to/project';
  176. $ignoreFiles = [
  177. 'Текстовый документ.txt',
  178. 'empty dir/'
  179. ];
  180. $directoryIterator = new \DirectoryIterator($this->outputDirname);
  181. $ignoreIterator = new IgnoreFilesFilterIterator($directoryIterator, $ignoreFiles);
  182. $zipFile = new ZipFile();
  183. $zipFile->addFilesFromIterator($ignoreIterator, $localPath);
  184. $zipFile->saveAsFile($this->outputFilename);
  185. $zipFile->close();
  186. self::assertCorrectZipArchive($this->outputFilename);
  187. $zipFile->openFile($this->outputFilename);
  188. self::assertFilesResult($zipFile, [
  189. '.hidden',
  190. 'text file.txt',
  191. ], $localPath);
  192. $zipFile->close();
  193. }
  194. public function testAddFilesFromRecursiveIteratorWithIgnoreFiles()
  195. {
  196. $localPath = 'to/project';
  197. $ignoreFiles = [
  198. '.hidden',
  199. 'empty dir2/ещё пустой каталог/',
  200. 'list.txt',
  201. 'category/Pictures/240x320',
  202. ];
  203. $directoryIterator = new \RecursiveDirectoryIterator($this->outputDirname);
  204. $ignoreIterator = new IgnoreFilesRecursiveFilterIterator($directoryIterator, $ignoreFiles);
  205. $zipFile = new ZipFile();
  206. $zipFile->addFilesFromIterator($ignoreIterator, $localPath);
  207. $zipFile->saveAsFile($this->outputFilename);
  208. $zipFile->close();
  209. self::assertCorrectZipArchive($this->outputFilename);
  210. $zipFile->openFile($this->outputFilename);
  211. self::assertFilesResult($zipFile, [
  212. 'text file.txt',
  213. 'Текстовый документ.txt',
  214. 'empty dir/',
  215. 'catalog/New File',
  216. 'catalog/New File 2',
  217. 'catalog/Empty Dir/',
  218. 'category/Pictures/128x160/Car/01.jpg',
  219. 'category/Pictures/128x160/Car/02.jpg',
  220. ], $localPath);
  221. $zipFile->close();
  222. }
  223. /**
  224. * Create archive and add files from glob pattern
  225. */
  226. public function testAddFilesFromGlob()
  227. {
  228. $localPath = '/';
  229. $zipFile = new ZipFile();
  230. $zipFile->addFilesFromGlob($this->outputDirname, '**.{txt,jpg}', $localPath);
  231. $zipFile->saveAsFile($this->outputFilename);
  232. $zipFile->close();
  233. self::assertCorrectZipArchive($this->outputFilename);
  234. $zipFile->openFile($this->outputFilename);
  235. self::assertFilesResult($zipFile, [
  236. 'text file.txt',
  237. 'Текстовый документ.txt',
  238. ], $localPath);
  239. $zipFile->close();
  240. }
  241. /**
  242. * Create archive and add recursively files from glob pattern
  243. */
  244. public function testAddFilesFromGlobRecursive()
  245. {
  246. $localPath = '/';
  247. $zipFile = new ZipFile();
  248. $zipFile->addFilesFromGlobRecursive($this->outputDirname, '**.{txt,jpg}', $localPath);
  249. $zipFile->saveAsFile($this->outputFilename);
  250. $zipFile->close();
  251. self::assertCorrectZipArchive($this->outputFilename);
  252. $zipFile->openFile($this->outputFilename);
  253. self::assertFilesResult($zipFile, [
  254. 'text file.txt',
  255. 'Текстовый документ.txt',
  256. 'category/list.txt',
  257. 'category/Pictures/128x160/Car/01.jpg',
  258. 'category/Pictures/128x160/Car/02.jpg',
  259. 'category/Pictures/240x320/Car/01.jpg',
  260. 'category/Pictures/240x320/Car/02.jpg',
  261. ], $localPath);
  262. $zipFile->close();
  263. }
  264. /**
  265. * Create archive and add files from regex pattern
  266. */
  267. public function testAddFilesFromRegex()
  268. {
  269. $localPath = 'path';
  270. $zipFile = new ZipFile();
  271. $zipFile->addFilesFromRegex($this->outputDirname, '~\.(txt|jpe?g)$~i', $localPath);
  272. $zipFile->saveAsFile($this->outputFilename);
  273. $zipFile->close();
  274. self::assertCorrectZipArchive($this->outputFilename);
  275. $zipFile->openFile($this->outputFilename);
  276. self::assertFilesResult($zipFile, [
  277. 'text file.txt',
  278. 'Текстовый документ.txt',
  279. ], $localPath);
  280. $zipFile->close();
  281. }
  282. /**
  283. * Create archive and add files recursively from regex pattern
  284. */
  285. public function testAddFilesFromRegexRecursive()
  286. {
  287. $localPath = '/';
  288. $zipFile = new ZipFile();
  289. $zipFile->addFilesFromRegexRecursive($this->outputDirname, '~\.(txt|jpe?g)$~i', $localPath);
  290. $zipFile->saveAsFile($this->outputFilename);
  291. $zipFile->close();
  292. self::assertCorrectZipArchive($this->outputFilename);
  293. $zipFile->openFile($this->outputFilename);
  294. self::assertFilesResult($zipFile, [
  295. 'text file.txt',
  296. 'Текстовый документ.txt',
  297. 'category/list.txt',
  298. 'category/Pictures/128x160/Car/01.jpg',
  299. 'category/Pictures/128x160/Car/02.jpg',
  300. 'category/Pictures/240x320/Car/01.jpg',
  301. 'category/Pictures/240x320/Car/02.jpg',
  302. ], $localPath);
  303. $zipFile->close();
  304. }
  305. public function testArrayAccessAddDir()
  306. {
  307. $localPath = 'path/to';
  308. $iterator = new \RecursiveDirectoryIterator($this->outputDirname);
  309. $zipFile = new ZipFile();
  310. $zipFile[$localPath] = $iterator;
  311. $zipFile->saveAsFile($this->outputFilename);
  312. $zipFile->close();
  313. self::assertCorrectZipArchive($this->outputFilename);
  314. $zipFile->openFile($this->outputFilename);
  315. self::assertFilesResult($zipFile, array_keys(self::$files), $localPath);
  316. $zipFile->close();
  317. }
  318. }