ZipFileAddDirTest.php 12 KB

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