Adding Unit Test to ensure a right behaviour of BpmnWorkflow Adapter

- flow->gateways (bpmn) to route (workflow) conversion is working fine
 - start and end event (bpmn) to setting start and end tasks is working fine
This commit is contained in:
Erik Amaru Ortiz
2014-02-27 15:51:42 -04:00
parent 4615b44032
commit bf933a5bf2
5 changed files with 258 additions and 56 deletions

View File

@@ -226,6 +226,11 @@ class Route extends BaseRoute
return empty($rows) ? null : $rows[0];
}
/**
* @param $field
* @param null $value
* @return \Route[]
*/
public static function findAllBy($field, $value = null)
{
$field = is_array($field) ? $field : array($field => $value);

View File

@@ -191,42 +191,42 @@ class BpmnWorkflow extends Project\Bpmn
parent::removeGateway($gatUid);
}
// public function addFlow($data)
// {
// parent::addFlow($data);
public function addFlow($data)
{
$floUid = parent::addFlow($data);
// to add a workflow route
// - activity -> activity ==> route
// - activity -> gateway -> activity ==> selection, evaluation, parallel or parallel by evaluation route
// $routes = self::mapBpmnFlowsToWorkflowRoute($data, $flows);
//
// if ($routes !== null) {
// foreach ($routes as $routeData) {
// $this->wp->addRoute($routeData["from"], $routeData["to"], $routeData["type"]);
// }
//
// return true;
// }
//
// // to add start event->activity as initial or end task
// switch ($data["FLO_ELEMENT_ORIGIN_TYPE"]) {
// case "bpmnEvent":
// switch ($data["FLO_ELEMENT_DEST_TYPE"]) {
// case "bpmnActivity":
// $event = \BpmnEventPeer::retrieveByPK($data["FLO_ELEMENT_ORIGIN"]);
//
// switch ($event && $event->getEvnType()) {
// case "START":
// // then set that activity/task as "Start Task"
// $this->wp->setStartTask($data["FLO_ELEMENT_DEST"]);
// break;
// }
// break;
// }
// break;
// }
// to add start event->activity as initial or end task
switch ($data["FLO_ELEMENT_ORIGIN_TYPE"]) {
case "bpmnEvent":
switch ($data["FLO_ELEMENT_DEST_TYPE"]) {
case "bpmnActivity":
$event = \BpmnEventPeer::retrieveByPK($data["FLO_ELEMENT_ORIGIN"]);
// }
// setting as start task
if ($event && $event->getEvnType() == "START") {
$this->wp->setStartTask($data["FLO_ELEMENT_DEST"]);
}
break;
}
break;
case "bpmnActivity":
switch ($data["FLO_ELEMENT_DEST_TYPE"]) {
case "bpmnEvent":
$actUid = $data["FLO_ELEMENT_ORIGIN"];
$evnUid = $data["FLO_ELEMENT_DEST"];
$event = \BpmnEventPeer::retrieveByPK($evnUid);
// setting as end task
if ($event && $event->getEvnType() == "END") {
$this->wp->setEndTask($actUid);
}
break;
}
break;
}
return $floUid;
}
// public function updateFlow($floUid, $data, $flows)
// {
@@ -247,8 +247,10 @@ class BpmnWorkflow extends Project\Bpmn
if (! is_null($event) && $event->getEvnType() == "START") {
$activity = \BpmnActivityPeer::retrieveByPK($flow->getFloElementDest());
if (! is_null($activity)) {
$this->wp->setStartTask($activity->getActUid(), false);
}
}
} elseif ($flow->getFloElementOriginType() == "bpmnActivity" &&
$flow->getFloElementDestType() == "bpmnEvent") {
// verify case: activity -> event(end)
@@ -284,7 +286,7 @@ class BpmnWorkflow extends Project\Bpmn
throw new \RuntimeException("Required param \"EVN_TYPE\" is missing.");
}
parent::addEvent($data);
return parent::addEvent($data);
}
public function mapBpmnFlowsToWorkflowRoutes()

View File

@@ -354,6 +354,8 @@ class Bpmn extends Handler
$event->save();
self::log("Add Event Success!");
return $event->getEvnUid();
} catch (\Exception $e) {
self::log("Exception: ", $e->getMessage(), "Trace: ", $e->getTraceAsString());
throw $e;

View File

@@ -212,15 +212,24 @@ class Workflow extends Handler
public function getTask($tasUid)
{
try {
$task = new Task();
return $task->load($tasUid);
$taskData = $task->load($tasUid);
} catch (\Exception $e){
$taskData = null;
}
return $taskData;
}
/**
* @return array()
*/
public function getTasks()
{
if (empty($this->proUid)) {
return null;
return array();
}
$tasks = new Tasks();

View File

@@ -21,7 +21,7 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase
public static function tearDownAfterClass()
{
//return false;
return false;
//cleaning DB
foreach (self::$uids as $prjUid) {
$bwap = Project\Adapter\BpmnWorkflow::load($prjUid);
@@ -32,8 +32,8 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase
function testNew()
{
$data = array(
"PRJ_NAME" => "Test Bpmn/Workflow Project #1",
"PRJ_DESCRIPTION" => "Description for - Test BPMN Project #1",
"PRJ_NAME" => "Test Bpmn/Workflow Project #1.". rand(1, 100),
"PRJ_DESCRIPTION" => "Description for - Test BPMN Project #1." . rand(1, 100),
"PRJ_AUTHOR" => "00000000000000000000000000000001"
);
@@ -299,7 +299,7 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase
"BOU_Y" => 163
));
$flowUid1 = $bwap->addFlow(array(
$bwap->addFlow(array(
'FLO_TYPE' => 'SEQUENCE',
'FLO_ELEMENT_ORIGIN' => $actUid1,
'FLO_ELEMENT_ORIGIN_TYPE' => 'bpmnActivity',
@@ -311,7 +311,7 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase
'FLO_Y2' => 163,
));
$flowUid2 = $bwap->addFlow(array(
$bwap->addFlow(array(
'FLO_TYPE' => 'SEQUENCE',
'FLO_ELEMENT_ORIGIN' => $gatUid,
'FLO_ELEMENT_ORIGIN_TYPE' => 'bpmnGateway',
@@ -325,19 +325,20 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase
$bwap->mapBpmnFlowsToWorkflowRoutes();
$this->assertCount(2, $bwap->getActivities());
$this->assertCount(1, $bwap->getGateways());
$this->assertCount(2, $bwap->getFlows());
$flows1 = \BpmnFlow::findAllBy(\BpmnFlowPeer::FLO_ELEMENT_DEST, $gatUid);
$flows2 = \BpmnFlow::findAllBy(\BpmnFlowPeer::FLO_ELEMENT_ORIGIN, $gatUid);
$this->assertCount(1, $flows1);
$this->assertCount(1, $flows2);
$this->assertEquals($flows1[0]->getFloElementOrigin(), $actUid1);
$this->assertEquals($flows2[0]->getFloElementDest(), $actUid2);
// cleaning
$bwap->removeActivity($actUid1);
$bwap->removeActivity($actUid2);
$bwap->removeGateway($gatUid);
$this->assertCount(0, $bwap->getActivities());
$this->assertCount(0, $bwap->getGateways());
$this->assertCount(0, $bwap->getFlows());
$wp = Project\Workflow::load($bwap->getUid());
$this->assertCount(0, $wp->getTasks());
$this->assertCount(0, $wp->getRoutes());
$this->resetProject($bwap);
}
/**
@@ -523,6 +524,189 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase
$this->assertCount(1, \Route::findAllBy(\RoutePeer::TAS_UID, $activitiesUid[2]));
$this->assertCount(3, \Route::findAllBy(\RoutePeer::ROU_NEXT_TASK, $actUid5));
// cleaning
$this->resetProject($bwap);
}
/**
* @depends testNew
* @param \ProcessMaker\Project\Adapter\BpmnWorkflow $bwap
* @return string
*/
function testSetStartEvent($bwap)
{
$actUid = $bwap->addActivity(array(
"ACT_NAME" => "Activity #1",
"BOU_X" => 312,
"BOU_Y" => 464
));
$evnUid = $bwap->addEvent(array(
"EVN_NAME" => "Event #1",
"EVN_TYPE" => "START",
"BOU_X" => 369,
"BOU_Y" => 338,
"EVN_MARKER" => "MESSAGE",
"EVN_MESSAGE" => "LEAD"
));
$floUid = $bwap->addFlow(array(
'FLO_TYPE' => 'SEQUENCE',
'FLO_ELEMENT_ORIGIN' => $evnUid,
'FLO_ELEMENT_ORIGIN_TYPE' => 'bpmnEvent',
'FLO_ELEMENT_DEST' => $actUid,
'FLO_ELEMENT_DEST_TYPE' => 'bpmnActivity',
'FLO_X1' => 174,
'FLO_Y1' => 365,
'FLO_X2' => 355,
'FLO_Y2' => 355,
));
$this->assertCount(1, $bwap->getActivities());
$this->assertCount(1, $bwap->getEvents());
$this->assertCount(1, $bwap->getFlows());
$wp = Project\Workflow::load($bwap->getUid());
$task = $wp->getTask($actUid);
$this->assertCount(1, $wp->getTasks());
$this->assertCount(0, $wp->getRoutes());
$this->assertNotNull($task);
$this->assertEquals($task["TAS_START"], "TRUE");
return $floUid;
}
/**
* @depends testNew
* @depends testSetStartEvent
* @param \ProcessMaker\Project\Adapter\BpmnWorkflow $bwap
* @param string $floUid
*/
function testUnsetStartEvent($bwap, $floUid)
{
$bwap->removeFlow($floUid);
$this->assertCount(1, $bwap->getActivities());
$this->assertCount(1, $bwap->getEvents());
$this->assertCount(0, $bwap->getFlows());
$wp = Project\Workflow::load($bwap->getUid());
$tasks = $wp->getTasks();
$this->assertCount(1, $tasks);
$this->assertCount(0, $wp->getRoutes());
$this->assertEquals($tasks[0]["TAS_START"], "FALSE");
// cleaning
$this->resetProject($bwap);
}
/**
* @depends testNew
* @param \ProcessMaker\Project\Adapter\BpmnWorkflow $bwap
*/
function testSetEndEvent($bwap)
{
$actUid = $bwap->addActivity(array(
"ACT_NAME" => "Activity #1",
"BOU_X" => 312,
"BOU_Y" => 464
));
$evnUid = $bwap->addEvent(array(
"EVN_NAME" => "Event #1",
"EVN_TYPE" => "END",
"BOU_X" => 369,
"BOU_Y" => 338,
"EVN_MARKER" => "MESSAGE",
"EVN_MESSAGE" => "LEAD"
));
$floUid = $bwap->addFlow(array(
'FLO_TYPE' => 'SEQUENCE',
'FLO_ELEMENT_ORIGIN' => $actUid,
'FLO_ELEMENT_ORIGIN_TYPE' => 'bpmnActivity',
'FLO_ELEMENT_DEST' => $evnUid,
'FLO_ELEMENT_DEST_TYPE' => 'bpmnEvent',
'FLO_X1' => 174,
'FLO_Y1' => 365,
'FLO_X2' => 355,
'FLO_Y2' => 355,
));
$this->assertCount(1, $bwap->getActivities());
$this->assertCount(1, $bwap->getEvents());
$this->assertCount(1, $bwap->getFlows());
$wp = Project\Workflow::load($bwap->getUid());
$task = $wp->getTask($actUid);
$this->assertCount(1, $wp->getTasks());
$this->assertCount(1, $wp->getRoutes());
$this->assertNotNull($task);
$routes = \Route::findAllBy(\RoutePeer::TAS_UID, $task["TAS_UID"]);
$this->assertCount(1, $routes);
$this->assertEquals($routes[0]->getRouNextTask(), "-1");
return $floUid;
}
/**
* @depends testNew
* @depends testSetEndEvent
* @param \ProcessMaker\Project\Adapter\BpmnWorkflow $bwap
* @param $floUid
*/
function testUnsetEndEvent($bwap, $floUid)
{
$bwap->removeFlow($floUid);
$this->assertCount(1, $bwap->getActivities());
$this->assertCount(1, $bwap->getEvents());
$this->assertCount(0, $bwap->getFlows());
$wp = Project\Workflow::load($bwap->getUid());
$this->assertCount(1, $wp->getTasks());
$this->assertCount(0, $wp->getRoutes());
// cleaning
$this->resetProject($bwap);
}
/**
* @param \ProcessMaker\Project\Adapter\BpmnWorkflow $bwap
*/
protected function resetProject(\ProcessMaker\Project\Adapter\BpmnWorkflow $bwap)
{
// cleaning
$activities = $bwap->getActivities();
foreach ($activities as $activity) {
$bwap->removeActivity($activity["ACT_UID"]);
}
$events = $bwap->getEvents();
foreach ($events as $event) {
$bwap->removeEvent($event["EVN_UID"]);
}
$gateways = $bwap->getGateways();
foreach ($gateways as $gateway) {
$bwap->removeGateway($gateway["GAT_UID"]);
}
$flows = $bwap->getFlows();
foreach ($flows as $flow) {
$bwap->removeFlow($flow["FLO_UID"]);
}
// verifying that project is cleaned
$this->assertCount(0, $bwap->getActivities());
$this->assertCount(0, $bwap->getEvents());
$this->assertCount(0, $bwap->getGateways());
$this->assertCount(0, $bwap->getFlows());
$wp = Project\Workflow::load($bwap->getUid());
$this->assertCount(0, $wp->getTasks());
$this->assertCount(0, $wp->getRoutes());
}
}