From b7d3d57b700ecfc3c845085e0f1809ee0acbde33 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 9 Feb 2011 21:02:18 +0100 Subject: [PATCH] [ticket/9549] Enhance teampage functionality with a new class, group_positions. PHPBB3-9549 --- phpBB/includes/group_positions.php | 220 ++++++++++++++++++ .../fixtures/group_positions.xml | 23 ++ .../group_positions/group_positions_test.php | 207 ++++++++++++++++ 3 files changed, 450 insertions(+) create mode 100644 phpBB/includes/group_positions.php create mode 100644 tests/group_positions/fixtures/group_positions.xml create mode 100644 tests/group_positions/group_positions_test.php diff --git a/phpBB/includes/group_positions.php b/phpBB/includes/group_positions.php new file mode 100644 index 0000000000..1749ca0578 --- /dev/null +++ b/phpBB/includes/group_positions.php @@ -0,0 +1,220 @@ +sql_query($sql); + $current_value = $db->sql_fetchfield('group_' . $field); + $db->sql_freeresult($result); + + if ($current_value === false) + { + // Group not found. + global $user; + trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING); + } + + return (int) $current_value; + } + + /** + * Get number of groups, displayed on the teampage/legend + * @param string $field name of the field to be counted + * @return int value of the last group displayed + */ + static function get_group_count($field) + { + global $db; + + $sql = 'SELECT group_' . $field . ' + FROM ' . GROUPS_TABLE . ' + ORDER BY group_' . $field . ' DESC'; + $result = $db->sql_query_limit($sql, 1); + $group_count = (int) $db->sql_fetchfield('group_' . $field); + $db->sql_freeresult($result); + + return $group_count; + } + + /** + * Addes a group by group_id + * @param string $field name of the field the group is added to + * @param int $group_id group_id of the group to be added + * @return void + */ + static function add_group($field, $group_id) + { + $current_value = self::get_group_value($field, $group_id); + + if ($current_value == self::GROUP_DISABLED) + { + global $db; + + // Group is currently not displayed, add it at the end. + $next_value = 1 + self::get_group_count($field, $field); + + $sql = 'UPDATE ' . GROUPS_TABLE . ' + SET group_' . $field . ' = ' . $next_value . ' + WHERE group_' . $field . ' = ' . self::GROUP_DISABLED . ' + AND group_id = ' . (int) $group_id; + $db->sql_query($sql); + } + } + + /** + * Deletes a group by group_id + * @param string $field name of the field the group is deleted from + * @param int $group_id group_id of the group to be deleted + * @return void + */ + static function delete_group($field, $group_id) + { + $current_value = self::get_group_value($field, $group_id); + + if ($current_value != self::GROUP_DISABLED) + { + global $db; + + $db->sql_transaction('begin'); + + $sql = 'UPDATE ' . GROUPS_TABLE . ' + SET group_' . $field . ' = group_' . $field . ' - 1 + WHERE group_' . $field . ' > ' . $current_value; + $db->sql_query($sql); + + $sql = 'UPDATE ' . GROUPS_TABLE . ' + SET group_' . $field . ' = ' . self::GROUP_DISABLED . ' + WHERE group_id = ' . (int) $group_id; + $db->sql_query($sql); + + $db->sql_transaction('commit'); + } + } + + /** + * Moves a group up by group_id + * @param string $field name of the field the group is moved by + * @param int $group_id group_id of the group to be moved + * @return void + */ + static function move_up($field, $group_id) + { + $current_value = self::get_group_value($field, $group_id); + + // Only move the group, if it is in the list and not already on top. + if ($current_value > 1) + { + global $db; + + $db->sql_transaction('begin'); + + $sql = 'UPDATE ' . GROUPS_TABLE . ' + SET group_' . $field . ' = group_' . $field . ' + 1 + WHERE group_' . $field . ' = ' . ($current_value - 1); + $db->sql_query($sql); + + $sql = 'UPDATE ' . GROUPS_TABLE . ' + SET group_' . $field . ' = ' . ($current_value - 1) . ' + WHERE group_id = ' . (int) $group_id; + $db->sql_query($sql); + + $db->sql_transaction('commit'); + } + } + + /** + * Moves a group down by group_id + * @param string $field name of the field the group is moved by + * @param int $group_id group_id of the group to be moved + * @return void + */ + static function move_down($field, $group_id) + { + $current_value = self::get_group_value($field, $group_id); + + if ($current_value != self::GROUP_DISABLED) + { + global $db; + + $db->sql_transaction('begin'); + + $sql = 'UPDATE ' . GROUPS_TABLE . ' + SET group_' . $field . ' = group_' . $field . ' - 1 + WHERE group_' . $field . ' = ' . ($current_value + 1); + $db->sql_query($sql); + + if ($db->sql_affectedrows() == 1) + { + // Only update when we move another one up, otherwise it was the last. + $sql = 'UPDATE ' . GROUPS_TABLE . ' + SET group_' . $field . ' = ' . ($current_value + 1) . ' + WHERE group_id = ' . (int) $group_id; + $db->sql_query($sql); + } + + $db->sql_transaction('commit'); + } + } + + /** + * Get group type language var + * @param int $group_type group_type from the groups-table + * @return string name of the language variable for the given group-type. + */ + static function group_type_language($group_type) + { + switch ($group_type) + { + case GROUP_OPEN: + return 'GROUP_REQUEST'; + case GROUP_CLOSED: + return 'GROUP_CLOSED'; + case GROUP_HIDDEN: + return 'GROUP_HIDDEN'; + case GROUP_SPECIAL: + return 'GROUP_SPECIAL'; + case GROUP_FREE: + return 'GROUP_OPEN'; + } + } +} diff --git a/tests/group_positions/fixtures/group_positions.xml b/tests/group_positions/fixtures/group_positions.xml new file mode 100644 index 0000000000..55b1c2e08d --- /dev/null +++ b/tests/group_positions/fixtures/group_positions.xml @@ -0,0 +1,23 @@ + + + + group_id + group_teampage + group_legend + + 1 + 0 + 0 + + + 2 + 1 + 0 + + + 3 + 2 + 1 + +
+
diff --git a/tests/group_positions/group_positions_test.php b/tests/group_positions/group_positions_test.php new file mode 100644 index 0000000000..6955a084a2 --- /dev/null +++ b/tests/group_positions/group_positions_test.php @@ -0,0 +1,207 @@ +createXMLDataSet(dirname(__FILE__) . '/fixtures/group_positions.xml'); + } + + public static function get_group_value_data() + { + return array( + array('teampage', 1, 0), + array('teampage', 2, 1), + array('legend', 1, 0), + array('legend', 3, 1), + ); + } + + /** + * @dataProvider get_group_value_data + */ + public function test_get_group_value($field, $group_id, $expected) + { + global $db; + + $db = $this->new_dbal(); + + $this->assertEquals($expected, phpbb_group_positions::get_group_value($field, $group_id)); + } + + public static function get_group_count_data() + { + return array( + array('teampage', 2), + array('legend', 1), + ); + } + + /** + * @dataProvider get_group_count_data + */ + public function test_get_group_count($field, $expected) + { + global $db; + + $db = $this->new_dbal(); + + $this->assertEquals($expected, phpbb_group_positions::get_group_count($field)); + } + + public static function add_group_data() + { + return array( + array('teampage', 1, array( + array('group_id' => 1, 'group_teampage' => 3, 'group_legend' => 0), + array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), + array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), + )), + array('teampage', 2, array( + array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), + array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), + array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), + )), + ); + } + + /** + * @dataProvider add_group_data + */ + public function test_add_group($field, $group_id, $expected) + { + global $db; + + $db = $this->new_dbal(); + phpbb_group_positions::add_group($field, $group_id); + + $result = $db->sql_query('SELECT group_id, group_teampage, group_legend + FROM ' . GROUPS_TABLE . ' + ORDER BY group_id ASC'); + + $this->assertEquals($expected, $db->sql_fetchrowset($result)); + } + + public static function delete_group_data() + { + return array( + array('teampage', 1, array( + array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), + array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), + array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), + )), + array('teampage', 2, array( + array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), + array('group_id' => 2, 'group_teampage' => 0, 'group_legend' => 0), + array('group_id' => 3, 'group_teampage' => 1, 'group_legend' => 1), + )), + array('teampage', 3, array( + array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), + array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), + array('group_id' => 3, 'group_teampage' => 0, 'group_legend' => 1), + )), + ); + } + + /** + * @dataProvider delete_group_data + */ + public function test_delete_group($field, $group_id, $expected) + { + global $db; + + $db = $this->new_dbal(); + phpbb_group_positions::delete_group($field, $group_id); + + $result = $db->sql_query('SELECT group_id, group_teampage, group_legend + FROM ' . GROUPS_TABLE . ' + ORDER BY group_id ASC'); + + $this->assertEquals($expected, $db->sql_fetchrowset($result)); + } + + public static function move_up_data() + { + return array( + array('teampage', 1, array( + array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), + array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), + array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), + )), + array('teampage', 2, array( + array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), + array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), + array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), + )), + array('teampage', 3, array( + array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), + array('group_id' => 2, 'group_teampage' => 2, 'group_legend' => 0), + array('group_id' => 3, 'group_teampage' => 1, 'group_legend' => 1), + )), + ); + } + + /** + * @dataProvider move_up_data + */ + public function test_move_up($field, $group_id, $expected) + { + global $db; + + $db = $this->new_dbal(); + phpbb_group_positions::move_up($field, $group_id); + + $result = $db->sql_query('SELECT group_id, group_teampage, group_legend + FROM ' . GROUPS_TABLE . ' + ORDER BY group_id ASC'); + + $this->assertEquals($expected, $db->sql_fetchrowset($result)); + } + + public static function move_down_data() + { + return array( + array('teampage', 1, array( + array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), + array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), + array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), + )), + array('teampage', 2, array( + array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), + array('group_id' => 2, 'group_teampage' => 2, 'group_legend' => 0), + array('group_id' => 3, 'group_teampage' => 1, 'group_legend' => 1), + )), + array('teampage', 3, array( + array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), + array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), + array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), + )), + ); + } + + /** + * @dataProvider move_down_data + */ + public function test_move_down($field, $group_id, $expected) + { + global $db; + + $db = $this->new_dbal(); + phpbb_group_positions::move_down($field, $group_id); + + $result = $db->sql_query('SELECT group_id, group_teampage, group_legend + FROM ' . GROUPS_TABLE . ' + ORDER BY group_id ASC'); + + $this->assertEquals($expected, $db->sql_fetchrowset($result)); + } +} +