Perforce Chronicle 2012.2/486814
API Documentation

Setup_Test_IndexControllerTest Class Reference

'Smoke' tests for the setup module's IndexController. More...

List of all members.

Public Member Functions

 setUp ()
 Set hostname so that urls can be built correctly.
 testAdministrator ()
 Test adminstrator action.
 testIndex ()
 Test setup splash page.
 testIndexForward ()
 Test that index forwards to requirements action when start is set.
 testRewrite ()
 Test the rewrite action.
 testRolesCreation ()
 Test default roles creation.
 testSite ()
 Test site action.
 testSiteAndDepotCreation ()
 Test site & local p4d creation.
 testSiteCreation ()
 Test site creation.
 testStorage ()
 Test storage action.
 testSummary ()
 Test the summary action.
 testSystemRequirements ()
 Test requirements action.

Detailed Description

'Smoke' tests for the setup module's IndexController.

Copyright:
2011-2012 Perforce Software. All rights reserved
License:
Please see LICENSE.txt in top-level folder of this distribution.
Version:
2012.2/486814

Member Function Documentation

Setup_Test_IndexControllerTest::setUp ( )

Set hostname so that urls can be built correctly.

    {
        if (!defined('HTTP_HOST')) {
            $this->markTestSkipped('The HTTP_HOST is not defined.');
        }

        // we want the bootstrap to run without a perforce connection
        // so that the application thinks setup is needed.
        parent::setUp(null, TEST_DATA_PATH . '/application.ini');

        // reset any global session variables to ensure a known starting state
        $_SESSION = array();
    }
Setup_Test_IndexControllerTest::testAdministrator ( )

Test adminstrator action.

    {
        // prime session with perforce details for new server.
        $_SESSION['setup']['storage'] = array(
            'serverType'    => 'new',
            'port'          => ''
        );

        $this->dispatch('/setup/administrator');
        $body = $this->response->getBody();
        $this->assertResponseCode('200');
        $this->assertModule('setup');
        $this->assertController('index');
        $this->assertAction('administrator');
        $this->assertQuery("input[name='user']", 'Expected user');
        $this->assertQuery("input[name='email']", 'Expected user');
        $this->assertQuery("input[name='password']", 'Expected password');
        $this->assertQuery("input[name='passwordConfirm']", 'Expected password');
        $this->assertQuery("input[type='submit']", 'Expected submit');

        // prime session with perforce details for existing server.
        $this->resetRequest()->resetResponse();
        $_SESSION['setup']['storage'] = array(
            'serverType'    => 'existing',
            'port'          => $this->utility->getP4Params('port'),
        );

        $this->dispatch('/setup/administrator');
        $body = $this->response->getBody();
        $this->assertResponseCode('200');
        $this->assertModule('setup');
        $this->assertController('index');
        $this->assertAction('administrator');
        $this->assertQuery("input[name='user']", 'Expected user');
        $this->assertQuery("input[name='password']", 'Expected password');
        $this->assertNotQuery("input[name='email']", 'Did not expect email');
        $this->assertNotQuery("input[name='passwordConfirm']", 'Did not expect password confirm');
        $this->assertQuery("input[type='submit']", 'Expected submit');

        // use bad storage details in session
        $this->resetRequest()->resetResponse();
        $_SESSION['setup']['storage'] = array();

        $this->dispatch('/setup/administrator');
        $body = $this->response->getBody();
        $this->assertModule('setup');
        $this->assertController('index');
        $this->assertAction('administrator');
        $this->assertRedirectTo('/setup/storage', 'Expect redirect to storage.');

        // use bad administrator details
        $this->resetRequest()->resetResponse();
        $_SESSION['setup']['storage'] = array(
            'serverType'    => 'existing',
            'port'          => $this->utility->getP4Params('port'),
        );

        $adminData = array();
        $this->request->setPost($adminData);
        $this->request->setMethod('POST');
        $this->dispatch('/setup/administrator');
        $body = $this->response->getBody();
        $this->assertModule('setup');
        $this->assertController('index');
        $this->assertAction('administrator');
        $this->assertQuery("input[name='user']", 'Expected user');
        $this->assertQuery("input[name='password']", 'Expected password');
        $this->assertRegExp("/<li>Value is required and can't be empty<\/li>/", $body, 'Expected error');

        // use bad administrator details with Go Back clicked
        $this->resetRequest()->resetResponse();
        $_SESSION['setup']['storage'] = array(
            'serverType'    => 'existing',
            'port'          => $this->utility->getP4Params('port'),
        );

        $adminData = array(
            'goback'    => true
        );
        $this->request->setPost($adminData);
        $this->request->setMethod('POST');
        $this->dispatch('/setup/administrator');
        $body = $this->response->getBody();
        $this->assertModule('setup');
        $this->assertController('index');
        $this->assertAction('administrator');
        $this->assertRedirectTo('/setup/storage', 'Expect redirect to storage.');

        // use good administrator details for new server
        $this->resetRequest()->resetResponse();
        $_SESSION['setup']['storage'] = array(
            'serverType'    => 'new',
            'port'          => ''
        );

        $adminData = array(
            'user'              => 'admin-user',
            'email'             => 'admin@localhost',
            'password'          => 'admin-pass1',
            'passwordConfirm'   => 'admin-pass1'
        );
        $this->request->setPost($adminData);
        $this->request->setMethod('POST');
        $this->dispatch('/setup/administrator');
        $body = $this->response->getBody();
        $this->assertModule('setup');
        $this->assertController('index');
        $this->assertAction('administrator');
        $this->assertRedirectTo('/setup/site', 'Expect redirect to site.');

        // use good administrator details for new server with Go Back clicked
        $this->resetRequest()->resetResponse();
        $_SESSION['setup']['storage'] = array(
            'serverType'    => 'new',
            'port'          => ''
        );

        $adminData = array(
            'user'              => 'admin-user',
            'email'             => 'admin@localhost',
            'password'          => 'admin-pass1',
            'passwordConfirm'   => 'admin-pass1',
            'goback'            => true
        );
        $this->request->setPost($adminData);
        $this->request->setMethod('POST');
        $this->dispatch('/setup/administrator');
        $body = $this->response->getBody();
        $this->assertModule('setup');
        $this->assertController('index');
        $this->assertAction('administrator');
        $this->assertRedirectTo('/setup/storage', 'Expect redirect to storage.');

        // use good administrator details for existing server
        $this->resetRequest()->resetResponse();
        $_SESSION['setup']['storage'] = array(
            'serverType'    => 'existing',
            'port'          => $this->utility->getP4Params('port'),
        );

        $adminData = array(
            'user'      => $this->utility->getP4Params('user'),
            'password'  => $this->utility->getP4Params('password')
        );
        $this->request->setPost($adminData);
        $this->request->setMethod('POST');
        $this->dispatch('/setup/administrator');
        $body = $this->response->getBody();
        $this->assertModule('setup');
        $this->assertController('index');
        $this->assertAction('administrator');
        $this->assertRedirectTo('/setup/site', 'Expect redirect to site.');

        // use good administrator details for existing server with Go Back clicked
        $this->resetRequest()->resetResponse();
        $_SESSION['setup']['storage'] = array(
            'serverType'    => 'existing',
            'port'          => $this->utility->getP4Params('port'),
        );

        $adminData = array(
            'user'      => $this->utility->getP4Params('user'),
            'password'  => $this->utility->getP4Params('password'),
            'goback'    => true
        );
        $this->request->setPost($adminData);
        $this->request->setMethod('POST');
        $this->dispatch('/setup/administrator');
        $body = $this->response->getBody();
        $this->assertModule('setup');
        $this->assertController('index');
        $this->assertAction('administrator');
        $this->assertRedirectTo('/setup/storage', 'Expect redirect to storage.');
    }
Setup_Test_IndexControllerTest::testIndex ( )

Test setup splash page.

    {
        // prime session to indicate previous completion
        $_SESSION['setup']['setupComplete'] = true;

        $this->dispatch('/setup');
        $this->assertModule('setup');
        $this->assertController('index');
        $this->assertAction('index');
        $this->assertQuery("a[href='/setup/start/yes']");
    }
Setup_Test_IndexControllerTest::testIndexForward ( )

Test that index forwards to requirements action when start is set.

    {
        $this->request->setQuery(array('start' => 'yes'));
        $this->dispatch('/setup');
        $this->assertModule('setup');
        $this->assertController('index');
        $this->assertAction('requirements');
    }
Setup_Test_IndexControllerTest::testRewrite ( )

Test the rewrite action.

    {
        $this->dispatch('/setup/rewrite');
        $this->assertModule('setup');
        $this->assertController('index');
        $this->assertAction('rewrite');
        $this->assertSame(
            trim($this->response->getBody()),
            md5_file(APPLICATION_PATH . '/setup/controllers/IndexController.php')
        );
    }
Setup_Test_IndexControllerTest::testRolesCreation ( )

Test default roles creation.

    {
        // prime session with perforce details.
        $_SESSION['setup']['storage'] = array(
            'serverType'    => 'existing',
            'port'          => $this->utility->getP4Params('port'),
        );
        $_SESSION['setup']['administrator'] = array(
            'user'          => $this->utility->getP4Params('user'),
            'password'      => $this->utility->getP4Params('password')
        );

        // delete all groups if there are any
        foreach (P4_Group::fetchAll() as $group) {
            $group->delete();
        }

        // ensure 'test-site' does not exist.
        $this->utility->removeSites();

        // create test-site.
        $siteData = array(
            'title'     => 'test-site',
            'urls'      => 'test-site.com, www.test-site.com',
        );

        $this->request->setPost($siteData);
        $this->request->setMethod('POST');
        $this->dispatch('/setup/site');

        $this->assertModule('setup', 'Expected setup module');
        $this->assertController('index', 'Expected index controller');
        $this->assertAction('site', 'Expected site action');

        // load test-site site
        $prefix = '//' . P4Cms_Site::SITE_PREFIX;
        $suffix = '/'  . P4Cms_Site::DEFAULT_BRANCH;
        $site   = P4Cms_Site::fetch($prefix . 'test-site' . $suffix)->load();

        // verify that site groups has been created
        $adapter   = $site->getStorageAdapter();
        $siteGroup = $adapter->getProperty(P4Cms_Acl_Role::PARENT_GROUP);
        $this->assertTrue(
            P4_Group::exists($siteGroup),
            "Expected creation of site group"
        );

        // verify that default roles were created and permissions set
        $roles = P4Cms_Acl_Role::fetchAll()->invoke('getId');

        // verify that member role exists
        $this->assertTrue(
            in_array(P4Cms_Acl_Role::ROLE_MEMBER, $roles),
            "Expected existence of member role."
        );

        // verify that administrator role exists
        $this->assertTrue(
            in_array(P4Cms_Acl_Role::ROLE_ADMINISTRATOR, $roles),
            "Expected existence of administrator role."
        );
        // verify that entered user has administrator role
        $user = $this->utility->getP4Params('user');
        $this->assertTrue(
            in_array($user, P4Cms_Acl_Role::fetch(P4Cms_Acl_Role::ROLE_ADMINISTRATOR)->getUsers()),
            "Expected entered user has an administrator role."
        );

        // verify that editor role exists
        $this->assertTrue(
            in_array('editor', $roles),
            "Expected existence of editor role."
        );

        // verify that author role exists
        $this->assertTrue(
            in_array('author', $roles),
            "Expected existence of author role."
        );

        // verify permissions
        $members  = $siteGroup . '--' . P4Cms_Acl_Role::ROLE_MEMBER;
        $admins   = $siteGroup . '--' . P4Cms_Acl_Role::ROLE_ADMINISTRATOR;
        $depotMap = $prefix . "test-site" . "/...";
        $aclFile  = $prefix . "test-site" . "/*/" . P4Cms_Site::ACL_RECORD_ID;

        // construct expected protections table.
        $table = new P4_Protections;
        $table->addProtection('write',  'user',  '*',        '*', '//...')
              ->addProtection('super',  'user',  'tester',   '*', '//...')
              ->addProtection('write',  'group', $siteGroup, '*', $depotMap)
              ->addProtection('review', 'group', $siteGroup, '*', $depotMap)
              ->addProtection('super',  'group', $admins,    '*', $depotMap);

        // get super user connection
        $connection = P4_Connection::factory(
            $this->utility->getP4Params('port'),
            $this->utility->getP4Params('user'),
            null,
            $this->utility->getP4Params('password')
        );

        // compare against actual table.
        $this->assertSame(
            $table->getProtections(),
            P4_Protections::fetch($connection)->getProtections(),
            "Expected matching protections table entries."
        );
    }
Setup_Test_IndexControllerTest::testSite ( )

Test site action.

    {
        // prime session with perforce details.
        $_SESSION['setup']['storage'] = array(
            'serverType'    => 'existing',
            'port'          => $this->utility->getP4Params('port'),
        );
        $_SESSION['setup']['administrator'] = array(
            'user'          => $this->utility->getP4Params('user'),
            'password'      => $this->utility->getP4Params('password')
        );

        $this->dispatch('/setup/site');
        $this->assertResponseCode('200');
        $this->assertModule('setup');
        $this->assertController('index');
        $this->assertAction('site');
        $this->assertQuery("input[name='title']");
        $this->assertQuery("textarea[name='urls']");
        $this->assertQuery("input[type='submit']");
    }
Setup_Test_IndexControllerTest::testSiteAndDepotCreation ( )

Test site & local p4d creation.

    {
        // prime session with perforce details.
        $_SESSION['setup']['storage'] = array(
            'serverType'    => 'new',
            'port'          => '',
        );
        $_SESSION['setup']['administrator'] = array(
            'user'              => 'admin',
            'email'             => 'admin@localhost',
            'password'          => 'passWORD1',
            'passwordConfirm'   => 'passWORD1',
        );

        // ensure 'new-site' does not exist.
        $this->utility->removeSites();

        // create new-site.
        $siteData = array(
            'title'         => 'new-site',
            'description'   => 'the description',
            'urls'          => 'new-site.com, www.newsite.com'
        );
        $this->request->setPost($siteData);
        $this->request->setMethod('POST');
        $this->dispatch('/setup/site');

        $body = $this->response->getBody();
        $this->assertModule('setup', 'Expected setup module');
        $this->assertController('index', 'Expected index controller');
        $this->assertAction('site', 'Expected site action');
        $this->assertRedirectTo('/setup/summary', 'Expect redirect to summary.');
        $session = new Zend_Session_Namespace('setup');
        $this->assertTrue($session->site instanceof P4Cms_Site, 'Expect a site object.');
        $this->assertEquals(
            $siteData['title'],
            $session->site->getConfig()->getTitle(),
            'Expected title.'
        );
        $this->assertEquals(
            $siteData['description'],
            $session->site->getConfig()->getDescription(),
            'Expected description.'
        );

        // ensure local p4d created.
        $perforce       = $_SESSION['setup']['storage'];
        $administrator  = $_SESSION['setup']['administrator'];
        $root           = TEST_DATA_PATH . '/perforce';
        $this->assertSame(
            $root,
            $perforce['root'],
            'New p4d P4ROOT should be in session.'
        );
        $this->assertSame(
            'admin',
            $administrator['user'],
            'User should be admin user.'
        );
        $this->assertTrue(strpos($perforce['port'], $root) !== false, "Port should include root");
        $this->assertTrue(strlen($administrator['password']) == 9, "Password should be 9 characters");

        // ensure new depot works.
        $p4 = P4_Connection::factory(
            $perforce['port'],
            $administrator['user'],
            null,
            $administrator['password']
        );
        $info = $p4->getInfo();
        $this->assertTrue(is_array($info), "P4 info output should be array.");
        $this->assertSame($root, $info['serverRoot'], "P4 server root should be expected local root");
    }
Setup_Test_IndexControllerTest::testSiteCreation ( )

Test site creation.

    {
        // prime session with perforce details.
        $_SESSION['setup']['storage'] = array(
            'serverType'    => 'existing',
            'port'          => $this->utility->getP4Params('port'),
        );
        $_SESSION['setup']['administrator'] = array(
            'user'          => $this->utility->getP4Params('user'),
            'password'      => $this->utility->getP4Params('password')
        );

        // ensure 'new-site' does not exist.
        $this->utility->removeSites();

        // create new-site.
        $siteData = array(
            'title'     => 'new-site',
            'urls'      => 'new-site.com, www.newsite.com',
        );
        $this->request->setPost($siteData);
        $this->request->setMethod('POST');
        $this->dispatch('/setup/site');
        $session = new Zend_Session_Namespace('setup');
        $this->assertTrue($session->site instanceof P4Cms_Site, 'Expect a site object.');
        $this->assertRedirectTo('/setup/summary', 'Expect redirect to summary.');

        // ensure site can login.
        try {
            $ticket = $session->site->getConnection()->login();
            $this->assertTrue(strlen($ticket) > 0, "Expected login ticket");
        } catch (P4_Connection_LoginException $e) {
            $this->fail("Expected login to succeed");
        }

        // test the unique site check which should fail because
        // the site client still exists.
        $this->resetRequest()->resetResponse();
        P4_User::fetch('chronicle')->delete();
        $this->request->setPost($siteData);
        $this->request->setMethod('POST');
        $this->dispatch('/setup/site');
        $this->assertQueryContentContains('ul.errors li', 'The site title you provided appears to be taken.');
    }
Setup_Test_IndexControllerTest::testStorage ( )

Test storage action.

    {
        $this->dispatch('/setup/storage');
        $body = $this->response->getBody();
        $this->assertModule('setup', 'Expected module');
        $this->assertController('index', 'Expected controller');
        $this->assertAction('storage', 'Expected action');
        $this->assertQuery("input[name='serverType']", 'Expected serverType field.');
        $this->assertQuery("input[name='port']", 'Expected port field.');
        $this->assertQuery("input[type='submit']", 'expected submit button');

        // test perforce action with bogus port
        $this->resetRequest()->resetResponse();
        $this->request->setPost(
            array(
                'serverType'    => 'existing',
                'port'          => 123456,
            )
        );
        $this->request->setMethod('POST');
        $this->dispatch('/setup/storage');
        $body = $this->response->getBody();
        $this->assertModule('setup', 'Expected module');
        $this->assertController('index', 'Expected controller');
        $this->assertAction('storage', 'Expected action');
        $this->assertQueryContentContains('ul.errors li', "Unable to connect to server on '123456'.", $body);

        // test perforce action with bogus port and Go Back clicked
        $this->resetRequest()->resetResponse();
        $this->request->setPost(
            array(
                'serverType'    => 'existing',
                'port'          => 123456,
                'goback'        => true,
            )
        );
        $this->request->setMethod('POST');
        $this->dispatch('/setup/storage');
        $body = $this->response->getBody();
        $this->assertModule('setup', 'Expected module');
        $this->assertController('index', 'Expected controller');
        $this->assertAction('storage', 'Expected action');
        $this->assertRedirectTo('/setup/requirements', 'Expect redirect to requirements');

        // test perforce action with good credentials.
        $this->resetRequest()->resetResponse();
        $this->request->setPost(
            array(
                'serverType'    => 'existing',
                'port'          => $this->utility->getP4Params('port'),
            )
        );
        $this->request->setMethod('POST');
        $this->dispatch('/setup/storage');
        $body = $this->response->getBody();
        $this->assertModule('setup', 'Expected module');
        $this->assertController('index', 'Expected controller');
        $this->assertAction('storage', 'Expected action');
        $this->assertRedirectTo('/setup/administrator', 'Expect redirect to administrator');

        // test perforce action with good credentials and Go Back clicked.
        $this->resetRequest()->resetResponse();
        $this->request->setPost(
            array(
                'serverType'    => 'existing',
                'port'          => $this->utility->getP4Params('port'),
                'goback'        => true,
            )
        );
        $this->request->setMethod('POST');
        $this->dispatch('/setup/storage');
        $body = $this->response->getBody();
        $this->assertModule('setup', 'Expected module');
        $this->assertController('index', 'Expected controller');
        $this->assertAction('storage', 'Expected action');
        $this->assertRedirectTo('/setup/requirements', 'Expect redirect to requirements');
    }
Setup_Test_IndexControllerTest::testSummary ( )

Test the summary action.

    {
        // prime session with perforce details.
        $_SESSION['setup']['storage'] = array(
            'serverType'    => 'new',
            'port'          => '',
        );
        $_SESSION['setup']['administrator'] = array(
            'user'              => 'admin',
            'email'             => 'admin@localhost',
            'password'          => 'passWORD1',
            'passwordConfirm'   => 'passWORD1',
        );

        // ensure 'new-site' does not exist.
        $this->utility->removeSites();

        // create new-site.
        $siteData = array(
            'title'         => 'new-site',
            'description'   => 'the site description',
            'urls'          => 'new-site.com, www.newsite.com'
        );
        $this->request->setPost($siteData);
        $this->request->setMethod('POST');
        $this->dispatch('/setup/site');
        $body = $this->response->getBody();
        $this->assertModule('setup', 'Expected setup module');
        $this->assertController('index', 'Expected index controller');
        $this->assertAction('site', 'Expected site action');
        $this->assertRedirectTo('/setup/summary', 'Expect redirect to summary.');
        $session = new Zend_Session_Namespace('setup');
        $this->assertTrue($session->site instanceof P4Cms_Site, 'Expect a site object.');

        $this->resetRequest()->resetResponse();

        // run summary action.
        $this->dispatch('/setup/summary');

        $body = $this->response->getBody();
        $this->assertModule('setup', 'Expected module');
        $this->assertController('index', 'Expected controller');
        $this->assertAction('summary', 'Expected action');
        $this->assertQueryContentContains('td.label', 'Title');
        $this->assertQueryContentContains('td.label', 'Addresses');
        $this->assertQueryContentContains('td.label', 'Administrator');
        $this->assertQueryContentContains('td.value', 'new-site');
        $this->assertQueryContentContains('td.value', 'the site description');
        $this->assertQueryContentContains('td.value', 'new-site.com');
        $this->assertQueryContentContains('td.value', 'admin');
    }
Setup_Test_IndexControllerTest::testSystemRequirements ( )

Test requirements action.

    {
        $this->dispatch('/setup/requirements');
        $this->assertModule('setup');
        $this->assertController('index');
        $this->assertAction('requirements');

        $body = $this->response->getBody();
        $this->assertRegExp('/<div[^>]+?preferred[^>]+?storage[^>]+?>/', $body);

        // try again with partial format
        $this->resetRequest()->resetResponse();
        $this->dispatch('/setup/requirements/format/partial');
        $body = $this->response->getBody();

        $this->assertModule('setup');
        $this->assertController('index');
        $this->assertAction('requirements');
        $this->assertRegExp('/Your data directory/', $body);
    }

The documentation for this class was generated from the following file: