|
Perforce Chronicle 2012.2/486814
API Documentation
|
Test the workflow index controller. More...
Public Member Functions | |
| testAdd () | |
| Test the add action. | |
| testBadAddPost () | |
| Test bogus post to add. | |
| testBadEditId () | |
| Test edit with bad workflow id. | |
| testBadEditPost () | |
| Test bad post to edit. | |
| testDelete () | |
| Test deleting workflow. | |
| testDeleteByAnonymous () | |
| Test delete action with anonymous access. | |
| testDeleteInvalidId () | |
| Test delete action with invalid id. | |
| testDeleteInvalidRequestMethod () | |
| Test deleting an invalid request method. | |
| testDeleteJson () | |
| Test deleting workflow in json context. | |
| testGoodAddPost () | |
| Test good post to add. | |
| testGoodEditPost () | |
| Test good post to edit. | |
| testIndexAction () | |
| Test manage workflows grid. | |
| testReset () | |
| Test workflows reset action. | |
Protected Member Functions | |
| _createWorkflow ($id) | |
| Create sample workflow record. | |
| _getTestWorkflowFormBadData () | |
| Return list with bogus data suitable for testing the workflow form. | |
| _getTestWorkflowFormGoodData () | |
| Return list with good data suitable for testing the workflow form. | |
| _getWorkflowFormElementsType () | |
| Return array with types of workflow form elements. | |
| _verifyBadPost ($url, $action, array $data) | |
| Dispatch to provided url with provided post data and verify that form contains errors. | |
| _verifyGoodPost ($url, $action, array $data) | |
| Dispatch to provided url with provided post data and verify that form values have been saved. | |
Test the workflow index controller.
| Workflow_Test_IndexControllerTest::_createWorkflow | ( | $ | id | ) | [protected] |
Create sample workflow record.
| string | $id | Id of created workflow. |
{
return Workflow_Model_Workflow::store(
array(
'id' => "$id",
'label' => "$id label",
'description' => "$id description"
)
);
}
| Workflow_Test_IndexControllerTest::_getTestWorkflowFormBadData | ( | ) | [protected] |
Return list with bogus data suitable for testing the workflow form.
{
// following data are suitable for testing both add and edit actions,
// however as id is provided from url for edit action, there must be
// an extra flag (idError = true) set if id error contributes to the
// total amount of errors (errorsCount)
$data = array(
array(
'values' => array(),
'errorsCount' => 3,
'idError' => true,
'message' => 'Missing required fields #1'
),
array(
'values' => array(
'description' => 'test desc'
),
'errorsCount' => 3,
'idError' => true,
'message' => 'Missing required fields #2'
),
array(
'values' => array(
'id' => 'foo'
),
'errorsCount' => 2,
'message' => 'Missing required fields #3'
),
array(
'values' => array(
'label' => 'foo',
'description' => 'foo desc',
'states' => "[foo] label = bar",
),
'errorsCount' => 1,
'idError' => true,
'message' => 'Missing id'
),
array(
'values' => array(
'id' => '#$%^',
'label' => 'foo',
'states' => '[a]'
),
'errorsCount' => 1,
'idError' => true,
'message' => 'Wrong id #1'
),
array(
'values' => array(
'id' => '@1',
'label' => 'foo',
'description' => 'bar',
'states' => '[baz]'
),
'errorsCount' => 1,
'idError' => true,
'message' => 'Wrong id #2'
),
array(
'values' => array(
'id' => 'spaces not allowed',
'label' => 'foo',
'description' => 'foo desc',
'states' => "[foo] label = bar",
),
'errorsCount' => 1,
'idError' => true,
'message' => 'Wrong id #3'
),
array(
'values' => array(
'id' => 'bar',
'label' => 'Bar',
'description' => 'bar desc',
'states' => "state",
),
'errorsCount' => 1,
'message' => 'Wrong states field (at least one state has to be defined)'
),
array(
'values' => array(
'id' => 'bar',
'label' => 'Bar',
'description' => 'bar desc',
'states' => "label=w",
),
'errorsCount' => 1,
'message' => 'Wrong states field (at least one state has to be defined)'
),
array(
'values' => array(
'id' => 'baz',
'label' => 'Baz baz',
'description' => 'bazzzZZZzzz',
'states' => "[state label = baz",
),
'errorsCount' => 1,
'message' => 'Wrong states field (not a valid INI format)'
)
);
return $data;
}
| Workflow_Test_IndexControllerTest::_getTestWorkflowFormGoodData | ( | ) | [protected] |
Return list with good data suitable for testing the workflow form.
{
$data = array(
array(
'values' => array(
'id' => 'foo',
'label' => 'foo label',
'states' => "[foo] label = bar",
),
),
array(
'values' => array(
'id' => 'bar',
'label' => 'bar label',
'description' => 'bar desc',
'states' => "[bar]\nlabel = baz\n[foo]\nlabel = another baz",
),
),
array(
'values' => array(
'id' => 'baz',
'label' => 'baz label',
'states' => "[123] a=b",
),
),
array(
'values' => array(
'id' => 'test',
'label' => 'x',
'description' => 'y',
'states' => "[ab c]",
),
)
);
return $data;
}
| Workflow_Test_IndexControllerTest::_getWorkflowFormElementsType | ( | ) | [protected] |
Return array with types of workflow form elements.
{
return array(
'id' => 'text',
'label' => 'text',
'description' => 'textarea',
'states' => 'textarea'
);
}
| Workflow_Test_IndexControllerTest::_verifyBadPost | ( | $ | url, |
| $ | action, | ||
| array $ | data | ||
| ) | [protected] |
Dispatch to provided url with provided post data and verify that form contains errors.
| string | $url | Url to dispatch to. |
| string | $action | Workflow action. |
| array | $data | Array containing post data, expected number of errors and message for assert output. |
{
$this->resetRequest()
->resetResponse();
$this->request->setMethod('POST');
$this->request->setPost($data['values']);
$this->dispatch($url);
$this->assertModule('workflow', 'Expected module.');
$this->assertController('index', 'Expected controller');
$this->assertAction($action, 'Expected action');
$this->assertResponseCode(400, 'Expected bad request response code.');
// check form errors
$this->assertQuery("#layout-main form.workflow-form", "Expected add form.");
$this->assertQueryCount(
"ul.errors",
$data['errorsCount'],
"Expected {$data['errorsCount']} form errors for test '{$data['message']}'."
);
// edit form should always preserve id from url
if ($action === 'edit') {
$data['values']['id'] = $this->getRequest()->getParam('id');
}
// ensure posted data were preserved
$elementTypes = $this->_getWorkflowFormElementsType();
foreach ($data['values'] as $field => $value) {
$query = $elementTypes[$field] == 'textarea'
? "dd textarea[name='$field']"
: "dd#$field-element";
$this->assertQueryContentContains(
"form.workflow-form $query",
$value,
"Expected preserving of value '$value' for '$field' field for test '{$data['message']}'."
);
}
}
| Workflow_Test_IndexControllerTest::_verifyGoodPost | ( | $ | url, |
| $ | action, | ||
| array $ | data | ||
| ) | [protected] |
Dispatch to provided url with provided post data and verify that form values have been saved.
| string | $url | Url to dispatch to. |
| string | $action | Workflow action. |
| array | $data | Array containing post data. |
{
$this->resetRequest()
->resetResponse();
$this->request->setMethod('POST');
$this->request->setPost($data['values']);
$this->dispatch($url);
$this->assertModule('workflow', 'Expected module.');
$this->assertController('index', 'Expected controller');
$this->assertAction($action, 'Expected action');
// expect redirect to previous page (base url)
$this->assertRedirectTo('/workflow/manage', 'Expect redirect to manage page.');
// edit form should always preserve id from url
if ($action === 'edit') {
$data['values']['id'] = $this->getRequest()->getParam('id');
}
// verify workflow record has been saved
$this->assertTrue(
Workflow_Model_Workflow::exists($data['values']['id']),
"Expected workflow record has been saved/updated."
);
// verify model values
$workflow = Workflow_Model_Workflow::fetch($data['values']['id']);
foreach ($data['values'] as $field => $value) {
// states are by default returned as list of state models
$workflowValue = $field == 'states'
? $workflow->getStatesAsIni()
: $workflow->getValue($field);
$this->assertSame(
$value,
$workflowValue,
"Expected value of '$field' returned by workflow model."
);
}
}
| Workflow_Test_IndexControllerTest::testAdd | ( | ) |
Test the add action.
{
$this->utility->impersonate('editor');
// verify form markup for different contexts
$contexts = array(null, 'partial');
foreach ($contexts as $context) {
$format = $context ? "/format/$context" : "";
$this->resetRequest()
->resetResponse();
$this->dispatch('/workflow/add' . $format);
$this->assertModule('workflow', 'Expected module.');
$this->assertController('index', 'Expected controller');
$this->assertAction('add', 'Expected action');
// ensure that form inputs are presented correctly
$this->assertQuery("form.workflow-form", "Expected add form.");
foreach ($this->_getWorkflowFormElementsType() as $field => $type) {
$query = $type !== 'textarea' ? 'input' : $type;
$this->assertQuery("{$query}[name='$field']", "Expected '$field' input.");
}
$this->assertQuery("input[type='submit']", "Expected submit button.");
// ensure labels are present.
$labels = array(
'id' => 'Id',
'label' => 'Label',
'description' => 'Description',
'states' => 'States'
);
foreach ($labels as $field => $label) {
$this->assertQueryContentContains("label[for='$field']", $label, "Expected $field label.");
}
}
}
| Workflow_Test_IndexControllerTest::testBadAddPost | ( | ) |
Test bogus post to add.
{
$this->utility->impersonate('editor');
// add workflow to allow testing for unique id
$this->_createWorkflow('test');
$tests = $this->_getTestWorkflowFormBadData();
$tests[] = array(
'values' => array(
'id' => 'test',
'label' => 'foo',
'description' => 'bar',
'states' => "[baz] label = baz",
),
'errorsCount' => 1,
'message' => 'Id already exists'
);
// loop throught all tests
foreach ($tests as $test) {
$this->_verifyBadPost('/workflow/add', 'add', $test);
}
}
| Workflow_Test_IndexControllerTest::testBadEditId | ( | ) |
Test edit with bad workflow id.
{
$this->utility->impersonate('editor');
$this->request->setParam('id', 'noexist');
$this->dispatch('/workflow/edit');
$this->assertModule('error', 'Expected module.');
$this->assertController('index', 'Expected controller.');
$this->assertAction('error', 'Expected action.');
}
| Workflow_Test_IndexControllerTest::testBadEditPost | ( | ) |
Test bad post to edit.
{
$this->utility->impersonate('editor');
$workflow = $this->_createWorkflow('foo');
$workflow->setValue('states', '[foo]\nlabel=foo label')
->save();
$tests = $this->_getTestWorkflowFormBadData();
// loop throught all tests
foreach ($tests as $test) {
// skip tests with 1 error due to wrong id as id for edit is provided from url
if (isset($test['idError']) && $test['idError'] === true) {
$test['errorsCount']--;
}
if ($test['errorsCount'] == 0) {
continue;
}
$this->_verifyBadPost('/workflow/edit/id/foo', 'edit', $test);
}
}
| Workflow_Test_IndexControllerTest::testDelete | ( | ) |
Test deleting workflow.
{
$this->utility->impersonate('editor');
$this->_createWorkflow('delete');
$this->_createWorkflow('no-delete');
$this->request->setMethod('POST');
$this->request->setParam('id', 'delete');
$this->dispatch('/workflow/delete');
$this->assertModule('workflow', 'Expected module.');
$this->assertController('index', 'Expected controller');
$this->assertAction('delete', 'Expected action');
// should redirect to the previous page (base url in this case)
$this->assertRedirectTo('/workflow/manage', 'Expect redirect to manage page.');
// verify workflow records after delete
$this->assertFalse(
Workflow_Model_Workflow::exists('delete'),
"Expected delete workflow has been deleted."
);
$this->assertTrue(
Workflow_Model_Workflow::exists('no-delete'),
"Expected no-delete workflow has not been deleted."
);
}
| Workflow_Test_IndexControllerTest::testDeleteByAnonymous | ( | ) |
Test delete action with anonymous access.
{
$this->_createWorkflow('test');
$this->request->setMethod('POST');
$this->request->setParam('id', 'test');
$this->dispatch('/workflow/delete');
$this->assertModule('error', __LINE__ .': Last module run should be error module.');
$this->assertController('index', __LINE__ .': Expected controller');
$this->assertAction('access-denied', __LINE__ .': Expected action');
// verify workflow record has not been deleted
$this->assertTrue(
Workflow_Model_Workflow::exists('test'),
"Expected test workflow has not been deleted."
);
}
| Workflow_Test_IndexControllerTest::testDeleteInvalidId | ( | ) |
Test delete action with invalid id.
{
$this->utility->impersonate('editor');
$this->request->setMethod('POST');
$this->dispatch('/workflow/delete/id/does-not-exist');
$this->assertModule('error', __LINE__ .': Last module run should be error module.');
$this->assertController('index', __LINE__ .': Expected controller');
$this->assertAction('error', __LINE__ .': Expected action');
}
| Workflow_Test_IndexControllerTest::testDeleteInvalidRequestMethod | ( | ) |
Test deleting an invalid request method.
{
$this->_createWorkflow('foo');
$this->request->setMethod('GET');
$this->dispatch('/workflow/delete/id/foo');
$this->assertModule('error', 'Expected error module.');
}
| Workflow_Test_IndexControllerTest::testDeleteJson | ( | ) |
Test deleting workflow in json context.
{
$this->utility->impersonate('editor');
$this->_createWorkflow('del');
$this->_createWorkflow('del1');
$this->request->setMethod('POST');
$this->request->setPost(
array(
'id' => 'del1',
'format' => 'json'
)
);
$this->dispatch('/workflow/delete');
$this->assertModule('workflow', 'Expected module.');
$this->assertController('index', 'Expected controller');
$this->assertAction('delete', 'Expected action');
// when delete in context, no redirecting should be made
$this->assertNotRedirect(
"Expected user is not redirected after workflow delete if within a context."
);
$responseBody = $this->response->getBody();
$this->assertEquals(
Zend_Json::encode(array('id' => 'del1')),
$responseBody,
__LINE__ .': Expected json output.'
);
// verify workflow records after delete
$this->assertFalse(
Workflow_Model_Workflow::exists('del1'),
"Expected del1 workflow has been deleted."
);
$this->assertTrue(
Workflow_Model_Workflow::exists('del'),
"Expected del workflow has not been deleted."
);
}
| Workflow_Test_IndexControllerTest::testGoodAddPost | ( | ) |
Test good post to add.
{
$this->utility->impersonate('editor');
$tests = $this->_getTestWorkflowFormGoodData();
// loop throught all tests
foreach ($tests as $test) {
$this->_verifyGoodPost('/workflow/add', 'add', $test);
}
}
| Workflow_Test_IndexControllerTest::testGoodEditPost | ( | ) |
Test good post to edit.
{
$this->utility->impersonate('editor');
$workflow = $this->_createWorkflow('bar');
$workflow->setValue('states', '[bar]\nlabel=bar label')
->save();
$tests = $this->_getTestWorkflowFormGoodData();
// loop throught all tests
foreach ($tests as $test) {
$this->_verifyGoodPost('/workflow/edit/id/bar', 'edit', $test);
}
}
| Workflow_Test_IndexControllerTest::testIndexAction | ( | ) |
Test manage workflows grid.
{
$this->utility->impersonate('editor');
// verify that workflows grid is accessible
$this->dispatch('/workflow');
$this->assertModule('workflow', 'Expected module for dispatching /workflow action.');
$this->assertController('index', 'Expected controller for dispatching /workflow action.');
$this->assertAction('index', 'Expected action for dispatching /workflow action.');
// verify that 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" and @jsid="p4cms.workflow.grid.instance"]',
'Expected dojox.grid table'
);
// verify add and reset buttons appear
// verify save and restore buttons appear
$this->assertQueryContentContains(
"div.button button.add-button",
"Add Workflow",
"Expected existence of Add Workflow button."
);
$this->assertQueryContentContains(
"div.button button",
"Reset to Defaults",
"Expected existence of Reset to Defaults button."
);
// check initial JSON output
$this->resetRequest()
->resetResponse();
$this->dispatch('/workflow/format/json');
$body = $this->response->getBody();
$this->assertModule('workflow', 'Expected module, dispatch #2. '. $body);
$this->assertController('index', 'Expected controller, dispatch #2 '. $body);
$this->assertAction('index', 'Expected action, dispatch #2 '. $body);
// verify there are no items in the grid
$data = Zend_Json::decode($body);
$this->assertSame(
array(),
$data['items'],
'Expected no workflows.'
);
// add few workflows and verify they appear
$this->_createWorkflow('test');
$this->_createWorkflow('foo');
$this->resetRequest()
->resetResponse();
// sort by label
$this->dispatch('/workflow/format/json?sort=label');
$body = $this->response->getBody();
$this->assertModule('workflow', 'Expected module, dispatch #3. '. $body);
$this->assertController('index', 'Expected controller, dispatch #3 '. $body);
$this->assertAction('index', 'Expected action, dispatch #3 '. $body);
$data = Zend_Json::decode($body);
$expected = array(
0 => array(
'id' => 'foo',
'label' => 'foo label',
'description' => 'foo description',
'states' => array(),
'contentTypes' => array()
),
1 => array(
'id' => 'test',
'label' => 'test label',
'description' => 'test description',
'states' => array(),
'contentTypes' => array()
)
);
$this->assertEquals(
$expected,
$data['items'],
'Expected 2 workflows.'
);
}
| Workflow_Test_IndexControllerTest::testReset | ( | ) |
Test workflows reset action.
{
$this->utility->impersonate('editor');
$workflows = array('workflow1', 'workflow2');
foreach ($workflows as $workflow) {
$this->_createWorkflow($workflow);
}
// ensure worflows are there
foreach ($workflows as $workflow) {
$this->assertTrue(
Workflow_Model_Workflow::exists($workflow),
"Expected '$workflow' workflow exists."
);
}
// reset workflows
$this->dispatch('/workflow/reset');
$this->assertModule('workflow', 'Expected module when workflow reset.');
$this->assertController('index', 'Expected controller when workflow reset.');
$this->assertAction('reset', 'Expected action when workflow reset.');
// ensure there are only default workflows
$defaultWorkflows = Workflow_Model_Workflow::fetchAll();
$this->assertEquals(
1,
$defaultWorkflows->count(),
"Expected 1 workflow after reset."
);
$this->assertTrue(
Workflow_Model_Workflow::exists('simple'),
"Expected presence of 'Simple' workflow after reset"
);
}