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]; return empty($rows) ? null : $rows[0];
} }
/**
* @param $field
* @param null $value
* @return \Route[]
*/
public static function findAllBy($field, $value = null) public static function findAllBy($field, $value = null)
{ {
$field = is_array($field) ? $field : array($field => $value); $field = is_array($field) ? $field : array($field => $value);

View File

@@ -191,42 +191,42 @@ class BpmnWorkflow extends Project\Bpmn
parent::removeGateway($gatUid); parent::removeGateway($gatUid);
} }
// public function addFlow($data) public function addFlow($data)
// { {
// parent::addFlow($data); $floUid = parent::addFlow($data);
// to add a workflow route // to add start event->activity as initial or end task
// - activity -> activity ==> route switch ($data["FLO_ELEMENT_ORIGIN_TYPE"]) {
// - activity -> gateway -> activity ==> selection, evaluation, parallel or parallel by evaluation route case "bpmnEvent":
// $routes = self::mapBpmnFlowsToWorkflowRoute($data, $flows); switch ($data["FLO_ELEMENT_DEST_TYPE"]) {
// case "bpmnActivity":
// if ($routes !== null) { $event = \BpmnEventPeer::retrieveByPK($data["FLO_ELEMENT_ORIGIN"]);
// 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;
// }
// } // 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) // public function updateFlow($floUid, $data, $flows)
// { // {
@@ -247,7 +247,9 @@ class BpmnWorkflow extends Project\Bpmn
if (! is_null($event) && $event->getEvnType() == "START") { if (! is_null($event) && $event->getEvnType() == "START") {
$activity = \BpmnActivityPeer::retrieveByPK($flow->getFloElementDest()); $activity = \BpmnActivityPeer::retrieveByPK($flow->getFloElementDest());
$this->wp->setStartTask($activity->getActUid(), false); if (! is_null($activity)) {
$this->wp->setStartTask($activity->getActUid(), false);
}
} }
} elseif ($flow->getFloElementOriginType() == "bpmnActivity" && } elseif ($flow->getFloElementOriginType() == "bpmnActivity" &&
$flow->getFloElementDestType() == "bpmnEvent") { $flow->getFloElementDestType() == "bpmnEvent") {
@@ -284,7 +286,7 @@ class BpmnWorkflow extends Project\Bpmn
throw new \RuntimeException("Required param \"EVN_TYPE\" is missing."); throw new \RuntimeException("Required param \"EVN_TYPE\" is missing.");
} }
parent::addEvent($data); return parent::addEvent($data);
} }
public function mapBpmnFlowsToWorkflowRoutes() public function mapBpmnFlowsToWorkflowRoutes()

View File

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

View File

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

View File

@@ -21,7 +21,7 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase
public static function tearDownAfterClass() public static function tearDownAfterClass()
{ {
//return false; return false;
//cleaning DB //cleaning DB
foreach (self::$uids as $prjUid) { foreach (self::$uids as $prjUid) {
$bwap = Project\Adapter\BpmnWorkflow::load($prjUid); $bwap = Project\Adapter\BpmnWorkflow::load($prjUid);
@@ -32,8 +32,8 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase
function testNew() function testNew()
{ {
$data = array( $data = array(
"PRJ_NAME" => "Test Bpmn/Workflow Project #1", "PRJ_NAME" => "Test Bpmn/Workflow Project #1.". rand(1, 100),
"PRJ_DESCRIPTION" => "Description for - Test BPMN Project #1", "PRJ_DESCRIPTION" => "Description for - Test BPMN Project #1." . rand(1, 100),
"PRJ_AUTHOR" => "00000000000000000000000000000001" "PRJ_AUTHOR" => "00000000000000000000000000000001"
); );
@@ -299,7 +299,7 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase
"BOU_Y" => 163 "BOU_Y" => 163
)); ));
$flowUid1 = $bwap->addFlow(array( $bwap->addFlow(array(
'FLO_TYPE' => 'SEQUENCE', 'FLO_TYPE' => 'SEQUENCE',
'FLO_ELEMENT_ORIGIN' => $actUid1, 'FLO_ELEMENT_ORIGIN' => $actUid1,
'FLO_ELEMENT_ORIGIN_TYPE' => 'bpmnActivity', 'FLO_ELEMENT_ORIGIN_TYPE' => 'bpmnActivity',
@@ -311,7 +311,7 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase
'FLO_Y2' => 163, 'FLO_Y2' => 163,
)); ));
$flowUid2 = $bwap->addFlow(array( $bwap->addFlow(array(
'FLO_TYPE' => 'SEQUENCE', 'FLO_TYPE' => 'SEQUENCE',
'FLO_ELEMENT_ORIGIN' => $gatUid, 'FLO_ELEMENT_ORIGIN' => $gatUid,
'FLO_ELEMENT_ORIGIN_TYPE' => 'bpmnGateway', 'FLO_ELEMENT_ORIGIN_TYPE' => 'bpmnGateway',
@@ -325,19 +325,20 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase
$bwap->mapBpmnFlowsToWorkflowRoutes(); $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 // cleaning
$bwap->removeActivity($actUid1); $this->resetProject($bwap);
$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());
} }
/** /**
@@ -523,6 +524,189 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase
$this->assertCount(1, \Route::findAllBy(\RoutePeer::TAS_UID, $activitiesUid[2])); $this->assertCount(1, \Route::findAllBy(\RoutePeer::TAS_UID, $activitiesUid[2]));
$this->assertCount(3, \Route::findAllBy(\RoutePeer::ROU_NEXT_TASK, $actUid5)); $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());
} }
} }