SiteTest.php #1

  • //
  • guest/
  • perforce_software/
  • chronicle/
  • main/
  • tests/
  • phpunit/
  • P4Cms/
  • SiteTest.php
  • View
  • Commits
  • Open Download .zip Download (13 KB)
<?php
/**
 * Test the site model.
 *
 * @copyright   2011 Perforce Software. All rights reserved.
 * @license     Please see LICENSE.txt in top-level folder of this distribution.
 * @version     <release>/<patch>
 */
class P4Cms_SiteTest extends TestCase
{
    /**
     * Set core modules path so that site load can find modules.
     * Load test sites and set the sites path to the test sites.
     */
    public function setUp()
    {
        parent::setUp();
        P4Cms_Site::setSitesDataPath(TEST_DATA_PATH . '/sites');
        P4Cms_Module::reset();
        P4Cms_Module::setCoreModulesPath(TEST_ASSETS_PATH . '/core-modules');
        P4Cms_Theme::addPackagesPath(TEST_ASSETS_PATH . '/sites/all/themes');
        P4Cms_PackageAbstract::setDocumentRoot(dirname(TEST_DATA_PATH));
        $this->utility->createTestSites();
    }

    /**
     * Cleanup.
     */
    public function tearDown()
    {
        P4Cms_Module::reset();
        P4Cms_PackageAbstract::setDocumentRoot(null);
        parent::tearDown();
    }

    /**
     * Ensure that sites list can be accessed and is cached.
     */
    public function testSites()
    {
        $sites = P4Cms_Site::fetchAll();
        $this->assertTrue($sites instanceof P4Cms_Model_Iterator, 'Expect sites object site');
        $this->_loadSiteData();
        $site = P4Cms_Site::fetch($this->_qualifySiteId('basic'));
        $this->assertTrue($site instanceof P4Cms_Site, 'Expect site object type');
    }

    /**
     * Ensure that site to url matching logic works as expected.
     */
    public function testSiteUrls()
    {
        $this->_loadSiteData();

        $tests = array(
            'http://basic.com'              => 'basic',
            'http://www.basic.com/'         => 'basic',
            'http://www.basic.com/foo'      => 'basic',
            'http://basic.com:123/'         => 'basic',
            'http://nomatch.com/'           => 'basic',
            'http://othersite.com/'         => 'other',
            'http://subdir.com/foo'         => 'subdir',
            'https://secure.com/'           => 'secure',
        );

        foreach ($tests as $urlString => $expectedId) {
            $url     = Zend_Uri_Http::fromString($urlString);
            $request = new P4Cms_Controller_Request_HttpTestCase($url);
            $request->setServer('HTTPS',     $url->getScheme() == 'https' ? 'on' : 'off');
            $request->setServer('HTTP_HOST', $url->getHost());

            $site    = P4Cms_Site::fetchByRequest($request);
            $id      = $site ? $site->getId() : false;
            $this->assertSame($this->_qualifySiteId($expectedId), $id, 'Expected site id');
        }
    }

    /**
     * Test the fetch method.
     */
    public function testFetchSite()
    {
        $this->_loadSiteData();
        $this->assertTrue(P4Cms_Site::fetch($this->_qualifySiteId('basic')) instanceof P4Cms_Site);

        try {
            P4Cms_Site::fetch($this->_qualifySiteId('alsdkjfksdf'));
            $this->fail('Fetch with bogus id should have failed');
        } catch (P4Cms_Model_NotFoundException $e) {
            $this->assertTrue(true, 'Expect fetch with bogus id to fail');
            $this->assertEquals(
                "Cannot find the specified site.",
                $e->getMessage(),
                'Expected error message'
            );
        } catch (Exception $e) {
            $this->fail(__LINE__ .' - Unexpected exception: '. $e->getMessage());
        }

        try {
            P4Cms_Site::fetch(0);
            $this->fail('Fetch with numeric id should have failed');
        } catch (InvalidArgumentException $e) {
            $this->assertTrue(true, 'Expect fetch with numeric id to fail');
            $this->assertEquals(
                "No site id given.",
                $e->getMessage(),
                'Expected error message'
            );
        } catch (Exception $e) {
            $this->fail(__LINE__ .' - Unexpected exception: '. $e->getMessage());
        }

        try {
            P4Cms_Site::fetch(false);
            $this->fail('Fetch with false id should have failed');
        } catch (InvalidArgumentException $e) {
            $this->assertTrue(true, 'Expect fetch with false id to fail');
            $this->assertEquals(
                "No site id given.",
                $e->getMessage(),
                'Expected error message'
            );
        } catch (Exception $e) {
            $this->fail(__LINE__ .' - Unexpected exception: '. $e->getMessage());
        }
    }

    /**
     * Test the key exists method.
     */
    public function testIdExists()
    {
        $this->_loadSiteData();
        $this->assertTrue(P4Cms_Site::exists($this->_qualifySiteId('basic')));
        $this->assertFalse(P4Cms_Site::exists($this->_qualifySiteId('laskdfjsdkfj')));
    }

    /**
     * Test config.
     */
    public function testConfig()
    {
        $site   = $this->_getFirstTestSite();
        $config = $site->getConfig();
        $this->assertTrue($config instanceof P4Cms_Site_Config, 'expected matching type');

        // adjust a config value directly
        $counter = intval($config->counter);
        $config->setValue('counter', ++$counter);

        // adjust values stored in config indirectly
        $title = 'the site title';
        $site->getConfig()->setTitle($title);
        $description = 'description of the site';
        $site->getConfig()->setDescription($description);

        $site->getConfig()->save();
        $site   = $this->_getFirstTestSite();
        $config = $site->getConfig();
        $this->assertSame((string)$counter, $config->counter, 'expected matching count');

        $this->assertEquals($title, $site->getConfig()->getTitle(), 'Expected title.');
        $this->assertEquals($description, $site->getConfig()->getDescription(), 'Expected description.');

        // test invalid arguments
        try {
            $site->getConfig()->setTitle(new stdClass);
            $this->fail('Unexpected success setting a non-string title.');
        } catch (PHPUnit_Framework_AssertionFailedError $e) {
            $this->fail($e->getMessage());
        } catch (InvalidArgumentException $e) {
            $this->assertEquals(
                "The provided title is not a string.",
                $e->getMessage(),
                'Expected error message.'
            );
        } catch (Exception $e) {
            $this->fail(
                "Unexpected exception setting a non-string title (" . get_class($e) . '): ' . $e->getMessage()
            );
        }

        try {
            $site->getConfig()->setDescription(new stdClass);
            $this->fail('Unexpected success setting a non-string description.');
        } catch (PHPUnit_Framework_AssertionFailedError $e) {
            $this->fail($e->getMessage());
        } catch (InvalidArgumentException $e) {
            $this->assertEquals(
                "The provided description is not a string.",
                $e->getMessage(),
                'Expected error message.'
            );
        } catch (Exception $e) {
            $this->fail(
                "Unexpected exception setting a non-string description (" . get_class($e) . '): ' . $e->getMessage()
            );
        }
    }

    /**
     * Test p4.
     */
    public function testP4()
    {
        $site = $this->_getFirstTestSite();
        $p4   = $site->getConnection();
        $info = $p4->getInfo();

        $this->assertTrue($p4 instanceof P4_Connection_Interface, 'Expected object class');
        $this->assertTrue(is_array($info), 'Info should be an array');

        // ensure site's p4 connection uses a temp client.
        $this->assertRegExp(
            "/^" . P4_Client::TEMP_ID_PREFIX . "/",
            $p4->getClient()
        );
    }

    /**
     * Test getUrl method.
     */
    public function testGetUrl()
    {
        $site = $this->_getFirstTestSite();
        try {
            $url = Zend_Uri_Http::fromString($site->getConfig()->getUrl());
            $this->assertTrue(true, "string url from getUrl should not fail");
        } catch (Zend_Uri_Exception $e) {
            $this->fail($e->getMessage());
        } catch (Exception $e) {
            $this->fail(__LINE__ .' - Unexpected exception: '. $e->getMessage());
        }

        $request = new P4Cms_Controller_Request_HttpTestCase($url);
        $request->setServer('HTTP_HOST', $url->getHost());

        $fetchedSite = P4Cms_Site::fetchByRequest($request);
        $this->assertEquals($site->getId(), $fetchedSite->getId(), 'Expected fetched site');
    }

    /**
     * Try to get a site's current theme.
     */
    public function testThemeAccessors()
    {
        $site   = $this->_getFirstTestSite();
        $config = $site->getConfig();
        unset($config->theme);
        $theme = $config->getTheme();
        $this->assertSame($theme, 'default', 'Expect default theme');

        $config->theme = 'alternative';
        $theme = $config->getTheme();
        $this->assertSame($theme, 'alternative', 'Expect alternative theme');
        $config->setTheme('default');
        $theme = $config->getTheme();
        $this->assertSame($theme, 'default', 'Expect default theme again');
    }

    /**
     * Test site load.
     */
    public function testLoad()
    {
        $site = $this->_getFirstTestSite();

        // clear the active site.
        P4Cms_Site::clearActive();

        try {
            $active = P4Cms_Site::fetchActive();
            $this->fail('Expect fetchActive() to fail');
        } catch(P4Cms_Site_Exception $e) {
            $this->assertSame(
                'There is no active (currently loaded) site.',
                $e->getMessage(),
                'Expect fetchActive() to fail when no site is active'
            );
        } catch(Exception $e) {
            $this->fail(__LINE__ .' - Unexpected error: '. $e->getMessage());
        }

        // run load and verify site is active.
        $site->load();
        $this->assertTrue(P4Cms_Site::hasActive(), 'Expect an active site post load');
        $this->assertTrue(
            P4Cms_Site::fetchActive() instanceof P4Cms_Site,
            'Expect correct object type for active site'
        );
    }

    /**
     * Test getting the acl object.
     */
    public function testGetAcl()
    {
        $site = $this->_getFirstTestSite();

        // should create an acl instance automatically.
        $acl = $site->getAcl();
        $this->assertTrue($acl instanceof P4Cms_Acl);

        // should contain default roles.
        $roles = P4Cms_Acl_Role::fetchAll(null, $site->getStorageAdapter());
        $this->assertSame(count($roles), count($acl->getRoles()));

        // should be able to fetch a second time (this time from memory).
        $acl2 = $site->getAcl();
        $this->assertSame($acl, $acl2);

        // should be able to save acl and have a new site fetch it from storage.
        $acl->add(new P4Cms_Acl_Resource('test-resource'));
        $acl->save();

        $site2 = new P4Cms_Site;
        $site2->setValues($site->getValues());

        $acl3 = $site2->getAcl();
        $this->assertTrue($acl3->has('test-resource'));
    }

    /**
     * Takes a site id (e.g. 'foo') and turns it into a qualified
     * stream id (e.g. '//chronicle-foo/live') using the SITE_PREFIX
     * and DEFAULT_BRANCH constants off the P4Cms_Site class.
     *
     * @param   string|bool     $id     the id to qualify or false
     * @return  string|bool     the qualified id or a flow through false
     */
    protected function _qualifySiteId($id)
    {
        // if false is passed in just return it.
        if ($id === false) {
            return false;
        }

        $prefix = '//' . P4Cms_Site::SITE_PREFIX;
        $suffix = '/'  . P4Cms_Site::DEFAULT_BRANCH;

        return $prefix . $id . $suffix;
    }

    /**
     * Get the first test site model.
     *
     * @return  P4Cms_Site  the first test site.
     */
    protected function _getFirstTestSite()
    {
        reset($this->utility->getTestSites());
        return P4Cms_Site::fetch(key($this->utility->getTestSites()));
    }

    /**
     * Load specific site test data.
     */
    protected function _loadSiteData()
    {
        $this->utility->saveSites(
            array(
                $this->_qualifySiteId('basic') => array(
                    'urls' => array(
                        'basic.com',
                        'www.basic.com'
                    )
                ),
                $this->_qualifySiteId('other') => array(
                    'urls' => array(
                        'othersite.com'
                    )
                ),
                $this->_qualifySiteId('subdir') => array(
                    'urls' => array(
                        'subdir.com/foo'
                    )
                ),
                $this->_qualifySiteId('secure') => array(
                    'urls' => array(
                        'https://secure.com'
                    )
                )
            )
        );
    }
}
# Change User Description Committed
#1 16170 perforce_software Move Chronicle files to follow new path scheme for branching.
//guest/perforce_software/chronicle/tests/phpunit/P4Cms/SiteTest.php
#1 8972 Matt Attaway Initial add of the Chronicle source code