Refactoring Bpmn/Workflow handling layer (4th commit) - adding unit test for BpmnActivity class that is handling transparently its Bound object

This commit is contained in:
Erik Amaru Ortiz
2014-02-04 20:50:18 -04:00
parent 163f150fb4
commit ad27682bc3
6 changed files with 513 additions and 146 deletions

View File

@@ -45,48 +45,19 @@ class BpmnActivity extends BaseBpmnActivity
}
}
// OVERRIDES
public function setActUid($actUid)
public static function findOneBy($field, $value)
{
parent::setActUid($actUid);
$this->bound->setElementUid($this->getActUid());
$rows = self::findAllBy($field, $value);
return empty($rows) ? null : $rows[0];
}
public function setPrjUid($prjUid)
public static function findAllBy($field, $value)
{
parent::setPrjUid($prjUid);
$this->bound->setPrjUid($this->getPrjUid());
}
$c = new Criteria('workflow');
$c->add($field, $value, Criteria::EQUAL);
public function setProUid($proUid)
{
parent::setProUid($proUid);
$process = BpmnProcessPeer::retrieveByPK($this->getProUid());
$this->bound->setDiaUid($process->getDiaUid());
}
public function save($con = null)
{
parent::save($con);
$this->setBoundDefaults();
$this->bound->save($con);
}
public function delete($con = null)
{
// first, delete the related bound object
if (! is_object($this->bound)) {
$this->bound = BpmnBound::findByElement('Activity', $this->getActUid());
}
if (is_object($this->bound)) {
$this->bound->delete($con);
}
parent::delete($con);
return BpmnActivityPeer::doSelect($c);
}
public static function getAll($prjUid = null, $start = null, $limit = null, $filter = '', $returnType = null, $changeCaseTo=CASE_UPPER)
@@ -122,6 +93,55 @@ class BpmnActivity extends BaseBpmnActivity
return $activities;
}
// OVERRIDES
public function setActUid($actUid)
{
parent::setActUid($actUid);
$this->bound->setElementUid($this->getActUid());
}
public function setPrjUid($prjUid)
{
parent::setPrjUid($prjUid);
$this->bound->setPrjUid($this->getPrjUid());
}
public function setProUid($proUid)
{
parent::setProUid($proUid);
$process = BpmnProcessPeer::retrieveByPK($this->getProUid());
$this->bound->setDiaUid($process->getDiaUid());
}
public function save($con = null)
{
parent::save($con);
$this->setBoundDefaults();
if ($this->bound->getBouUid() == "") {
$this->bound->setBouUid(\ProcessMaker\Util\Hash::generateUID());
}
$this->bound->save($con);
}
public function delete($con = null)
{
// first, delete the related bound object
if (! is_object($this->bound) || $this->bound->getBouUid() == "") {
$this->bound = BpmnBound::findByElement('Activity', $this->getActUid());
}
if (is_object($this->bound)) {
$this->bound->delete($con);
}
parent::delete($con);
}
public function fromArray($data, $type = BasePeer::TYPE_FIELDNAME)
{
parent::fromArray($data, $type);
@@ -143,7 +163,7 @@ class BpmnActivity extends BaseBpmnActivity
$data = parent::toArray($type);
$bouUid = $this->bound->getBouUid();
if (empty($bouUid)) {
if (! empty($bouUid)) {
$bound = BpmnBound::findByElement('Activity', $this->getActUid());
if (is_object($bound)) {

View File

@@ -17,16 +17,18 @@ require_once 'classes/model/om/BaseBpmnBound.php';
class BpmnBound extends BaseBpmnBound
{
public static function findOneBy($field, $value)
{
$rows = self::findAllBy($field, $value);
return empty($rows) ? null : $rows[0];
}
public static function findAllBy($field, $value)
{
$c = new Criteria('workflow');
$c->add($field, $value, Criteria::EQUAL);
$c->add($field, $value, CRITERIA::EQUAL );
$rs = ContentPeer::doSelectRS($c);
//$rs->setFetchmode(ResultSet::FETCHMODE_ASSOC);
$rs->next();
return $rs->getRow();
return BpmnBoundPeer::doSelect($c);
}
public static function findByElement($type, $uid)

View File

@@ -46,6 +46,8 @@ class BpmnProject //extends ProjectHandler
*/
protected $project;
protected $prjUid;
/**
* @var \BpmnProcess
*/
@@ -56,36 +58,6 @@ class BpmnProject //extends ProjectHandler
*/
protected $diagram;
/**
* @var array of \BpmnActivities objects
*/
protected $activities = array();
/**
* @var array of \BpmnEvents objects
*/
protected $events = array();
/**
* @var array on \BpmnFlow objects
*/
protected $flows = array();
/**
* @var array of \BpmnArtifact objects
*/
protected $artifacts = array();
/**
* @var array of \BpmnLaneset objects
*/
protected $laneset = array();
/**
* @var array of \BpmnLanes objects
*/
protected $lanes = array();
public function __construct($data = null)
{
@@ -96,8 +68,15 @@ class BpmnProject //extends ProjectHandler
public static function load($prjUid)
{
$project = ProjectPeer::retrieveByPK($prjUid);
if (! is_object($project)) {
return null;
}
$me = new BpmnProject();
$me->project = ProjectPeer::retrieveByPK($prjUid);
$me->project = $project;
$me->prjUid = $me->project->getPrjUid();
return $me;
}
@@ -114,6 +93,31 @@ class BpmnProject //extends ProjectHandler
$this->project->fromArray($data, BasePeer::TYPE_FIELDNAME);
$this->project->setPrjCreateDate(date("Y-m-d H:i:s"));
$this->project->save();
$this->prjUid = $this->project->getPrjUid();
}
public function remove()
{
/*
* 1. Remove Diagram related objects
* 2. Remove Project related objects
*/
$activities = $this->getActivities();
foreach ($activities as $activity) {
$this->removeActivity($activity["ACT_UID"]);
}
$process = ProcessPeer::retrieveByPK($this->getProcess("object")->getProUid());
$process->delete();
$diagram = DiagramPeer::retrieveByPK($this->getDiagram("object")->getDiaUid());
$diagram->delete();
$project = ProjectPeer::retrieveByPK($this->getUid());
$project->delete();
}
public function addDiagram($data = array())
@@ -164,37 +168,29 @@ class BpmnProject //extends ProjectHandler
$activity->setProUid($this->getProcess("object")->getProUid());
$activity->save();
$this->activities[$activity->getActUid()] = $activity;
return $activity->getActUid();
}
public function getActivity($actUid)
public function getActivity($actUid, $retType = 'array')
{
if (empty($this->activities) || ! array_key_exists($actUid, $this->activities)) {
$activity = ActivityPeer::retrieveByPK($actUid);
$activity = ActivityPeer::retrieveByPK($actUid);
if (! is_object($activity)) {
return null;
}
$this->activities[$actUid] = $activity;
if ($retType != "object" && ! empty($activity)) {
$activity = $activity->toArray();
}
return $this->activities[$actUid];
return $activity;
}
public function getActivities()
public function getActivities($retType = 'array')
{
if (empty($this->activities)) {
$this->activities = Activity::getAll($this->project->getPrjUid(), null, null, '', 'object');
}
return Activity::getAll($this->getUid(), null, null, '', $retType);
}
$activitiesList = array();
foreach ($this->activities as $activity) {
$activitiesList[] = $activity->toArray();
}
return $activitiesList;
public function removeActivity($actUid)
{
$activity = ActivityPeer::retrieveByPK($actUid);
$activity->delete();
}
public function addEvent($data)
@@ -226,19 +222,9 @@ class BpmnProject //extends ProjectHandler
return $this->events[$evnUid];
}
public function getEvents()
public function getEvents($retType)
{
if (empty($this->events)) {
$this->events = Activity::getAll($this->project->getPrjUid(), null, null, '', 'object');
}
$eventsList = array();
foreach ($this->events as $event) {
$eventsList[] = $event->toArray();
}
return $eventsList;
return Event::getAll($this->project->getPrjUid(), null, null, '', 'object');
}
public function addGateway($data)
@@ -270,19 +256,9 @@ class BpmnProject //extends ProjectHandler
return $this->gateways[$gatUid];
}
public function getGateways()
public function getGateways($retType = 'array')
{
if (empty($this->gateways)) {
$this->gateways = Activity::getAll($this->project->getPrjUid(), null, null, '', 'object');
}
$gatewaysList = array();
foreach ($this->gateways as $gateway) {
$gatewaysList[] = $gateway->toArray();
}
return $gatewaysList;
return Activity::getAll($this->project->getPrjUid(), null, null, '', $retType);
}
public function addFlow($data)
@@ -313,19 +289,9 @@ class BpmnProject //extends ProjectHandler
return $this->flows[$floUid];
}
public function getFlows()
public function getFlows($retType = 'array')
{
if (empty($this->flows)) {
$this->flows = Activity::getAll($this->project->getPrjUid(), null, null, '', 'object');
}
$flowsList = array();
foreach ($this->flows as $flow) {
$flowsList[] = $flow->toArray();
}
return $flowsList;
return Activity::getAll($this->project->getPrjUid(), null, null, '', $retType);
}
public function addArtifact($data)
@@ -383,7 +349,7 @@ class BpmnProject //extends ProjectHandler
throw new \Exception("Error: There is not an initialized project.");
}
return $this->project->getPrjUid();
return $this->prjUid;
}
public function getProject($retType = "array")

View File

@@ -0,0 +1,254 @@
<?php
if (! class_exists("Propel")) {
include_once __DIR__ . "/../bootstrap.php";
}
use \BpmnActivity;
class BpmnActivityTest extends PHPUnit_Framework_TestCase
{
protected static $prjUid = "00000000000000000000000000000001";
protected static $diaUid = "18171550f1198ddc8642045664020352";
protected static $proUid = "155064020352f1198ddc864204561817";
protected static $data1;
protected static $data2;
public static function setUpBeforeClass()
{
$project = new \BpmnProject();
$project->setPrjUid(self::$prjUid);
$project->setPrjName("Dummy Project");
$project->save();
$process = new \BpmnDiagram();
$process->setDiaUid(self::$diaUid);
$process->setPrjUid(self::$prjUid);
$process->save();
$process = new \BpmnProcess();
$process->setProUid(self::$proUid);
$process->setPrjUid(self::$prjUid);
$process->setDiaUid(self::$diaUid);
$process->save();
self::$data1 = array(
"ACT_UID" => "864215906402045618170352f1198ddc",
"PRJ_UID" => self::$prjUid,
"PRO_UID" => self::$proUid,
"ACT_NAME" => "Activity #1",
"BOU_X" => "51",
"BOU_Y" => "52"
);
self::$data2 = array(
"ACT_UID" => "70352f1198ddc8642159064020456181",
"PRJ_UID" => self::$prjUid,
"PRO_UID" => self::$proUid,
"ACT_NAME" => "Activity #2",
"BOU_X" => "53",
"BOU_Y" => "54"
);
}
public static function tearDownAfterClass()
{
$activities = BpmnActivity::findAllBy(BpmnActivityPeer::PRJ_UID, self::$prjUid);
foreach ($activities as $activity) {
$activity->delete();
}
$bounds = BpmnBound::findAllBy(BpmnBoundPeer::PRJ_UID, self::$prjUid);
foreach ($bounds as $bound) {
$bound->delete();
}
$process = BpmnProcessPeer::retrieveByPK(self::$proUid);
$process->delete();
$diagram = BpmnDiagramPeer::retrieveByPK(self::$diaUid);
$diagram->delete();
$project = BpmnProjectPeer::retrieveByPK(self::$prjUid);
$project->delete();
}
public function testNew()
{
$activity = new BpmnActivity();
$activity->setActUid(self::$data1["ACT_UID"]);
$activity->setPrjUid(self::$data1["PRJ_UID"]);
$activity->setProUid(self::$data1["PRO_UID"]);
$activity->setActName(self::$data1["ACT_NAME"]);
$activity->getBound()->setBouX(self::$data1["BOU_X"]);
$activity->getBound()->setBouY(self::$data1["BOU_Y"]);
$activity->save();
$activity2 = BpmnActivityPeer::retrieveByPK($activity->getActUid());
$this->assertNotNull($activity2);
return $activity;
}
public function testNewUsingFromArray()
{
$activity = new BpmnActivity();
$activity->fromArray(self::$data2);
$activity->save();
$activity2 = BpmnActivityPeer::retrieveByPK($activity->getActUid());
$this->assertNotNull($activity2);
return $activity;
}
/**
* @depends testNew
*/
public function testToArrayFromTestNew($activity)
{
$expected = array(
"ACT_UID" => self::$data1["ACT_UID"],
"PRJ_UID" => self::$data1["PRJ_UID"],
"PRO_UID" => self::$data1["PRO_UID"],
"ACT_NAME" => self::$data1["ACT_NAME"],
"ACT_TYPE" => "TASK",
"ACT_IS_FOR_COMPENSATION" => "0",
"ACT_START_QUANTITY" => "1",
"ACT_COMPLETION_QUANTITY" => "1",
"ACT_TASK_TYPE" => "EMPTY",
"ACT_IMPLEMENTATION" => "",
"ACT_INSTANTIATE" => "0",
"ACT_SCRIPT_TYPE" => "",
"ACT_SCRIPT" => "",
"ACT_LOOP_TYPE" => "NONE",
"ACT_TEST_BEFORE" => "0",
"ACT_LOOP_MAXIMUM" => "0",
"ACT_LOOP_CONDITION" => "",
"ACT_LOOP_CARDINALITY" => "0",
"ACT_LOOP_BEHAVIOR" => "NONE",
"ACT_IS_ADHOC" => "0",
"ACT_IS_COLLAPSED" => "1",
"ACT_COMPLETION_CONDITION" => "",
"ACT_ORDERING" => "PARALLEL",
"ACT_CANCEL_REMAINING_INSTANCES" => "1",
"ACT_PROTOCOL" => "",
"ACT_METHOD" => "",
"ACT_IS_GLOBAL" => "0",
"ACT_REFERER" => "",
"ACT_DEFAULT_FLOW" => "",
"ACT_MASTER_DIAGRAM" => "",
"DIA_UID" => "18171550f1198ddc8642045664020352",
"ELEMENT_UID" => self::$data1["ACT_UID"],
"BOU_ELEMENT" => "pm_canvas",
"BOU_ELEMENT_TYPE" => "bpmnActivity",
"BOU_X" => self::$data1["BOU_X"],
"BOU_Y" => self::$data1["BOU_Y"],
"BOU_WIDTH" => "0",
"BOU_HEIGHT" => "0",
"BOU_REL_POSITION" => "0",
"BOU_SIZE_IDENTICAL" => "0",
"BOU_CONTAINER" => "bpmnDiagram"
);
$result = $activity->toArray();
$bouUid = $result["BOU_UID"];
$this->assertNotEmpty($bouUid);
$this->assertEquals(32, strlen($bouUid));
unset($result["BOU_UID"]);
$this->assertEquals($expected, $result);
}
/**
* @depends testNewUsingFromArray
*/
public function testToArrayFromTestNewUsingFromArray($activity)
{
$expected = array(
"ACT_UID" => self::$data2["ACT_UID"],
"PRJ_UID" => self::$data2["PRJ_UID"],
"PRO_UID" => self::$data2["PRO_UID"],
"ACT_NAME" => self::$data2["ACT_NAME"],
"ACT_TYPE" => "TASK",
"ACT_IS_FOR_COMPENSATION" => "0",
"ACT_START_QUANTITY" => "1",
"ACT_COMPLETION_QUANTITY" => "1",
"ACT_TASK_TYPE" => "EMPTY",
"ACT_IMPLEMENTATION" => "",
"ACT_INSTANTIATE" => "0",
"ACT_SCRIPT_TYPE" => "",
"ACT_SCRIPT" => "",
"ACT_LOOP_TYPE" => "NONE",
"ACT_TEST_BEFORE" => "0",
"ACT_LOOP_MAXIMUM" => "0",
"ACT_LOOP_CONDITION" => "",
"ACT_LOOP_CARDINALITY" => "0",
"ACT_LOOP_BEHAVIOR" => "NONE",
"ACT_IS_ADHOC" => "0",
"ACT_IS_COLLAPSED" => "1",
"ACT_COMPLETION_CONDITION" => "",
"ACT_ORDERING" => "PARALLEL",
"ACT_CANCEL_REMAINING_INSTANCES" => "1",
"ACT_PROTOCOL" => "",
"ACT_METHOD" => "",
"ACT_IS_GLOBAL" => "0",
"ACT_REFERER" => "",
"ACT_DEFAULT_FLOW" => "",
"ACT_MASTER_DIAGRAM" => "",
"DIA_UID" => "18171550f1198ddc8642045664020352",
"ELEMENT_UID" => self::$data2["ACT_UID"],
"BOU_ELEMENT" => "pm_canvas",
"BOU_ELEMENT_TYPE" => "bpmnActivity",
"BOU_X" => self::$data2["BOU_X"],
"BOU_Y" => self::$data2["BOU_Y"],
"BOU_WIDTH" => "0",
"BOU_HEIGHT" => "0",
"BOU_REL_POSITION" => "0",
"BOU_SIZE_IDENTICAL" => "0",
"BOU_CONTAINER" => "bpmnDiagram"
);
$result = $activity->toArray();
$bouUid = $result["BOU_UID"];
$this->assertNotEmpty($bouUid);
$this->assertEquals(32, strlen($bouUid));
unset($result["BOU_UID"]);
$this->assertEquals($expected, $result);
}
/**
* @depends testNew
* @depends testNewUsingFromArray
* @param $activity1 \BpmnActivity
* @param $activity2 \BpmnActivity
*/
public function testDelete($activity1, $activity2)
{
$actUid = $activity1->getActUid();
$activity = BpmnActivityPeer::retrieveByPK($actUid);
$activity->delete();
$this->assertNull(BpmnActivityPeer::retrieveByPK($actUid));
// the previous call must delete the bound object related to activity too.
$this->assertNull(BpmnBound::findByElement("Activity", $actUid));
$actUid = $activity2->getActUid();
$activity = BpmnActivityPeer::retrieveByPK($actUid);
$activity->delete();
$this->assertNull(BpmnActivityPeer::retrieveByPK($actUid));
// the previous call must delete the bound object related to activity too.
$this->assertNull(BpmnBound::findByElement("Activity", $actUid));
}
}

View File

@@ -43,8 +43,7 @@ class BpmnProjectTest extends PHPUnit_Framework_TestCase
$bp->addDiagram($data);
// Load from DB
$bpLoaded = BpmnProject::load($bp->getUid());
$diagramData = $bpLoaded->getDiagram();
$diagramData = $bp->getDiagram();
$this->assertEquals($data["DIA_NAME"], $diagramData["DIA_NAME"]);
$this->assertEquals($bp->getUid(), $diagramData["PRJ_UID"]);
@@ -66,9 +65,7 @@ class BpmnProjectTest extends PHPUnit_Framework_TestCase
$bp->addProcess($data);
// Load from DB
$bpLoaded = BpmnProject::load($bp->getUid());
$processData = $bpLoaded->getProcess();
$processData = $bp->getProcess();
$this->assertEquals($data["PRO_NAME"], $processData["PRO_NAME"]);
$this->assertEquals($bp->getUid(), $processData["PRJ_UID"]);
@@ -87,15 +84,12 @@ class BpmnProjectTest extends PHPUnit_Framework_TestCase
"BOU_Y" => "50"
);
$processData = $bp->getProcess();
// Save to DB
$bp->addActivity($data);
// Load from DB
$bpLoaded = BpmnProject::load($bp->getUid());
$activities = $bpLoaded->getActivities();
$processData = $bp->getProcess();
$activities = $bp->getActivities();
$this->assertCount(1, $activities);
@@ -105,8 +99,138 @@ class BpmnProjectTest extends PHPUnit_Framework_TestCase
$this->assertEquals($value, $activityData[$key]);
}
$this->assertEquals($bpLoaded->getUid(), $activityData["PRJ_UID"]);
$this->assertEquals($bp->getUid(), $activityData["PRJ_UID"]);
$this->assertEquals($processData["PRO_UID"], $activityData["PRO_UID"]);
}
/**
* @depends testCreate
* @param $bp \ProcessMaker\Project\BpmnProject
* @return array
*/
public function testAddActivityWithUid($bp)
{
$actUid = "f1198ddc864204561817155064020352";
$data = array(
"ACT_UID" => $actUid,
"ACT_NAME" => "Activity #X",
"BOU_X" => "50",
"BOU_Y" => "50"
);
// Save to DB
$bp->addActivity($data);
// Load from DB
$activities = $bp->getActivities();
$uids = array();
foreach ($activities as $activity) {
array_push($uids, $activity["ACT_UID"]);
}
$this->assertTrue(in_array($actUid, $uids));
return $data;
}
/**
* @depends testCreate
* @depends testAddActivityWithUid
* @param $bp \ProcessMaker\Project\BpmnProject
* @param $data
*/
public function testGetActivity($bp, $data)
{
// Load from DB
$activityData = $bp->getActivity($data["ACT_UID"]);
// in data is set the determinated UID for activity created in previous step
foreach ($data as $key => $value) {
$this->assertEquals($value, $activityData[$key]);
}
// Testing with an invalid uid
$this->assertNull($bp->getActivity("INVALID-UID"));
}
/**
* @depends testCreate
* @depends testAddActivityWithUid
* @param $bp \ProcessMaker\Project\BpmnProject
* @param $data
*/
public function testRemoveActivity($bp, $data)
{
$this->assertCount(2, $bp->getActivities());
$bp->removeActivity($data["ACT_UID"]);
$this->assertCount(1, $bp->getActivities());
}
public function testGetActivities()
{
// Create a new BpmnProject and save to DB
$bp = new BpmnProject(array(
"PRJ_NAME" => "Test BPMN Project #2",
"PRJ_DESCRIPTION" => "Description for - Test BPMN Project #1",
"PRJ_AUTHOR" => "00000000000000000000000000000001"
));
$bp->addDiagram();
$bp->addProcess();
$this->assertCount(0, $bp->getActivities());
// Save to DB
$bp->addActivity(array(
"ACT_NAME" => "Activity #2",
"BOU_X" => "50",
"BOU_Y" => "50"
));
$bp->addActivity(array(
"ACT_NAME" => "Activity #3",
"BOU_X" => "50",
"BOU_Y" => "50"
));
$this->assertCount(2, $bp->getActivities());
return $bp;
}
/**
* @depends testGetActivities
* @param $bp \ProcessMaker\Project\BpmnProject
* @return null|\ProcessMaker\Project\BpmnProject
*/
public function testLoad($bp)
{
$prjUid = $bp->getUid();
$bp2 = BpmnProject::load($prjUid);
$this->assertNotNull($bp2);
$this->assertEquals($bp->getActivities(), $bp2->getActivities());
$this->assertEquals($bp->getDiagram(), $bp2->getDiagram());
$this->assertEquals($bp->getProcess(), $bp2->getProcess());
return $bp2;
}
/**
* @depends testLoad
* @param $bp \ProcessMaker\Project\BpmnProject
*/
public function testRemove($bp)
{
$prjUid = $bp->getUid();
$bp->remove();
$this->assertNull(BpmnProject::load($prjUid));
}
}

View File

@@ -68,6 +68,7 @@ Bootstrap::LoadThirdParty("smarty/libs", "Smarty.class");
Bootstrap::registerSystemClasses();
Bootstrap::registerDir('src', PATH_HOME . 'engine/src/');
Bootstrap::registerDir('model', PATH_CORE . 'classes' . PATH_SEP . 'model');
$config = System::getSystemConfiguration();