diff options
-rw-r--r-- | app/Model/Board.php | 58 | ||||
-rw-r--r-- | tests/units/BoardTest.php | 80 | ||||
-rw-r--r-- | tests/units/ProjectActivityTest.php | 2 |
3 files changed, 125 insertions, 15 deletions
diff --git a/app/Model/Board.php b/app/Model/Board.php index 711f3dd9..712a3534 100644 --- a/app/Model/Board.php +++ b/app/Model/Board.php @@ -146,6 +146,46 @@ class Board extends Base } /** + * Get columns with consecutive positions + * + * If you remove a column, the positions are not anymore consecutives + * + * @access public + * @param integer $project_id + * @return array + */ + public function getNormalizedColumnPositions($project_id) + { + $columns = $this->db->hashtable(self::TABLE)->eq('project_id', $project_id)->asc('position')->getAll('id', 'position'); + $position = 1; + + foreach ($columns as $column_id => $column_position) { + $columns[$column_id] = $position++; + } + + return $columns; + } + + /** + * Save the new positions for a set of columns + * + * @access public + * @param array $columns Hashmap of column_id/column_position + * @return boolean + */ + public function saveColumnPositions(array $columns) + { + return $this->db->transaction(function ($db) use ($columns) { + + foreach ($columns as $column_id => $position) { + if (! $db->table(self::TABLE)->eq('id', $column_id)->update(array('position' => $position))) { + return false; + } + } + }); + } + + /** * Move a column down, increment the column position value * * @access public @@ -155,7 +195,7 @@ class Board extends Base */ public function moveDown($project_id, $column_id) { - $columns = $this->db->hashtable(self::TABLE)->eq('project_id', $project_id)->asc('position')->getAll('id', 'position'); + $columns = $this->getNormalizedColumnPositions($project_id); $positions = array_flip($columns); if (isset($columns[$column_id]) && $columns[$column_id] < count($columns)) { @@ -163,12 +203,7 @@ class Board extends Base $position = ++$columns[$column_id]; $columns[$positions[$position]]--; - $this->db->startTransaction(); - $this->db->table(self::TABLE)->eq('id', $column_id)->update(array('position' => $position)); - $this->db->table(self::TABLE)->eq('id', $positions[$position])->update(array('position' => $columns[$positions[$position]])); - $this->db->closeTransaction(); - - return true; + return $this->saveColumnPositions($columns); } return false; @@ -184,7 +219,7 @@ class Board extends Base */ public function moveUp($project_id, $column_id) { - $columns = $this->db->hashtable(self::TABLE)->eq('project_id', $project_id)->asc('position')->getAll('id', 'position'); + $columns = $this->getNormalizedColumnPositions($project_id); $positions = array_flip($columns); if (isset($columns[$column_id]) && $columns[$column_id] > 1) { @@ -192,12 +227,7 @@ class Board extends Base $position = --$columns[$column_id]; $columns[$positions[$position]]++; - $this->db->startTransaction(); - $this->db->table(self::TABLE)->eq('id', $column_id)->update(array('position' => $position)); - $this->db->table(self::TABLE)->eq('id', $positions[$position])->update(array('position' => $columns[$positions[$position]])); - $this->db->closeTransaction(); - - return true; + return $this->saveColumnPositions($columns); } return false; diff --git a/tests/units/BoardTest.php b/tests/units/BoardTest.php index 23276718..ebd4f655 100644 --- a/tests/units/BoardTest.php +++ b/tests/units/BoardTest.php @@ -289,4 +289,84 @@ class BoardTest extends Base $this->assertEquals(4, $columns[3]['position']); $this->assertEquals($columns_id[3], $columns[3]['id']); } + + public function testMoveUpAndRemoveColumn() + { + $p = new Project($this->container); + $b = new Board($this->container); + + // We create a project + $this->assertEquals(1, $p->create(array('name' => 'UnitTest1'))); + + // We remove the second column + $this->assertTrue($b->removeColumn(2)); + + $columns = $b->getColumns(1); + $this->assertNotEmpty($columns); + $this->assertCount(3, $columns); + + $this->assertEquals(1, $columns[0]['position']); + $this->assertEquals(3, $columns[1]['position']); + $this->assertEquals(4, $columns[2]['position']); + + $this->assertEquals(1, $columns[0]['id']); + $this->assertEquals(3, $columns[1]['id']); + $this->assertEquals(4, $columns[2]['id']); + + // We move up the second column + $this->assertTrue($b->moveUp(1, $columns[1]['id'])); + + // Check the new positions + $columns = $b->getColumns(1); + $this->assertNotEmpty($columns); + $this->assertCount(3, $columns); + + $this->assertEquals(1, $columns[0]['position']); + $this->assertEquals(2, $columns[1]['position']); + $this->assertEquals(3, $columns[2]['position']); + + $this->assertEquals(3, $columns[0]['id']); + $this->assertEquals(1, $columns[1]['id']); + $this->assertEquals(4, $columns[2]['id']); + } + + public function testMoveDownAndRemoveColumn() + { + $p = new Project($this->container); + $b = new Board($this->container); + + // We create a project + $this->assertEquals(1, $p->create(array('name' => 'UnitTest1'))); + + // We remove the second column + $this->assertTrue($b->removeColumn(2)); + + $columns = $b->getColumns(1); + $this->assertNotEmpty($columns); + $this->assertCount(3, $columns); + + $this->assertEquals(1, $columns[0]['position']); + $this->assertEquals(3, $columns[1]['position']); + $this->assertEquals(4, $columns[2]['position']); + + $this->assertEquals(1, $columns[0]['id']); + $this->assertEquals(3, $columns[1]['id']); + $this->assertEquals(4, $columns[2]['id']); + + // We move up the second column + $this->assertTrue($b->moveDown(1, $columns[0]['id'])); + + // Check the new positions + $columns = $b->getColumns(1); + $this->assertNotEmpty($columns); + $this->assertCount(3, $columns); + + $this->assertEquals(1, $columns[0]['position']); + $this->assertEquals(2, $columns[1]['position']); + $this->assertEquals(3, $columns[2]['position']); + + $this->assertEquals(3, $columns[0]['id']); + $this->assertEquals(1, $columns[1]['id']); + $this->assertEquals(4, $columns[2]['id']); + } } diff --git a/tests/units/ProjectActivityTest.php b/tests/units/ProjectActivityTest.php index e70dfb0e..f0b27649 100644 --- a/tests/units/ProjectActivityTest.php +++ b/tests/units/ProjectActivityTest.php @@ -41,7 +41,7 @@ class ProjectActivityTest extends Base $this->assertNotEmpty($events); $this->assertTrue(is_array($events)); $this->assertEquals(2, count($events)); - $this->assertEquals(time(), $events[0]['date_creation']); + $this->assertEquals(time(), $events[0]['date_creation'], '', 1); $this->assertEquals(Task::EVENT_UPDATE, $events[0]['event_name']); $this->assertEquals(Task::EVENT_CLOSE, $events[1]['event_name']); } |