Subversion Repositories SmartDukaan

Rev

Blame | Last modification | View Log | RSS feed

<?php
/**
 * ShellDispatcherTest file
 *
 * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice
 *
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
 * @package       Cake.Test.Case.Console
 * @since         CakePHP(tm) v 1.2.0.5432
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 */

App::uses('ShellDispatcher', 'Console');

/**
 * TestShellDispatcher class
 *
 * @package       Cake.Test.Case.Console
 */
class TestShellDispatcher extends ShellDispatcher {

/**
 * params property
 *
 * @var array
 */
        public $params = array();

/**
 * stopped property
 *
 * @var string
 */
        public $stopped = null;

/**
 * TestShell
 *
 * @var mixed
 */
        public $TestShell;

/**
 * _initEnvironment method
 *
 * @return void
 */
        protected function _initEnvironment() {
        }

/**
 * clear method
 *
 * @return void
 */
        public function clear() {
        }

/**
 * _stop method
 *
 * @return void
 */
        protected function _stop($status = 0) {
                $this->stopped = 'Stopped with status: ' . $status;
                return $status;
        }

/**
 * getShell
 *
 * @param string $shell
 * @return mixed
 */
        public function getShell($shell) {
                return $this->_getShell($shell);
        }

/**
 * _getShell
 *
 * @param string $plugin
 * @return mixed
 */
        protected function _getShell($shell) {
                if (isset($this->TestShell)) {
                        return $this->TestShell;
                }
                return parent::_getShell($shell);
        }

}

/**
 * ShellDispatcherTest
 *
 * @package       Cake.Test.Case.Console
 */
class ShellDispatcherTest extends CakeTestCase {

/**
 * setUp method
 *
 * @return void
 */
        public function setUp() {
                parent::setUp();
                App::build(array(
                        'Plugin' => array(
                                CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS
                        ),
                        'Console/Command' => array(
                                CAKE . 'Test' . DS . 'test_app' . DS . 'Console' . DS . 'Command' . DS
                        )
                ), App::RESET);
                CakePlugin::load('TestPlugin');
        }

/**
 * tearDown method
 *
 * @return void
 */
        public function tearDown() {
                parent::tearDown();
                CakePlugin::unload();
        }

/**
 * testParseParams method
 *
 * @return void
 */
        public function testParseParams() {
                $Dispatcher = new TestShellDispatcher();

                $params = array(
                        '/cake/1.2.x.x/cake/console/cake.php',
                        'bake',
                        '-app',
                        'new',
                        '-working',
                        '/var/www/htdocs'
                );
                $expected = array(
                        'app' => 'new',
                        'webroot' => 'webroot',
                        'working' => str_replace('/', DS, '/var/www/htdocs/new'),
                        'root' => str_replace('/', DS, '/var/www/htdocs')
                );
                $Dispatcher->parseParams($params);
                $this->assertEquals($expected, $Dispatcher->params);

                $params = array('cake.php');
                $expected = array(
                        'app' => 'app',
                        'webroot' => 'webroot',
                        'working' => str_replace('\\', DS, dirname(CAKE_CORE_INCLUDE_PATH) . DS . 'app'),
                        'root' => str_replace('\\', DS, dirname(CAKE_CORE_INCLUDE_PATH)),
                );
                $Dispatcher->params = $Dispatcher->args = array();
                $Dispatcher->parseParams($params);
                $this->assertEquals($expected, $Dispatcher->params);

                $params = array(
                        'cake.php',
                        '-app',
                        'new',
                );
                $expected = array(
                        'app' => 'new',
                        'webroot' => 'webroot',
                        'working' => str_replace('\\', DS, dirname(CAKE_CORE_INCLUDE_PATH) . DS . 'new'),
                        'root' => str_replace('\\', DS, dirname(CAKE_CORE_INCLUDE_PATH))
                );
                $Dispatcher->params = $Dispatcher->args = array();
                $Dispatcher->parseParams($params);
                $this->assertEquals($expected, $Dispatcher->params);

                $params = array(
                        './cake.php',
                        'bake',
                        '-app',
                        'new',
                        '-working',
                        '/cake/1.2.x.x/cake/console'
                );

                $expected = array(
                        'app' => 'new',
                        'webroot' => 'webroot',
                        'working' => str_replace('\\', DS, dirname(CAKE_CORE_INCLUDE_PATH) . DS . 'new'),
                        'root' => str_replace('\\', DS, dirname(CAKE_CORE_INCLUDE_PATH))
                );

                $Dispatcher->params = $Dispatcher->args = array();
                $Dispatcher->parseParams($params);
                $this->assertEquals($expected, $Dispatcher->params);

                $params = array(
                        './console/cake.php',
                        'bake',
                        '-app',
                        'new',
                        '-working',
                        '/cake/1.2.x.x/cake'
                );
                $expected = array(
                        'app' => 'new',
                        'webroot' => 'webroot',
                        'working' => str_replace('\\', DS, dirname(CAKE_CORE_INCLUDE_PATH) . DS . 'new'),
                        'root' => str_replace('\\', DS, dirname(CAKE_CORE_INCLUDE_PATH))
                );
                $Dispatcher->params = $Dispatcher->args = array();
                $Dispatcher->parseParams($params);
                $this->assertEquals($expected, $Dispatcher->params);

                $params = array(
                        './console/cake.php',
                        'bake',
                        '-app',
                        'new',
                        '-dry',
                        '-working',
                        '/cake/1.2.x.x/cake'
                );
                $expected = array(
                        'app' => 'new',
                        'working' => str_replace('\\', DS, dirname(CAKE_CORE_INCLUDE_PATH) . DS . 'new'),
                        'root' => str_replace('\\', DS, dirname(CAKE_CORE_INCLUDE_PATH)),
                        'webroot' => 'webroot'
                );
                $Dispatcher->params = $Dispatcher->args = array();
                $Dispatcher->parseParams($params);
                $this->assertEquals($expected, $Dispatcher->params);

                $params = array(
                        './console/cake.php',
                        '-working',
                        '/cake/1.2.x.x/cake',
                        'schema',
                        'run',
                        'create',
                        '-dry',
                        '-f',
                        '-name',
                        'DbAcl'
                );
                $expected = array(
                        'app' => 'app',
                        'webroot' => 'webroot',
                        'working' => str_replace('\\', DS, dirname(CAKE_CORE_INCLUDE_PATH) . DS . 'app'),
                        'root' => str_replace('\\', DS, dirname(CAKE_CORE_INCLUDE_PATH)),
                );
                $Dispatcher->params = $Dispatcher->args = array();
                $Dispatcher->parseParams($params);
                $this->assertEquals($expected, $Dispatcher->params);

                $expected = array(
                        './console/cake.php', 'schema', 'run', 'create', '-dry', '-f', '-name', 'DbAcl'
                );
                $this->assertEquals($expected, $Dispatcher->args);

                $params = array(
                        '/cake/1.2.x.x/cake/console/cake.php',
                        '-working',
                        '/cake/1.2.x.x/app',
                        'schema',
                        'run',
                        'create',
                        '-dry',
                        '-name',
                        'DbAcl'
                );
                $expected = array(
                        'app' => 'app',
                        'webroot' => 'webroot',
                        'working' => str_replace('/', DS, '/cake/1.2.x.x/app'),
                        'root' => str_replace('/', DS, '/cake/1.2.x.x'),
                );
                $Dispatcher->params = $Dispatcher->args = array();
                $Dispatcher->parseParams($params);
                $this->assertEquals($expected, $Dispatcher->params);

                $params = array(
                        'cake.php',
                        '-working',
                        'C:/wamp/www/cake/app',
                        'bake',
                        '-app',
                        'C:/wamp/www/apps/cake/app',
                );
                $expected = array(
                        'app' => 'app',
                        'webroot' => 'webroot',
                        'working' => 'C:\wamp\www\apps\cake\app',
                        'root' => 'C:\wamp\www\apps\cake'
                );

                $Dispatcher->params = $Dispatcher->args = array();
                $Dispatcher->parseParams($params);
                $this->assertEquals($expected, $Dispatcher->params);

                $params = array(
                        'cake.php',
                        '-working',
                        'C:\wamp\www\cake\app',
                        'bake',
                        '-app',
                        'C:\wamp\www\apps\cake\app',
                );
                $expected = array(
                        'app' => 'app',
                        'webroot' => 'webroot',
                        'working' => 'C:\wamp\www\apps\cake\app',
                        'root' => 'C:\wamp\www\apps\cake'
                );
                $Dispatcher->params = $Dispatcher->args = array();
                $Dispatcher->parseParams($params);
                $this->assertEquals($expected, $Dispatcher->params);

                $params = array(
                        'cake.php',
                        '-working',
                        'C:\wamp\www\apps',
                        'bake',
                        '-app',
                        'cake\app',
                        '-url',
                        'http://example.com/some/url/with/a/path'
                );
                $expected = array(
                        'app' => 'app',
                        'webroot' => 'webroot',
                        'working' => 'C:\wamp\www\apps\cake\app',
                        'root' => 'C:\wamp\www\apps\cake',
                );
                $Dispatcher->params = $Dispatcher->args = array();
                $Dispatcher->parseParams($params);
                $this->assertEquals($expected, $Dispatcher->params);

                $params = array(
                        '/home/amelo/dev/cake-common/cake/console/cake.php',
                        '-root',
                        '/home/amelo/dev/lsbu-vacancy',
                        '-working',
                        '/home/amelo/dev/lsbu-vacancy',
                        '-app',
                        'app',
                );
                $expected = array(
                        'app' => 'app',
                        'webroot' => 'webroot',
                        'working' => '/home/amelo/dev/lsbu-vacancy/app',
                        'root' => '/home/amelo/dev/lsbu-vacancy',
                );
                $Dispatcher->params = $Dispatcher->args = array();
                $Dispatcher->parseParams($params);
                $this->assertEquals($expected, $Dispatcher->params);

                $params = array(
                        '/cake/1.2.x.x/cake/console/cake.php',
                        'bake',
                        '-app',
                        'new',
                        '-app',
                        'old',
                        '-working',
                        '/var/www/htdocs'
                );
                $expected = array(
                        'app' => 'old',
                        'webroot' => 'webroot',
                        'working' => str_replace('/', DS, '/var/www/htdocs/old'),
                        'root' => str_replace('/', DS, '/var/www/htdocs')
                );
                $Dispatcher->parseParams($params);
                $this->assertEquals($expected, $Dispatcher->params);

                if (DS === '\\') {
                        $params = array(
                                'cake.php',
                                '-working',
                                'D:\www',
                                'bake',
                                'my_app',
                        );
                        $expected = array(
                                'working' => 'D:\\\\www',
                                'app' => 'www',
                                'root' => 'D:\\',
                                'webroot' => 'webroot'
                        );

                        $Dispatcher->params = $Dispatcher->args = array();
                        $Dispatcher->parseParams($params);
                        $this->assertEquals($expected, $Dispatcher->params);
                }
        }

/**
 * Verify loading of (plugin-) shells
 *
 * @return void
 */
        public function testGetShell() {
                $this->skipIf(class_exists('SampleShell'), 'SampleShell Class already loaded.');
                $this->skipIf(class_exists('ExampleShell'), 'ExampleShell Class already loaded.');

                $Dispatcher = new TestShellDispatcher();

                $result = $Dispatcher->getShell('sample');
                $this->assertInstanceOf('SampleShell', $result);

                $Dispatcher = new TestShellDispatcher();
                $result = $Dispatcher->getShell('test_plugin.example');
                $this->assertInstanceOf('ExampleShell', $result);
                $this->assertEquals('TestPlugin', $result->plugin);
                $this->assertEquals('Example', $result->name);

                $Dispatcher = new TestShellDispatcher();
                $result = $Dispatcher->getShell('TestPlugin.example');
                $this->assertInstanceOf('ExampleShell', $result);
        }

/**
 * Verify correct dispatch of Shell subclasses with a main method
 *
 * @return void
 */
        public function testDispatchShellWithMain() {
                $Dispatcher = new TestShellDispatcher();
                $Shell = $this->getMock('Shell');

                $Shell->expects($this->once())->method('initialize');
                $Shell->expects($this->once())->method('runCommand')
                        ->with(null, array())
                        ->will($this->returnValue(true));

                $Dispatcher->TestShell = $Shell;

                $Dispatcher->args = array('mock_with_main');
                $result = $Dispatcher->dispatch();
                $this->assertTrue($result);
                $this->assertEquals(array(), $Dispatcher->args);
        }

/**
 * Verify correct dispatch of Shell subclasses without a main method
 *
 * @return void
 */
        public function testDispatchShellWithoutMain() {
                $Dispatcher = new TestShellDispatcher();
                $Shell = $this->getMock('Shell');

                $Shell->expects($this->once())->method('initialize');
                $Shell->expects($this->once())->method('runCommand')
                        ->with('initdb', array('initdb'))
                        ->will($this->returnValue(true));

                $Dispatcher->TestShell = $Shell;

                $Dispatcher->args = array('mock_without_main', 'initdb');
                $result = $Dispatcher->dispatch();
                $this->assertTrue($result);
        }

/**
 * Verify correct dispatch of custom classes with a main method
 *
 * @return void
 */
        public function testDispatchNotAShellWithMain() {
                $Dispatcher = new TestShellDispatcher();
                $methods = get_class_methods('Object');
                array_push($methods, 'main', 'initdb', 'initialize', 'loadTasks', 'startup', '_secret');
                $Shell = $this->getMock('Object', $methods);

                $Shell->expects($this->never())->method('initialize');
                $Shell->expects($this->once())->method('startup');
                $Shell->expects($this->once())->method('main')->will($this->returnValue(true));
                $Dispatcher->TestShell = $Shell;

                $Dispatcher->args = array('mock_with_main_not_a');
                $result = $Dispatcher->dispatch();
                $this->assertTrue($result);
                $this->assertEquals(array(), $Dispatcher->args);

                $Shell = $this->getMock('Object', $methods);
                $Shell->expects($this->once())->method('initdb')->will($this->returnValue(true));
                $Shell->expects($this->once())->method('startup');
                $Dispatcher->TestShell = $Shell;

                $Dispatcher->args = array('mock_with_main_not_a', 'initdb');
                $result = $Dispatcher->dispatch();
                $this->assertTrue($result);
        }

/**
 * Verify correct dispatch of custom classes without a main method
 *
 * @return void
 */
        public function testDispatchNotAShellWithoutMain() {
                $Dispatcher = new TestShellDispatcher();
                $methods = get_class_methods('Object');
                array_push($methods, 'main', 'initdb', 'initialize', 'loadTasks', 'startup', '_secret');
                $Shell = $this->getMock('Object', $methods);

                $Shell->expects($this->never())->method('initialize');
                $Shell->expects($this->once())->method('startup');
                $Shell->expects($this->once())->method('main')->will($this->returnValue(true));
                $Dispatcher->TestShell = $Shell;

                $Dispatcher->args = array('mock_without_main_not_a');
                $result = $Dispatcher->dispatch();
                $this->assertTrue($result);
                $this->assertEquals(array(), $Dispatcher->args);

                $Shell = $this->getMock('Object', $methods);
                $Shell->expects($this->once())->method('initdb')->will($this->returnValue(true));
                $Shell->expects($this->once())->method('startup');
                $Dispatcher->TestShell = $Shell;

                $Dispatcher->args = array('mock_without_main_not_a', 'initdb');
                $result = $Dispatcher->dispatch();
                $this->assertTrue($result);
        }

/**
 * Verify shifting of arguments
 *
 * @return void
 */
        public function testShiftArgs() {
                $Dispatcher = new TestShellDispatcher();

                $Dispatcher->args = array('a', 'b', 'c');
                $this->assertEquals('a', $Dispatcher->shiftArgs());
                $this->assertSame($Dispatcher->args, array('b', 'c'));

                $Dispatcher->args = array('a' => 'b', 'c', 'd');
                $this->assertEquals('b', $Dispatcher->shiftArgs());
                $this->assertSame($Dispatcher->args, array('c', 'd'));

                $Dispatcher->args = array('a', 'b' => 'c', 'd');
                $this->assertEquals('a', $Dispatcher->shiftArgs());
                $this->assertSame($Dispatcher->args, array('b' => 'c', 'd'));

                $Dispatcher->args = array(0 => 'a', 2 => 'b', 30 => 'c');
                $this->assertEquals('a', $Dispatcher->shiftArgs());
                $this->assertSame($Dispatcher->args, array(0 => 'b', 1 => 'c'));

                $Dispatcher->args = array();
                $this->assertNull($Dispatcher->shiftArgs());
                $this->assertSame(array(), $Dispatcher->args);
        }

}