ZipFileAddDirTest.php 14 KB

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