FilesystemSpec.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. <?php
  2. namespace spec\Gaufrette;
  3. use Gaufrette\Adapter;
  4. use Gaufrette\File;
  5. use PhpSpec\ObjectBehavior;
  6. use Prophecy\Argument;
  7. interface ExtendedAdapter extends \Gaufrette\Adapter,
  8. \Gaufrette\Adapter\FileFactory,
  9. \Gaufrette\Adapter\StreamFactory,
  10. \Gaufrette\Adapter\ChecksumCalculator,
  11. \Gaufrette\Adapter\MetadataSupporter,
  12. \Gaufrette\Adapter\MimeTypeProvider
  13. {}
  14. class FilesystemSpec extends ObjectBehavior
  15. {
  16. /**
  17. * @param \Gaufrette\Adapter $adapter
  18. */
  19. function let(Adapter $adapter)
  20. {
  21. $this->beConstructedWith($adapter);
  22. }
  23. function it_is_initializable()
  24. {
  25. $this->shouldBeAnInstanceOf('Gaufrette\Filesystem');
  26. $this->shouldBeAnInstanceOf('Gaufrette\FilesystemInterface');
  27. }
  28. /**
  29. * @param \Gaufrette\Adapter $adapter
  30. */
  31. function it_gives_access_to_adapter(Adapter $adapter)
  32. {
  33. $this->getAdapter()->shouldBe($adapter);
  34. }
  35. /**
  36. * @param \Gaufrette\Adapter $adapter
  37. */
  38. function it_check_if_file_exists_using_adapter(Adapter $adapter)
  39. {
  40. $adapter->exists('filename')->willReturn(true);
  41. $adapter->exists('otherFilename')->willReturn(false);
  42. $this->has('filename')->shouldReturn(true);
  43. $this->has('otherFilename')->shouldReturn(false);
  44. }
  45. /**
  46. * @param \Gaufrette\Adapter $adapter
  47. */
  48. function it_renames_file(Adapter $adapter)
  49. {
  50. $adapter->exists('filename')->shouldBeCalled()->willReturn(true);
  51. $adapter->exists('otherFilename')->shouldBeCalled()->willReturn(false);
  52. $adapter->rename('filename', 'otherFilename')->shouldBeCalled()->willReturn(true);
  53. $this->rename('filename', 'otherFilename')->shouldReturn(true);
  54. }
  55. /**
  56. * @param \Gaufrette\Adapter $adapter
  57. */
  58. function it_fails_when_renamed_source_file_does_not_exist(Adapter $adapter)
  59. {
  60. $adapter->exists('filename')->willReturn(false);
  61. $this
  62. ->shouldThrow(new \Gaufrette\Exception\FileNotFound('filename'))
  63. ->duringRename('filename', 'otherFilename')
  64. ;
  65. }
  66. /**
  67. * @param \Gaufrette\Adapter $adapter
  68. */
  69. function it_fails_when_renamed_target_file_exists(Adapter $adapter)
  70. {
  71. $adapter->exists('filename')->willReturn(true);
  72. $adapter->exists('otherFilename')->willReturn(true);
  73. $this
  74. ->shouldThrow(new \Gaufrette\Exception\UnexpectedFile('otherFilename'))
  75. ->duringRename('filename', 'otherFilename')
  76. ;
  77. }
  78. /**
  79. * @param \Gaufrette\Adapter $adapter
  80. */
  81. function it_fails_when_rename_is_not_successful(Adapter $adapter)
  82. {
  83. $adapter->exists('filename')->willReturn(true);
  84. $adapter->exists('otherFilename')->willReturn(false);
  85. $adapter->rename('filename', 'otherFilename')->willReturn(false);
  86. $this
  87. ->shouldThrow(new \RuntimeException('Could not rename the "filename" key to "otherFilename".'))
  88. ->duringRename('filename', 'otherFilename')
  89. ;
  90. }
  91. /**
  92. * @param \Gaufrette\Adapter $adapter
  93. */
  94. function it_creates_file_object_for_key(Adapter $adapter)
  95. {
  96. $adapter->exists('filename')->willReturn(true);
  97. $this->get('filename')->shouldBeAnInstanceOf('Gaufrette\File');
  98. }
  99. /**
  100. * @param \Gaufrette\Adapter $adapter
  101. */
  102. function it_does_not_get_file_object_when_file_with_key_does_not_exist(Adapter $adapter)
  103. {
  104. $adapter->exists('filename')->willReturn(false);
  105. $this
  106. ->shouldThrow(new \Gaufrette\Exception\FileNotFound('filename'))
  107. ->duringGet('filename')
  108. ;
  109. }
  110. /**
  111. * @param \Gaufrette\Adapter $adapter
  112. */
  113. function it_gets_file_object_when_file_does_not_exist_but_can_be_created(Adapter $adapter)
  114. {
  115. $adapter->exists('filename')->willReturn(false);
  116. $this->get('filename', true)->shouldBeAnInstanceOf('Gaufrette\File');
  117. }
  118. /**
  119. * @param \spec\Gaufrette\ExtendedAdapter $extendedAdapter
  120. * @param \Gaufrette\File $file
  121. */
  122. function it_delegates_file_creation_to_adapter_when_adapter_is_file_factory(ExtendedAdapter $extendedAdapter, File $file)
  123. {
  124. $this->beConstructedWith($extendedAdapter);
  125. $extendedAdapter->exists('filename')->willReturn(true);
  126. $extendedAdapter->createFile('filename', $this)->willReturn($file);
  127. $this->get('filename')->shouldBe($file);
  128. }
  129. /**
  130. * @param \Gaufrette\Adapter $adapter
  131. */
  132. function it_writes_content_to_new_file(Adapter $adapter)
  133. {
  134. $adapter->exists('filename')->shouldBeCalled()->willReturn(false);
  135. $adapter->write('filename', 'some content to write')->shouldBeCalled()->willReturn(21);
  136. $this->write('filename', 'some content to write')->shouldReturn(21);
  137. }
  138. /**
  139. * @param \Gaufrette\Adapter $adapter
  140. */
  141. function it_updates_content_of_file(Adapter $adapter)
  142. {
  143. $adapter->write('filename', 'some content to write')->shouldBeCalled()->willReturn(21);
  144. $this->write('filename', 'some content to write', true)->shouldReturn(21);
  145. }
  146. /**
  147. * @param \Gaufrette\Adapter $adapter
  148. */
  149. function it_does_not_update_content_of_file_when_file_cannot_be_overwriten(Adapter $adapter)
  150. {
  151. $adapter->exists('filename')->willReturn(true);
  152. $adapter->write('filename', 'some content to write')->shouldNotBeCalled();
  153. $this
  154. ->shouldThrow(new \Gaufrette\Exception\FileAlreadyExists('filename'))
  155. ->duringWrite('filename', 'some content to write')
  156. ;
  157. }
  158. /**
  159. * @param \Gaufrette\Adapter $adapter
  160. */
  161. function it_fails_when_write_is_not_successful(Adapter $adapter)
  162. {
  163. $adapter->exists('filename')->willReturn(false);
  164. $adapter->write('filename', 'some content to write')->shouldBeCalled()->willReturn(false);
  165. $this
  166. ->shouldThrow(new \RuntimeException('Could not write the "filename" key content.'))
  167. ->duringWrite('filename', 'some content to write')
  168. ;
  169. }
  170. /**
  171. * @param \Gaufrette\Adapter $adapter
  172. */
  173. function it_read_file(Adapter $adapter)
  174. {
  175. $adapter->exists('filename')->shouldBeCalled()->willReturn(true);
  176. $adapter->read('filename')->shouldBeCalled()->willReturn('Some content');
  177. $this->read('filename')->shouldReturn('Some content');
  178. }
  179. /**
  180. * @param \Gaufrette\Adapter $adapter
  181. */
  182. function it_does_not_read_file_which_does_not_exist(Adapter $adapter)
  183. {
  184. $adapter->exists('filename')->willReturn(false);
  185. $this
  186. ->shouldThrow(new \Gaufrette\Exception\FileNotFound('filename'))
  187. ->duringRead('filename');
  188. }
  189. /**
  190. * @param \Gaufrette\Adapter $adapter
  191. */
  192. function it_fails_when_read_is_not_successful(Adapter $adapter)
  193. {
  194. $adapter->exists('filename')->willReturn(true);
  195. $adapter->read('filename')->willReturn(false);
  196. $this
  197. ->shouldThrow(new \RuntimeException('Could not read the "filename" key content.'))
  198. ->duringRead('filename')
  199. ;
  200. }
  201. /**
  202. * @param \Gaufrette\Adapter $adapter
  203. */
  204. function it_deletes_file(Adapter $adapter)
  205. {
  206. $adapter->exists('filename')->shouldBeCalled()->willReturn(true);
  207. $adapter->delete('filename')->shouldBeCalled()->willReturn(true);
  208. $this->delete('filename')->shouldReturn(true);
  209. }
  210. /**
  211. * @param \Gaufrette\Adapter $adapter
  212. */
  213. function it_does_not_delete_file_which_does_not_exist(Adapter $adapter)
  214. {
  215. $adapter->exists('filename')->willReturn(false);
  216. $this
  217. ->shouldThrow(new \Gaufrette\Exception\FileNotFound('filename'))
  218. ->duringDelete('filename')
  219. ;
  220. }
  221. /**
  222. * @param \Gaufrette\Adapter $adapter
  223. */
  224. function it_fails_when_delete_is_not_successful(Adapter $adapter)
  225. {
  226. $adapter->exists('filename')->willReturn(true);
  227. $adapter->delete('filename')->willReturn(false);
  228. $this
  229. ->shouldThrow(new \RuntimeException('Could not remove the "filename" key.'))
  230. ->duringDelete('filename')
  231. ;
  232. }
  233. /**
  234. * @param \Gaufrette\Adapter $adapter
  235. */
  236. function it_should_get_all_keys(Adapter $adapter)
  237. {
  238. $keys = array('filename', 'filename1', 'filename2');
  239. $adapter->keys()->willReturn($keys);
  240. $this->keys()->shouldReturn($keys);
  241. }
  242. /**
  243. * @param \Gaufrette\Adapter $adapter
  244. */
  245. function it_match_listed_keys_using_specified_pattern(Adapter $adapter)
  246. {
  247. $keys = array('filename', 'filename1', 'filename2', 'testKey', 'KeyTest', 'testkey');
  248. $adapter->keys()->willReturn($keys);
  249. $adapter->isDirectory(Argument::any())->willReturn(false);
  250. $this->listKeys()->shouldReturn(
  251. array(
  252. 'keys' => array('filename', 'filename1', 'filename2', 'testKey', 'KeyTest', 'testkey'),
  253. 'dirs' => array()
  254. )
  255. );
  256. $this->listKeys('filename')->shouldReturn(
  257. array(
  258. 'keys' => array('filename', 'filename1', 'filename2'),
  259. 'dirs' => array()
  260. )
  261. );
  262. $this->listKeys('Key')->shouldReturn(
  263. array(
  264. 'keys' => array('KeyTest'),
  265. 'dirs' => array()
  266. )
  267. );
  268. }
  269. /**
  270. * @param \Gaufrette\Adapter $adapter
  271. */
  272. function it_listing_directories_using_adapter_is_directory_method(Adapter $adapter)
  273. {
  274. $keys = array('filename', 'filename1', 'filename2', 'testKey', 'KeyTest', 'testkey');
  275. $adapter->keys()->willReturn($keys);
  276. $adapter->isDirectory('filename')->willReturn(false);
  277. $adapter->isDirectory('filename2')->willReturn(false);
  278. $adapter->isDirectory('KeyTest')->willReturn(false);
  279. $adapter->isDirectory('testkey')->willReturn(false);
  280. $adapter->isDirectory('filename1')->willReturn(true);
  281. $adapter->isDirectory('testKey')->willReturn(true);
  282. $this->listKeys()->shouldReturn(
  283. array(
  284. 'keys' => array('filename', 'filename2', 'KeyTest', 'testkey'),
  285. 'dirs' => array('filename1', 'testKey')
  286. )
  287. );
  288. $this->listKeys('filename')->shouldReturn(
  289. array(
  290. 'keys' => array('filename', 'filename2'),
  291. 'dirs' => array('filename1')
  292. )
  293. );
  294. $this->listKeys('Key')->shouldReturn(
  295. array(
  296. 'keys' => array('KeyTest'),
  297. 'dirs' => array()
  298. )
  299. );
  300. }
  301. /**
  302. * @param \Gaufrette\Adapter $adapter
  303. */
  304. function it_gets_mtime_of_file_using_adapter(Adapter $adapter)
  305. {
  306. $adapter->exists('filename')->willReturn(true);
  307. $adapter->mtime('filename')->willReturn(1234567);
  308. $this->mtime('filename')->shouldReturn(1234567);
  309. }
  310. /**
  311. * @param \Gaufrette\Adapter $adapter
  312. */
  313. function it_does_not_get_mtime_of_file_which_does_not_exist(Adapter $adapter)
  314. {
  315. $adapter->exists('filename')->willReturn(false);
  316. $this
  317. ->shouldThrow(new \Gaufrette\Exception\FileNotFound('filename'))
  318. ->duringMtime('filename')
  319. ;
  320. }
  321. /**
  322. * @param \Gaufrette\Adapter $adapter
  323. */
  324. function it_calculates_file_checksum(Adapter $adapter)
  325. {
  326. $adapter->exists('filename')->shouldBeCalled()->willReturn(true);
  327. $adapter->read('filename')->willReturn('some content');
  328. $this->checksum('filename')->shouldReturn(md5('some content'));
  329. }
  330. /**
  331. * @param \Gaufrette\Adapter $adapter
  332. */
  333. function it_does_not_calculate_checksum_of_file_which_does_not_exist(Adapter $adapter)
  334. {
  335. $adapter->exists('filename')->shouldBeCalled()->willReturn(false);
  336. $this
  337. ->shouldThrow(new \Gaufrette\Exception\FileNotFound('filename'))
  338. ->duringChecksum('filename');
  339. }
  340. /**
  341. * @param \spec\Gaufrette\ExtendedAdapter $extendedAdapter
  342. */
  343. function it_delegates_checksum_calculation_to_adapter_when_adapter_is_checksum_calculator(ExtendedAdapter $extendedAdapter)
  344. {
  345. $this->beConstructedWith($extendedAdapter);
  346. $extendedAdapter->exists('filename')->shouldBeCalled()->willReturn(true);
  347. $extendedAdapter->read('filename')->shouldNotBeCalled();
  348. $extendedAdapter->checksum('filename')->shouldBeCalled()->willReturn(12);
  349. $this->checksum('filename')->shouldReturn(12);
  350. }
  351. /**
  352. * @param \spec\Gaufrette\ExtendedAdapter $extendedAdapter
  353. */
  354. function it_delegates_mime_type_resolution_to_adapter_when_adapter_is_mime_type_provider(ExtendedAdapter $extendedAdapter)
  355. {
  356. $this->beConstructedWith($extendedAdapter);
  357. $extendedAdapter->exists('filename')->willReturn(true);
  358. $extendedAdapter->mimeType('filename')->willReturn('text/plain');
  359. $this->mimeType('filename')->shouldReturn('text/plain');
  360. }
  361. function it_cannot_resolve_mime_type_if_the_adapter_cannot_provide_it(Adapter $adapter)
  362. {
  363. $adapter->exists('filename')->willReturn(true);
  364. $this
  365. ->shouldThrow(new \LogicException(sprintf('Adapter "%s" cannot provide MIME type', get_class($adapter->getWrappedObject()))))
  366. ->duringMimeType('filename');
  367. }
  368. }