FilePermissionsTest.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Setup\Test\Unit;
  7. use \Magento\Framework\Setup\FilePermissions;
  8. use Magento\Framework\App\Filesystem\DirectoryList;
  9. use Magento\Framework\App\State;
  10. class FilePermissionsTest extends \PHPUnit\Framework\TestCase
  11. {
  12. /**
  13. * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Filesystem\Directory\Write
  14. */
  15. private $directoryWriteMock;
  16. /**
  17. * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Filesystem
  18. */
  19. private $filesystemMock;
  20. /**
  21. * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\App\Filesystem\DirectoryList
  22. */
  23. private $directoryListMock;
  24. /**
  25. * @var \PHPUnit_Framework_MockObject_MockObject|State
  26. */
  27. private $stateMock;
  28. /**
  29. * @var FilePermissions
  30. */
  31. private $filePermissions;
  32. public function setUp()
  33. {
  34. $this->directoryWriteMock = $this->createMock(\Magento\Framework\Filesystem\Directory\Write::class);
  35. $this->filesystemMock = $this->createMock(\Magento\Framework\Filesystem::class);
  36. $this->stateMock = $this->createMock(State::class);
  37. $this->filesystemMock
  38. ->expects($this->any())
  39. ->method('getDirectoryWrite')
  40. ->will($this->returnValue($this->directoryWriteMock));
  41. $this->directoryListMock = $this->createMock(\Magento\Framework\App\Filesystem\DirectoryList::class);
  42. $this->filePermissions = new FilePermissions(
  43. $this->filesystemMock,
  44. $this->directoryListMock,
  45. $this->stateMock
  46. );
  47. }
  48. /**
  49. * @param string $mageMode
  50. * @dataProvider modeDataProvider
  51. */
  52. public function testGetInstallationWritableDirectories($mageMode)
  53. {
  54. $this->setUpDirectoryListInstallation();
  55. $this->stateMock->expects($this->once())
  56. ->method('getMode')
  57. ->willReturn($mageMode);
  58. $expected = [
  59. BP . '/app/etc',
  60. BP . '/var',
  61. BP . '/pub/media',
  62. BP . '/pub/static',
  63. BP . '/generated'
  64. ];
  65. $this->assertEquals($expected, $this->filePermissions->getInstallationWritableDirectories());
  66. }
  67. public function testGetInstallationWritableDirectoriesInProduction()
  68. {
  69. $this->setUpDirectoryListInstallationInProduction();
  70. $this->stateMock->expects($this->once())
  71. ->method('getMode')
  72. ->willReturn(State::MODE_PRODUCTION);
  73. $expected = [
  74. BP . '/app/etc',
  75. BP . '/var',
  76. BP . '/pub/media',
  77. BP . '/pub/static'
  78. ];
  79. $this->assertEquals($expected, $this->filePermissions->getInstallationWritableDirectories());
  80. }
  81. public function testGetApplicationNonWritableDirectories()
  82. {
  83. $this->directoryListMock
  84. ->expects($this->once())
  85. ->method('getPath')
  86. ->with(DirectoryList::CONFIG)
  87. ->will($this->returnValue(BP . '/app/etc'));
  88. $expected = [BP . '/app/etc'];
  89. $this->assertEquals($expected, $this->filePermissions->getApplicationNonWritableDirectories());
  90. }
  91. public function testGetInstallationCurrentWritableDirectories()
  92. {
  93. $this->setUpDirectoryListInstallation();
  94. $this->setUpDirectoryWriteInstallation();
  95. $expected = [
  96. BP . '/app/etc',
  97. ];
  98. $this->filePermissions->getInstallationWritableDirectories();
  99. $this->assertEquals($expected, $this->filePermissions->getInstallationCurrentWritableDirectories());
  100. }
  101. /**
  102. * @param array $mockMethods
  103. * @param array $expected
  104. * @dataProvider getApplicationCurrentNonWritableDirectoriesDataProvider
  105. */
  106. public function testGetApplicationCurrentNonWritableDirectories(array $mockMethods, array $expected)
  107. {
  108. $this->directoryListMock
  109. ->expects($this->at(0))
  110. ->method('getPath')
  111. ->with(DirectoryList::CONFIG)
  112. ->will($this->returnValue(BP . '/app/etc'));
  113. $index = 0;
  114. foreach ($mockMethods as $mockMethod => $returnValue) {
  115. $this->directoryWriteMock
  116. ->expects($this->at($index))
  117. ->method($mockMethod)
  118. ->will($this->returnValue($returnValue));
  119. $index += 1;
  120. }
  121. $this->filePermissions->getApplicationNonWritableDirectories();
  122. $this->assertEquals($expected, $this->filePermissions->getApplicationCurrentNonWritableDirectories());
  123. }
  124. /**
  125. * @return array
  126. */
  127. public function getApplicationCurrentNonWritableDirectoriesDataProvider()
  128. {
  129. return [
  130. [
  131. [
  132. 'isExist' => true,
  133. 'isDirectory' => true,
  134. 'isReadable' => true,
  135. 'isWritable' => false
  136. ],
  137. [BP . '/app/etc'],
  138. ],
  139. [['isExist' => false], []],
  140. [['isExist' => true, 'isDirectory' => false], []],
  141. [['isExist' => true, 'isDirectory' => true, 'isReadable' => true, 'isWritable' => true], []],
  142. ];
  143. }
  144. /**
  145. * @param string $mageMode
  146. * @dataProvider modeDataProvider
  147. * @covers \Magento\Framework\Setup\FilePermissions::getMissingWritableDirectoriesForInstallation
  148. * @covers \Magento\Framework\Setup\FilePermissions::getMissingWritablePathsForInstallation
  149. */
  150. public function testGetMissingWritableDirectoriesAndPathsForInstallation($mageMode)
  151. {
  152. $this->setUpDirectoryListInstallation();
  153. $this->setUpDirectoryWriteInstallation();
  154. $this->stateMock->expects($this->once())
  155. ->method('getMode')
  156. ->willReturn($mageMode);
  157. $expected = [
  158. BP . '/var',
  159. BP . '/pub/media',
  160. BP . '/pub/static',
  161. BP . '/generated'
  162. ];
  163. $this->assertEquals(
  164. $expected,
  165. array_values($this->filePermissions->getMissingWritableDirectoriesForInstallation())
  166. );
  167. $this->assertEquals(
  168. $expected,
  169. array_values($this->filePermissions->getMissingWritablePathsForInstallation())
  170. );
  171. }
  172. public function testGetMissingWritableDirectoriesAndPathsForInstallationInProduction()
  173. {
  174. $this->setUpDirectoryListInstallationInProduction();
  175. $this->setUpDirectoryWriteInstallation();
  176. $this->stateMock->expects($this->once())
  177. ->method('getMode')
  178. ->willReturn(State::MODE_PRODUCTION);
  179. $expected = [
  180. BP . '/var',
  181. BP . '/pub/media',
  182. BP . '/pub/static'
  183. ];
  184. $this->assertEquals(
  185. $expected,
  186. array_values($this->filePermissions->getMissingWritableDirectoriesForInstallation())
  187. );
  188. $this->assertEquals(
  189. $expected,
  190. array_values($this->filePermissions->getMissingWritablePathsForInstallation())
  191. );
  192. }
  193. public function testGetMissingWritableDirectoriesForDbUpgrade()
  194. {
  195. $directoryMethods = ['isExist', 'isDirectory', 'isReadable', 'isWritable'];
  196. foreach ($directoryMethods as $method) {
  197. $this->directoryWriteMock->expects($this->exactly(2))
  198. ->method($method)
  199. ->willReturn(true);
  200. }
  201. $this->assertEmpty($this->filePermissions->getMissingWritableDirectoriesForDbUpgrade());
  202. }
  203. /**
  204. * @param array $mockMethods
  205. * @param array $expected
  206. * @dataProvider getUnnecessaryWritableDirectoriesForApplicationDataProvider
  207. */
  208. public function testGetUnnecessaryWritableDirectoriesForApplication(array $mockMethods, array $expected)
  209. {
  210. $this->directoryListMock
  211. ->expects($this->at(0))
  212. ->method('getPath')
  213. ->with(DirectoryList::CONFIG)
  214. ->will($this->returnValue(BP . '/app/etc'));
  215. $index = 0;
  216. foreach ($mockMethods as $mockMethod => $returnValue) {
  217. $this->directoryWriteMock
  218. ->expects($this->at($index))
  219. ->method($mockMethod)
  220. ->will($this->returnValue($returnValue));
  221. $index += 1;
  222. }
  223. $this->assertEquals(
  224. $expected,
  225. array_values($this->filePermissions->getUnnecessaryWritableDirectoriesForApplication())
  226. );
  227. }
  228. /**
  229. * @return array
  230. */
  231. public function getUnnecessaryWritableDirectoriesForApplicationDataProvider()
  232. {
  233. return [
  234. [['isExist' => true, 'isDirectory' => true, 'isReadable' => true, 'isWritable' => false], []],
  235. [['isExist' => false], [BP . '/app/etc']],
  236. ];
  237. }
  238. public function setUpDirectoryListInstallation()
  239. {
  240. $this->setUpDirectoryListInstallationInProduction();
  241. $this->directoryListMock
  242. ->expects($this->at(4))
  243. ->method('getPath')
  244. ->with(DirectoryList::GENERATED)
  245. ->will($this->returnValue(BP . '/generated'));
  246. }
  247. public function setUpDirectoryListInstallationInProduction()
  248. {
  249. $this->directoryListMock
  250. ->expects($this->at(0))
  251. ->method('getPath')
  252. ->with(DirectoryList::CONFIG)
  253. ->will($this->returnValue(BP . '/app/etc'));
  254. $this->directoryListMock
  255. ->expects($this->at(1))
  256. ->method('getPath')
  257. ->with(DirectoryList::VAR_DIR)
  258. ->will($this->returnValue(BP . '/var'));
  259. $this->directoryListMock
  260. ->expects($this->at(2))
  261. ->method('getPath')
  262. ->with(DirectoryList::MEDIA)
  263. ->will($this->returnValue(BP . '/pub/media'));
  264. $this->directoryListMock
  265. ->expects($this->at(3))
  266. ->method('getPath')
  267. ->with(DirectoryList::STATIC_VIEW)
  268. ->will($this->returnValue(BP . '/pub/static'));
  269. }
  270. public function setUpDirectoryWriteInstallation()
  271. {
  272. // CONFIG
  273. $this->directoryWriteMock
  274. ->expects($this->at(0))
  275. ->method('isExist')
  276. ->will($this->returnValue(true));
  277. $this->directoryWriteMock
  278. ->expects($this->at(1))
  279. ->method('isDirectory')
  280. ->will($this->returnValue(true));
  281. $this->directoryWriteMock
  282. ->expects($this->at(2))
  283. ->method('isReadable')
  284. ->will($this->returnValue(true));
  285. $this->directoryWriteMock
  286. ->expects($this->at(3))
  287. ->method('isWritable')
  288. ->will($this->returnValue(true));
  289. // VAR
  290. $this->directoryWriteMock
  291. ->expects($this->at(4))
  292. ->method('isExist')
  293. ->will($this->returnValue(false));
  294. // MEDIA
  295. $this->directoryWriteMock
  296. ->expects($this->at(5))
  297. ->method('isExist')
  298. ->will($this->returnValue(true));
  299. $this->directoryWriteMock
  300. ->expects($this->at(6))
  301. ->method('isDirectory')
  302. ->will($this->returnValue(false));
  303. // STATIC_VIEW
  304. $this->directoryWriteMock
  305. ->expects($this->at(7))
  306. ->method('isExist')
  307. ->will($this->returnValue(true));
  308. $this->directoryWriteMock
  309. ->expects($this->at(8))
  310. ->method('isDirectory')
  311. ->will($this->returnValue(true));
  312. $this->directoryWriteMock
  313. ->expects($this->at(9))
  314. ->method('isReadable')
  315. ->will($this->returnValue(true));
  316. $this->directoryWriteMock
  317. ->expects($this->at(10))
  318. ->method('isWritable')
  319. ->will($this->returnValue(false));
  320. }
  321. /**
  322. * @return array
  323. */
  324. public function modeDataProvider()
  325. {
  326. return [
  327. [State::MODE_DEFAULT],
  328. [State::MODE_DEVELOPER],
  329. ];
  330. }
  331. }