<?php
/**
* Test methods for the content list view helper.
*
* @copyright 2011 Perforce Software. All rights reserved.
* @license Please see LICENSE.txt in top-level folder of this distribution.
* @version <release>/<patch>
*/
class Content_Test_ContentListHelperTest extends ModuleTest
{
protected $_templateFile = 'contentListTemplate.phtml';
/**
* Create a type for testing.
*/
public function _createTestType()
{
$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'),
),
'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();
return $type;
}
/**
* Creates a test entry of the provided type
*
* @param P4Cms_Content_Type $type the content type of entry to create
* @param string $id the id to use for the content entry
*/
protected function _createTestEntry($type, $id = 'test-content')
{
$entry = new P4Cms_Content;
$entry->setContentType($type)
->setValue('title', 'Test Title')
->setValue('body', 'The body of the test')
->setValue('abstract', 'abstract this')
->setId($id)
->save('a test entry');
return $entry;
}
/**
* Test setup.
*/
public function setup()
{
parent::setup();
$this->_view = Zend_Layout::getMvcInstance()->getView();
$this->_view->addFilterPath(dirname(APPLICATION_PATH) . '/P4Cms/Filter');
}
/**
* Test instantiation.
*/
public function testInstantiation()
{
$helper = new Content_View_Helper_ContentList;
$helper->setView($this->_view);
$this->assertTrue($helper instanceof Content_View_Helper_ContentList, 'Expected class');
}
/**
* Test render without content
*/
public function testEmptyRender()
{
$type = $this->_createTestType();
$helper = new Content_View_Helper_ContentList;
$helper->setView($this->_view);
$helper->contentList(new P4Cms_Record_Query(array('type' => $type->getId())));
$this->assertEquals(
$helper->render(),
'No content entries found.',
'Expected empty list. ' . __LINE__
);
}
/**
* Test render with content, but no query; ensure that all items are rendered.
*/
public function testContentRender()
{
$type = $this->_createTestType();
for ($x = 0; $x < 5; ++$x) {
$this->_createTestEntry($type, 'test-content-' . $x);
}
$helper = new Content_View_Helper_ContentList;
$helper->setView($this->_view);
$helper->contentList(new P4Cms_Record_Query());
$expected = '<ul class="content-list">' . PHP_EOL;
for ($i = 0; $i < 5; $i++) {
$expected .= '<li class="content-list-entry-' . ($i + 1)
. ' content-list-entry-' . (($i + 1) % 2 ? 'odd' : 'even')
. ' content-list-type-test-type"><a href="/view/id/test-content-' . $i . '">'
. '<span class=\'value-node\'>Test Title</span></a></li>' . PHP_EOL;
}
$expected .= '</ul>' . PHP_EOL;
$this->assertSame(
$expected,
$helper->render(),
'Did not receive expected output. Line #' . __LINE__
);
}
/**
* Test render with content, no query, and a list of fields; ensure that all items are rendered
* but only requested fields are returned.
*/
public function testFieldsRender()
{
$type = $this->_createTestType();
for ($x = 0; $x < 5; ++$x) {
$this->_createTestEntry($type, 'test-content-' . $x);
}
$helper = new Content_View_Helper_ContentList;
$helper->setView($this->_view);
$helper->contentList(new P4Cms_Record_Query(), array('fields' => array('title', 'abstract')));
$expected = '<ul class="content-list">' . PHP_EOL;
for ($i = 0; $i < 5; $i++) {
$expected .= '<li class="content-list-entry-' . ($i + 1)
. ' content-list-entry-' . (($i + 1) % 2 ? 'odd' : 'even')
. ' content-list-type-test-type">'
. '<span class=\'value-node\'>Test Title</span>'
. '<span class=\'value-node\'>abstract this</span></li>' . PHP_EOL;
}
$expected .= '</ul>' . PHP_EOL;
$this->assertSame(
$expected,
$helper->render(),
'Expected only title and abstract fields. Line #' . __LINE__
);
}
/**
* Test render with content, no query, and a list of fields; ensure that all items are rendered
* but only requested fields are returned; fields should be altered by the provided filter.
*/
public function testFilteredFieldsRender()
{
$type = $this->_createTestType();
$this->_createTestEntry($type, 'test-content-0');
$this->_createTestEntry($type, 'test-content-1');
$options = array(
'fields' => array(
'title' => array('filters'=> array('StringToUpper'))
)
);
$helper = new Content_View_Helper_ContentList;
$helper->setView($this->_view);
$helper->contentList(new P4Cms_Record_Query(), $options);
$expected = '<ul class="content-list">' . PHP_EOL
. '<li class="content-list-entry-1 content-list-entry-odd'
. ' content-list-type-test-type"><span class=\'value-node\'>'
. 'TEST TITLE</span></li>' . PHP_EOL
. '<li class="content-list-entry-2 content-list-entry-even'
. ' content-list-type-test-type"><span class=\'value-node\'>'
. 'TEST TITLE</span></li>' . PHP_EOL
. '</ul>' . PHP_EOL;
$this->assertSame(
$expected,
$helper->render(),
'Expected only title and abstract fields. Line #' . __LINE__
);
}
/**
* Test render with content, no query, and a list of fields; ensure that all items are rendered
* but only requested fields are returned; fields should be altered by the provided decorator.
*/
public function testDecoratedFieldsRender()
{
$type = $this->_createTestType();
$this->_createTestEntry($type, 'test-content-0');
$this->_createTestEntry($type, 'test-content-1');
$options = array(
'fields' => array(
'title' => array(
'decorators'=> array(
'Value',
array(
'decorator' => 'HtmlTag',
'options' => array('tag' => 'div')
)
)
)
)
);
$helper = new Content_View_Helper_ContentList;
$helper->setView($this->_view);
$helper->contentList(new P4Cms_Record_Query(), $options);
$expected = '<ul class="content-list">' . PHP_EOL
. '<li class="content-list-entry-1 content-list-entry-odd'
. ' content-list-type-test-type"><div><span class=\'value-node\'>'
. 'Test Title</span></div></li>' . PHP_EOL
. '<li class="content-list-entry-2 content-list-entry-even'
. ' content-list-type-test-type"><div><span class=\'value-node\'>'
. 'Test Title</span></div></li>' . PHP_EOL
. '</ul>' . PHP_EOL;
$this->assertSame(
$expected,
$helper->render(),
'Expected decorated title field. Line #' . __LINE__
);
}
/**
* Test render with content, no query, and a list of fields that have default decorators;
* ensure that all items are rendered but only requested fields are returned;
* fields should be altered by the default decorators.
*/
public function testDefaultDecoratedRender()
{
$elements = array(
'title' => array(
'type' => 'text',
'options' => array('label' => 'Title', 'required' => true),
),
'image' => array(
'type' => 'imageFile',
'options' => array('label' => 'Pic'),
),
'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('image', file_get_contents(TEST_ASSETS_PATH . '/images/content-type-icon.png'))
->setFieldMetadata(
'image',
array(
"mimeType" => "image/png",
"filename" => 'content-type-icon.png'
)
)
->setId('file-content')
->save('a test entry');
$options = array('fields' => array('image'));
$helper = new Content_View_Helper_ContentList;
$helper->setView($this->_view);
$helper->contentList(new P4Cms_Record_Query(), $options);
$expected = '<ul class="content-list">' . PHP_EOL
. '<li class="content-list-entry-1 content-list-entry-odd content-list-type-test-type">'
. '<img orientation="" alt="content-type-icon.png" src="/image/id/file-content/field/image/v/1">'
. '</li>' . PHP_EOL . '</ul>' . PHP_EOL;
$this->assertSame(
$expected,
$helper->render(),
'Expected decorated title field. Line #' . __LINE__
);
}
/**
* Test render with content and a query; ensure that expected items are rendered.
*/
public function testContentQuery()
{
$type = $this->_createTestType();
for ($x = 0; $x < 5; $x++) {
$this->_createTestEntry($type, 'test-content-' . $x);
}
$entry = new P4Cms_Content;
$entry->setContentType($type)
->setValue('title', 'More Content')
->setValue('body', 'The body of the test')
->setValue('abstract', 'abstract this')
->setId('more-content')
->save('a test entry');
$query = new P4Cms_Record_Query;
$query->addFilter(P4Cms_Record_Filter::create()->add('contentType', 'test-type'));
$helper = new Content_View_Helper_ContentList;
$helper->setView($this->_view);
$helper->contentList($query);
$expected = '<ul class="content-list">' . PHP_EOL;
for ($i = -1; $i < 5; $i++) {
$id = $i >= 0 ? "test-content-$i" : "more-content";
$title = $i >= 0 ? "Test Title" : "More Content";
$expected .= '<li class="content-list-entry-' . ($i + 2)
. ' content-list-entry-' . (($i + 2) % 2 ? 'odd' : 'even')
. ' content-list-type-test-type"><a href="/view/id/' . $id . '">'
. '<span class=\'value-node\'>' . $title . '</span></a></li>' . PHP_EOL;
}
$expected .= '</ul>' . PHP_EOL;
$this->assertSame(
$expected,
$helper->render(),
'Expected 6 content entries returned by query with content type filter. Line #' . __LINE__
);
$query = new P4Cms_Record_Query;
$query->addFilter(P4Cms_Record_Filter::create()->add('title', 'More Content'));
$helper->contentList($query);
$expected = '<ul class="content-list">' . PHP_EOL
. '<li class="content-list-entry-1 content-list-entry-odd'
. ' content-list-type-test-type"><a href="/view/id/more-content">'
. '<span class=\'value-node\'>More Content</span></a></li>' . PHP_EOL
. '</ul>' . PHP_EOL;
$this->assertSame(
$expected,
$helper->render(),
'Expected 1 content entry returned by query with filter. Line #' . __LINE__
);
}
/**
* Test rendering the list with a template.
*/
public function testTemplateRender()
{
$type = $this->_createTestType();
for ($x = 0; $x < 5; ++$x) {
$this->_createTestEntry($type, 'test-content-' . $x);
}
$this->_view->setScriptPath(__DIR__ . '/');
$helper = new Content_View_Helper_ContentList;
$helper->setView($this->_view);
$helper->contentList(
new P4Cms_Record_Query(),
array('template' => $this->_templateFile)
);
$this->assertSelectCount(
'ul li',
$x,
$helper->render(),
'Expected ' . $x . ' content entries. Line #' . __LINE__
);
}
}