View source
<?php
namespace Composer\Installers\Test;
use Composer\Installers\Installer;
use Composer\Util\Filesystem;
use Composer\Package\Package;
use Composer\Package\RootPackage;
use Composer\Composer;
use Composer\Config;
class InstallerTest extends TestCase {
private $composer;
private $config;
private $vendorDir;
private $binDir;
private $dm;
private $repository;
private $io;
private $fs;
public function setUp() {
$this->fs = new Filesystem();
$this->composer = new Composer();
$this->config = new Config();
$this->composer
->setConfig($this->config);
$this->vendorDir = realpath(sys_get_temp_dir()) . DIRECTORY_SEPARATOR . 'baton-test-vendor';
$this
->ensureDirectoryExistsAndClear($this->vendorDir);
$this->binDir = realpath(sys_get_temp_dir()) . DIRECTORY_SEPARATOR . 'baton-test-bin';
$this
->ensureDirectoryExistsAndClear($this->binDir);
$this->config
->merge(array(
'config' => array(
'vendor-dir' => $this->vendorDir,
'bin-dir' => $this->binDir,
),
));
$this->dm = $this
->getMockBuilder('Composer\\Downloader\\DownloadManager')
->disableOriginalConstructor()
->getMock();
$this->composer
->setDownloadManager($this->dm);
$this->repository = $this
->getMock('Composer\\Repository\\InstalledRepositoryInterface');
$this->io = $this
->getMock('Composer\\IO\\IOInterface');
}
public function tearDown() {
$this->fs
->removeDirectory($this->vendorDir);
$this->fs
->removeDirectory($this->binDir);
}
public function testSupports($type, $expected) {
$installer = new Installer($this->io, $this->composer);
$this
->assertSame($expected, $installer
->supports($type), sprintf('Failed to show support for %s', $type));
}
public function dataForTestSupport() {
return array(
array(
'agl-module',
true,
),
array(
'aimeos-extension',
true,
),
array(
'annotatecms-module',
true,
),
array(
'annotatecms-component',
true,
),
array(
'annotatecms-service',
true,
),
array(
'bitrix-module',
true,
),
array(
'bitrix-component',
true,
),
array(
'bitrix-theme',
true,
),
array(
'cakephp',
false,
),
array(
'cakephp-',
false,
),
array(
'cakephp-app',
false,
),
array(
'cakephp-plugin',
true,
),
array(
'chef-cookbook',
true,
),
array(
'chef-role',
true,
),
array(
'codeigniter-app',
false,
),
array(
'codeigniter-library',
true,
),
array(
'codeigniter-third-party',
true,
),
array(
'codeigniter-module',
true,
),
array(
'concrete5-block',
true,
),
array(
'concrete5-package',
true,
),
array(
'concrete5-theme',
true,
),
array(
'concrete5-update',
true,
),
array(
'craft-plugin',
true,
),
array(
'croogo-plugin',
true,
),
array(
'croogo-theme',
true,
),
array(
'dokuwiki-plugin',
true,
),
array(
'dokuwiki-template',
true,
),
array(
'drupal-module',
true,
),
array(
'dolibarr-module',
true,
),
array(
'elgg-plugin',
true,
),
array(
'fuel-module',
true,
),
array(
'fuel-package',
true,
),
array(
'fuel-theme',
true,
),
array(
'fuelphp-component',
true,
),
array(
'hurad-plugin',
true,
),
array(
'hurad-theme',
true,
),
array(
'joomla-library',
true,
),
array(
'kirby-plugin',
true,
),
array(
'kohana-module',
true,
),
array(
'laravel-library',
true,
),
array(
'lithium-library',
true,
),
array(
'magento-library',
true,
),
array(
'mako-package',
true,
),
array(
'modxevo-snippet',
true,
),
array(
'modxevo-plugin',
true,
),
array(
'modxevo-module',
true,
),
array(
'modxevo-template',
true,
),
array(
'modxevo-lib',
true,
),
array(
'mediawiki-extension',
true,
),
array(
'mediawiki-skin',
true,
),
array(
'microweber-module',
true,
),
array(
'modulework-module',
true,
),
array(
'moodle-mod',
true,
),
array(
'october-module',
true,
),
array(
'october-plugin',
true,
),
array(
'piwik-plugin',
true,
),
array(
'phpbb-extension',
true,
),
array(
'pimcore-plugin',
true,
),
array(
'ppi-module',
true,
),
array(
'prestashop-module',
true,
),
array(
'prestashop-theme',
true,
),
array(
'puppet-module',
true,
),
array(
'redaxo-addon',
true,
),
array(
'redaxo-bestyle-plugin',
true,
),
array(
'roundcube-plugin',
true,
),
array(
'shopware-backend-plugin',
true,
),
array(
'shopware-core-plugin',
true,
),
array(
'shopware-frontend-plugin',
true,
),
array(
'shopware-theme',
true,
),
array(
'silverstripe-module',
true,
),
array(
'silverstripe-theme',
true,
),
array(
'smf-module',
true,
),
array(
'smf-theme',
true,
),
array(
'symfony1-plugin',
true,
),
array(
'thelia-module',
true,
),
array(
'thelia-frontoffice-template',
true,
),
array(
'thelia-backoffice-template',
true,
),
array(
'thelia-email-template',
true,
),
array(
'tusk-task',
true,
),
array(
'tusk-asset',
true,
),
array(
'typo3-flow-plugin',
true,
),
array(
'typo3-cms-extension',
true,
),
array(
'whmcs-gateway',
true,
),
array(
'wolfcms-plugin',
true,
),
array(
'wordpress-plugin',
true,
),
array(
'wordpress-core',
false,
),
array(
'zend-library',
true,
),
array(
'zikula-module',
true,
),
array(
'zikula-theme',
true,
),
);
}
public function testInstallPath($type, $path, $name, $version = '1.0.0') {
$installer = new Installer($this->io, $this->composer);
$package = new Package($name, $version, $version);
$package
->setType($type);
$result = $installer
->getInstallPath($package);
$this
->assertEquals($path, $result);
}
public function dataForTestInstallPath() {
return array(
array(
'agl-module',
'More/MyTestPackage/',
'agl/my_test-package',
),
array(
'aimeos-extension',
'ext/ai-test/',
'author/ai-test',
),
array(
'annotatecms-module',
'addons/modules/my_module/',
'vysinsky/my_module',
),
array(
'annotatecms-component',
'addons/components/my_component/',
'vysinsky/my_component',
),
array(
'annotatecms-service',
'addons/services/my_service/',
'vysinsky/my_service',
),
array(
'bitrix-module',
'local/modules/my_module/',
'author/my_module',
),
array(
'bitrix-component',
'local/components/my_component/',
'author/my_component',
),
array(
'bitrix-theme',
'local/templates/my_theme/',
'author/my_theme',
),
array(
'cakephp-plugin',
'Plugin/Ftp/',
'shama/ftp',
),
array(
'chef-cookbook',
'Chef/mre/my_cookbook/',
'mre/my_cookbook',
),
array(
'chef-role',
'Chef/roles/my_role/',
'mre/my_role',
),
array(
'codeigniter-library',
'application/libraries/my_package/',
'shama/my_package',
),
array(
'codeigniter-module',
'application/modules/my_package/',
'shama/my_package',
),
array(
'concrete5-block',
'blocks/concrete5_block/',
'remo/concrete5_block',
),
array(
'concrete5-package',
'packages/concrete5_package/',
'remo/concrete5_package',
),
array(
'concrete5-theme',
'themes/concrete5_theme/',
'remo/concrete5_theme',
),
array(
'concrete5-update',
'updates/concrete5/',
'concrete5/concrete5',
),
array(
'craft-plugin',
'craft/plugins/my_plugin/',
'mdcpepper/my_plugin',
),
array(
'croogo-plugin',
'Plugin/Sitemaps/',
'fahad19/sitemaps',
),
array(
'croogo-theme',
'View/Themed/Readable/',
'rchavik/readable',
),
array(
'dokuwiki-plugin',
'lib/plugins/someplugin/',
'author/someplugin',
),
array(
'dokuwiki-template',
'lib/tpl/sometemplate/',
'author/sometemplate',
),
array(
'dolibarr-module',
'htdocs/custom/my_module/',
'shama/my_module',
),
array(
'drupal-module',
'modules/my_module/',
'shama/my_module',
),
array(
'drupal-theme',
'themes/my_module/',
'shama/my_module',
),
array(
'drupal-profile',
'profiles/my_module/',
'shama/my_module',
),
array(
'drupal-drush',
'drush/my_module/',
'shama/my_module',
),
array(
'elgg-plugin',
'mod/sample_plugin/',
'test/sample_plugin',
),
array(
'fuel-module',
'fuel/app/modules/module/',
'fuel/module',
),
array(
'fuel-package',
'fuel/packages/orm/',
'fuel/orm',
),
array(
'fuel-theme',
'fuel/app/themes/theme/',
'fuel/theme',
),
array(
'fuelphp-component',
'components/demo/',
'fuelphp/demo',
),
array(
'hurad-plugin',
'plugins/Akismet/',
'atkrad/akismet',
),
array(
'hurad-theme',
'plugins/Hurad2013/',
'atkrad/Hurad2013',
),
array(
'joomla-plugin',
'plugins/my_plugin/',
'shama/my_plugin',
),
array(
'kirby-plugin',
'site/plugins/my_plugin/',
'shama/my_plugin',
),
array(
'kohana-module',
'modules/my_package/',
'shama/my_package',
),
array(
'laravel-library',
'libraries/my_package/',
'shama/my_package',
),
array(
'lithium-library',
'libraries/li3_test/',
'user/li3_test',
),
array(
'magento-library',
'lib/foo/',
'test/foo',
),
array(
'modxevo-snippet',
'assets/snippets/my_snippet/',
'shama/my_snippet',
),
array(
'modxevo-plugin',
'assets/plugins/my_plugin/',
'shama/my_plugin',
),
array(
'modxevo-module',
'assets/modules/my_module/',
'shama/my_module',
),
array(
'modxevo-template',
'assets/templates/my_template/',
'shama/my_template',
),
array(
'modxevo-lib',
'assets/lib/my_lib/',
'shama/my_lib',
),
array(
'mako-package',
'app/packages/my_package/',
'shama/my_package',
),
array(
'mediawiki-extension',
'extensions/APC/',
'author/APC',
),
array(
'mediawiki-extension',
'extensions/APC/',
'author/APC-extension',
),
array(
'mediawiki-extension',
'extensions/UploadWizard/',
'author/upload-wizard',
),
array(
'mediawiki-extension',
'extensions/SyntaxHighlight_GeSHi/',
'author/syntax-highlight_GeSHi',
),
array(
'mediawiki-skin',
'skins/someskin/',
'author/someskin-skin',
),
array(
'mediawiki-skin',
'skins/someskin/',
'author/someskin',
),
array(
'microweber-module',
'userfiles/modules/my-thing/',
'author/my-thing-module',
),
array(
'modulework-module',
'modules/my_package/',
'shama/my_package',
),
array(
'moodle-mod',
'mod/my_package/',
'shama/my_package',
),
array(
'october-module',
'modules/my_plugin/',
'shama/my_plugin',
),
array(
'october-plugin',
'plugins/shama/my_plugin/',
'shama/my_plugin',
),
array(
'october-theme',
'themes/my_theme/',
'shama/my_theme',
),
array(
'piwik-plugin',
'plugins/VisitSummary/',
'shama/visit-summary',
),
array(
'prestashop-module',
'modules/a-module/',
'vendor/a-module',
),
array(
'prestashop-theme',
'themes/a-theme/',
'vendor/a-theme',
),
array(
'phpbb-extension',
'ext/test/foo/',
'test/foo',
),
array(
'phpbb-style',
'styles/foo/',
'test/foo',
),
array(
'phpbb-language',
'language/foo/',
'test/foo',
),
array(
'pimcore-plugin',
'plugins/MyPlugin/',
'ubikz/my_plugin',
),
array(
'ppi-module',
'modules/foo/',
'test/foo',
),
array(
'puppet-module',
'modules/puppet-name/',
'puppet/puppet-name',
),
array(
'redaxo-addon',
'redaxo/include/addons/my_plugin/',
'shama/my_plugin',
),
array(
'redaxo-bestyle-plugin',
'redaxo/include/addons/be_style/plugins/my_plugin/',
'shama/my_plugin',
),
array(
'roundcube-plugin',
'plugins/base/',
'test/base',
),
array(
'roundcube-plugin',
'plugins/replace_dash/',
'test/replace-dash',
),
array(
'shopware-backend-plugin',
'engine/Shopware/Plugins/Local/Backend/ShamaMyBackendPlugin/',
'shama/my-backend-plugin',
),
array(
'shopware-core-plugin',
'engine/Shopware/Plugins/Local/Core/ShamaMyCorePlugin/',
'shama/my-core-plugin',
),
array(
'shopware-frontend-plugin',
'engine/Shopware/Plugins/Local/Frontend/ShamaMyFrontendPlugin/',
'shama/my-frontend-plugin',
),
array(
'shopware-theme',
'templates/my_theme/',
'shama/my-theme',
),
array(
'silverstripe-module',
'my_module/',
'shama/my_module',
),
array(
'silverstripe-module',
'sapphire/',
'silverstripe/framework',
'2.4.0',
),
array(
'silverstripe-module',
'framework/',
'silverstripe/framework',
'3.0.0',
),
array(
'silverstripe-module',
'framework/',
'silverstripe/framework',
'3.0.0-rc1',
),
array(
'silverstripe-module',
'framework/',
'silverstripe/framework',
'my/branch',
),
array(
'silverstripe-theme',
'themes/my_theme/',
'shama/my_theme',
),
array(
'smf-module',
'Sources/my_module/',
'shama/my_module',
),
array(
'smf-theme',
'Themes/my_theme/',
'shama/my_theme',
),
array(
'symfony1-plugin',
'plugins/sfShamaPlugin/',
'shama/sfShamaPlugin',
),
array(
'symfony1-plugin',
'plugins/sfShamaPlugin/',
'shama/sf-shama-plugin',
),
array(
'thelia-module',
'local/modules/my_module/',
'shama/my_module',
),
array(
'thelia-frontoffice-template',
'templates/frontOffice/my_template_fo/',
'shama/my_template_fo',
),
array(
'thelia-backoffice-template',
'templates/backOffice/my_template_bo/',
'shama/my_template_bo',
),
array(
'thelia-email-template',
'templates/email/my_template_email/',
'shama/my_template_email',
),
array(
'tusk-task',
'.tusk/tasks/my_task/',
'shama/my_task',
),
array(
'typo3-flow-package',
'Packages/Application/my_package/',
'shama/my_package',
),
array(
'typo3-flow-build',
'Build/my_package/',
'shama/my_package',
),
array(
'typo3-cms-extension',
'typo3conf/ext/my_extension/',
'shama/my_extension',
),
array(
'whmcs-gateway',
'modules/gateways/gateway_name/',
'vendor/gateway_name',
),
array(
'wolfcms-plugin',
'wolf/plugins/my_plugin/',
'shama/my_plugin',
),
array(
'wordpress-plugin',
'wp-content/plugins/my_plugin/',
'shama/my_plugin',
),
array(
'wordpress-muplugin',
'wp-content/mu-plugins/my_plugin/',
'shama/my_plugin',
),
array(
'zend-extra',
'extras/library/zend_test/',
'shama/zend_test',
),
array(
'zikula-module',
'modules/my-test_module/',
'my/test_module',
),
array(
'zikula-theme',
'themes/my-test_theme/',
'my/test_theme',
),
);
}
public function testGetCakePHPInstallPathException() {
$installer = new Installer($this->io, $this->composer);
$package = new Package('shama/ftp', '1.0.0', '1.0.0');
$package
->setType('cakephp-whoops');
$result = $installer
->getInstallPath($package);
}
public function testCustomInstallPath() {
$installer = new Installer($this->io, $this->composer);
$package = new Package('shama/ftp', '1.0.0', '1.0.0');
$package
->setType('cakephp-plugin');
$consumerPackage = new RootPackage('foo/bar', '1.0.0', '1.0.0');
$this->composer
->setPackage($consumerPackage);
$consumerPackage
->setExtra(array(
'installer-paths' => array(
'my/custom/path/{$name}/' => array(
'shama/ftp',
'foo/bar',
),
),
));
$result = $installer
->getInstallPath($package);
$this
->assertEquals('my/custom/path/Ftp/', $result);
}
public function testCustomInstallerName() {
$installer = new Installer($this->io, $this->composer);
$package = new Package('shama/cakephp-ftp-plugin', '1.0.0', '1.0.0');
$package
->setType('cakephp-plugin');
$package
->setExtra(array(
'installer-name' => 'FTP',
));
$result = $installer
->getInstallPath($package);
$this
->assertEquals('Plugin/FTP/', $result);
}
public function testCustomTypePath() {
$installer = new Installer($this->io, $this->composer);
$package = new Package('slbmeh/my_plugin', '1.0.0', '1.0.0');
$package
->setType('wordpress-plugin');
$consumerPackage = new RootPackage('foo/bar', '1.0.0', '1.0.0');
$this->composer
->setPackage($consumerPackage);
$consumerPackage
->setExtra(array(
'installer-paths' => array(
'my/custom/path/{$name}/' => array(
'type:wordpress-plugin',
),
),
));
$result = $installer
->getInstallPath($package);
$this
->assertEquals('my/custom/path/my_plugin/', $result);
}
public function testNoVendorName() {
$installer = new Installer($this->io, $this->composer);
$package = new Package('sfPhpunitPlugin', '1.0.0', '1.0.0');
$package
->setType('symfony1-plugin');
$result = $installer
->getInstallPath($package);
$this
->assertEquals('plugins/sfPhpunitPlugin/', $result);
}
public function testTypo3Inflection() {
$installer = new Installer($this->io, $this->composer);
$package = new Package('typo3/fluid', '1.0.0', '1.0.0');
$package
->setAutoload(array(
'psr-0' => array(
'TYPO3\\Fluid' => 'Classes',
),
));
$package
->setType('typo3-flow-package');
$result = $installer
->getInstallPath($package);
$this
->assertEquals('Packages/Application/TYPO3.Fluid/', $result);
}
public function testUninstallAndDeletePackageFromLocalRepo() {
$package = new Package('foo', '1.0.0', '1.0.0');
$installer = $this
->getMock('Composer\\Installers\\Installer', array(
'getInstallPath',
), array(
$this->io,
$this->composer,
));
$installer
->expects($this
->once())
->method('getInstallPath')
->with($package)
->will($this
->returnValue(sys_get_temp_dir() . '/foo'));
$repo = $this
->getMock('Composer\\Repository\\InstalledRepositoryInterface');
$repo
->expects($this
->once())
->method('hasPackage')
->with($package)
->will($this
->returnValue(true));
$repo
->expects($this
->once())
->method('removePackage')
->with($package);
$installer
->uninstall($repo, $package);
}
}