InstallerTest.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. /*
  3. * This file is part of Composer.
  4. *
  5. * (c) Nils Adermann <naderman@naderman.de>
  6. * Jordi Boggiano <j.boggiano@seld.be>
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Composer\Test;
  12. use Composer\Installer;
  13. use Composer\Repository\ArrayRepository;
  14. use Composer\Repository\RepositoryManager;
  15. use Composer\Repository\RepositoryInterface;
  16. use Composer\Package\PackageInterface;
  17. use Composer\Package\Link;
  18. use Composer\Test\Mock\WritableRepositoryMock;
  19. use Composer\Test\Mock\InstallationManagerMock;
  20. class InstallerTest extends TestCase
  21. {
  22. /**
  23. * @dataProvider provideInstaller
  24. */
  25. public function testInstaller(PackageInterface $rootPackage, $repositories, array $options)
  26. {
  27. $io = $this->getMock('Composer\IO\IOInterface');
  28. $downloadManager = $this->getMock('Composer\Downloader\DownloadManager');
  29. $config = $this->getMock('Composer\Config');
  30. $repositoryManager = new RepositoryManager($io, $config);
  31. $repositoryManager->setLocalRepository(new WritableRepositoryMock());
  32. $repositoryManager->setLocalDevRepository(new WritableRepositoryMock());
  33. if (!is_array($repositories)) {
  34. $repositories = array($repositories);
  35. }
  36. foreach ($repositories as $repository) {
  37. $repositoryManager->addRepository($repository);
  38. }
  39. $locker = $this->getMockBuilder('Composer\Package\Locker')->disableOriginalConstructor()->getMock();
  40. $installationManager = new InstallationManagerMock();
  41. $eventDispatcher = $this->getMockBuilder('Composer\Script\EventDispatcher')->disableOriginalConstructor()->getMock();
  42. $autoloadGenerator = $this->getMock('Composer\Autoload\AutoloadGenerator');
  43. $installer = new Installer($io, clone $rootPackage, $downloadManager, $repositoryManager, $locker, $installationManager, $eventDispatcher, $autoloadGenerator);
  44. $result = $installer->run();
  45. $this->assertTrue($result);
  46. $expectedInstalled = isset($options['install']) ? $options['install'] : array();
  47. $expectedUpdated = isset($options['update']) ? $options['update'] : array();
  48. $expectedUninstalled = isset($options['uninstall']) ? $options['uninstall'] : array();
  49. $installed = $installationManager->getInstalledPackages();
  50. $this->assertSame($expectedInstalled, $installed);
  51. $updated = $installationManager->getUpdatedPackages();
  52. $this->assertSame($expectedUpdated, $updated);
  53. $uninstalled = $installationManager->getUninstalledPackages();
  54. $this->assertSame($expectedUninstalled, $uninstalled);
  55. }
  56. public function provideInstaller()
  57. {
  58. $cases = array();
  59. // when A requires B and B requires A, and A is a non-published root package
  60. // the install of B should succeed
  61. $a = $this->getPackage('A', '1.0.0');
  62. $a->setRequires(array(
  63. new Link('A', 'B', $this->getVersionConstraint('=', '1.0.0')),
  64. ));
  65. $b = $this->getPackage('B', '1.0.0');
  66. $b->setRequires(array(
  67. new Link('B', 'A', $this->getVersionConstraint('=', '1.0.0')),
  68. ));
  69. $cases[] = array(
  70. $a,
  71. new ArrayRepository(array($b)),
  72. array(
  73. 'install' => array($b)
  74. ),
  75. );
  76. // #480: when A requires B and B requires A, and A is a published root package
  77. // only B should be installed, as A is the root
  78. $a = $this->getPackage('A', '1.0.0');
  79. $a->setRequires(array(
  80. new Link('A', 'B', $this->getVersionConstraint('=', '1.0.0')),
  81. ));
  82. $b = $this->getPackage('B', '1.0.0');
  83. $b->setRequires(array(
  84. new Link('B', 'A', $this->getVersionConstraint('=', '1.0.0')),
  85. ));
  86. $cases[] = array(
  87. $a,
  88. new ArrayRepository(array($a, $b)),
  89. array(
  90. 'install' => array($b)
  91. ),
  92. );
  93. return $cases;
  94. }
  95. }