/ */ class Setup_Test_IndexControllerTest extends ModuleControllerTest { /** * Set hostname so that urls can be built correctly. */ public function setUp() { 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(); } /** * Test setup splash page. */ public function testIndex() { // 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']"); } /** * Test that index forwards to requirements action when start is set. */ public function testIndexForward() { $this->request->setQuery(array('start' => 'yes')); $this->dispatch('/setup'); $this->assertModule('setup'); $this->assertController('index'); $this->assertAction('requirements'); } /** * Test requirements action. */ public function testSystemRequirements() { $this->dispatch('/setup/requirements'); $this->assertModule('setup'); $this->assertController('index'); $this->assertAction('requirements'); $body = $this->response->getBody(); $this->assertRegExp('/]+?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); } /** * Test adminstrator action. */ public function testAdministrator() { // 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("/
  • 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.'); } /** * Test site action. */ public function testSite() { // 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']"); } /** * Test site creation. */ public function testSiteCreation() { // 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.'); } /** * Test default roles creation */ public function testRolesCreation() { // 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." ); } /** * Test site & local p4d creation. */ public function testSiteAndDepotCreation() { // 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"); } /** * Test storage action. */ public function testStorage() { $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'); } /** * Test the rewrite action. */ public function testRewrite() { $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') ); } /** * Test the summary action. */ public function testSummary() { // 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'); } }