ZipFileAddDirTest.php 13 KB

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