1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-01-18 06:38:43 +01:00

[ticket/15886] Group helper functions

PHPBB3-15886
This commit is contained in:
mrgoldy 2018-11-29 19:56:24 +01:00
parent 04d825ec2d
commit b6f6930eb5
6 changed files with 332 additions and 91 deletions

View File

@ -15,25 +15,25 @@ namespace phpbb\group;
class helper
{
/** @var \phpbb\auth\auth */
/** @var \phpbb\auth\auth */
protected $auth;
/** @var \phpbb\cache\service */
/** @var \phpbb\cache\service */
protected $cache;
/** @var \phpbb\config\config */
/** @var \phpbb\config\config */
protected $config;
/** @var \phpbb\language\language */
/** @var \phpbb\language\language */
protected $language;
/** @var \phpbb\event\dispatcher_interface */
/** @var \phpbb\event\dispatcher_interface */
protected $phpbb_dispatcher;
/** @var \phpbb\path_helper */
/** @var \phpbb\path_helper */
protected $phpbb_path_helper;
/** @var \phpbb\user */
/** @var \phpbb\user */
protected $user;
/** @var string phpBB root path */
@ -42,9 +42,6 @@ class helper
/** @var string PHP file extension */
protected $php_ext;
/** @var array Default group name string templates */
protected $default_templates = array();
/**
* Constructor
*
@ -58,7 +55,7 @@ class helper
* @param string $phpbb_root_path phpBB root path
* @param string $php_ext PHP file extension
*/
public function __construct(\phpbb\auth\auth $auth, \phpbb\cache\service $cache, \phpbb\config\config $config, \phpbb\language\language $language, \phpbb\event\dispatcher_interface $phpbb_dispatcher, \phpbb\path_helper $phpbb_path_helper, \phpbb\user $user, $phpbb_root_path, $php_ext)
public function __construct(\phpbb\auth\auth $auth, \phpbb\cache\service $cache, \phpbb\config\config $config, \phpbb\language\language $language, \phpbb\event\dispatcher_interface $phpbb_dispatcher, \phpbb\path_helper $phpbb_path_helper, \phpbb\user $user, $phpbb_root_path, $php_ext)
{
$this->auth = $auth;
$this->cache = $cache;
@ -69,14 +66,7 @@ class helper
$this->user = $user;
$this->phpbb_root_path = $phpbb_root_path;
$this->default_templates = array(
'base_url' => append_sid("{$phpbb_root_path}memberlist.$php_ext", 'mode=group&g={GROUP_ID}'),
'tpl_noprofile' => '<span class="username">{GROUP_NAME}</span>',
'tpl_noprofile_colour' => '<span style="color: {GROUP_COLOUR};" class="username-coloured">{GROUP_NAME}</span>',
'tpl_profile' => '<a href="{PROFILE_URL}" class="username">{GROUP_NAME}</a>',
'tpl_profile_colour' => '<a href="{PROFILE_URL}" style="color: {GROUP_COLOUR};" class="username-coloured">{GROUP_NAME}</a>',
);
$this->php_ext = $php_ext;
}
/**
@ -102,6 +92,14 @@ class helper
*/
public function get_name_string($mode, $group_id, $group_name, $group_colour = '', $custom_profile_url = false)
{
$_profile_cache = array(
'base_url' => append_sid("{$this->phpbb_root_path}memberlist.{$this->php_ext}", 'mode=group&amp;g={GROUP_ID}'),
'tpl_noprofile' => '<span class="username">{GROUP_NAME}</span>',
'tpl_noprofile_colour' => '<span class="username-coloured" style="color: {GROUP_COLOUR};">{GROUP_NAME}</span>',
'tpl_profile' => '<a class="username" href="{PROFILE_URL}">{GROUP_NAME}</a>',
'tpl_profile_colour' => '<a class="username-coloured" href="{PROFILE_URL}" style="color: {GROUP_COLOUR};">{GROUP_NAME}</a>',
);
// This switch makes sure we only run code required for the mode
switch ($mode)
{
@ -141,7 +139,7 @@ class helper
// For anonymous the link leads to a login page.
if ($group_id && ($this->user->data['user_id'] == ANONYMOUS || $this->auth->acl_get('u_viewprofile')))
{
$profile_url = ($custom_profile_url !== false) ? $custom_profile_url . '&amp;g=' . (int) $group_id : str_replace(array('={GROUP_ID}', '=%7BGROUP_ID%7D'), '=' . (int) $group_id, $this->default_templates['base_url']);
$profile_url = ($custom_profile_url !== false) ? $custom_profile_url . '&amp;g=' . (int) $group_id : str_replace(array('={GROUP_ID}', '=%7BGROUP_ID%7D'), '=' . (int) $group_id, $_profile_cache['base_url']);
}
else
{
@ -162,11 +160,11 @@ class helper
{
if (($mode === 'full' && !$profile_url) || $mode === 'no_profile')
{
$group_name_string = str_replace(array('{GROUP_COLOUR}', '{GROUP_NAME}'), array($group_colour, $group_name), (!$group_colour) ? $this->default_templates['tpl_noprofile'] : $this->default_templates['tpl_noprofile_colour']);
$group_name_string = str_replace(array('{GROUP_COLOUR}', '{GROUP_NAME}'), array($group_colour, $group_name), (!$group_colour) ? $_profile_cache['tpl_noprofile'] : $_profile_cache['tpl_noprofile_colour']);
}
else
{
$group_name_string = str_replace(array('{PROFILE_URL}', '{GROUP_COLOUR}', '{GROUP_NAME}'), array($profile_url, $group_colour, $group_name), (!$group_colour) ? $this->default_templates['tpl_profile'] : $this->default_templates['tpl_profile_colour']);
$group_name_string = str_replace(array('{PROFILE_URL}', '{GROUP_COLOUR}', '{GROUP_NAME}'), array($profile_url, $group_colour, $group_name), (!$group_colour) ? $_profile_cache['tpl_profile'] : $_profile_cache['tpl_profile_colour']);
}
}
@ -202,7 +200,7 @@ class helper
*
* @param array $group_data the current stored group data
*
* @return array An associative array containing the rank title (title),
* @return array An associative array containing the rank title (title),
* the rank image as full img tag (img) and the rank image source (img_src)
*/
public function get_rank($group_data)

View File

@ -0,0 +1,114 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
require_once dirname(__FILE__) . '/helper_test_case.php';
class phpbb_group_helper_get_name_string_test extends phpbb_group_helper_test_case
{
public function get_name_string_profile_data()
{
global $phpbb_root_path, $phpEx;
return array(
array(0, 'Non existing group', '', false, ''),
array(2, 'Administrators', 'AA0000', false, "{$phpbb_root_path}memberlist.$phpEx?mode=group&amp;g=2"),
array(42, 'Example Group', '', 'http://www.example.org/group.php?mode=show', 'http://www.example.org/group.php?mode=show&amp;g=42'),
);
}
/**
* @dataProvider get_name_string_profile_data
*/
public function test_get_name_string_profile($group_id, $group_name, $group_colour, $custom_profile_url, $expected)
{
$this->assertEquals($expected, $this->group_helper->get_name_string('profile', $group_id, $group_name, $group_colour, $custom_profile_url));
}
public function get_name_string_group_name_data()
{
return array(
// Should be fine
array(0, 'Bots', 'AA0000', false, 'Bots'),
array(1, 'new_group', '', false, 'Some new group'),
array(2, 'group_with_ümlauts', '', 'http://www.example.org/group.php?mode=show', 'Should work'),
// Should fail and thus return the same
array(3, 'not_uppercase', 'FFFFFF', false, 'not_uppercase'),
array(4, 'Awesome group', '', false, 'Awesome group'),
);
}
/**
* @dataProvider get_name_string_group_name_data
*/
public function test_get_name_string_group_name($group_id, $group_name, $group_colour, $custom_profile_url, $expected)
{
$this->assertEquals($expected, $this->group_helper->get_name_string('group_name', $group_id, $group_name, $group_colour, $custom_profile_url));
}
public function get_name_string_colour_data()
{
return array(
array(0, '', '', false, ''),
array(0, '', 'F0F0F0', false, '#F0F0F0'),
array(1, 'Guests', '000000', false, '#000000'),
array(2, 'Administrators', '', false, ''),
);
}
/**
* @dataProvider get_name_string_colour_data
*/
public function test_get_name_string_colour($group_id, $group_name, $group_colour, $custom_profile_url, $expected)
{
$this->assertEquals($expected, $this->group_helper->get_name_string('colour', $group_id, $group_name, $group_colour, $custom_profile_url));
}
public function get_name_string_full_data()
{
global $phpbb_root_path, $phpEx;
return array(
array(0, 'Bots', '000000', false, '<span class="username-coloured" style="color: #000000;">Bots</span>'),
array(7, 'new_group', 'FFA500', false, '<a class="username-coloured" href="' . $phpbb_root_path . 'memberlist.' . $phpEx . '?mode=group&amp;g=7" style="color: #FFA500;">Some new group</a>'),
array(14, 'Awesome group', '', 'http://www.example.org/group.php?mode=show', '<a class="username" href="http://www.example.org/group.php?mode=show&amp;g=14">Awesome group</a>'),
);
}
/**
* @dataProvider get_name_string_full_data
*/
public function test_get_name_string_full($group_id, $group_name, $group_colour, $custom_profile_url, $expected)
{
$this->assertEquals($expected, $this->group_helper->get_name_string('full', $group_id, $group_name, $group_colour, $custom_profile_url));
}
public function get_name_string_no_profile_data()
{
return array(
array(0, 'Bots', '000000', false, '<span class="username-coloured" style="color: #000000;">Bots</span>'),
array(1, 'new_group', '', false, '<span class="username">Some new group</span>'),
arraY(2, 'not_uppercase', 'FF0000', false, '<span class="username-coloured" style="color: #FF0000;">not_uppercase</span>'),
array(5, 'Awesome group', '', 'http://www.example.org/group.php?mode=show', '<span class="username">Awesome group</span>'),
);
}
/**
* @dataProvider get_name_string_no_profile_data
*/
public function test_get_name_string_no_profile($group_id, $group_name, $group_colour, $custom_profile_url, $expected)
{
$this->assertEquals($expected, $this->group_helper->get_name_string('no_profile', $group_id, $group_name, $group_colour, $custom_profile_url));
}
}

View File

@ -0,0 +1,31 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
require_once dirname(__FILE__) . '/helper_test_case.php';
class phpbb_group_helper_get_name_test extends phpbb_group_helper_test_case
{
public function test_get_name()
{
// They should be totally fine
$this->assertEquals('Bots', $this->group_helper->get_name('Bots'));
$this->assertEquals('Some new group', $this->group_helper->get_name('new_group'));
$this->assertEquals('Should work', $this->group_helper->get_name('group_with_ümlauts'));
// This should fail (obviously)
$this->assertNotEquals('The key does not contain uppercase letters', $this->group_helper->get_name('not_uppercase'));
// The key doesn't exist so just return group name...
$this->assertEquals('Awesome group', $this->group_helper->get_name('Awesome group'));
}
}

View File

@ -0,0 +1,43 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
require_once dirname(__FILE__) . '/helper_test_case.php';
class phpbb_group_helper_get_rank_test extends phpbb_group_helper_test_case
{
public function get_rank_data()
{
global $phpbb_root_path;
return array(
array(
array('group_id' => 0, 'group_rank' => 1),
array(
'title' => 'Site admin',
'img' => '<img src="' . $phpbb_root_path . 'images/ranks/siteadmin.png' . '" alt="Site admin" title="Site admin" />',
'img_src' => $phpbb_root_path . 'images/ranks/siteadmin.png',
)
),
array(array('group_id' => 1, 'group_rank' => 0), array('title' => null, 'img' => null, 'img_src' => null)),
array(array('group_id' => 2, 'group_rank' => 2), array('title' => 'Test member', 'img' => '', 'img_src' => '')),
);
}
/**
* @dataProvider get_rank_data
*/
public function test_get_rank($group_data, $expected)
{
$this->assertEquals($expected, $this->group_helper->get_rank($group_data));
}
}

View File

@ -1,68 +0,0 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
class phpbb_group_helper_test extends phpbb_test_case
{
/** @var \phpbb\group\helper */
protected $group_helper;
public function setUp()
{
global $phpbb_root_path, $phpEx;
// Set up language service
$lang = new \phpbb\language\language(
new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx)
);
// Set up language data for testing
$reflection_class = new ReflectionClass('\phpbb\language\language');
// Set default language files loaded flag to true
$loaded_flag = $reflection_class->getProperty('common_language_files_loaded');
$loaded_flag->setAccessible(true);
$loaded_flag->setValue($lang, true);
// Set up test language data
$lang_array = $reflection_class->getProperty('lang');
$lang_array->setAccessible(true);
$lang_array->setValue($lang, $this->get_test_language_data_set());
// Set up group helper
$this->group_helper = new \phpbb\group\helper($lang);
}
public function test_get_name()
{
// They should be totally fine
$this->assertEquals('Bots', $this->group_helper->get_name('Bots'));
$this->assertEquals('Some new group', $this->group_helper->get_name('new_group'));
$this->assertEquals('Should work', $this->group_helper->get_name('group_with_ümlauts'));
// This should fail (obviously)
$this->assertNotEquals('They key does not contain uppercase letters', $this->group_helper->get_name('not_uppercase'));
// The key doesn't exist so just return group name...
$this->assertEquals('Awesome group', $this->group_helper->get_name('Awesome group'));
}
protected function get_test_language_data_set()
{
return array(
'G_BOTS' => 'Bots',
'G_NEW_GROUP' => 'Some new group',
'G_not_uppercase' => 'The key does not contain uppercase letters',
'G_GROUP_WITH_ÜMLAUTS' => 'Should work',
);
}
}

View File

@ -0,0 +1,123 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
class phpbb_group_helper_test_case extends phpbb_test_case
{
/** @var \phpbb\group\helper */
protected $group_helper;
protected function config_defaults()
{
$defaults = array(
'ranks_path' => 'images/ranks'
);
return $defaults;
}
protected function get_test_language_data_set()
{
return array(
'G_BOTS' => 'Bots',
'G_NEW_GROUP' => 'Some new group',
'G_not_uppercase' => 'The key does not contain uppercase letters',
'G_GROUP_WITH_ÜMLAUTS' => 'Should work',
);
}
protected function get_test_rank_data_set()
{
return array(
'special' => array(
1 => array(
'rank_id' => 1,
'rank_title' => 'Site admin',
'rank_special' => 1,
'rank_image' => 'siteadmin.png',
),
2 => array(
'rank_id' => 2,
'rank_title' => 'Test member',
'rank_special' => 1,
'rank_image' => '',
)
)
);
}
protected function setup_engine(array $new_config = array())
{
global $cache, $phpbb_dispatcher, $phpbb_root_path, $phpEx;
// Set up authentication data for testing
$auth = $this->getMock('\phpbb\auth\auth');
$auth->expects($this->any())
->method('acl_get')
->with($this->stringContains('_'), $this->anything())
->will($this->returnValueMap(array(
array('u_viewprofile', true),
)));
// Set up cache service
$cache_service = $this->getMockBuilder('\phpbb\cache\service')->disableOriginalConstructor()->getMock();
$cache_service->expects($this->any())
->method('obtain_ranks')
->will($this->returnValue($this->get_test_rank_data_set()));
// Set up configuration
$defaults = $this->config_defaults();
$config = new \phpbb\config\config(array_merge($defaults, $new_config));
// Set up language service
$lang = new \phpbb\language\language(
new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx)
);
// Set up language data for testing
$reflection_class = new ReflectionClass('\phpbb\language\language');
// Set default language files loaded flag to true
$loaded_flag = $reflection_class->getProperty('common_language_files_loaded');
$loaded_flag->setAccessible(true);
$loaded_flag->setValue($lang, true);
// Set up test language data
$lang_array = $reflection_class->getProperty('lang');
$lang_array->setAccessible(true);
$lang_array->setValue($lang, $this->get_test_language_data_set());
// Set up event dispatcher
$phpbb_dispatcher = new phpbb_mock_event_dispatcher();
// Set up path helper
$filesystem = new \phpbb\filesystem\filesystem();
$path_helper = new \phpbb\path_helper(
new \phpbb\symfony_request(
new phpbb_mock_request()
),
$filesystem,
$this->getMock('\phpbb\request\request'),
$phpbb_root_path,
$phpEx
);
$user = new \phpbb\user($lang, '\phpbb\datetime');
$user->data['user_id'] = ANONYMOUS;
$this->group_helper = new \phpbb\group\helper($auth, $cache_service, $config, $lang, $phpbb_dispatcher, $path_helper, $user, $phpbb_root_path, $phpEx);
}
public function setUp()
{
$this->setup_engine();
}
}