ComposerInformationTest.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Composer;
  7. use Magento\Framework\App\Filesystem\DirectoryList;
  8. use Magento\TestFramework\Helper\Bootstrap;
  9. /**
  10. * Tests Magento\Framework\ComposerInformation
  11. */
  12. class ComposerInformationTest extends \PHPUnit\Framework\TestCase
  13. {
  14. /**
  15. * @var \Magento\Framework\ObjectManagerInterface
  16. */
  17. private $objectManager;
  18. /**
  19. * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\App\Filesystem\DirectoryList
  20. */
  21. private $directoryList;
  22. /**
  23. * @var ComposerJsonFinder
  24. */
  25. private $composerJsonFinder;
  26. /**
  27. * @var ComposerFactory
  28. */
  29. private $composerFactory;
  30. public function setUp()
  31. {
  32. $this->objectManager = Bootstrap::getObjectManager();
  33. }
  34. /**
  35. * Setup DirectoryList, Filesystem, and ComposerJsonFinder to use a specified directory for reading composer files
  36. *
  37. * @param $composerDir string Directory under _files that contains composer files
  38. */
  39. private function setupDirectory($composerDir)
  40. {
  41. $directories = [
  42. DirectoryList::CONFIG => [DirectoryList::PATH => __DIR__ . '/_files/'],
  43. DirectoryList::ROOT => [DirectoryList::PATH => __DIR__ . '/_files/' . $composerDir],
  44. DirectoryList::COMPOSER_HOME => [DirectoryList::PATH => __DIR__ . '/_files/' . $composerDir],
  45. ];
  46. $this->directoryList = $this->objectManager->create(
  47. \Magento\Framework\App\Filesystem\DirectoryList::class,
  48. ['root' => __DIR__ . '/_files/' . $composerDir, 'config' => $directories]
  49. );
  50. $this->filesystem = $this->objectManager->create(
  51. \Magento\Framework\Filesystem::class,
  52. ['directoryList' => $this->directoryList]
  53. );
  54. $this->composerJsonFinder = new ComposerJsonFinder($this->directoryList);
  55. $this->composerFactory = new ComposerFactory($this->directoryList, $this->composerJsonFinder);
  56. }
  57. /**
  58. * @param $composerDir string Directory under _files that contains composer files
  59. *
  60. * @dataProvider getRequiredPhpVersionDataProvider
  61. */
  62. public function testGetRequiredPhpVersion($composerDir)
  63. {
  64. $this->setupDirectory($composerDir);
  65. /** @var \Magento\Framework\Composer\ComposerInformation $composerInfo */
  66. $composerInfo = $this->objectManager->create(
  67. \Magento\Framework\Composer\ComposerInformation::class,
  68. ['composerFactory' => $this->composerFactory]
  69. );
  70. $this->assertEquals("~5.5.0|~5.6.0|~7.0.0", $composerInfo->getRequiredPhpVersion());
  71. }
  72. /**
  73. * @param $composerDir string Directory under _files that contains composer files
  74. *
  75. * @dataProvider getRequiredPhpVersionDataProvider
  76. */
  77. public function testGetRequiredExtensions($composerDir)
  78. {
  79. $this->setupDirectory($composerDir);
  80. $expectedExtensions = ['ctype', 'gd', 'spl', 'dom', 'simplexml', 'mcrypt', 'hash', 'curl', 'iconv', 'intl'];
  81. /** @var \Magento\Framework\Composer\ComposerInformation $composerInfo */
  82. $composerInfo = $this->objectManager->create(
  83. \Magento\Framework\Composer\ComposerInformation::class,
  84. ['composerFactory' => $this->composerFactory]
  85. );
  86. $actualRequiredExtensions = $composerInfo->getRequiredExtensions();
  87. foreach ($expectedExtensions as $expectedExtension) {
  88. $this->assertContains($expectedExtension, $actualRequiredExtensions);
  89. }
  90. }
  91. /**
  92. * @param $composerDir string Directory under _files that contains composer files
  93. *
  94. * @dataProvider getRequiredPhpVersionDataProvider
  95. */
  96. public function testGetSuggestedPackages($composerDir)
  97. {
  98. $this->setupDirectory($composerDir);
  99. $composerInfo = $this->objectManager->create(
  100. \Magento\Framework\Composer\ComposerInformation::class,
  101. ['composerFactory' => $this->composerFactory]
  102. );
  103. $actualSuggestedExtensions = $composerInfo->getSuggestedPackages();
  104. $this->assertArrayHasKey('psr/log', $actualSuggestedExtensions);
  105. }
  106. /**
  107. * @param $composerDir string Directory under _files that contains composer files
  108. *
  109. * @dataProvider getRequiredPhpVersionDataProvider
  110. */
  111. public function testGetRootRequiredPackagesAndTypes($composerDir)
  112. {
  113. $this->setupDirectory($composerDir);
  114. /** @var \Magento\Framework\Composer\ComposerInformation $composerInfo */
  115. $composerInfo = $this->objectManager->create(
  116. \Magento\Framework\Composer\ComposerInformation::class,
  117. ['composerFactory' => $this->composerFactory]
  118. );
  119. $requiredPackagesAndTypes = $composerInfo->getRootRequiredPackageTypesByName();
  120. $this->assertArrayHasKey('composer/composer', $requiredPackagesAndTypes);
  121. $this->assertEquals('library', $requiredPackagesAndTypes['composer/composer']);
  122. }
  123. /**
  124. * Data provider that returns directories containing different types of composer files.
  125. *
  126. * @return array
  127. */
  128. public function getRequiredPhpVersionDataProvider()
  129. {
  130. return [
  131. 'Skeleton Composer' => ['testSkeleton'],
  132. 'Composer.json from git clone' => ['testFromClone'],
  133. 'Composer.json from git create project' => ['testFromCreateProject'],
  134. ];
  135. }
  136. public function testIsPackageInComposerJson()
  137. {
  138. $this->setupDirectory('testSkeleton');
  139. /** @var \Magento\Framework\Composer\ComposerInformation $composerInfo */
  140. $composerInfo = $this->objectManager->create(
  141. \Magento\Framework\Composer\ComposerInformation::class,
  142. ['composerFactory' => $this->composerFactory]
  143. );
  144. $packageName = 'magento/sample-module-minimal';
  145. $this->assertTrue($composerInfo->isPackageInComposerJson($packageName));
  146. $packageName = 'magento/wrong-module-name';
  147. $this->assertFalse($composerInfo->isPackageInComposerJson($packageName));
  148. }
  149. /**
  150. * @param $composerDir string Directory under _files that contains composer files
  151. *
  152. * @dataProvider getRequiredPhpVersionDataProvider
  153. */
  154. public function testGetRootRepositories($composerDir)
  155. {
  156. $this->setupDirectory($composerDir);
  157. /** @var \Magento\Framework\Composer\ComposerInformation $composerInfo */
  158. $composerInfo = $this->objectManager->create(
  159. \Magento\Framework\Composer\ComposerInformation::class,
  160. ['composerFactory' => $this->composerFactory]
  161. );
  162. if ($composerDir === 'testFromCreateProject') {
  163. $this->assertEquals(['https://repo.magento.com/'], $composerInfo->getRootRepositories());
  164. } else {
  165. $this->assertEquals([], $composerInfo->getRootRepositories());
  166. }
  167. }
  168. /**
  169. * @param $composerDir string Directory under _files that contains composer files
  170. *
  171. * @dataProvider getRequiredPhpVersionDataProvider
  172. */
  173. public function testIsMagentoRoot($composerDir)
  174. {
  175. $this->setupDirectory($composerDir);
  176. /** @var \Magento\Framework\Composer\ComposerInformation $composerInfo */
  177. $composerInfo = $this->objectManager->create(
  178. \Magento\Framework\Composer\ComposerInformation::class,
  179. ['composerFactory' => $this->composerFactory]
  180. );
  181. if ($composerDir === 'testFromClone') {
  182. $this->assertTrue($composerInfo->isMagentoRoot());
  183. } else {
  184. $this->assertFalse($composerInfo->isMagentoRoot());
  185. }
  186. }
  187. }