IndexControllerTest.php #1

  • //
  • guest/
  • perforce_software/
  • chronicle/
  • main/
  • application/
  • history/
  • tests/
  • IndexControllerTest.php
  • View
  • Commits
  • Open Download .zip Download (9 KB)
<?php
/**
 * Test the history index controller.
 *
 * @copyright   2011 Perforce Software. All rights reserved.
 * @license     Please see LICENSE.txt in top-level folder of this distribution.
 * @version     <release>/<patch>
 */
class History_Test_IndexControllerTest extends ModuleControllerTest
{
    /**
     * Perform setup
     */
    public function setUp()
    {
        parent::setUp();
        $this->utility->impersonate('administrator');
    }

    /**
     * Create a type and a entry for testing.
     *
     * @param integer $includeId Flag whether to include id
     */
    public function _createTestTypeAndEntry($includeId = false)
    {
        $elements = array(
            'title' => array(
                'type'      => 'text',
                'options'   => array('label' => 'Title', 'required' => true),
            ),
            'body'  => array(
                'type'      => 'textarea',
                'options'   => array('label' => 'Body'),
            ),
            'abstract'  => array(
                'type'      => 'textarea',
                'options'   => array('label' => 'Abstract'),
            ),
        );
        if ($includeId) {
            $elements['id'] = array(
                'type'      => 'text',
                'options'   => array('label' => 'ID', 'required' => true)
            );
        }
        $type = new P4Cms_Content_Type;
        $type->setId("test-type")
             ->setLabel("Test Type")
             ->setElements($elements)
             ->setValue('icon', file_get_contents(TEST_ASSETS_PATH . '/images/content-type-icon.png'))
             ->setFieldMetadata('icon', array("mimeType" => "image/png"))
             ->save();

        $entry = new P4Cms_Content;
        $entry->setContentType($type)
             ->setValue('title', 'Test Title')
             ->setValue('body', 'The body of the test')
             ->setValue('abstract', 'abstract this');
        if ($includeId) {
            $entry->setId('theId');
        } else {
            $entry->setId(1);
        }
        $entry->save('a test entry');

        return array($type, $entry);
    }

    /**
     * Tests the index action of the history index controller.
     * Gets history with no specified content id, expecting error.
     * Gets history for newly created content, verifies data grid structure.
     * Gets history information for newly created content, verifies json content.
     * Gets history information for revised content, verifies json content.
     */
    public function testIndexAction()
    {
        $this->dispatch('/history/index/index');

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

        list($type, $entry) = $this->_createTestTypeAndEntry();

        P4Cms_Record_RegisteredType::create()
                    ->setId('content')
                    ->setRecordClass('P4Cms_Content')
                    ->setUriCallback(
                        function($id, $action, $params)
                        {
                            return call_user_func(
                                P4Cms_Content::getUriCallback(),
                                P4Cms_Content::fetch($id, array('includeDeleted' => true)),
                                $action,
                                $params
                            );
                        }
                    );

        $this->dispatch('/history/index/index/format/partial/type/content/id/' . $entry->getId());

        $body = $this->getResponse()->getBody();

        $this->assertModule('history', 'Expected module, dispatch #1. '. $body);
        $this->assertController('index', 'Expected controller, dispatch #1 '. $body);
        $this->assertAction('index', 'Expected action, dispatch #1 '. $body);

        // ensure table and dojo data elements exist
        $this->assertXpath('//div[@dojotype="dojox.data.QueryReadStore"]', 'Expected dojo.data div');
        $this->assertXpath('//table[@dojotype="p4cms.ui.grid.DataGrid"]', 'Expected dojox.grid table');

        // check initial JSON output
        $this->resetRequest()->resetResponse();

        $this->dispatch('/history/format/json/type/content/id/' . $entry->getId() . '?start=0&count=100');

        $body = $this->response->getBody();
        $this->assertModule('history', 'Expected module, dispatch #2. '. $body);
        $this->assertController('index', 'Expected controller, dispatch #2 '. $body);
        $this->assertAction('index', 'Expected action, dispatch #2 '. $body);

        $data = Zend_Json::decode($body);

        $this->assertSame(1, count($data['items']), 'Expected one item');

        $this->assertSame($data['items'][0]['version'], '1', 'Expected version to match');
        $this->assertSame($data['items'][0]['user'], 'tester', 'Expected user to match');
        $this->assertSame($data['items'][0]['date'], 'just now', 'Expected date to match');
        $this->assertSame($data['items'][0]['description'], "a test entry\n", 'Expected description to match');

        // revise, save, and verify
        $entry->setValue('title', 'Revised Test Title')
             ->setValue('body', 'A different test body')
             ->setValue('abstract', 'Abstractification.');
        $entry->save('modified test entry');

        $this->resetRequest()->resetResponse();
        $this->dispatch('/history/format/json/type/content/id/' . $entry->getId() . '?start=0&count=100');

        $body = $this->response->getBody();
        $this->assertModule('history', 'Expected module, dispatch #2. '. $body);
        $this->assertController('index', 'Expected controller, dispatch #2 '. $body);
        $this->assertAction('index', 'Expected action, dispatch #2 '. $body);

        $data = Zend_Json::decode($body);

        $this->assertSame(2, count($data['items']), 'Expected two items');

        $this->assertSame($data['items'][0]['version'], '2', 'Expected version to match');
        $this->assertSame($data['items'][0]['user'], 'tester', 'Expected user to match');
        $this->assertSame($data['items'][0]['date'], 'just now', 'Expected date to match');
        $this->assertSame(
            $data['items'][0]['description'],
            "modified test entry\n",
            'Expected description to match'
        );
    }

    /**
     * Tests the toolbar generation.
     *
     * @return void
     */
    public function testToolbarAction()
    {
        $this->dispatch('/history/index/toolbar/');

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

        list($type, $entry) = $this->_createTestTypeAndEntry();

        P4Cms_Record_RegisteredType::create()
                    ->setId('content')
                    ->setRecordClass('P4Cms_Content')
                    ->setUriCallback(
                        function($id, $action, $params)
                        {
                            return call_user_func(
                                P4Cms_Content::getUriCallback(),
                                P4Cms_Content::fetch($id, array('includeDeleted' => true)),
                                $action,
                                $params
                            );
                        }
                    );

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

        $this->dispatch('/history/index/toolbar/format/partial/type/content/id/' . $entry->getId());

        $body = $this->getResponse()->getBody();

        $this->assertModule('history', 'Expected module, dispatch #1. '. $body);
        $this->assertController('index', 'Expected controller, dispatch #1 '. $body);
        $this->assertAction('toolbar', 'Expected action, dispatch #1 '. $body);

        $this->assertXpathContentContains(
            '//div[@dojotype="dijit.MenuItem"]',
            'Version 1 by tester just now',
            'Expected dijit menu item with version and user information.'
        );
        $this->assertQueryContentContains(
            'div.middle > span.change > span.action',
            'added',
            'Expected action.'
        );
        $this->assertQueryContentContains(
            'div.middle > span.change > span.user',
            'tester',
            'Expected user.'
        );
        $this->assertQueryContentContains(
            'div.middle > span.change > span.date',
            'just now',
            'Expected date.'
        );
        $this->assertQueryContentContains(
            'div.middle > span.change > span.description',
            'a test entry',
            'Expected entry.'
        );

        $this->assertQueryContentContains(
            'div',
            "p4cms.history.view('content', '1');",
            'Expected history list button javascript.'
        );
    }
}
# Change User Description Committed
#1 16170 perforce_software Move Chronicle files to follow new path scheme for branching.
//guest/perforce_software/chronicle/application/history/tests/IndexControllerTest.php
#1 8972 Matt Attaway Initial add of the Chronicle source code