* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Fxp\Composer\AssetPlugin\Tests; use Composer\Composer; use Composer\Config; use Composer\Installer\InstallationManager; use Composer\Installer\InstallerEvent; use Composer\IO\IOInterface; use Composer\Plugin\CommandEvent; use Composer\Repository\RepositoryManager; use Composer\Util\Filesystem; use Fxp\Composer\AssetPlugin\AssetEvents; use Fxp\Composer\AssetPlugin\Event\VcsRepositoryEvent; use Fxp\Composer\AssetPlugin\FxpAssetPlugin; /** * Tests of asset plugin. * * @author François Pluchino */ class FxpAssetPluginTest extends \PHPUnit_Framework_TestCase { /** * @var FxpAssetPlugin */ protected $plugin; /** * @var Composer */ protected $composer; /** * @var IOInterface */ protected $io; /** * @var \PHPUnit_Framework_MockObject_MockObject */ protected $package; protected function setUp() { $io = $this->getMock('Composer\IO\IOInterface'); $config = $this->getMock('Composer\Config'); $config->expects($this->any()) ->method('get') ->will($this->returnCallback(function ($key) { switch ($key) { case 'cache-repo-dir': return sys_get_temp_dir().'/composer-test-repo-cache'; } return; })); $this->package = $this->getMock('Composer\Package\RootPackageInterface'); $this->package->expects($this->any()) ->method('getRequires') ->will($this->returnValue(array())); $this->package->expects($this->any()) ->method('getDevRequires') ->will($this->returnValue(array())); /* @var IOInterface $io */ /* @var Config $config */ $rm = new RepositoryManager($io, $config); $im = new InstallationManager(); $composer = $this->getMock('Composer\Composer'); $composer->expects($this->any()) ->method('getRepositoryManager') ->will($this->returnValue($rm)); $composer->expects($this->any()) ->method('getPackage') ->will($this->returnValue($this->package)); $composer->expects($this->any()) ->method('getConfig') ->will($this->returnValue($config)); $composer->expects($this->any()) ->method('getInstallationManager') ->will($this->returnValue($im)); $this->plugin = new FxpAssetPlugin(); $this->composer = $composer; $this->io = $io; } protected function tearDown() { $this->plugin = null; $this->composer = null; $this->io = null; $fs = new Filesystem(); $fs->remove(sys_get_temp_dir().'/composer-test-repo-cache'); } public function testAssetRepositories() { $this->package->expects($this->any()) ->method('getExtra') ->will($this->returnValue(array())); $this->plugin->activate($this->composer, $this->io); $repos = $this->composer->getRepositoryManager()->getRepositories(); $this->assertCount(2, $repos); foreach ($repos as $repo) { $this->assertInstanceOf('Composer\Repository\ComposerRepository', $repo); } } /** * @dataProvider getDataForAssetVcsRepositories */ public function testAssetVcsRepositories($type) { $this->package->expects($this->any()) ->method('getExtra') ->will($this->returnValue(array())); $this->plugin->activate($this->composer, $this->io); $rm = $this->composer->getRepositoryManager(); $repo = $rm->createRepository($type, array( 'type' => $type, 'url' => 'http://foo.tld', )); $this->assertInstanceOf('Composer\Repository\VcsRepository', $repo); } public function getDataForAssetVcsRepositories() { return array( array('npm-vcs'), array('npm-git'), array('npm-github'), array('bower-vcs'), array('bower-git'), array('bower-github'), ); } public function testAssetRepositoryWithValueIsNotArray() { $this->setExpectedException('UnexpectedValueException'); $this->package->expects($this->any()) ->method('getExtra') ->will($this->returnValue(array('asset-repositories' => array( 'invalid_repo', )))); $this->plugin->activate($this->composer, $this->io); } public function testAssetRepositoryWithInvalidType() { $this->setExpectedException('UnexpectedValueException'); $this->package->expects($this->any()) ->method('getExtra') ->will($this->returnValue(array('asset-repositories' => array( array(), )))); $this->plugin->activate($this->composer, $this->io); } public function testAssetRepositoryWithInvalidTypeFormat() { $this->setExpectedException('UnexpectedValueException'); $this->package->expects($this->any()) ->method('getExtra') ->will($this->returnValue(array('asset-repositories' => array( array('type' => 'invalid_type'), )))); $this->plugin->activate($this->composer, $this->io); } public function testAssetRepositoryWithInvalidUrl() { $this->setExpectedException('UnexpectedValueException'); $this->package->expects($this->any()) ->method('getExtra') ->will($this->returnValue(array('asset-repositories' => array( array('type' => 'npm-vcs'), )))); $this->plugin->activate($this->composer, $this->io); } public function testAssetRepository() { $this->package->expects($this->any()) ->method('getExtra') ->will($this->returnValue(array('asset-repositories' => array( array('type' => 'npm-vcs', 'url' => 'http://foo.tld'), )))); $this->plugin->activate($this->composer, $this->io); $repos = $this->composer->getRepositoryManager()->getRepositories(); $this->assertCount(3, $repos); $this->assertInstanceOf('Fxp\Composer\AssetPlugin\Repository\AssetVcsRepository', $repos[2]); } public function testAssetRepositoryWithAlreadyExistRepositoryName() { $this->package->expects($this->any()) ->method('getExtra') ->will($this->returnValue(array('asset-repositories' => array( array('type' => 'npm-vcs', 'url' => 'http://foo.tld'), array('type' => 'npm-vcs', 'url' => 'http://foo.tld'), )))); $this->plugin->activate($this->composer, $this->io); $repos = $this->composer->getRepositoryManager()->getRepositories(); $this->assertCount(3, $repos); $this->assertInstanceOf('Fxp\Composer\AssetPlugin\Repository\AssetVcsRepository', $repos[2]); } public function testAssetPackageWithoutPackage() { $this->setExpectedException('UnexpectedValueException'); $this->package->expects($this->any()) ->method('getExtra') ->will($this->returnValue(array('asset-repositories' => array( array('type' => 'package'), )))); $this->plugin->activate($this->composer, $this->io); } public function testAssetPackageWithInvalidPackage() { $this->setExpectedException('UnexpectedValueException'); $this->package->expects($this->any()) ->method('getExtra') ->will($this->returnValue(array('asset-repositories' => array( array('type' => 'package', 'package' => array('key' => 'value')), )))); $this->plugin->activate($this->composer, $this->io); } public function testAssetPackageRepositories() { $this->package->expects($this->any()) ->method('getExtra') ->will($this->returnValue(array('asset-repositories' => array( array( 'type' => 'package', 'package' => array( 'name' => 'foo', 'type' => 'ASSET-asset-library', 'version' => '0.0.0.0', 'dist' => array( 'url' => 'foo.tld/bar', 'type' => 'file', ), ), ), )))); $rm = $this->composer->getRepositoryManager(); $rm->setRepositoryClass('package', 'Composer\Repository\PackageRepository'); $this->plugin->activate($this->composer, $this->io); $repos = $this->composer->getRepositoryManager()->getRepositories(); $this->assertCount(3, $repos); $this->assertInstanceOf('Composer\Repository\PackageRepository', $repos[2]); } public function testOptionsForAssetRegistryRepositories() { $this->package->expects($this->any()) ->method('getExtra') ->will($this->returnValue(array('asset-registry-options' => array( 'npm-option1' => 'value 1', 'bower-option1' => 'value 2', )))); $this->plugin->activate($this->composer, $this->io); } public function testSubscribeEvents() { $this->package->expects($this->any()) ->method('getExtra') ->will($this->returnValue(array())); $this->assertCount(3, $this->plugin->getSubscribedEvents()); $this->assertCount(0, $this->composer->getRepositoryManager()->getRepositories()); $event = new VcsRepositoryEvent(AssetEvents::ADD_VCS_REPOSITORIES, array( array('type' => 'npm-vcs', 'url' => 'http://foo.tld'), )); /* @var InstallerEvent $eventInstaller */ $eventInstaller = $this->getMockBuilder('Composer\Installer\InstallerEvent') ->disableOriginalConstructor() ->getMock(); /* @var CommandEvent|\PHPUnit_Framework_MockObject_MockObject $eventCommand */ $eventCommand = $this->getMockBuilder('Composer\Plugin\CommandEvent') ->disableOriginalConstructor() ->getMock(); $eventCommand->expects($this->any()) ->method('getCommandName') ->will($this->returnValue('show')); $this->plugin->activate($this->composer, $this->io); $this->assertCount(2, $this->composer->getRepositoryManager()->getRepositories()); $this->plugin->onAddVcsRepositories($event); $this->plugin->onPluginCommand($eventCommand); $this->plugin->onPreDependenciesSolving($eventInstaller); $this->assertCount(3, $this->composer->getRepositoryManager()->getRepositories()); } public function testAssetInstallers() { $this->package->expects($this->any()) ->method('getExtra') ->will($this->returnValue(array())); $this->plugin->activate($this->composer, $this->io); $im = $this->composer->getInstallationManager(); $this->assertInstanceOf('Fxp\Composer\AssetPlugin\Installer\BowerInstaller', $im->getInstaller('bower-asset-library')); $this->assertInstanceOf('Fxp\Composer\AssetPlugin\Installer\AssetInstaller', $im->getInstaller('npm-asset-library')); } }