InstallerTest.php 4.1 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(array $expectedInstalled, array $expectedUpdated, array $expectedUninstalled, PackageInterface $package, RepositoryInterface $repository)
  26. {
  27. $io = $this->getMock('Composer\IO\IOInterface');
  28. $package = $this->getPackage('A', '1.0.0');
  29. $package->setRequires(array(
  30. new Link('A', 'B', $this->getVersionConstraint('=', '1.0.0')),
  31. ));
  32. $downloadManager = $this->getMock('Composer\Downloader\DownloadManager');
  33. $config = $this->getMock('Composer\Config');
  34. $repositoryManager = new RepositoryManager($io, $config);
  35. $repositoryManager->setLocalRepository(new WritableRepositoryMock());
  36. $repositoryManager->setLocalDevRepository(new WritableRepositoryMock());
  37. $repositoryManager->addRepository($repository);
  38. $locker = $this->getMockBuilder('Composer\Package\Locker')->disableOriginalConstructor()->getMock();
  39. $installationManager = new InstallationManagerMock();
  40. $eventDispatcher = $this->getMockBuilder('Composer\Script\EventDispatcher')->disableOriginalConstructor()->getMock();
  41. $autoloadGenerator = $this->getMock('Composer\Autoload\AutoloadGenerator');
  42. $installer = new Installer($io, $package, $downloadManager, $repositoryManager, $locker, $installationManager, $eventDispatcher, $autoloadGenerator);
  43. $result = $installer->run();
  44. $this->assertTrue($result);
  45. $installed = $installationManager->getInstalledPackages();
  46. $this->assertSame($expectedInstalled, array_map(array($this, 'getPackageString'), $installed));
  47. $updated = $installationManager->getUpdatedPackages();
  48. $this->assertSame($expectedUpdated, array_map(array($this, 'getPackageString'), $updated));
  49. $uninstalled = $installationManager->getUninstalledPackages();
  50. $this->assertSame($expectedUninstalled, array_map(array($this, 'getPackageString'), $uninstalled));
  51. }
  52. public function provideInstaller()
  53. {
  54. $cases = array();
  55. // when A requires B and B requires A, and A is a non-published root package
  56. // the install of B should succeed
  57. $a = $this->getPackage('A', '1.0.0');
  58. $a->setRequires(array(
  59. new Link('A', 'B', $this->getVersionConstraint('=', '1.0.0')),
  60. ));
  61. $b = $this->getPackage('B', '1.0.0');
  62. $b->setRequires(array(
  63. new Link('B', 'A', $this->getVersionConstraint('=', '1.0.0')),
  64. ));
  65. $cases[] = array(
  66. array('b-1.0.0.0'),
  67. array(),
  68. array(),
  69. $a,
  70. new ArrayRepository(array($b)),
  71. );
  72. // #480: when A requires B and B requires A, and A is a published root package
  73. // only B should be installed, as A is the root
  74. $a = $this->getPackage('A', '1.0.0');
  75. $a->setRequires(array(
  76. new Link('A', 'B', $this->getVersionConstraint('=', '1.0.0')),
  77. ));
  78. $b = $this->getPackage('B', '1.0.0');
  79. $b->setRequires(array(
  80. new Link('B', 'A', $this->getVersionConstraint('=', '1.0.0')),
  81. ));
  82. $cases[] = array(
  83. array('b-1.0.0.0'),
  84. array(),
  85. array(),
  86. $a,
  87. new ArrayRepository(array($a, $b)),
  88. );
  89. return $cases;
  90. }
  91. public function getPackageString(PackageInterface $package)
  92. {
  93. return (string) $package;
  94. }
  95. }