ResourceManagerTest.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. <?php
  2. namespace Alchemy\Zippy\Tests\Resource;
  3. use Alchemy\Zippy\Resource\ResourceCollection;
  4. use Alchemy\Zippy\Tests\TestCase;
  5. use Alchemy\Zippy\Resource\ResourceManager;
  6. class ResourceManagerTest extends TestCase
  7. {
  8. /**
  9. * @covers Alchemy\Zippy\Resource\ResourceManager::handle
  10. */
  11. public function testHandle()
  12. {
  13. $mapper = $this->getRequestMapperMock();
  14. $manager = new ResourceManager(
  15. $mapper,
  16. $this->getResourceTeleporterMock(),
  17. $this->getFilesystemMock()
  18. );
  19. $context = '/path/to/current/directory';
  20. $request = array($this->createProcessableInPlaceResource(), $this->createProcessableInPlaceResource());
  21. $expectedCollection = new ResourceCollection($context, $request, false);
  22. $mapper->expects($this->once())
  23. ->method('map')
  24. ->with($this->equalTo($context), $this->equalTo($request))
  25. ->will($this->returnValue($expectedCollection));
  26. $collection = $manager->handle($context, $request);
  27. $this->assertEquals($expectedCollection, $collection);
  28. }
  29. public function testHandleNotProcessables()
  30. {
  31. $mapper = $this->getRequestMapperMock();
  32. $manager = new ResourceManager(
  33. $mapper,
  34. $this->getResourceTeleporterMock(),
  35. $this->getFilesystemMock()
  36. );
  37. $context = '/path/to/current/directory';
  38. $request = array($this->createNotProcessableInPlaceResource(), $this->createNotProcessableInPlaceResource());
  39. $expectedCollection = new ResourceCollection($context, $request, false);
  40. $mapper->expects($this->once())
  41. ->method('map')
  42. ->with($this->equalTo($context), $this->equalTo($request))
  43. ->will($this->returnValue($expectedCollection));
  44. $collection = $manager->handle($context, $request);
  45. $this->assertNotEquals($expectedCollection, $collection);
  46. $this->assertTrue($collection->isTemporary());
  47. }
  48. private function createProcessableInPlaceResource()
  49. {
  50. $resource = $this->getMockBuilder('Alchemy\Zippy\Resource\Resource')
  51. ->disableOriginalConstructor()
  52. ->getMock();
  53. $resource->expects($this->any())
  54. ->method('canBeProcessedInPlace')
  55. ->will($this->returnValue(true));
  56. return $resource;
  57. }
  58. private function createNotProcessableInPlaceResource()
  59. {
  60. $resource = $this->getMockBuilder('Alchemy\Zippy\Resource\Resource')
  61. ->disableOriginalConstructor()
  62. ->getMock();
  63. $resource->expects($this->any())
  64. ->method('canBeProcessedInPlace')
  65. ->will($this->returnValue(false));
  66. return $resource;
  67. }
  68. /**
  69. * @covers Alchemy\Zippy\Resource\ResourceManager::cleanup
  70. */
  71. public function testCleanup()
  72. {
  73. $fs = $this->getFilesystemMock();
  74. $manager = new ResourceManager(
  75. $this->getRequestMapperMock(),
  76. $this->getResourceTeleporterMock(),
  77. $fs
  78. );
  79. $context = 'context' . mt_rand();
  80. $fs->expects($this->once())
  81. ->method('remove')
  82. ->with($this->equalTo($context));
  83. $collection = $this->getMockBuilder('Alchemy\Zippy\Resource\ResourceCollection')
  84. ->disableOriginalConstructor()
  85. ->getMock();
  86. $collection->expects($this->once())
  87. ->method('isTemporary')
  88. ->will($this->returnValue(true));
  89. $collection->expects($this->once())
  90. ->method('getContext')
  91. ->will($this->returnValue($context));
  92. $manager->cleanup($collection);
  93. }
  94. /**
  95. * @covers Alchemy\Zippy\Resource\ResourceManager::cleanup
  96. */
  97. public function testCleanupWhenCollectionIsNotTemporary()
  98. {
  99. $fs = $this->getFilesystemMock();
  100. $manager = new ResourceManager(
  101. $this->getRequestMapperMock(),
  102. $this->getResourceTeleporterMock(),
  103. $fs
  104. );
  105. $fs->expects($this->never())
  106. ->method('remove');
  107. $collection = $this->getMockBuilder('Alchemy\Zippy\Resource\ResourceCollection')
  108. ->disableOriginalConstructor()
  109. ->getMock();
  110. $collection->expects($this->once())
  111. ->method('isTemporary')
  112. ->will($this->returnValue(false));
  113. $collection->expects($this->never())
  114. ->method('getContext');
  115. $manager->cleanup($collection);
  116. }
  117. /**
  118. * @covers Alchemy\Zippy\Resource\ResourceManager::handle
  119. */
  120. public function testFunctionnal()
  121. {
  122. $wd = __DIR__;
  123. $tmpdir = rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR);
  124. $filesystem = new \Symfony\Component\Filesystem\Filesystem();
  125. $filesystem->mkdir($tmpdir . '/path/to/local/');
  126. $filesystem->mkdir($tmpdir . '/to/');
  127. $filesystem->mkdir($tmpdir . '/path/to/a');
  128. touch($tmpdir . '/path/to/local/file.ext');
  129. touch($tmpdir . '/path/to/local/file2.ext');
  130. touch($tmpdir . '/to/file3.ext');
  131. $request = array(
  132. $wd . '/input/path/to/local/file.ext',
  133. $wd . '/input/path/to/a/../local/file2.ext',
  134. $tmpdir . '/path/to/local/file.ext',
  135. $tmpdir . '/path/to/a/../local/file2.ext',
  136. 'http://www.google.com/+/business/images/plus-badge.png',
  137. 'http://www.google.com/+/business/images/plusone-button.png',
  138. 'file://' . $tmpdir . '/to/file3.ext',
  139. 'file://' . $wd . '/input/path/to/a/../local/file3.ext',
  140. '/I/want/this/file/to/go/there' => 'file://' . $wd . '/input/path/to/local/file2.ext',
  141. '/I/want/this/file/to/go/here' => 'file://' . $wd . '/input/path/to/local/file3.ext'
  142. );
  143. $expected = array(
  144. 'input/path/to/local/file.ext',
  145. 'input/path/to/local/file2.ext',
  146. 'file.ext',
  147. 'file2.ext',
  148. 'plus-badge.png',
  149. 'plusone-button.png',
  150. 'file3.ext',
  151. 'input/path/to/local/file3.ext',
  152. 'I/want/this/file/to/go/there',
  153. 'I/want/this/file/to/go/here',
  154. );
  155. $expectedSource = array(
  156. $request[0],
  157. $request[1],
  158. $request[2],
  159. $request[3],
  160. $request[4],
  161. $request[5],
  162. $request[6],
  163. $request[7],
  164. $request['/I/want/this/file/to/go/there'],
  165. $request['/I/want/this/file/to/go/here'],
  166. );
  167. $resourceManger = ResourceManager::create();
  168. $collection = $resourceManger->handle($wd, $request);
  169. $this->assertCount(10, $collection);
  170. $n = 0;
  171. foreach ($collection as $resource) {
  172. $this->assertEquals($expected[$n], $resource->getTarget());
  173. $this->assertEquals($expectedSource[$n], $resource->getOriginal());
  174. $n++;
  175. }
  176. }
  177. protected function getRequestMapperMock()
  178. {
  179. return $this->getMockBuilder('Alchemy\Zippy\Resource\RequestMapper')
  180. ->disableOriginalConstructor()
  181. ->getMock();
  182. }
  183. protected function getResourceTeleporterMock()
  184. {
  185. return $this->getMockBuilder('Alchemy\Zippy\Resource\ResourceTeleporter')
  186. ->disableOriginalConstructor()
  187. ->getMock();
  188. }
  189. protected function getFilesystemMock()
  190. {
  191. return $this->getMockBuilder('Symfony\Component\Filesystem\Filesystem')
  192. ->disableOriginalConstructor()
  193. ->getMock();
  194. }
  195. }