summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/Action/TaskMoveAnotherProject.php84
-rw-r--r--app/Model/Action.php33
-rw-r--r--tests/units/ActionTaskMoveAnotherProjectTest.php84
-rw-r--r--tests/units/Base.php1
4 files changed, 177 insertions, 25 deletions
diff --git a/app/Action/TaskMoveAnotherProject.php b/app/Action/TaskMoveAnotherProject.php
new file mode 100644
index 00000000..8091053e
--- /dev/null
+++ b/app/Action/TaskMoveAnotherProject.php
@@ -0,0 +1,84 @@
+<?php
+
+namespace Action;
+
+use Model\Task;
+
+/**
+ * Move a task to another project
+ *
+ * @package action
+ * @author Frederic Guillot
+ */
+class TaskMoveAnotherProject extends Base
+{
+ /**
+ * Task model
+ *
+ * @accesss private
+ * @var \Model\Task
+ */
+ private $task;
+
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param integer $project_id Project id
+ * @param \Model\Task $task Task model instance
+ */
+ public function __construct($project_id, 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(
+ 'column_id' => t('Column'),
+ 'project_id' => t('Project'),
+ );
+ }
+
+ /**
+ * Get the required parameter for the event
+ *
+ * @access public
+ * @return string[]
+ */
+ public function getEventRequiredParameters()
+ {
+ return array(
+ 'task_id',
+ 'column_id',
+ 'project_id',
+ );
+ }
+
+ /**
+ * 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') && $data['project_id'] != $this->getParam('project_id')) {
+
+ $task = $this->task->getById($data['task_id']);
+ $this->task->moveToAnotherProject($this->getParam('project_id'), $task);
+
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/app/Model/Action.php b/app/Model/Action.php
index f296a58f..ad995991 100644
--- a/app/Model/Action.php
+++ b/app/Model/Action.php
@@ -41,6 +41,7 @@ class Action extends Base
'TaskAssignSpecificUser' => t('Assign the task to a specific user'),
'TaskAssignCurrentUser' => t('Assign the task to the person who does the action'),
'TaskDuplicateAnotherProject' => t('Duplicate the task to another project'),
+ 'TaskMoveAnotherProject' => t('Move the task to another project'),
'TaskAssignColorUser' => t('Assign a color to a specific user'),
'TaskAssignColorCategory' => t('Assign automatically a color based on a category'),
'TaskAssignCategoryColor' => t('Assign automatically a category based on a color'),
@@ -217,34 +218,16 @@ class Action extends Base
* @param integer $project_id Project id
* @throws \LogicException
* @return \Core\Listener Action Instance
- * @throw LogicException
*/
public function load($name, $project_id)
{
- switch ($name) {
- case 'TaskClose':
- $className = '\Action\TaskClose';
- return new $className($project_id, new Task($this->registry));
- case 'TaskAssignCurrentUser':
- $className = '\Action\TaskAssignCurrentUser';
- return new $className($project_id, new Task($this->registry), new Acl($this->registry));
- case 'TaskAssignSpecificUser':
- $className = '\Action\TaskAssignSpecificUser';
- return new $className($project_id, new Task($this->registry));
- case 'TaskDuplicateAnotherProject':
- $className = '\Action\TaskDuplicateAnotherProject';
- return new $className($project_id, new Task($this->registry));
- case 'TaskAssignColorUser':
- $className = '\Action\TaskAssignColorUser';
- return new $className($project_id, new Task($this->registry));
- case 'TaskAssignColorCategory':
- $className = '\Action\TaskAssignColorCategory';
- return new $className($project_id, new Task($this->registry));
- case 'TaskAssignCategoryColor':
- $className = '\Action\TaskAssignCategoryColor';
- return new $className($project_id, new Task($this->registry));
- default:
- throw new LogicException('Action not found: '.$name);
+ $className = '\Action\\'.$name;
+
+ if ($name === 'TaskAssignCurrentUser') {
+ return new $className($project_id, new Task($this->registry), new Acl($this->registry));
+ }
+ else {
+ return new $className($project_id, new Task($this->registry));
}
}
diff --git a/tests/units/ActionTaskMoveAnotherProjectTest.php b/tests/units/ActionTaskMoveAnotherProjectTest.php
new file mode 100644
index 00000000..e6a938de
--- /dev/null
+++ b/tests/units/ActionTaskMoveAnotherProjectTest.php
@@ -0,0 +1,84 @@
+<?php
+
+require_once __DIR__.'/Base.php';
+
+use Model\Task;
+use Model\Project;
+
+class ActionTaskMoveAnotherProject extends Base
+{
+ public function testBadProject()
+ {
+ $action = new Action\TaskMoveAnotherProject(3, new Task($this->registry));
+ $action->setParam('column_id', 5);
+
+ $event = array(
+ 'project_id' => 2,
+ 'task_id' => 3,
+ 'column_id' => 5,
+ );
+
+ $this->assertFalse($action->isExecutable($event));
+ $this->assertFalse($action->execute($event));
+ }
+
+ public function testBadColumn()
+ {
+ $action = new Action\TaskMoveAnotherProject(3, new Task($this->registry));
+ $action->setParam('column_id', 5);
+
+ $event = array(
+ 'project_id' => 3,
+ 'task_id' => 3,
+ 'column_id' => 3,
+ );
+
+ $this->assertFalse($action->execute($event));
+ }
+
+ public function testExecute()
+ {
+ $action = new Action\TaskMoveAnotherProject(1, new Task($this->registry));
+
+ // We create a task in the first column
+ $t = new Task($this->registry);
+ $p = new Project($this->registry);
+ $this->assertEquals(1, $p->create(array('name' => 'project 1')));
+ $this->assertEquals(2, $p->create(array('name' => 'project 2')));
+ $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 NOT be executed because we define the same project
+ $action->setParam('column_id', 2);
+ $action->setParam('project_id', 1);
+ $this->assertFalse($action->execute($event));
+
+ // Our task should be assigned to the project 1
+ $task = $t->getById(1);
+ $this->assertNotEmpty($task);
+ $this->assertEquals(1, $task['project_id']);
+
+ // 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 because we define a different project
+ $action->setParam('column_id', 2);
+ $action->setParam('project_id', 2);
+ $this->assertTrue($action->execute($event));
+
+ // Our task should be assigned to the project 2
+ $task = $t->getById(1);
+ $this->assertNotEmpty($task);
+ $this->assertEquals(2, $task['project_id']);
+ }
+}
diff --git a/tests/units/Base.php b/tests/units/Base.php
index 0fc0f99e..fad5d074 100644
--- a/tests/units/Base.php
+++ b/tests/units/Base.php
@@ -47,6 +47,7 @@ require_once __DIR__.'/../../app/Action/TaskAssignColorUser.php';
require_once __DIR__.'/../../app/Action/TaskAssignColorCategory.php';
require_once __DIR__.'/../../app/Action/TaskAssignCurrentUser.php';
require_once __DIR__.'/../../app/Action/TaskDuplicateAnotherProject.php';
+require_once __DIR__.'/../../app/Action/TaskMoveAnotherProject.php';
abstract class Base extends PHPUnit_Framework_TestCase
{