summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrédéric Guillot <fguillot@users.noreply.github.com>2014-03-11 21:12:53 -0400
committerFrédéric Guillot <fguillot@users.noreply.github.com>2014-03-11 21:12:53 -0400
commitc0ab45110688d698c1038d203017fda2385c5142 (patch)
tree57427ded9c096d3a558980b1b32de6e1b3242b62
parent66c7cf0caa5802c825e3f511158bb719cf82cafa (diff)
Add unit test for the "task close" action
-rw-r--r--actions/base.php85
-rw-r--r--actions/task_close.php33
-rw-r--r--tests/ActionTaskCloseTest.php62
-rw-r--r--tests/Base.php1
4 files changed, 181 insertions, 0 deletions
diff --git a/actions/base.php b/actions/base.php
index bb9b8bc1..13e4b6ee 100644
--- a/actions/base.php
+++ b/actions/base.php
@@ -2,30 +2,101 @@
namespace Action;
+/**
+ * Base class for automatic actions
+ *
+ * @package action
+ * @author Frederic Guillot
+ */
abstract class Base implements \Core\Listener
{
+ /**
+ * Project id
+ *
+ * @access private
+ * @var integer
+ */
private $project_id = 0;
+
+ /**
+ * User parameters
+ *
+ * @access private
+ * @var array
+ */
private $params = array();
+ /**
+ * Execute the action
+ *
+ * @abstract
+ * @access public
+ * @param array $data Event data dictionary
+ * @return bool True if the action was executed or false when not executed
+ */
abstract public function doAction(array $data);
+
+ /**
+ * Get the required parameter for the action (defined by the user)
+ *
+ * @abstract
+ * @access public
+ * @return array
+ */
abstract public function getActionRequiredParameters();
+
+ /**
+ * Get the required parameter for the event (check if for the event data)
+ *
+ * @abstract
+ * @access public
+ * @return array
+ */
abstract public function getEventRequiredParameters();
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param integer $project_id Project id
+ */
public function __construct($project_id)
{
$this->project_id = $project_id;
}
+ /**
+ * Set an user defined parameter
+ *
+ * @access public
+ * @param string $name Parameter name
+ * @param mixed $value Value
+ */
public function setParam($name, $value)
{
$this->params[$name] = $value;
}
+ /**
+ * Get an user defined parameter
+ *
+ * @access public
+ * @param string $name Parameter name
+ * @param mixed $default_value Default value
+ * @return mixed
+ */
public function getParam($name, $default_value = null)
{
return isset($this->params[$name]) ? $this->params[$name] : $default_value;
}
+ /**
+ * Check if an action is executable (right project and required parameters)
+ *
+ * @access public
+ * @param array $data Event data dictionary
+ * @return bool True if the action is executable
+ */
public function isExecutable(array $data)
{
if (isset($data['project_id']) && $data['project_id'] == $this->project_id && $this->hasRequiredParameters($data)) {
@@ -35,6 +106,13 @@ abstract class Base implements \Core\Listener
return false;
}
+ /**
+ * Check if the event data has required parameters to execute the action
+ *
+ * @access public
+ * @param array $data Event data dictionary
+ * @return bool True if all keys are there
+ */
public function hasRequiredParameters(array $data)
{
foreach ($this->getEventRequiredParameters() as $parameter) {
@@ -44,6 +122,13 @@ abstract class Base implements \Core\Listener
return true;
}
+ /**
+ * Execute the action
+ *
+ * @access public
+ * @param array $data Event data dictionary
+ * @return bool True if the action was executed or false when not executed
+ */
public function execute(array $data)
{
if ($this->isExecutable($data)) {
diff --git a/actions/task_close.php b/actions/task_close.php
index 4ac579c4..4d129d73 100644
--- a/actions/task_close.php
+++ b/actions/task_close.php
@@ -4,14 +4,33 @@ namespace Action;
require_once __DIR__.'/base.php';
+/**
+ * Close automatically a task
+ *
+ * @package action
+ * @author Frederic Guillot
+ */
class TaskClose extends Base
{
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param integer $project_id Project id
+ * @param Task $task Task model instance
+ */
public function __construct($project_id, \Model\Task $task)
{
parent::__construct($project_id);
$this->task = $task;
}
+ /**
+ * Get the required parameter for the action (defined by the user)
+ *
+ * @access public
+ * @return array
+ */
public function getActionRequiredParameters()
{
return array(
@@ -19,6 +38,13 @@ class TaskClose extends Base
);
}
+ /**
+ * Get the required parameter for the event (check if for the event data)
+ *
+ * @abstract
+ * @access public
+ * @return array
+ */
public function getEventRequiredParameters()
{
return array(
@@ -27,6 +53,13 @@ class TaskClose extends Base
);
}
+ /**
+ * Execute the action
+ *
+ * @access public
+ * @param array $data Event data dictionary
+ * @return bool True if the action was executed or false when not executed
+ */
public function doAction(array $data)
{
if ($data['column_id'] == $this->getParam('column_id')) {
diff --git a/tests/ActionTaskCloseTest.php b/tests/ActionTaskCloseTest.php
new file mode 100644
index 00000000..0d405739
--- /dev/null
+++ b/tests/ActionTaskCloseTest.php
@@ -0,0 +1,62 @@
+<?php
+
+require_once __DIR__.'/base.php';
+
+use Model\Task;
+
+class ActionTaskCloseTest extends Base
+{
+ public function testBadProject()
+ {
+ $action = new Action\TaskClose(3, new Task($this->db, $this->event));
+ $action->setParam('column_id', 5);
+
+ $event = array(
+ 'project_id' => 2,
+ 'task_id' => 3,
+ 'column_id' => 5,
+ );
+
+ $this->assertFalse($action->doAction($event));
+ }
+
+ public function testBadColumn()
+ {
+ $action = new Action\TaskClose(3, new Task($this->db, $this->event));
+ $action->setParam('column_id', 5);
+
+ $event = array(
+ 'project_id' => 3,
+ 'task_id' => 3,
+ 'column_id' => 3,
+ );
+
+ $this->assertFalse($action->doAction($event));
+ }
+
+ public function testExecute()
+ {
+ $action = new Action\TaskClose(1, new Task($this->db, $this->event));
+ $action->setParam('column_id', 2);
+
+ // We create a task in the first column
+ $task = new Task($this->db, $this->event);
+ $this->assertEquals(1, $p->create(array('name' => 'test')));
+ $this->assertEquals(1, $t->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 1)));
+
+ // We create an event to move the task to the 2nd column
+ $event = array(
+ 'project_id' => 1,
+ 'task_id' => 1,
+ 'column_id' => 2,
+ );
+
+ // Our event should be executed
+ $this->assertTrue($action->doAction($event));
+
+ // Our task should be closed
+ $t = $task->getById(1);
+ $this->assertNotEmpty($t);
+ $this->assertEquals(0, $t['is_active']);
+ }
+}
diff --git a/tests/Base.php b/tests/Base.php
index 6efb92e5..98dbf1b9 100644
--- a/tests/Base.php
+++ b/tests/Base.php
@@ -11,6 +11,7 @@ require_once __DIR__.'/../models/project.php';
require_once __DIR__.'/../models/user.php';
require_once __DIR__.'/../models/board.php';
require_once __DIR__.'/../models/action.php';
+require_once __DIR__.'/../actions/task_close.php';
abstract class Base extends PHPUnit_Framework_TestCase
{