* Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Test\EventDispatcher; use Composer\EventDispatcher\Event; use Composer\EventDispatcher\EventDispatcher; use Composer\Installer\InstallerEvents; use Composer\TestCase; use Composer\Script\ScriptEvents; use Composer\Script\CommandEvent; use Composer\Util\ProcessExecutor; class EventDispatcherTest extends TestCase { /** * @expectedException RuntimeException */ public function testListenerExceptionsAreCaught() { $io = $this->getMock('Composer\IO\IOInterface'); $dispatcher = $this->getDispatcherStubForListenersTest(array( 'Composer\Test\EventDispatcher\EventDispatcherTest::call' ), $io); $io->expects($this->once()) ->method('write') ->with('Script Composer\Test\EventDispatcher\EventDispatcherTest::call handling the post-install-cmd event terminated with an exception'); $dispatcher->dispatchCommandEvent(ScriptEvents::POST_INSTALL_CMD, false); } public function testDispatcherCanConvertScriptEventToCommandEventForListener() { $io = $this->getMock('Composer\IO\IOInterface'); $dispatcher = $this->getDispatcherStubForListenersTest(array( 'Composer\Test\EventDispatcher\EventDispatcherTest::expectsCommandEvent' ), $io); $this->assertEquals(1, $dispatcher->dispatchScript(ScriptEvents::POST_INSTALL_CMD, false)); } public function testDispatcherDoesNotAttemptConversionForListenerWithoutTypehint() { $io = $this->getMock('Composer\IO\IOInterface'); $dispatcher = $this->getDispatcherStubForListenersTest(array( 'Composer\Test\EventDispatcher\EventDispatcherTest::expectsVariableEvent' ), $io); $this->assertEquals(1, $dispatcher->dispatchScript(ScriptEvents::POST_INSTALL_CMD, false)); } /** * @dataProvider getValidCommands * @param string $command */ public function testDispatcherCanExecuteSingleCommandLineScript($command) { $process = $this->getMock('Composer\Util\ProcessExecutor'); $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') ->setConstructorArgs(array( $this->getMock('Composer\Composer'), $this->getMock('Composer\IO\IOInterface'), $process, )) ->setMethods(array('getListeners')) ->getMock(); $listener = array($command); $dispatcher->expects($this->atLeastOnce()) ->method('getListeners') ->will($this->returnValue($listener)); $process->expects($this->once()) ->method('execute') ->with($command) ->will($this->returnValue(0)); $dispatcher->dispatchCommandEvent(ScriptEvents::POST_INSTALL_CMD, false); } public function testDispatcherCanExecuteCliAndPhpInSameEventScriptStack() { $process = $this->getMock('Composer\Util\ProcessExecutor'); $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') ->setConstructorArgs(array( $this->getMock('Composer\Composer'), $this->getMock('Composer\IO\IOInterface'), $process, )) ->setMethods(array( 'getListeners', 'executeEventPhpScript', )) ->getMock(); $process->expects($this->exactly(2)) ->method('execute') ->will($this->returnValue(0)); $listeners = array( 'echo -n foo', 'Composer\\Test\\EventDispatcher\\EventDispatcherTest::someMethod', 'echo -n bar', ); $dispatcher->expects($this->atLeastOnce()) ->method('getListeners') ->will($this->returnValue($listeners)); $dispatcher->expects($this->once()) ->method('executeEventPhpScript') ->with('Composer\Test\EventDispatcher\EventDispatcherTest', 'someMethod') ->will($this->returnValue(true)); $dispatcher->dispatchCommandEvent(ScriptEvents::POST_INSTALL_CMD, false); } private function getDispatcherStubForListenersTest($listeners, $io) { $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') ->setConstructorArgs(array( $this->getMock('Composer\Composer'), $io, )) ->setMethods(array('getListeners')) ->getMock(); $dispatcher->expects($this->atLeastOnce()) ->method('getListeners') ->will($this->returnValue($listeners)); return $dispatcher; } public function getValidCommands() { return array( array('phpunit'), array('echo foo'), array('echo -n foo'), ); } public function testDispatcherOutputsCommands() { $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') ->setConstructorArgs(array( $this->getMock('Composer\Composer'), $this->getMock('Composer\IO\IOInterface'), new ProcessExecutor, )) ->setMethods(array('getListeners')) ->getMock(); $listener = array('echo foo'); $dispatcher->expects($this->atLeastOnce()) ->method('getListeners') ->will($this->returnValue($listener)); ob_start(); $dispatcher->dispatchCommandEvent(ScriptEvents::POST_INSTALL_CMD, false); $this->assertEquals('foo', trim(ob_get_clean())); } public function testDispatcherOutputsErrorOnFailedCommand() { $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') ->setConstructorArgs(array( $this->getMock('Composer\Composer'), $io = $this->getMock('Composer\IO\IOInterface'), new ProcessExecutor, )) ->setMethods(array('getListeners')) ->getMock(); $code = 'exit 1'; $listener = array($code); $dispatcher->expects($this->atLeastOnce()) ->method('getListeners') ->will($this->returnValue($listener)); $io->expects($this->once()) ->method('write') ->with($this->equalTo('Script '.$code.' handling the post-install-cmd event returned with an error')); $this->setExpectedException('RuntimeException'); $dispatcher->dispatchCommandEvent(ScriptEvents::POST_INSTALL_CMD, false); } public function testDispatcherInstallerEvents() { $process = $this->getMock('Composer\Util\ProcessExecutor'); $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') ->setConstructorArgs(array( $this->getMock('Composer\Composer'), $this->getMock('Composer\IO\IOInterface'), $process, )) ->setMethods(array('getListeners')) ->getMock(); $dispatcher->expects($this->atLeastOnce()) ->method('getListeners') ->will($this->returnValue(array())); $policy = $this->getMock('Composer\DependencyResolver\PolicyInterface'); $pool = $this->getMockBuilder('Composer\DependencyResolver\Pool')->disableOriginalConstructor()->getMock(); $installedRepo = $this->getMockBuilder('Composer\Repository\CompositeRepository')->disableOriginalConstructor()->getMock(); $request = $this->getMockBuilder('Composer\DependencyResolver\Request')->disableOriginalConstructor()->getMock(); $dispatcher->dispatchInstallerEvent(InstallerEvents::PRE_DEPENDENCIES_SOLVING, $policy, $pool, $installedRepo, $request); $dispatcher->dispatchInstallerEvent(InstallerEvents::POST_DEPENDENCIES_SOLVING, $policy, $pool, $installedRepo, $request, array()); } public static function call() { throw new \RuntimeException(); } public static function expectsCommandEvent(CommandEvent $event) { return false; } public static function expectsVariableEvent($event) { return false; } public static function someMethod() { return true; } }