ZipFileAddDirTest.php 14 KB

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