|
Perforce Chronicle 2012.2/486814
API Documentation
|
Test the content index controller. More...
Public Member Functions | |
| _createTestTypeAndEntry ($includeId=false) | |
| Create a type and a entry for testing. | |
| setUp () | |
| Perform setup. | |
| testAddBadPost () | |
| Test add action with bad details. | |
| testAddGoodPost () | |
| Test add action with good details. | |
| testAddGoodPostWithId () | |
| Test add action with good details, and a content type that has an id. | |
| testAddNoPostTypeExists () | |
| Test add action without post, using an existing type. | |
| testAddNoPostTypeParam () | |
| Test add action without post, manipulating the type param. | |
| testBadBatch () | |
| Test creating a bad batch. | |
| testBadLayoutSelection () | |
| Test invalid layout fallback to default. | |
| testBadView () | |
| Test viewing non-existant content. | |
| testChooseType () | |
| Test choose type directly. | |
| testCustomLayoutSelection () | |
| Test valid custom layout. | |
| testDefaultLayoutSelection () | |
| Test default layout. | |
| testDeleteInvalidId () | |
| Test delete action. | |
| testDeleteInvalidRequestMethod () | |
| Test deleting an invalid request method. | |
| testDownload () | |
| Test downloading. | |
| testEditBadPost () | |
| Test edit action with a bad post. | |
| testEditGoodPost () | |
| Test edit action with a good post. | |
| testEditGoodPostWithId () | |
| Test edit action with a good post, content type uses an id field. | |
| testEditNoPost () | |
| Test edit action with no post. | |
| testFormAction () | |
| Test the form action. | |
| testGoodBatch () | |
| Test creating a proper batch. | |
| testGoodView () | |
| Test viewing content. | |
| testImageAdjust () | |
| Test image action with requested transformations. | |
| testIndex () | |
| Test view action. | |
| testInvalidImage () | |
| Test finding invalid images in content. | |
| testJsonDelete () | |
| Test performing delete in json context. | |
| testManage () | |
| Test the manage action. | |
| testMultipleDelete () | |
| Test delete multiple entries in batch. | |
| testOpenedAction () | |
| test the opened action | |
| testSecurity () | |
| Test data are escaped in the view according to attached display filters. | |
| testStandardDelete () | |
| Test performing a standard delete. | |
| testSubForm () | |
| Test getting content sub-forms. | |
| testValidateFieldBadContentType () | |
| Test validateField w. | |
| testValidateFieldBadField () | |
| Test validate w. | |
| testValidateFieldBadValue () | |
| Test validate w. | |
| testValidateFieldGoodValue () | |
| Test validate w. | |
| testValidateFieldNoParams () | |
| Test validateField w. | |
| testValidImage () | |
| Test finding valid images in content. | |
| testView () | |
| Test the view action. | |
| testViewScriptSelection () | |
| Test view script selection (more specific to less specific). | |
Public Attributes | |
| $bootstrap = array('Bootstrap', 'run') | |
Protected Member Functions | |
| _createContent () | |
| Create several test content entries. | |
Test the content index controller.
| Content_Test_IndexControllerTest::_createContent | ( | ) | [protected] |
Create several test content entries.
{
// test type content
$entry = new P4Cms_Content;
$entry->setId('test567')
->setContentType('test-type')
->setValue('title', 'My Title')
->setValue('body', 'My content body')
->save();
// test type w. id content
$entry = new P4Cms_Content;
$entry->setId('test123')
->setContentType('test-type-w-id')
->setValue('title', 'My Title')
->setValue('body', 'My content body')
->save();
// test type w. file
$entry = new P4Cms_Content;
$entry->setId('test890')
->setContentType('test-type-w-file')
->setValue('title', 'My Title')
->setValue('file', 'test file content')
->setFieldMetadata(
'file',
array('filename' => 'myfile.txt', 'mimeType' => 'text/plain')
)
->save();
// test type w. image
$entry = new P4Cms_Content;
$entry->setId('test867-5309')
->setContentType('test-type-w-file')
->setValue('title', 'Test Image')
->setValue('file', 'test image content')
->setFieldMetadata(
'file',
array('filename' => 'image.jpg', 'mimeType' => 'image/jpg')
)
->save();
}
| Content_Test_IndexControllerTest::_createTestTypeAndEntry | ( | $ | includeId = false | ) |
Create a type and a entry for testing.
| integer | $includeId | Flag whether to include id |
{
$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);
}
| Content_Test_IndexControllerTest::setUp | ( | ) |
Perform setup.
{
parent::setUp();
P4Cms_Content_Type::installDefaultTypes();
// ensure a type is present for testing.
$type = new P4Cms_Content_Type;
$type->setId('test-type')
->setLabel('Test Type')
->setElements(
array(
"title" => array(
"type" => "text",
"options" => array("label" => "Title", "required" => true)
),
"body" => array(
"type" => "textarea",
"options" => array("label" => "Body")
)
)
)
->setValue('icon', file_get_contents(TEST_ASSETS_PATH . "/images/content-type-icon.png"))
->setFieldMetadata('icon', array("mimeType" => "image/png"))
->setValue('group', 'test')
->save();
// ensure a type w. id is present for testing.
$type = new P4Cms_Content_Type;
$type->setId('test-type-w-id')
->setLabel('Test Type')
->setElements(
array(
"id" => array(
"type" => "text",
"options" => array("label" => "Title", "required" => true)
),
"title" => array(
"type" => "text",
"options" => array("label" => "Title", "required" => true)
),
"body" => array(
"type" => "textarea",
"options" => array("label" => "Body")
)
)
)
->setValue('icon', file_get_contents(TEST_ASSETS_PATH . "/images/content-type-icon.png"))
->setFieldMetadata('icon', array("mimeType" => "image/png"))
->setValue('group', 'test')
->save();
// ensure a type w. a file is present for testing.
$type = new P4Cms_Content_Type;
$type->setId('test-type-w-file')
->setLabel('Test Type')
->setElements(
array(
"title" => array(
"type" => "text",
"options" => array("label" => "Title", "required" => true)
),
"name" => array(
"type" => "file",
"options" => array("label" => "File")
)
)
)
->setValue('icon', file_get_contents(TEST_ASSETS_PATH . "/images/content-type-icon.png"))
->setFieldMetadata('icon', array("mimeType" => "image/png"))
->setValue('group', 'test2')
->save();
}
| Content_Test_IndexControllerTest::testAddBadPost | ( | ) |
Test add action with bad details.
{
$this->utility->impersonate('author');
// create a type
list($type, $entry) = $this->_createTestTypeAndEntry();
$params = array(
'contentType' => $type->getId(),
'title' => '',
'body' => '',
'format' => 'dojoio'
);
$this->request->setMethod('POST');
$this->request->setPost($params);
$this->dispatch('/content/add');
$this->assertModule('content', 'Last module run should be content module.');
$this->assertController('index', 'Expected controller');
$this->assertAction('add', 'Expected action');
$body = $this->response->getBody();
$this->assertRegexp('/title[^}]*isEmpty/', $body, 'Expect id validation failure');
}
| Content_Test_IndexControllerTest::testAddGoodPost | ( | ) |
Test add action with good details.
{
$this->utility->impersonate('author');
list($type, $entry) = $this->_createTestTypeAndEntry();
$title = 'Second Title';
$body = 'The 2nd body.';
$params = array(
'contentType' => $type->getId(),
'title' => $title,
'body' => $body,
'format' => 'json',
'comment' => 'user note'
);
$this->request->setMethod('POST');
$this->request->setPost($params);
$this->dispatch('/content/add');
$response = Zend_Json::decode($this->response->getBody());
$this->assertModule('content', 'Last module run should be content module.');
$this->assertController('index', 'Expected controller.');
$this->assertAction('add', 'Expected action.');
$this->assertResponseCode(200, 'Expected response code.');
$this->assertTrue(isset($response['contentId']), 'Expected content id');
$fetched = P4Cms_Content::fetch($response['contentId']);
$change = $fetched->toP4File()->getChange();
$this->assertSame($title, $fetched->getValue('title'), 'Expected title in saved content');
$this->assertSame($body, $fetched->getValue('body'), 'Expected body in saved content');
$this->assertSame('user note', trim($change->getDescription()), 'Expected change description');
}
| Content_Test_IndexControllerTest::testAddGoodPostWithId | ( | ) |
Test add action with good details, and a content type that has an id.
{
$this->utility->impersonate('author');
list($type, $entry) = $this->_createTestTypeAndEntry(true);
$title = 'Second Title';
$body = 'The 2nd body.';
$newId = 'newId';
$params = array(
'contentType' => $type->getId(),
'id' => 'newId',
'title' => $title,
'body' => $body,
'format' => 'dojoio'
);
$this->request->setMethod('POST');
$this->request->setPost($params);
$this->dispatch('/content/add');
$responseBody = $this->response->getBody();
$this->assertModule('content', 'Last module run should be content module.'. $responseBody);
$this->assertController('index', 'Expected controller.'. $responseBody);
$this->assertAction('add', 'Expected action.'. $responseBody);
$this->assertResponseCode(200, 'Expected response code.'. $responseBody);
$this->assertRegexp('/contentId.+'. $newId .'/', $responseBody, 'Expected content id');
$fetched = P4Cms_Content::fetch($newId);
$this->assertSame($title, $fetched->getValue('title'), 'Expected title in saved content');
$this->assertSame($body, $fetched->getValue('body'), 'Expected body in saved content');
}
| Content_Test_IndexControllerTest::testAddNoPostTypeExists | ( | ) |
Test add action without post, using an existing type.
{
$this->utility->impersonate('author');
// create a type
list($type, $entry) = $this->_createTestTypeAndEntry();
$this->request->setParam('type', $type->getId());
$this->dispatch('/content/add');
$this->assertModule('content', 'Last module run should be content module.');
$this->assertController('index', 'Expected controller');
$this->assertAction('add', 'Expected action');
// check that output looks correct.
$this->assertQuery(
'div#content-entry-[contentType="test-type"]',
'Expected content-type to be specified in entry widget'
);
$this->assertQuery(
'div[elementName="body"]',
'Expected body element.'
);
$this->assertQuery(
'div[elementName="abstract"]',
'Expected abstract element.'
);
}
| Content_Test_IndexControllerTest::testAddNoPostTypeParam | ( | ) |
Test add action without post, manipulating the type param.
{
$this->utility->impersonate('author');
// test without a type
$this->dispatch('/content/add');
$this->assertModule('content', 'Last module run should be content module.');
$this->assertController('index', 'Expected controller');
$this->assertAction('choose-type', 'Expected action');
$this->resetRequest()->resetResponse();
$this->request->setParam('type', 'doesnotexist');
$this->dispatch('/content/add');
$this->assertModule('content', 'Last module run should be content module.');
$this->assertController('index', 'Expected controller');
$this->assertAction('choose-type', 'Expected action');
}
| Content_Test_IndexControllerTest::testBadBatch | ( | ) |
Test creating a bad batch.
{
$this->utility->impersonate('member');
list($type, $entry) = $this->_createTestTypeAndEntry();
P4Cms_PubSub::subscribe(
'p4cms.content.record.preSave',
function()
{
throw new Exception("Take that batch!");
}
);
$title = 'Second Title';
$body = 'The 2nd body.';
$params = array(
'contentType' => $type->getId(),
'title' => $title,
'body' => $body,
'format' => 'dojoio'
);
$this->request->setMethod('POST');
$this->request->setPost($params);
try {
$this->dispatch('/content/add');
$this->fail("Expected exception.");
} catch (Exception $e) {
// ensure batch reverted.
$adapter = P4Cms_Record::getDefaultAdapter();
$this->assertFalse($adapter->inBatch());
}
}
| Content_Test_IndexControllerTest::testBadLayoutSelection | ( | ) |
Test invalid layout fallback to default.
{
$this->utility->impersonate('anonymous');
$this->_createTestTypeAndEntry();
$type = P4Cms_Content_Type::fetch('test-type');
$type->setLayout('dasfsadf')->save();
// should use default layout.
$this->dispatch('content/view/id/1');
$this->assertQuery(".default-layout");
}
| Content_Test_IndexControllerTest::testBadView | ( | ) |
Test viewing non-existant content.
{
$this->utility->impersonate('anonymous');
// test view w. invalid id.
$this->request->setParam('id', 'test567');
$this->dispatch('/content/view');
$responseBody = $this->getResponse()->getBody();
$this->assertModule('error', 'Expected module.'. $responseBody);
$this->assertController('index', 'Expected controller.'. $responseBody);
$this->assertAction('page-not-found', 'Expected action.'. $responseBody);
}
| Content_Test_IndexControllerTest::testChooseType | ( | ) |
Test choose type directly.
{
$this->dispatch('/content/choose-type');
$this->assertModule('content', 'Expected module.');
$this->assertController('index', 'Expected controller');
$this->assertAction('choose-type', 'Expected action');
$body = $this->response->getBody();
$this->assertQuery('div[title="Pages"]', 'Expect to find Pages group');
$this->assertRegexp(
'/<a href="\/add\/type\/test-type">Test Type<\/a>/',
$body,
"Expected to find test type.\n$body"
);
$this->assertRegexp(
'/<a href="\/add\/type\/basic-page">Basic Page<\/a>/',
$body,
"Expected to find page module default type.\n$body"
);
$this->assertRegexp('/<body/', "Expect a body tag in this request\n$body");
}
| Content_Test_IndexControllerTest::testCustomLayoutSelection | ( | ) |
Test valid custom layout.
{
$this->utility->impersonate('anonymous');
$this->_createTestTypeAndEntry();
$type = P4Cms_Content_Type::fetch('test-type');
$type->setLayout('blank-layout')->save();
// should use blank layout.
$this->dispatch('content/view/id/1');
$this->assertQuery(".blank-layout");
}
| Content_Test_IndexControllerTest::testDefaultLayoutSelection | ( | ) |
Test default layout.
{
$this->utility->impersonate('anonymous');
$this->_createTestTypeAndEntry();
// should use default layout.
$this->dispatch('content/view/id/1');
$this->assertQuery(".default-layout");
}
| Content_Test_IndexControllerTest::testDeleteInvalidId | ( | ) |
Test delete action.
{
$this->utility->impersonate('administrator');
$this->request->setMethod('POST');
$this->request->setPost(array('ids' => array('not-exist')));
$this->dispatch('/content/delete/format/json');
$this->assertModule('content', __LINE__ .': Last module run should be content module.');
$this->assertController('index', __LINE__ .': Expected controller');
$this->assertAction('delete', __LINE__ .': Expected action');
// ensure no entries have been deleted
$response = Zend_Json::decode($this->response->getBody());
$this->assertSame(
0,
count($response['deletedIds']),
"Expected no entries have been deleted."
);
}
| Content_Test_IndexControllerTest::testDeleteInvalidRequestMethod | ( | ) |
Test deleting an invalid request method.
{
list($type, $entry) = $this->_createTestTypeAndEntry();
$this->request->setMethod('GET');
$this->dispatch('/content/delete/id/'. $entry->getId());
$this->assertModule('error', 'Expected error module.');
}
| Content_Test_IndexControllerTest::testDownload | ( | ) |
Test downloading.
{
$this->utility->impersonate('anonymous');
// create content entry to be deleted.
$this->_createContent();
$this->request->setParam('id', 'test890');
$this->dispatch('/content/download');
$this->assertModule('content', 'Expected module.');
$this->assertController('index', 'Expected controller');
$this->assertAction('download', 'Expected action');
// ensure content delivered.
$this->assertSame(
$this->response->getBody(),
"test file content"
);
// check headers.
$headers = $this->response->sendHeaders();
$this->assertSame(
$headers['content-type'],
'Content-Type: text/plain'
);
$this->assertSame(
$headers['content-disposition'],
'Content-Disposition: attachment; filename="myfile.txt"'
);
}
| Content_Test_IndexControllerTest::testEditBadPost | ( | ) |
Test edit action with a bad post.
{
$this->utility->impersonate('administrator');
list($type, $entry) = $this->_createTestTypeAndEntry();
$title = 'Another Title';
$body = 'The second body.';
$params = array(
'title' => '',
'body' => '',
'format' => 'dojoio'
);
$this->request->setParam('id', $entry->getId());
$this->request->setMethod('POST');
$this->request->setPost($params);
$this->dispatch('/content/edit');
$this->assertModule('content', 'Last module run should be content module.');
$this->assertController('index', 'Expected controller');
$this->assertAction('edit', 'Expected action');
$responseBody = $this->response->getBody();
$this->assertRegexp('/title[^}]*isEmpty/', $responseBody, 'Expect title validation failure');
}
| Content_Test_IndexControllerTest::testEditGoodPost | ( | ) |
Test edit action with a good post.
{
$this->utility->impersonate('administrator');
list($type, $entry) = $this->_createTestTypeAndEntry();
$title = 'Another Title';
$body = 'The second body.';
$params = array(
'contentType' => $type->getId(),
'id' => $entry->getId(),
'title' => $title,
'body' => $body,
'format' => 'dojoio'
);
$this->request->setParam('id', $entry->getId());
$this->request->setMethod('POST');
$this->request->setPost($params);
$this->dispatch('/content/edit');
$responseBody = $this->response->getBody();
$this->assertModule('content', 'Last module run should be content module.'. $responseBody);
$this->assertController('index', 'Expected controller.'. $responseBody);
$this->assertAction('edit', 'Expected action.'. $responseBody);
$this->assertResponseCode(200, 'Expected response code.'. $responseBody);
$this->assertRegexp('/contentId.+'. $entry->getId() .'/', $responseBody, 'Expected content id');
$fetched = P4Cms_Content::fetch($entry->getId());
$this->assertSame($title, $fetched->getValue('title'), 'Expected title in saved content');
$this->assertSame($body, $fetched->getValue('body'), 'Expected body in saved content');
}
| Content_Test_IndexControllerTest::testEditGoodPostWithId | ( | ) |
Test edit action with a good post, content type uses an id field.
{
$this->utility->impersonate('administrator');
list($type, $entry) = $this->_createTestTypeAndEntry(true);
$title = 'Another Title';
$body = 'The second body.';
$params = array(
'contentType' => $type->getId(),
'id' => $entry->getId(),
'title' => $title,
'body' => $body,
'format' => 'dojoio'
);
$this->request->setParam('id', $entry->getId());
$this->request->setMethod('POST');
$this->request->setPost($params);
$this->dispatch('/content/edit');
$responseBody = $this->response->getBody();
$this->assertModule('content', 'Last module run should be content module.'. $responseBody);
$this->assertController('index', 'Expected controller.'. $responseBody);
$this->assertAction('edit', 'Expected action.'. $responseBody);
$this->assertResponseCode(200, 'Expected response code.'. $responseBody);
$this->assertRegexp('/contentId.+'. $entry->getId() .'/', $responseBody, 'Expected content id');
$fetched = P4Cms_Content::fetch($entry->getId());
$this->assertSame($title, $fetched->getValue('title'), 'Expected title in saved content');
$this->assertSame($body, $fetched->getValue('body'), 'Expected body in saved content');
}
| Content_Test_IndexControllerTest::testEditNoPost | ( | ) |
Test edit action with no post.
{
$this->utility->impersonate('administrator');
list($type, $entry) = $this->_createTestTypeAndEntry();
$this->request->setParam('id', $entry->getId());
$this->dispatch('/content/edit');
$this->assertModule('content', 'Last module run should be content module.');
$this->assertController('index', 'Expected controller');
$this->assertAction('edit', 'Expected action');
$responseBody = $this->response->getBody();
$this->assertRegexp(
"/p4cms.content.startEdit/",
$responseBody,
'Expect JS edit mode enable code'.$responseBody
);
$this->assertQuery(
'div#content-entry-' . $entry->getId() . '[contentType="' . $type->getId() . '"]',
'Expected content-type to be specified in entry widget'
);
$this->assertQuery(
'div[elementName="title"]',
'Expected title element.'
);
$this->assertQueryContentContains(
'div[elementName="body"]',
$entry->getValue('body'),
'Expected body element.'
);
$this->assertQueryContentContains(
'div[elementName="abstract"]',
$entry->getValue('abstract'),
'Expected abstract element.'
);
}
| Content_Test_IndexControllerTest::testFormAction | ( | ) |
Test the form action.
{
// ensure no entry/type id causes error.
$this->dispatch('/content/form');
$responseBody = $this->getResponse()->getBody();
$this->assertModule('error', 'Last module run should be error module.'. $responseBody);
$this->assertController('index', 'Expected controller.'. $responseBody);
$this->assertAction('error', 'Expected action.'. $responseBody);
$this->assertResponseCode(500, 'Expected response code with no id.'. $responseBody);
$this->assertRegExp(
'/Cannot get content type. The content type has not been set./',
$responseBody,
'Expected error message.'
);
$this->resetRequest()->resetResponse();
// again with a content id
list($type, $entry) = $this->_createTestTypeAndEntry(true);
$this->dispatch('/content/form/id/'. $entry->getId());
$responseBody = $this->getResponse()->getBody();
$this->assertModule('content', __LINE__ .'Last module run should be content module.'. $responseBody);
$this->assertController('index', __LINE__ .'Expected controller.'. $responseBody);
$this->assertAction('form', __LINE__ .'Expected action.'. $responseBody);
$this->assertResponseCode(200, __LINE__ .'Expected response code with id.'. $responseBody);
$this->assertQuery(
'input[id="title"]',
__LINE__ .': Expected title element.'
);
$this->assertQueryContentContains(
'textarea[id="body"]',
$entry->getValue('body'),
__LINE__ .': Expected body element.'
);
$this->assertQueryContentContains(
'textarea[id="abstract"]',
$entry->getValue('abstract'),
__LINE__ .': Expected abstract element.'
);
$this->resetRequest()->resetResponse();
// again with a content type specified
$this->dispatch('/content/form/contentType/'. $type->getId());
$responseBody = $this->getResponse()->getBody();
$this->assertModule('content', __LINE__ .': Expected module.'. $responseBody);
$this->assertController('index', __LINE__ .': Expected controller.'. $responseBody);
$this->assertAction('form', __LINE__ .': Expected action.'. $responseBody);
$this->assertResponseCode(200, __LINE__ .'Expected response code with type.'. $responseBody);
$this->assertQuery(
'input[id="title"]',
__LINE__ .': Expected title element.'. $responseBody
);
$this->assertQuery(
'textarea[id="body"]',
__LINE__ .': Expected body element.'. $responseBody
);
$this->assertQuery(
'textarea[id="abstract"]',
__LINE__ .': Expected abstract element.'. $responseBody
);
}
| Content_Test_IndexControllerTest::testGoodBatch | ( | ) |
Test creating a proper batch.
{
$this->utility->impersonate('administrator');
list($type, $entry) = $this->_createTestTypeAndEntry();
// create a test category.
Category_Model_Category::store(array('id' => 'test'));
// count the number of changes pre-save.
$changeCount = $changes = P4_Change::fetchAll()->count();
$title = 'Second Title';
$body = 'The 2nd body.';
$params = array(
'contentType' => $type->getId(),
'title' => $title,
'body' => $body,
'format' => 'dojoio',
'category' => array(
'categories' => array('test')
)
);
$this->request->setMethod('POST');
$this->request->setPost($params);
$this->dispatch('/content/add');
// ensure save produced a single change with multiple files.
$changes = P4_Change::fetchAll();
$change = P4_Change::fetch($changeCount + 1);
$this->assertSame(
count($changes),
$changeCount + 1,
"Expected save to produce one change."
);
$this->assertTrue(count($change->getFiles()) > 1);
}
| Content_Test_IndexControllerTest::testGoodView | ( | ) |
Test viewing content.
{
$this->utility->impersonate('anonymous');
// create content entry to be viewed.
$this->_createContent();
$this->request->setParam('id', 'test567');
$this->dispatch('/content/view');
$responseBody = $this->getResponse()->getBody();
$this->assertModule('content', 'Expected module.'. $responseBody);
$this->assertController('index', 'Expected controller'. $responseBody);
$this->assertAction('view', 'Expected action'. $responseBody);
// check that correct data is displayed.
$this->assertQueryContentRegex('div[@elementname="title"]', '/My Title/', $responseBody);
$this->assertQueryContentRegex('div[@elementname="body"]', '/My content body/', $responseBody);
}
| Content_Test_IndexControllerTest::testImageAdjust | ( | ) |
Test image action with requested transformations.
{
// as this will properly work only with some image driver, we skip this test
// in the case when no image driver can be created or no jpeg support
try {
P4Cms_Image_Driver_Factory::create();
} catch (P4Cms_Image_Exception $e) {
$this->markTestSkipped("No image drivers available.");
}
$image = new P4Cms_Image;
if (!$image->isSupportedType('jpeg')) {
$this->markTestSkipped("Unsupported jpeg image format.");
}
$this->utility->impersonate('anonymous');
// create record with a real image (200x46 pixels)
$imageData = @file_get_contents(TEST_ASSETS_PATH . '/images/perforce-logo.jpg');
$entry = new P4Cms_Content;
$entry->setId('image-test')
->setContentType('test-type-w-file')
->setValue('title', 'Test Image')
->setValue('file', $imageData)
->setFieldMetadata(
'file',
array('filename' => 'image.jpg', 'mimeType' => 'image/jpg')
)
->save();
$tests = array(
array(
'params' => array(),
'outputDimensions' => array(
'width' => 200,
'height' => 46
),
'line' => __LINE__
),
array(
'params' => array(
'sharpen' => '1'
),
'outputDimensions' => array(
'width' => 200,
'height' => 46
),
'line' => __LINE__
),
array(
'params' => array(
'width' => '150'
),
'outputDimensions' => array(
'width' => 150,
'height' => 35
),
'line' => __LINE__
),
array(
'params' => array(
'height' => '23'
),
'outputDimensions' => array(
'width' => 100,
'height' => 23
),
'line' => __LINE__
),
array(
'params' => array(
'width' => '73',
'height' => '127'
),
'outputDimensions' => array(
'width' => 73,
'height' => 127
),
'line' => __LINE__
),
array(
'params' => array(
'maxWidth' => '100'
),
'outputDimensions' => array(
'width' => 100,
'height' => 23
),
'line' => __LINE__
),
array(
'params' => array(
'maxWidth' => '500'
),
'outputDimensions' => array(
'width' => 200,
'height' => 46
),
'line' => __LINE__
),
array(
'params' => array(
'maxHeight' => '30'
),
'outputDimensions' => array(
'width' => 130,
'height' => 30
),
'line' => __LINE__
),
array(
'params' => array(
'maxHeight' => '500'
),
'outputDimensions' => array(
'width' => 200,
'height' => 46
),
'line' => __LINE__
),
array(
'params' => array(
'width' => '300',
'maxWidth' => '152'
),
'outputDimensions' => array(
'width' => 152,
'height' => 35
),
'line' => __LINE__
),
array(
'params' => array(
'height' => '300',
'maxHeight' => '152'
),
'outputDimensions' => array(
'width' => 661,
'height' => 152
),
'line' => __LINE__
),
array(
'params' => array(
'height' => '92',
'maxWidth' => '300'
),
'outputDimensions' => array(
'width' => 300,
'height' => 69
),
'line' => __LINE__
),
array(
'params' => array(
'width' => '150',
'maxHeight' => '50'
),
'outputDimensions' => array(
'width' => 150,
'height' => 35
),
'line' => __LINE__
),
array(
'params' => array(
'width' => '450',
'height' => '150',
'maxWidth' => '300',
'maxHeight' => '100'
),
'outputDimensions' => array(
'width' => 300,
'height' => 100
),
'line' => __LINE__
),
array(
'params' => array(
'width' => '450',
'height' => '150',
'maxWidth' => '300',
'maxHeight' => '55'
),
'outputDimensions' => array(
'width' => 165,
'height' => 55
),
'line' => __LINE__
)
);
// run tests
foreach ($tests as $test) {
$this->resetRequest()->resetResponse();
$params = array_merge(
array('id' => 'image-test'),
$test['params']
);
$this->request->setParams($params);
$this->dispatch('/content/image/');
$this->assertModule('content', 'Expected module.');
$this->assertController('index', 'Expected controller');
$this->assertAction('image', 'Expected action');
// check dimensions of the output image
$dimensions = $image
->setData($this->getResponse()->getBody())
->getImageSize();
$this->assertSame(
$test['outputDimensions']['width'],
$dimensions['width'],
"Line {$test['line']}: Expected output image width."
);
$this->assertSame(
$test['outputDimensions']['height'],
$dimensions['height'],
"Line {$test['line']}: Expected output image height."
);
}
}
| Content_Test_IndexControllerTest::testIndex | ( | ) |
Test view action.
{
$this->utility->impersonate('anonymous');
$this->dispatch('/content/index');
$body = $this->response->getBody();
$this->assertModule('content', 'Last module run should be content module.'. $body);
$this->assertController('index', 'Expected controller'. $body);
$this->assertAction('index', 'Expected action'. $body);
// check that output looks sane.
$this->assertQueryContentRegex(
'#content p',
'/This site does not contain any content/',
'Expect the no content paragraph.'
);
// create a content entry, and make sure it appears in the index.
list($type, $entry) = $this->_createTestTypeAndEntry();
$this->resetRequest()
->resetResponse();
$this->dispatch('/content/index');
$this->assertModule('content', 'Last module run should be content module.');
$this->assertController('index', 'Expected controller');
$this->assertAction('index', 'Expected action');
// check that output looks correct.
$this->assertQueryContentContains(
'#content ul.content-list li h2 a',
$entry->getValue('title'),
'Expect the correct title.'
);
$this->assertQueryContentContains(
'#content ul.content-list li p.content-excerpt',
$entry->getValue('body'),
'Expect the correct excerpt.'
);
}
| Content_Test_IndexControllerTest::testInvalidImage | ( | ) |
Test finding invalid images in content.
{
$this->utility->impersonate('anonymous');
// create content entry to be downloaded.
$this->_createContent();
$this->request->setParam('id', 'test890');
$this->dispatch('/content/image/');
// verify that an invalid image gives a 404 response
$response = $this->response->getHttpResponseCode();
$this->assertSame(
$response,
404
);
}
| Content_Test_IndexControllerTest::testJsonDelete | ( | ) |
Test performing delete in json context.
{
$this->utility->impersonate('administrator');
list($type, $entry) = $this->_createTestTypeAndEntry();
$this->request->setMethod('POST');
$this->request->setPost(array('ids' => array(1)));
$this->dispatch('/content/delete/format/json');
$this->assertModule('content', __LINE__ .': Last module run should be content module.');
$this->assertController('index', __LINE__ .': Expected controller');
$this->assertAction('delete', __LINE__ .': Expected action');
// ensure 1 entry have been deleted
$response = Zend_Json::decode($this->response->getBody());
$this->assertSame(
array('1'),
$response['deletedIds'],
"Expected entry '1' has been deleted."
);
// ensure that entry id can be passed via 'id' parameter as well
$entry->setId(7);
$entry->save();
$this->resetRequest()->resetResponse();
$this->request->setMethod('POST');
$this->dispatch('/content/delete/id/7/format/json');
$this->assertModule('content', __LINE__ .': Last module run should be content module.');
$this->assertController('index', __LINE__ .': Expected controller');
$this->assertAction('delete', __LINE__ .': Expected action');
// ensure 1 entry have been deleted
$response = Zend_Json::decode($this->response->getBody());
$this->assertSame(
array('7'),
$response['deletedIds'],
"Expected entry '7' has been deleted."
);
}
| Content_Test_IndexControllerTest::testManage | ( | ) |
Test the manage action.
{
$this->utility->impersonate('administrator');
$this->dispatch('/content/manage');
$body = $this->response->getBody();
$this->assertModule('content', 'Expected module, dispatch #1. '. $body);
$this->assertController('index', 'Expected controller, dispatch #1 '. $body);
$this->assertAction('manage', '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');
// ensure add content button appears
$this->assertXpath('//button[@class="add-button"]', 'Expected add button. '. $body);
// check initial JSON output
$this->resetRequest()->resetResponse();
$this->dispatch('/content/browse/format/json');
$body = $this->response->getBody();
$this->assertModule('content', 'Expected module, dispatch #2. '. $body);
$this->assertController('index', 'Expected controller, dispatch #2 '. $body);
$this->assertAction('browse', 'Expected action, dispatch #2 '. $body);
$data = Zend_Json::decode($body);
$this->assertSame(
array(),
$data['items'],
'Expected no items'
);
// create several content entries.
$expected = array();
$order = array (1, 2, 3, 4, 5, 6, 7, 8, 9);
foreach ($order as $i) {
$entry = new P4Cms_Content;
$entry->setId("test$i")
->setValue('contentType', 'test-type')
->setValue('title', "title $i")
->setValue('file', str_repeat('.', $i))
->save();
$expected[] = array(
'id' => "test$i",
'title' => "title $i",
'type' => array(
"label" => $entry->getContentType()->getLabel(),
"description" => $entry->getContentType()->getDescription(),
"fields" => $entry->getContentType()->getElementNames()
),
'icon' => '/type/icon/id/test-type',
'excerpt' => "",
"#REdate" => "just now",
'rawDate' => $entry->getModTime(),
'deleted' => '',
'version' => "1",
'privileges' => P4Cms_User::fetchActive()->getAllowedPrivileges("content/$i"),
);
}
// check again and ensure entries appear.
$this->resetRequest()->resetResponse();
$this->request->setParam('sort', 'title');
$this->dispatch('/content/browse/format/json');
$body = $this->response->getBody();
$this->assertModule('content', 'Expected module, dispatch #3. '. $body);
$this->assertController('index', 'Expected controller, dispatch #3 '. $body);
$this->assertAction('browse', 'Expected action, dispatch #3 '. $body);
$body = $this->response->getBody();
$data = Zend_Json::decode($body);
// ensure that all entries in expected are contained in data items - we cannot
// compare whole arrays as there might be items added by other modules
foreach ($expected as $key => $expectedValues) {
$this->assertEquals(
$expectedValues,
array_intersect($expectedValues, $data['items'][$key]),
"Expected items for index: $key"
);
}
}
| Content_Test_IndexControllerTest::testMultipleDelete | ( | ) |
Test delete multiple entries in batch.
{
$this->utility->impersonate('editor');
// create 5 test entries with ids 1 to 5
list($type, $entry) = $this->_createTestTypeAndEntry();
for ($i = 2; $i <= 5; $i++) {
$entry->setId($i);
$entry->save();
}
// ensure that if no ids are passed, no entries will be deleted
$this->request->setMethod('POST');
$this->dispatch('/content/delete/format/json');
$response = Zend_Json::decode($this->response->getBody());
$this->assertSame(
0,
count($response['deletedIds']),
"Expected no entries were deleted."
);
$this->assertSame(
5,
P4Cms_Content::fetchAll()->count(),
"Expected no entries were deleted."
);
// delete entries 1,3, and 4
$this->resetRequest()->resetResponse();
$this->request->setMethod('POST');
$this->request->setPost(
array(
'ids' => array(1, 3, 4),
'comment' => 'delete 3 entries in a batch'
)
);
$this->dispatch('/content/delete/format/json');
$response = Zend_Json::decode($this->response->getBody());
$this->assertSame(
array('1', '3', '4'),
$response['deletedIds'],
"Expected entries 1,3 and 4 have been deleted."
);
$this->assertSame(
2,
P4Cms_Content::fetchAll()->count()
);
// verify that all entries were deleted in the same changelist
$entry1 = P4Cms_Content::fetch('1', array('includeDeleted' => true));
$entry3 = P4Cms_Content::fetch('3', array('includeDeleted' => true));
$entry4 = P4Cms_Content::fetch('4', array('includeDeleted' => true));
$this->assertSame(
$entry1->toP4File()->getChange()->getId(),
$entry3->toP4File()->getChange()->getId(),
"Expected entries 1,3 were submitted in the same change."
);
$this->assertSame(
$entry1->toP4File()->getChange()->getId(),
$entry4->toP4File()->getChange()->getId(),
"Expected entries 1,4 were submitted in the same change."
);
// ensure no other files were submitted in the same changelist
$this->assertSame(
3,
count($entry1->toP4File()->getChange()->getFiles()),
"Expected no other entries were submitted in the same change."
);
// verify that comment was saved in changelist decription
$this->assertSame(
"delete 3 entries in a batch\n",
$entry1->toP4File()->getChange()->getDescription(),
"Expected changelist description"
);
}
| Content_Test_IndexControllerTest::testOpenedAction | ( | ) |
test the opened action
{
$this->utility->impersonate('administrator');
list($type, $entry) = $this->_createTestTypeAndEntry();
$this->request->setParam('id', $entry->getId());
$this->dispatch('/content/opened');
$this->assertModule('content', 'Last module run should be content module.');
$this->assertController('index', 'Expected controller');
$this->assertAction('opened', 'Expected action');
$data = Zend_Json_Decoder::decode($this->response->getBody());
unset($data['change']['Date']);
unset($data['change']['Client']);
unset($data['change']['Change']);
$this->assertSame(
array(
'change' => array(
'User' => 'tester',
'Status' => 'submitted',
'Type' => 'public',
'Description' => "a test entry\n",
'JobStatus' => NULL,
'Jobs' => array(),
'Files' => array('//chronicle-test/live/content/1#1')
),
'status' => array(
'Version' => '1',
'Action' => 'add'
),
),
$data
);
}
| Content_Test_IndexControllerTest::testSecurity | ( | ) |
Test data are escaped in the view according to attached display filters.
{
$this->utility->impersonate('author');
// create content type for testing with display filters
$elements = array(
'id' => array(
'type' => 'text'
),
'title' => array(
'type' => 'text',
'options' => array('label' => 'Title', 'required' => true),
'display' => array('filters' => array("HtmlSpecialChars"))
),
'body' => array(
'type' => 'textarea',
'options' => array('label' => 'Body')
)
);
$type = new P4Cms_Content_Type;
$type->setId("test-type")
->setLabel("Test Type")
->setElements($elements)
->save();
// ensure content is saved into perforce unescaped
$title = "Escape test <script> a ( / & 1";
$body = "<a>1 & 2</a>";
$params = array(
'contentType' => 'test-type',
'id' => 'test1',
'title' => $title,
'body' => $body,
'format' => 'dojoio'
);
$this->request->setMethod('POST');
$this->request->setPost($params);
$this->dispatch('/content/add');
$responseBody = $this->response->getBody();
$this->assertModule('content', 'Expected module; '. $responseBody);
$this->assertController('index', 'Expected controller; '. $responseBody);
$this->assertAction('add', 'Expected action; '. $responseBody);
$entry = P4Cms_Content::fetch('test1');
$this->assertSame(
$title,
$entry->getValue('title'),
"Expected content entry title value."
);
$this->assertSame(
$body,
$entry->getValue('body'),
"Expected content entry body value."
);
// ensure data in the view are escaped according to filters
$this->resetRequest()
->resetResponse();
$this->dispatch('/content/view/id/test1');
$responseBody = $this->response->getBody();
$this->assertModule('content', 'Expected module; '. $responseBody);
$this->assertController('index', 'Expected controller; '. $responseBody);
$this->assertAction('view', 'Expected action; '. $responseBody);
// ensure title output is escaped
$this->assertQueryContentRegex(
'div[elementName="title"] span',
"/Escape test <script> a \( \/ & 1/",
__LINE__ .': Expected title element value.'
);
// ensure no escaping is done on body as no display filters have been set
// @note we parse the output directly as assertQueryContentRegex from some reason
// requires pattern to be /<a>1 & 2<\/a>/ although the output doesn't contain &
$pathPattern = '<div[^>]+elementName="body"';
$valuePattern = '<a>1 & 2<\/a>';
$this->assertTrue(
preg_match("/{$pathPattern}[^\/]+{$valuePattern}/", $responseBody) === 1,
__LINE__ .': Expected body element value.'
);
}
| Content_Test_IndexControllerTest::testStandardDelete | ( | ) |
Test performing a standard delete.
{
$this->utility->impersonate('administrator');
list($type, $entry) = $this->_createTestTypeAndEntry();
$this->request->setMethod('POST');
$this->dispatch('/content/delete/id/'. $entry->getId());
$responseBody = $this->getResponse()->getBody();
$this->assertModule('content', __LINE__ .': Last module run should be content module.'. $responseBody);
$this->assertController('index', __LINE__ .': Expected controller'. $responseBody);
$this->assertAction('delete', __LINE__ .': Expected action'. $responseBody);
// expect redirect to manage index.
$this->assertRedirectTo('/', __LINE__ .': Expect redirect to content manage index.'. $responseBody);
}
| Content_Test_IndexControllerTest::testSubForm | ( | ) |
Test getting content sub-forms.
{
$this->utility->impersonate('author');
// create a category so the sub form will contain one.
Category_Model_Category::store('test-category');
$type = new P4Cms_Content_Type;
$type->setId("test-type")
->setLabel("Test Type")
->save();
// ensure fetching category sub-form works as expected.
$this->request->setParam('contentType', 'test-type')
->setParam('form', 'category');
$this->dispatch('/content/index/sub-form');
$this->assertQuery('fieldset#fieldset-category');
$this->assertQuery('input[name="category[categories][]"]');
$this->assertQuery('input[value="test-category"]');
}
| Content_Test_IndexControllerTest::testValidateFieldBadContentType | ( | ) |
Test validateField w.
bad content type.
{
$this->utility->impersonate('editor');
list($type, $entry) = $this->_createTestTypeAndEntry();
$this->getRequest()->setParam('contentType', 'doesnotexist');
$this->getRequest()->setParam('field', 'fieldName');
$this->dispatch('/content/validate-field');
$this->assertModule('error');
$this->assertController('index');
$this->assertAction('error');
$responseBody = $this->getResponse()->getBody();
$this->assertRegexp('/Cannot fetch record \'doesnotexist\'. Record does not exist./', $responseBody);
}
| Content_Test_IndexControllerTest::testValidateFieldBadField | ( | ) |
Test validate w.
non-existent field
{
$this->utility->impersonate('editor');
list($type, $entry) = $this->_createTestTypeAndEntry();
$this->getRequest()->setParams(
array(
'contentType' => $type->getId(),
'field' => 'doesnotexist',
'value' => ''
)
);
$this->dispatch('/content/validate-field');
$this->assertModule('error');
$this->assertController('index');
$this->assertAction('error');
$responseBody = $this->getResponse()->getBody();
$this->assertRegexp('/P4Cms_Content_Exception/', $responseBody);
}
| Content_Test_IndexControllerTest::testValidateFieldBadValue | ( | ) |
Test validate w.
bad value
{
$this->utility->impersonate('editor');
list($type, $entry) = $this->_createTestTypeAndEntry();
$this->getRequest()->setParams(
array(
'contentType' => $type->getId(),
'field' => 'title',
'value' => ''
)
);
$this->dispatch('/content/validate-field');
$this->assertModule('content');
$this->assertController('index');
$this->assertAction('validate-field');
$responseBody = $this->getResponse()->getBody();
$responseData = Zend_Json::decode($responseBody);
$this->assertFalse($responseData['isValid']);
$this->assertSame(1, count($responseData['errors']));
}
| Content_Test_IndexControllerTest::testValidateFieldGoodValue | ( | ) |
Test validate w.
a good value.
{
$this->utility->impersonate('editor');
list($type, $entry) = $this->_createTestTypeAndEntry();
$this->getRequest()->setParams(
array(
'contentType' => $type->getId(),
'field' => 'title',
'value' => 'good title'
)
);
$this->dispatch('/content/validate-field');
$this->assertModule('content');
$this->assertController('index');
$this->assertAction('validate-field');
$responseBody = $this->getResponse()->getBody();
$responseData = Zend_Json::decode($responseBody);
$this->assertTrue($responseData['isValid']);
$this->assertSame(0, count($responseData['errors']));
$this->assertSame(1, preg_match('/good title/', $responseData['displayValue']));
}
| Content_Test_IndexControllerTest::testValidateFieldNoParams | ( | ) |
Test validateField w.
no params.
{
$this->utility->impersonate('editor');
list($type, $entry) = $this->_createTestTypeAndEntry();
$this->dispatch('/content/validate-field');
$this->assertModule('error');
$this->assertController('index');
$this->assertAction('error');
$responseBody = $this->getResponse()->getBody();
$this->assertRegexp('/P4Cms_Content_Exception/', $responseBody);
}
| Content_Test_IndexControllerTest::testValidImage | ( | ) |
Test finding valid images in content.
{
$this->utility->impersonate('anonymous');
// create content entry to be downloaded.
$this->_createContent();
$this->request->setParam('id', 'test867-5309');
$this->dispatch('/content/image/');
$this->assertModule('content', 'Expected module.');
$this->assertController('index', 'Expected controller');
$this->assertAction('image', 'Expected action');
// ensure content delivered.
$this->assertSame(
$this->response->getBody(),
"test image content"
);
// check headers.
$headers = $this->response->sendHeaders();
$this->assertSame(
$headers['content-type'],
'Content-Type: image/jpg',
'Expected content type'
);
$this->assertFalse(
array_key_exists('content-disposition', $headers),
'Expect content-disposition to not exist'
);
}
| Content_Test_IndexControllerTest::testView | ( | ) |
Test the view action.
{
$this->utility->impersonate('anonymous');
$this->dispatch('/content/view/id/1/does not exist');
$this->assertModule('error', __LINE__ .': Last module run should be error module.');
$this->assertController('index', __LINE__ .': Expected controller');
$this->assertAction('page-not-found', __LINE__ .': Expected action');
$this->resetRequest()->resetResponse();
list($type, $entry) = $this->_createTestTypeAndEntry();
$this->dispatch('/content/view/id/'. $entry->getId());
$this->assertModule('content', __LINE__ .': Last module run should be content module.');
$this->assertController('index', __LINE__ .': Expected controller');
$this->assertAction('view', __LINE__ .': Expected action');
$this->assertQuery(
'div#content-entry-1[contentType="' . $type->getId() . '"]',
__LINE__ .': Expected content-type to be specified in entry widget'
);
$this->assertQueryContentContains(
'div[elementName="title"]',
$entry->getValue('title'),
__LINE__ .': Expected title element.'
);
$this->assertQueryContentContains(
'div[elementName="body"]',
$entry->getValue('body'),
__LINE__ .': Expected body element.'
);
$this->assertQueryContentContains(
'div[elementName="abstract"]',
$entry->getValue('abstract'),
__LINE__ .': Expected abstract element.'
);
}
| Content_Test_IndexControllerTest::testViewScriptSelection | ( | ) |
Test view script selection (more specific to less specific).
The 'default' test theme has a specific view for content id #2 and for content type id 'test-type-2'.
{
$this->utility->impersonate('anonymous');
$this->_createTestTypeAndEntry();
// first entry should get default view.
$this->dispatch('content/view/id/1');
$this->assertQuery("div#content-entry-1");
// reset for next test.
$this->resetRequest()->resetResponse();
// test again with a new type that has a custom view.
$type = P4Cms_Content_Type::fetch('test-type');
$type->setId('test-type-2')->save();
$entry = P4Cms_Content::fetch(1);
$entry->setContentType('test-type-2')->save();
// updated entry should get the type specific view.
$this->dispatch('content/view/id/1');
$this->assertQuery("div#type-specific");
// reset for next test.
$this->resetRequest()->resetResponse();
// test again with a new entry that has a custom view.
$entry = P4Cms_Content::fetch(1);
$entry->setId(2)->save();
// new entry should get the entry specific view.
$this->dispatch('content/view/id/2');
$this->assertQuery("div#entry-specific");
// reset for next test.
$this->resetRequest()->resetResponse();
// test again with type that has a custom view.
$entry->setContentType('test-type-2')->save();
// updated entry should still get the entry specific view.
$this->dispatch('content/view/id/2');
$this->assertQuery("div#entry-specific");
}
| Content_Test_IndexControllerTest::$bootstrap = array('Bootstrap', 'run') |