aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--phpBB/includes/group_positions.php220
-rw-r--r--tests/group_positions/fixtures/group_positions.xml23
-rw-r--r--tests/group_positions/group_positions_test.php207
3 files changed, 450 insertions, 0 deletions
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 @@
+<?php
+/**
+*
+* @package phpBB3
+* @version $Id$
+* @copyright (c) 2005 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+/**
+* Group Position class, containing all functions to manage the groups in the teampage and legend.
+*
+* group_teampage/group_legend is an ascending list 1, 2, ..., n for groups which are displayed. 1 is the first group, n the last.
+* If the value is 0 (self::GROUP_DISABLED) the group is not displayed.
+* @package phpBB3
+*/
+class phpbb_group_positions
+{
+ /**
+ * Group is not displayed
+ */
+ const GROUP_DISABLED = 0;
+
+ /**
+ * Returns the group_{$field} for a given group, if the group exists.
+ * @param string $field name of the field to be selected
+ * @param int $group_id group_id of the group to be selected
+ * @return int position of the group
+ */
+ static function get_group_value($field, $group_id)
+ {
+ global $db;
+
+ $sql = 'SELECT group_' . $field . '
+ FROM ' . GROUPS_TABLE . '
+ WHERE group_id = ' . (int) $group_id;
+ $result = $db->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 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dataset>
+ <table name="phpbb_groups">
+ <column>group_id</column>
+ <column>group_teampage</column>
+ <column>group_legend</column>
+ <row>
+ <value>1</value>
+ <value>0</value>
+ <value>0</value>
+ </row>
+ <row>
+ <value>2</value>
+ <value>1</value>
+ <value>0</value>
+ </row>
+ <row>
+ <value>3</value>
+ <value>2</value>
+ <value>1</value>
+ </row>
+ </table>
+</dataset>
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 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2008 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+*
+*/
+
+
+class phpbb_group_positions_test extends phpbb_database_test_case
+{
+ public function getDataSet()
+ {
+ return $this->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));
+ }
+}
+