/**
  * @test
  *
  * @depends testInstallerCreationShouldNotCreateVendorDirectory
  * @depends testInstallerCreationShouldNotCreateBinDirectory
  */
 public function updateStableToDevelopment()
 {
     $installer = new SharedPackageInstaller($this->io, $this->composer, $this->fs, $this->dataManager);
     $defaultInstaller = $this->getMockBuilder('Composer\\Installer\\LibraryInstaller')->disableOriginalConstructor()->getMock();
     $im = new InstallationManager();
     $im->addInstaller(new SharedPackageInstallerSolver($installer, $defaultInstaller));
     $this->composer->setInstallationManager($im);
     $initial = $this->createStablePackageMock();
     $target = $this->createDevelopmentPackageMock();
     $this->fs->ensureDirectoryExists($installer->getInstallPath($initial));
     $initial->expects($this->any())->method('getPrettyName')->will($this->returnValue('initial-package'));
     $initial->expects($this->any())->method('getTargetDir')->will($this->returnValue('oldtarget'));
     $initial->expects($this->once())->method('getType')->willReturn('shared-package');
     $target->expects($this->once())->method('getType')->willReturn('shared-package');
     $target->expects($this->any())->method('getTargetDir')->will($this->returnValue('newtarget'));
     $this->dm->expects($this->once())->method('download')->with($target, $this->dependenciesDir . '/letudiant/foo-bar/dev-develop/newtarget');
     $this->repository->expects($this->exactly(2))->method('hasPackage')->will($this->onConsecutiveCalls(true, true, false, false));
     $this->dataManager->expects($this->once())->method('addPackageUsage')->willReturn($target);
     $installer->update($this->repository, $initial, $target);
     $this->assertFileExists($this->vendorDir, 'Vendor dir should be created');
     $this->assertFileExists($this->binDir, 'Bin dir should be created');
     $this->assertFileExists($this->dependenciesDir, 'Dependencies dir should be created');
     $this->assertFileExists($this->symlinkDir, 'Symlink dir should be created');
     $this->assertFileNotExists($installer->getInstallPath($initial));
     $this->assertTrue(is_link($this->symlinkDir . '/letudiant/foo-bar'));
 }
 /**
  * @test
  */
 public function install()
 {
     $installer = $this->createInstaller();
     $package = $this->createPackageMock();
     $this->dm->expects($this->exactly(1))->method('download')->with($package, $this->dependenciesDir . '/letudiant/foo-bar/dev-develop');
     $this->repository->expects($this->exactly(2))->method('addPackage')->with($package);
     $this->dataManager->expects($this->exactly(2))->method('addPackageUsage')->willReturn($package);
     $installer->install($this->repository, $package);
     $this->assertFileExists($this->vendorDir, 'Vendor dir should be created');
     $this->assertFileExists($this->binDir, 'Bin dir should be created');
     $this->assertFileExists($this->symlinkDir, 'Symlink dir should be created');
     $this->assertFileExists($this->symlinkDir . '/letudiant', 'Symlink package prefix dir should be created');
     $this->assertTrue(is_link($this->symlinkDir . '/letudiant/foo-bar'), 'Symlink should be created');
     $this->assertFileExists($this->dependenciesDir, 'Dependencies dir should be created');
     // Install another time with already created directory
     $this->fs->ensureDirectoryExists($installer->getInstallPath($package));
     $this->repository->expects($this->once())->method('hasPackage')->with($package)->willReturn(false);
     $installer->install($this->repository, $package);
 }
 /**
  * @param PackageInterface $package
  *
  * @return string
  */
 public function getPackageBasePath(PackageInterface $package)
 {
     $this->filesystem->ensureDirectoryExists($this->vendorDir);
     return $this->vendorDir . DIRECTORY_SEPARATOR . $package->getPrettyName() . DIRECTORY_SEPARATOR . $package->getPrettyVersion();
 }