1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-08-11 19:24:01 +02:00

Merge branch 'develop' into ticket/10820-develop

# By Joas Schilling (146) and others
# Via Andreas Fischer (50) and others
* develop: (356 commits)
  [ticket/11599] Copy the forums into a static array for later reuse
  [ticket/11602] Do not call localize_errors() if avatars are disabled
  [ticket/11601] Add protected method for database sync and call it
  [ticket/11601] Split post_setup_synchronisation logic from xml parsing
  [ticket/11550] Specify a valid path so it's clearer that it must be a path
  [ticket/11550] Move comments to correct function
  [ticket/11550] We use a different fixture set for extension_acp_test.php
  [ticket/11550] Fixtures should only be directories not files
  [ticket/11550] Use new functionality from the test case helpers
  [ticket/11550] Move functionality for copying/restoring to test case helpers
  [ticket/11550] Fix copying the fixtures in extension_permission_lang_test.php
  [ticket/11543] Add more users so #hidden <> #normal
  [ticket/11590] Close database connections when tearDown() is called
  [ticket/develop/11543] Use plurals in develop
  [ticket/11543] Use correct IP addresses and inject time for correct values
  [ticket/11543] Add unit tests for obtain_users_online_string()
  [ticket/11543] Add unit tests for obtain_users_online() with empty forum
  [ticket/11543] Add unit tests for obtain_users_online()
  [ticket/11543] Add unit tests for obtain_guest_count()
  [ticket/11481] Move prepended slash from calls into function
  ...
This commit is contained in:
Dhruv
2013-06-13 22:00:12 +05:30
260 changed files with 9043 additions and 2949 deletions

View File

@@ -7,9 +7,14 @@ Prerequisites
PHPUnit
-------
phpBB unit tests use PHPUnit framework. Version 3.5 or better is required
to run the tests. PHPUnit prefers to be installed via PEAR; refer to
http://www.phpunit.de/ for more information.
phpBB unit tests use the PHPUnit framework (see http://www.phpunit.de for more
information). Version 3.5 or higher is required to run the tests. PHPUnit can
be installed via Composer together with other development dependencies as
follows.
$ cd phpBB
$ php ../composer.phar install --dev
$ cd ..
PHP extensions
--------------
@@ -77,14 +82,16 @@ In order to run tests on some of the databases that we support, it will be
necessary to provide a custom DSN string in test_config.php. This is only
needed for MSSQL 2000+ (PHP module), MSSQL via ODBC, and Firebird when
PDO_Firebird does not work on your system
(https://bugs.php.net/bug.php?id=61183). The variable must be named $custom_dsn.
(https://bugs.php.net/bug.php?id=61183). The variable must be named `$custom_dsn`.
Examples:
Firebird using http://www.firebirdsql.org/en/odbc-driver/
$custom_dsn = "Driver={Firebird/InterBase(r) driver};dbname=$dbhost:$dbname";
$custom_dsn = "Driver={Firebird/InterBase(r) driver};dbname=$dbhost:$dbname";
MSSQL
$custom_dsn = "Driver={SQL Server Native Client 10.0};Server=$dbhost;Database=$dbname";
$custom_dsn = "Driver={SQL Server Native Client 10.0};Server=$dbhost;Database=$dbname";
The other fields in test_config.php should be filled out as you would normally
to connect to that database in phpBB.
@@ -113,7 +120,7 @@ Running
Once the prerequisites are installed, run the tests from the project root
directory (above phpBB):
$ phpunit
$ phpBB/vendor/bin/phpunit
Slow tests
--------------
@@ -123,7 +130,7 @@ Thus these tests are in the `slow` group, which is excluded by default. You can
enable slow tests by copying the phpunit.xml.all file to phpunit.xml. If you
only want the slow tests, run:
$ phpunit --group slow
$ phpBB/vendor/bin/phpunit --group slow
More Information
================

View File

@@ -55,11 +55,14 @@ class phpbb_dbal_migrator_test extends phpbb_database_test_case
'phpbb_',
$tools
);
$container = new phpbb_mock_container_builder();
$container->set('migrator', $migrator);
$this->extension_manager = new phpbb_extension_manager(
new phpbb_mock_container_builder(),
$container,
$this->db,
$this->config,
$this->migrator,
new phpbb_filesystem(),
'phpbb_ext',
dirname(__FILE__) . '/../../phpBB/',

View File

@@ -0,0 +1,16 @@
<?php
class phpbb_ext_barfoo_acp_a_info
{
public function module()
{
return array(
'filename' => 'phpbb_ext_barfoo_acp_a_module',
'title' => 'Barfoo',
'version' => '3.1.0-dev',
'modes' => array(
'config' => array('title' => 'Config', 'auth' => '', 'cat' => array('ACP_MODS')),
),
);
}
}

View File

@@ -0,0 +1,5 @@
<?php
class phpbb_ext_barfoo_acp_a_module
{
}

View File

@@ -0,0 +1,5 @@
<?php
class phpbb_ext_barfoo_ext extends phpbb_extension_base
{
}

View File

@@ -0,0 +1,16 @@
<?php
class phpbb_ext_foo_acp_a_info
{
public function module()
{
return array(
'filename' => 'phpbb_ext_foo_acp_a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
'config' => array('title' => 'Config', 'auth' => '', 'cat' => array('ACP_MODS')),
),
);
}
}

View File

@@ -0,0 +1,5 @@
<?php
class phpbb_ext_foo_acp_a_module
{
}

View File

@@ -0,0 +1,19 @@
<?php
/*
* Due to the mismatch between the class name and the file name, this module
* file shouldn't be found by the extension finder
*/
class phpbb_ext_foo_acp_foo_info
{
public function module()
{
return array(
'filename' => 'phpbb_ext_foo_acp_fail_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
'config' => array('title' => 'Config', 'auth' => '', 'cat' => array('ACP_MODS')),
),
);
}
}

View File

@@ -0,0 +1,8 @@
<?php
/*
* Due to the mismatch between the class name and the file name of the module
* info file, this module's info file shouldn't be found
*/
class phpbb_ext_foo_acp_fail_module
{
}

View File

@@ -0,0 +1,16 @@
<?php
class phpbb_ext_foo_mcp_a_info
{
public function module()
{
return array(
'filename' => 'phpbb_ext_foo_mcp_a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
'config' => array('title' => 'Config', 'auth' => '', 'cat' => array('MCP_MAIN')),
),
);
}
}

View File

@@ -0,0 +1,5 @@
<?php
class phpbb_ext_foo_mcp_a_module
{
}

View File

@@ -158,6 +158,23 @@ class phpbb_extension_finder_test extends phpbb_test_case
);
}
public function test_find_from_extension()
{
$files = $this->finder
->extension_directory('/type')
->find_from_extension('foo', dirname(__FILE__) . '/ext/foo/');
$classes = $this->finder->get_classes_from_files($files);
sort($classes);
$this->assertEquals(
array(
'phpbb_ext_foo_type_alternative',
'phpbb_ext_foo_type_dummy_empty',
),
$classes
);
}
/**
* These do not work because of changes with PHPBB3-11386
* They do not seem neccessary to me, so I am commenting them out for now

View File

@@ -0,0 +1,28 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* @package acp
*/
class acp_foobar
{
var $u_action;
function main($id, $mode)
{
}
}

View File

@@ -0,0 +1,26 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @package module_install
*/
class acp_foobar_info
{
function module()
{
return array(
'filename' => 'acp_foobar',
'title' => 'ACP Foobar',
'version' => '3.1.0-dev',
'modes' => array(
'test' => array('title' => 'Test', 'auth' => '', 'cat' => array('ACP_GENERAL')),
),
);
}
}

View File

@@ -30,7 +30,7 @@ class phpbb_extension_manager_test extends phpbb_database_test_case
public function test_available()
{
$this->assertEquals(array('bar', 'foo', 'vendor/moo'), array_keys($this->extension_manager->all_available()));
$this->assertEquals(array('bar', 'barfoo', 'foo', 'vendor/moo'), array_keys($this->extension_manager->all_available()));
}
public function test_enabled()
@@ -107,11 +107,13 @@ class phpbb_extension_manager_test extends phpbb_database_test_case
$table_prefix,
array()
);
$container = new phpbb_mock_container_builder();
$container->set('migrator', $migrator);
return new phpbb_extension_manager(
new phpbb_mock_container_builder(),
$container,
$db,
$config,
$migrator,
new phpbb_filesystem(),
'phpbb_ext',
dirname(__FILE__) . '/',

View File

@@ -7,7 +7,9 @@
*
*/
class metadata_manager_test extends phpbb_database_test_case
require_once dirname(__FILE__) . '/../../phpBB/includes/db/db_tools.php';
class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
{
protected $class_loader;
protected $extension_manager;
@@ -59,11 +61,13 @@ class metadata_manager_test extends phpbb_database_test_case
$this->table_prefix,
array()
);
$container = new phpbb_mock_container_builder();
$container->set('migrator', $migrator);
$this->extension_manager = new phpbb_extension_manager(
new phpbb_mock_container_builder(),
$container,
$this->db,
$this->config,
$this->migrator,
new phpbb_filesystem(),
'phpbb_ext',
$this->phpbb_root_path,
@@ -416,31 +420,16 @@ class metadata_manager_test extends phpbb_database_test_case
* Get an instance of the metadata manager
*
* @param string $ext_name
* @return phpbb_extension_metadata_manager_test
* @return phpbb_mock_metadata_manager
*/
private function get_metadata_manager($ext_name)
{
return new phpbb_extension_metadata_manager_test(
return new phpbb_mock_metadata_manager(
$ext_name,
$this->db,
$this->config,
$this->extension_manager,
$this->phpbb_root_path,
$this->phpEx,
$this->template,
$this->config
$this->phpbb_root_path
);
}
}
class phpbb_extension_metadata_manager_test extends phpbb_extension_metadata_manager
{
public function set_metadata($metadata)
{
$this->metadata = $metadata;
}
public function merge_metadata($metadata)
{
$this->metadata = array_merge($this->metadata, $metadata);
}
}

View File

@@ -0,0 +1,192 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/ext/foo/acp/a_info.php';
require_once dirname(__FILE__) . '/ext/foo/mcp/a_info.php';
require_once dirname(__FILE__) . '/ext/foo/acp/fail_info.php';
require_once dirname(__FILE__) . '/ext/barfoo/acp/a_info.php';
require_once dirname(__FILE__) . '/../../phpBB/includes/acp/acp_modules.php';
class phpbb_extension_modules_test extends phpbb_test_case
{
protected $extension_manager;
protected $finder;
public function setUp()
{
global $phpbb_extension_manager;
$this->extension_manager = new phpbb_mock_extension_manager(
dirname(__FILE__) . '/',
array(
'foo' => array(
'ext_name' => 'foo',
'ext_active' => '1',
'ext_path' => 'ext/foo/',
),
'bar' => array(
'ext_name' => 'bar',
'ext_active' => '1',
'ext_path' => 'ext/bar/',
),
));
$phpbb_extension_manager = $this->extension_manager;
$this->acp_modules = new acp_modules();
}
public function test_get_module_infos()
{
global $phpbb_root_path;
// Correctly set the root path for this test to this directory, so the classes can be found
$phpbb_root_path = dirname(__FILE__) . '/';
// Find acp module info files
$this->acp_modules->module_class = 'acp';
$acp_modules = $this->acp_modules->get_module_infos();
$this->assertEquals(array(
'phpbb_ext_foo_acp_a_module' => array(
'filename' => 'phpbb_ext_foo_acp_a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
'config' => array('title' => 'Config', 'auth' => '', 'cat' => array('ACP_MODS')),
),
),
'acp_foobar' => array(
'filename' => 'acp_foobar',
'title' => 'ACP Foobar',
'version' => '3.1.0-dev',
'modes' => array(
'test' => array('title' => 'Test', 'auth' => '', 'cat' => array('ACP_GENERAL')),
),
),
), $acp_modules);
// Find mcp module info files
$this->acp_modules->module_class = 'mcp';
$acp_modules = $this->acp_modules->get_module_infos();
$this->assertEquals(array(
'phpbb_ext_foo_mcp_a_module' => array(
'filename' => 'phpbb_ext_foo_mcp_a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
'config' => array('title' => 'Config', 'auth' => '', 'cat' => array('MCP_MAIN')),
),
),
), $acp_modules);
// Find a specific module info file (mcp_a_module)
$this->acp_modules->module_class = 'mcp';
$acp_modules = $this->acp_modules->get_module_infos('mcp_a_module');
$this->assertEquals(array(
'phpbb_ext_foo_mcp_a_module' => array(
'filename' => 'phpbb_ext_foo_mcp_a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
'config' => array('title' => 'Config', 'auth' => '', 'cat' => array('MCP_MAIN')),
),
),
), $acp_modules);
// Find a specific module info file (mcp_a_module) with passing the module_class
$this->acp_modules->module_class = '';
$acp_modules = $this->acp_modules->get_module_infos('mcp_a_module', 'mcp');
$this->assertEquals(array(
'phpbb_ext_foo_mcp_a_module' => array(
'filename' => 'phpbb_ext_foo_mcp_a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
'config' => array('title' => 'Config', 'auth' => '', 'cat' => array('MCP_MAIN')),
),
),
), $acp_modules);
// The mcp module info file we're looking for shouldn't exist
$this->acp_modules->module_class = 'mcp';
$acp_modules = $this->acp_modules->get_module_infos('mcp_a_fail');
$this->assertEquals(array(), $acp_modules);
// As there are no ucp modules we shouldn't find any
$this->acp_modules->module_class = 'ucp';
$acp_modules = $this->acp_modules->get_module_infos();
$this->assertEquals(array(), $acp_modules);
// Get module info of specified extension module
$this->acp_modules->module_class = 'acp';
$acp_modules = $this->acp_modules->get_module_infos('phpbb_ext_foo_acp_a_module');
$this->assertEquals(array(
'phpbb_ext_foo_acp_a_module' => array (
'filename' => 'phpbb_ext_foo_acp_a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array (
'config' => array ('title' => 'Config', 'auth' => '', 'cat' => array ('ACP_MODS')),
),
),
), $acp_modules);
// No specific module and module class set to an incorrect name
$acp_modules = $this->acp_modules->get_module_infos('', 'wcp', true);
$this->assertEquals(array(), $acp_modules);
// No specific module, no module_class set in the function parameter, and an incorrect module class
$this->acp_modules->module_class = 'wcp';
$acp_modules = $this->acp_modules->get_module_infos();
$this->assertEquals(array(), $acp_modules);
// No specific module, module class set to false (will default to the above acp)
// Setting $use_all_available will cause get_module_infos() to also load not enabled extensions (barfoo)
$this->acp_modules->module_class = 'acp';
$acp_modules = $this->acp_modules->get_module_infos('', false, true);
$this->assertEquals(array(
'phpbb_ext_foo_acp_a_module' => array(
'filename' => 'phpbb_ext_foo_acp_a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
'config' => array('title' => 'Config', 'auth' => '', 'cat' => array('ACP_MODS')),
),
),
'acp_foobar' => array(
'filename' => 'acp_foobar',
'title' => 'ACP Foobar',
'version' => '3.1.0-dev',
'modes' => array(
'test' => array('title' => 'Test', 'auth' => '', 'cat' => array('ACP_GENERAL')),
),
),
'phpbb_ext_barfoo_acp_a_module' => array(
'filename' => 'phpbb_ext_barfoo_acp_a_module',
'title' => 'Barfoo',
'version' => '3.1.0-dev',
'modes' => array(
'config' => array('title' => 'Config', 'auth' => '', 'cat' => array('ACP_MODS')),
),
)
), $acp_modules);
// Specific module set to disabled extension
$acp_modules = $this->acp_modules->get_module_infos('phpbb_ext_barfoo_acp_a_module', 'acp', true);
$this->assertEquals(array(
'phpbb_ext_barfoo_acp_a_module' => array(
'filename' => 'phpbb_ext_barfoo_acp_a_module',
'title' => 'Barfoo',
'version' => '3.1.0-dev',
'modes' => array(
'config' => array('title' => 'Config', 'auth' => '', 'cat' => array('ACP_MODS')),
),
)
), $acp_modules);
}
}

View File

@@ -0,0 +1,120 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/common_groups_test.php';
/**
* @group functional
*/
class phpbb_functional_acp_groups_test extends phpbb_functional_common_groups_test
{
protected $form_data;
protected function get_url()
{
return 'adm/index.php?i=groups&mode=manage&action=edit';
}
public function acp_group_test_data()
{
return array(
'both_yes' => array(
5,
true,
true,
),
'legend_no_teampage' => array(
5,
true,
false,
),
'no_legend_teampage' => array(
5,
false,
true,
),
'both_no' => array(
5,
false,
false,
),
'no_change' => array(
5,
NULL,
NULL,
),
'back_to_default' => array(
5,
true,
true,
),
// Remove and add moderators back in order to reset
// group order to default one
'mods_both_no' => array(
4,
false,
false,
),
'mods_back_to_default' => array(
4,
true,
true,
),
);
}
/**
* @dataProvider acp_group_test_data
*/
public function test_acp_groups_teampage($group_id, $tick_legend, $tick_teampage)
{
$this->group_manage_login();
// Manage Administrators group
$form = $this->get_group_manage_form($group_id);
$this->form_data[0] = $form->getValues();
if (isset($tick_legend) && isset($tick_teampage))
{
if ($tick_legend)
{
$form['group_legend']->tick();
}
else
{
$form['group_legend']->untick();
}
if ($tick_teampage)
{
$form['group_teampage']->tick();
}
else
{
$form['group_teampage']->untick();
}
}
$crawler = self::submit($form);
$this->assertContains($this->lang('GROUP_UPDATED'), $crawler->text());
$form = $this->get_group_manage_form($group_id);
if (!isset($tick_legend) && !isset($tick_teampage))
{
$this->form_data[1] = $form->getValues();
unset($this->form_data[0]['creation_time'], $this->form_data[0]['form_token'], $this->form_data[1]['creation_time'], $this->form_data[1]['form_token']);
$this->assertEquals($this->form_data[0], $this->form_data[1]);
}
else
{
$this->form_data = $form->getValues();
$this->assertEquals($tick_legend, $this->form_data['group_legend']);
$this->assertEquals($tick_teampage, $this->form_data['group_teampage']);
}
}
}

View File

@@ -25,25 +25,22 @@ class phpbb_functional_acp_permissions_test extends phpbb_functional_test_case
{
// Permissions tab
// XXX hardcoded id
$crawler = $this->request('GET', 'adm/index.php?i=16&sid=' . $this->sid);
$this->assert_response_success();
$crawler = self::request('GET', 'adm/index.php?i=16&sid=' . $this->sid);
// these language strings are html
$this->assertContains($this->lang('ACP_PERMISSIONS_EXPLAIN'), $this->client->getResponse()->getContent());
$this->assertContains($this->lang('ACP_PERMISSIONS_EXPLAIN'), $this->get_content());
}
public function test_select_user()
{
// User permissions
$crawler = $this->request('GET', 'adm/index.php?i=acp_permissions&icat=16&mode=setting_user_global&sid=' . $this->sid);
$this->assert_response_success();
$this->assertContains($this->lang('ACP_USERS_PERMISSIONS_EXPLAIN'), $this->client->getResponse()->getContent());
$crawler = self::request('GET', 'adm/index.php?i=acp_permissions&icat=16&mode=setting_user_global&sid=' . $this->sid);
$this->assertContains($this->lang('ACP_USERS_PERMISSIONS_EXPLAIN'), $this->get_content());
// Select admin
$form = $crawler->selectButton($this->lang('SUBMIT'))->form();
$data = array('username[0]' => 'admin');
$form->setValues($data);
$crawler = $this->client->submit($form);
$this->assert_response_success();
$crawler = self::submit($form);
$this->assertContains($this->lang('ACL_SET'), $crawler->filter('h1')->eq(1)->text());
}
@@ -91,8 +88,7 @@ class phpbb_functional_acp_permissions_test extends phpbb_functional_test_case
public function test_change_permission($description, $permission_type, $permission, $mode, $object_name, $object_id)
{
// Get the form
$crawler = $this->request('GET', "adm/index.php?i=acp_permissions&icat=16&mode=$mode&${object_name}[0]=$object_id&type=$permission_type&sid=" . $this->sid);
$this->assert_response_success();
$crawler = self::request('GET', "adm/index.php?i=acp_permissions&icat=16&mode=$mode&${object_name}[0]=$object_id&type=$permission_type&sid=" . $this->sid);
$this->assertContains($this->lang('ACL_SET'), $crawler->filter('h1')->eq(1)->text());
// XXX globals for phpbb_auth, refactor it later
@@ -114,8 +110,7 @@ class phpbb_functional_acp_permissions_test extends phpbb_functional_test_case
// set to never
$data = array("setting[$object_id][0][$permission]" => '0');
$form->setValues($data);
$crawler = $this->client->submit($form);
$this->assert_response_success();
$crawler = self::submit($form);
$this->assertContains($this->lang('AUTH_UPDATED'), $crawler->text());
// check acl again

View File

@@ -17,8 +17,7 @@ class phpbb_functional_auth_test extends phpbb_functional_test_case
$this->login();
// check for logout link
$crawler = $this->request('GET', 'index.php');
$this->assert_response_success();
$crawler = self::request('GET', 'index.php');
$this->assertContains($this->lang('LOGOUT_USER', 'admin'), $crawler->filter('.navbar')->text());
}
@@ -26,8 +25,7 @@ class phpbb_functional_auth_test extends phpbb_functional_test_case
{
$this->create_user('anothertestuser');
$this->login('anothertestuser');
$crawler = $this->request('GET', 'index.php');
$this->assert_response_success();
$crawler = self::request('GET', 'index.php');
$this->assertContains('anothertestuser', $crawler->filter('.icon-logout')->text());
}
@@ -40,13 +38,11 @@ class phpbb_functional_auth_test extends phpbb_functional_test_case
$this->add_lang('ucp');
// logout
$crawler = $this->request('GET', 'ucp.php?sid=' . $this->sid . '&mode=logout');
$this->assert_response_success();
$crawler = self::request('GET', 'ucp.php?sid=' . $this->sid . '&mode=logout');
$this->assertContains($this->lang('LOGOUT_REDIRECT'), $crawler->filter('#message')->text());
// look for a register link, which should be visible only when logged out
$crawler = $this->request('GET', 'index.php');
$this->assert_response_success();
$crawler = self::request('GET', 'index.php');
$this->assertContains($this->lang('REGISTER'), $crawler->filter('.navbar')->text());
}
@@ -56,8 +52,7 @@ class phpbb_functional_auth_test extends phpbb_functional_test_case
$this->admin_login();
// check that we are logged in
$crawler = $this->request('GET', 'adm/index.php?sid=' . $this->sid);
$this->assert_response_success();
$crawler = self::request('GET', 'adm/index.php?sid=' . $this->sid);
$this->assertContains($this->lang('ADMIN_PANEL'), $crawler->filter('h1')->text());
}
}

View File

@@ -14,22 +14,19 @@ class phpbb_functional_browse_test extends phpbb_functional_test_case
{
public function test_index()
{
$crawler = $this->request('GET', 'index.php');
$this->assert_response_success();
$crawler = self::request('GET', 'index.php');
$this->assertGreaterThan(0, $crawler->filter('.topiclist')->count());
}
public function test_viewforum()
{
$crawler = $this->request('GET', 'viewforum.php?f=2');
$this->assert_response_success();
$crawler = self::request('GET', 'viewforum.php?f=2');
$this->assertGreaterThan(0, $crawler->filter('.topiclist')->count());
}
public function test_viewtopic()
{
$crawler = $this->request('GET', 'viewtopic.php?t=1');
$this->assert_response_success();
$crawler = self::request('GET', 'viewtopic.php?t=1');
$this->assertGreaterThan(0, $crawler->filter('.postbody')->count());
}
}

View File

@@ -0,0 +1,63 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @group functional
*/
abstract class phpbb_functional_common_groups_test extends phpbb_functional_test_case
{
abstract protected function get_url();
/**
* Get group_manage form
* @param int $group_id ID of the group that should be managed
*/
protected function get_group_manage_form($group_id = 5)
{
// Manage Administrators group
$crawler = self::request('GET', $this->get_url() . "&g=$group_id&sid=" . $this->sid);
$form = $crawler->selectButton($this->lang('SUBMIT'))->form();
return $form;
}
/**
* Execute login calls and add_lang() calls for tests
*/
protected function group_manage_login()
{
$this->login();
$this->admin_login();
$this->add_lang(array('ucp', 'acp/groups'));
}
public function groups_manage_test_data()
{
return array(
array('', 'GROUP_UPDATED'),
array('aa0000', 'GROUP_UPDATED'),
array('AAG000','WRONG_DATA_COLOUR'),
array('#AA0000', 'WRONG_DATA_COLOUR'),
);
}
/**
* @dataProvider groups_manage_test_data
*/
public function test_groups_manage($input, $expected)
{
$this->group_manage_login();
// Manage Administrators group
$form = $this->get_group_manage_form();
$form['group_colour']->setValue($input);
$crawler = self::submit($form);
$this->assertContains($this->lang($expected), $crawler->text());
}
}

View File

@@ -12,34 +12,25 @@
*/
class phpbb_functional_extension_acp_test extends phpbb_functional_test_case
{
static private $copied_files = array();
static private $helper;
/**
* This should only be called once before the tests are run.
* This is used to copy the extensions to the phpBB install
*/
static protected $fixtures = array(
'./',
);
static public function setUpBeforeClass()
{
global $phpbb_root_path;
parent::setUpBeforeClass();
self::$helper = new phpbb_test_case_helpers(self);
self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/../extension/ext/', self::$fixtures);
}
self::$copied_files = array();
static public function tearDownAfterClass()
{
parent::tearDownAfterClass();
if (file_exists($phpbb_root_path . 'ext/'))
{
// First, move any extensions setup on the board to a temp directory
self::$copied_files = self::$helper->copy_dir($phpbb_root_path . 'ext/', $phpbb_root_path . 'store/temp_ext/');
// Then empty the ext/ directory on the board (for accurate test cases)
self::$helper->empty_dir($phpbb_root_path . 'ext/');
}
// Copy our ext/ files from the test case to the board
self::$copied_files = array_merge(self::$copied_files, self::$helper->copy_dir(dirname(__FILE__) . '/../extension/ext/', $phpbb_root_path . 'ext/'));
self::$helper->restore_original_ext_dir();
}
public function setUp()
@@ -84,35 +75,12 @@ class phpbb_functional_extension_acp_test extends phpbb_functional_test_case
$this->add_lang('acp/extensions');
}
/**
* This should only be called once after the tests are run.
* This is used to remove the files copied to the phpBB install
*/
static public function tearDownAfterClass()
{
global $phpbb_root_path;
if (file_exists($phpbb_root_path . 'store/temp_ext/'))
{
// Copy back the board installed extensions from the temp directory
self::$helper->copy_dir($phpbb_root_path . 'store/temp_ext/', $phpbb_root_path . 'ext/');
}
// Remove all of the files we copied around (from board ext -> temp_ext, from test ext -> board ext)
self::$helper->remove_files(self::$copied_files);
if (file_exists($phpbb_root_path . 'store/temp_ext/'))
{
self::$helper->empty_dir($phpbb_root_path . 'store/temp_ext/');
}
}
public function test_list()
{
$crawler = $this->request('GET', 'adm/index.php?i=acp_extensions&mode=main&sid=' . $this->sid);
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&sid=' . $this->sid);
$this->assertCount(1, $crawler->filter('.ext_enabled'));
$this->assertCount(4, $crawler->filter('.ext_disabled'));
$this->assertCount(5, $crawler->filter('.ext_disabled'));
$this->assertContains('phpBB Foo Extension', $crawler->filter('.ext_enabled')->eq(0)->text());
$this->assertContainsLang('PURGE', $crawler->filter('.ext_enabled')->eq(0)->text());
@@ -131,7 +99,7 @@ class phpbb_functional_extension_acp_test extends phpbb_functional_test_case
public function test_details()
{
$crawler = $this->request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=details&ext_name=foo&sid=' . $this->sid);
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=details&ext_name=foo&sid=' . $this->sid);
$validation = array(
'DISPLAY_NAME' => 'phpBB Foo Extension',
@@ -174,46 +142,46 @@ class phpbb_functional_extension_acp_test extends phpbb_functional_test_case
public function test_enable_pre()
{
// Foo is already enabled (redirect to list)
$crawler = $this->request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=enable_pre&ext_name=foo&sid=' . $this->sid);
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=enable_pre&ext_name=foo&sid=' . $this->sid);
$this->assertContainsLang('EXTENSION_NAME', $crawler->filter('html')->text());
$this->assertContainsLang('EXTENSION_OPTIONS', $crawler->filter('html')->text());
$this->assertContainsLang('EXTENSION_ACTIONS', $crawler->filter('html')->text());
$crawler = $this->request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=enable_pre&ext_name=vendor%2Fmoo&sid=' . $this->sid);
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=enable_pre&ext_name=vendor%2Fmoo&sid=' . $this->sid);
$this->assertContainsLang('ENABLE_CONFIRM', $crawler->filter('html')->text());
}
public function test_disable_pre()
{
// Moo is not enabled (redirect to list)
$crawler = $this->request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=disable_pre&ext_name=vendor%2Fmoo&sid=' . $this->sid);
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=disable_pre&ext_name=vendor%2Fmoo&sid=' . $this->sid);
$this->assertContainsLang('EXTENSION_NAME', $crawler->filter('html')->text());
$this->assertContainsLang('EXTENSION_OPTIONS', $crawler->filter('html')->text());
$this->assertContainsLang('EXTENSION_ACTIONS', $crawler->filter('html')->text());
$crawler = $this->request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=disable_pre&ext_name=foo&sid=' . $this->sid);
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=disable_pre&ext_name=foo&sid=' . $this->sid);
$this->assertContainsLang('DISABLE_CONFIRM', $crawler->filter('html')->text());
}
public function test_purge_pre()
{
// test2 is not available (error)
$crawler = $this->request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=purge_pre&ext_name=test2&sid=' . $this->sid);
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=purge_pre&ext_name=test2&sid=' . $this->sid);
$this->assertContains('The required file does not exist', $crawler->filter('html')->text());
$crawler = $this->request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=purge_pre&ext_name=foo&sid=' . $this->sid);
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=purge_pre&ext_name=foo&sid=' . $this->sid);
$this->assertContainsLang('PURGE_CONFIRM', $crawler->filter('html')->text());
}
public function test_actions()
{
$crawler = $this->request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=enable&ext_name=vendor%2Fmoo&sid=' . $this->sid);
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=enable&ext_name=vendor%2Fmoo&sid=' . $this->sid);
$this->assertContainsLang('ENABLE_SUCCESS', $crawler->filter('html')->text());
$crawler = $this->request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=disable&ext_name=vendor%2Fmoo&sid=' . $this->sid);
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=disable&ext_name=vendor%2Fmoo&sid=' . $this->sid);
$this->assertContainsLang('DISABLE_SUCCESS', $crawler->filter('html')->text());
$crawler = $this->request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=purge&ext_name=vendor%2Fmoo&sid=' . $this->sid);
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=purge&ext_name=vendor%2Fmoo&sid=' . $this->sid);
$this->assertContainsLang('PURGE_SUCCESS', $crawler->filter('html')->text());
}
}

View File

@@ -6,6 +6,7 @@
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/db/db_tools.php';
/**
* @group functional
@@ -14,65 +15,27 @@ class phpbb_functional_extension_controller_test extends phpbb_functional_test_c
{
protected $phpbb_extension_manager;
static private $helper;
static protected $fixtures = array(
'foo/bar/config/routing.yml',
'foo/bar/config/services.yml',
'foo/bar/controller/controller.php',
'foo/bar/styles/prosilver/template/foo_bar_body.html',
'foo/bar/config/',
'foo/bar/controller/',
'foo/bar/styles/prosilver/template/',
);
/**
* This should only be called once before the tests are run.
* This is used to copy the fixtures to the phpBB install
*/
static public function setUpBeforeClass()
{
global $phpbb_root_path;
parent::setUpBeforeClass();
$directories = array(
$phpbb_root_path . 'ext/foo/bar/',
$phpbb_root_path . 'ext/foo/bar/config/',
$phpbb_root_path . 'ext/foo/bar/controller/',
$phpbb_root_path . 'ext/foo/bar/styles/prosilver/template',
);
foreach ($directories as $dir)
{
if (!is_dir($dir))
{
mkdir($dir, 0777, true);
}
}
foreach (self::$fixtures as $fixture)
{
copy(
"tests/functional/fixtures/ext/$fixture",
"{$phpbb_root_path}ext/$fixture");
}
self::$helper = new phpbb_test_case_helpers(self);
self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/fixtures/ext/', self::$fixtures);
}
/**
* This should only be called once after the tests are run.
* This is used to remove the fixtures from the phpBB install
*/
static public function tearDownAfterClass()
{
global $phpbb_root_path;
parent::tearDownAfterClass();
foreach (self::$fixtures as $fixture)
{
unlink("{$phpbb_root_path}ext/$fixture");
}
rmdir("{$phpbb_root_path}ext/foo/bar/config");
rmdir("{$phpbb_root_path}ext/foo/bar/controller");
rmdir("{$phpbb_root_path}ext/foo/bar/styles/prosilver/template");
rmdir("{$phpbb_root_path}ext/foo/bar/styles/prosilver");
rmdir("{$phpbb_root_path}ext/foo/bar/styles");
rmdir("{$phpbb_root_path}ext/foo/bar");
rmdir("{$phpbb_root_path}ext/foo");
self::$helper->restore_original_ext_dir();
}
public function setUp()
@@ -90,8 +53,8 @@ class phpbb_functional_extension_controller_test extends phpbb_functional_test_c
public function test_foo_bar()
{
$this->phpbb_extension_manager->enable('foo/bar');
$crawler = $this->request('GET', 'app.php?controller=foo/bar');
$this->assert_response_success();
$crawler = self::request('GET', 'app.php?controller=foo/bar', array(), false);
self::assert_response_status_code();
$this->assertContains("foo/bar controller handle() method", $crawler->filter('body')->text());
$this->phpbb_extension_manager->purge('foo/bar');
}
@@ -102,8 +65,7 @@ class phpbb_functional_extension_controller_test extends phpbb_functional_test_c
public function test_controller_with_template()
{
$this->phpbb_extension_manager->enable('foo/bar');
$crawler = $this->request('GET', 'app.php?controller=foo/template');
$this->assert_response_success();
$crawler = self::request('GET', 'app.php?controller=foo/template');
$this->assertContains("I am a variable", $crawler->filter('#content')->text());
$this->phpbb_extension_manager->purge('foo/bar');
}
@@ -115,8 +77,8 @@ class phpbb_functional_extension_controller_test extends phpbb_functional_test_c
public function test_missing_argument()
{
$this->phpbb_extension_manager->enable('foo/bar');
$crawler = $this->request('GET', 'app.php?controller=foo/baz');
$this->assertEquals(500, $this->client->getResponse()->getStatus());
$crawler = self::request('GET', 'app.php?controller=foo/baz', array(), false);
$this->assert_response_html(500);
$this->assertContains('Missing value for argument #1: test in class phpbb_ext_foo_bar_controller:baz', $crawler->filter('body')->text());
$this->phpbb_extension_manager->purge('foo/bar');
}
@@ -127,8 +89,8 @@ class phpbb_functional_extension_controller_test extends phpbb_functional_test_c
public function test_exception_should_result_in_500_status_code()
{
$this->phpbb_extension_manager->enable('foo/bar');
$crawler = $this->request('GET', 'app.php?controller=foo/exception');
$this->assertEquals(500, $this->client->getResponse()->getStatus());
$crawler = self::request('GET', 'app.php?controller=foo/exception', array(), false);
$this->assert_response_html(500);
$this->assertContains('Exception thrown from foo/exception route', $crawler->filter('body')->text());
$this->phpbb_extension_manager->purge('foo/bar');
}
@@ -144,8 +106,8 @@ class phpbb_functional_extension_controller_test extends phpbb_functional_test_c
*/
public function test_error_ext_disabled_or_404()
{
$crawler = $this->request('GET', 'app.php?controller=does/not/exist');
$this->assertEquals(404, $this->client->getResponse()->getStatus());
$crawler = self::request('GET', 'app.php?controller=does/not/exist', array(), false);
$this->assert_response_html(404);
$this->assertContains('No route found for "GET /does/not/exist"', $crawler->filter('body')->text());
}
}

View File

@@ -0,0 +1,99 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/db/db_tools.php';
require_once dirname(__FILE__) . '/../../phpBB/includes/acp/acp_modules.php';
/**
* @group functional
*/
class phpbb_functional_extension_module_test extends phpbb_functional_test_case
{
protected $phpbb_extension_manager;
static private $helper;
static protected $fixtures = array(
'./',
);
static public function setUpBeforeClass()
{
parent::setUpBeforeClass();
self::$helper = new phpbb_test_case_helpers(self);
self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/fixtures/ext/', self::$fixtures);
}
static public function tearDownAfterClass()
{
parent::tearDownAfterClass();
self::$helper->restore_original_ext_dir();
}
public function setUp()
{
global $db;
parent::setUp();
$this->phpbb_extension_manager = $this->get_extension_manager();
$this->phpbb_extension_manager->enable('foo/bar');
$modules = new acp_modules();
$db = $this->get_db();
$sql = 'SELECT module_id
FROM ' . MODULES_TABLE . "
WHERE module_langname = 'acp'
AND module_class = 'ACP_CAT_DOT_MODS'";
$result = $db->sql_query($sql);
$module_id = (int) $db->sql_fetchfield('module_id');
$db->sql_freeresult($result);
$parent_data = array(
'module_basename' => '',
'module_enabled' => 1,
'module_display' => 1,
'parent_id' => $module_id,
'module_class' => 'acp',
'module_langname' => 'ACP_FOOBAR_TITLE',
'module_mode' => '',
'module_auth' => '',
);
$modules->update_module_data($parent_data, true);
$module_data = array(
'module_basename' => 'phpbb_ext_foo_bar_acp_main_module',
'module_enabled' => 1,
'module_display' => 1,
'parent_id' => $parent_data['module_id'],
'module_class' => 'acp',
'module_langname' => 'ACP_FOOBAR_TITLE',
'module_mode' => 'mode',
'module_auth' => '',
);
$modules->update_module_data($module_data, true);
$this->purge_cache();
}
/**
* Check a controller for extension foo/bar.
*/
public function test_foo_bar()
{
$this->login();
$this->admin_login();
$crawler = self::request('GET', 'adm/index.php?i=phpbb_ext_foo_bar_acp_main_module&mode=mode&sid=' . $this->sid);
$this->assertContains("Bertie rulez!", $crawler->filter('#main')->text());
$this->phpbb_extension_manager->purge('foo/bar');
}
}

View File

@@ -0,0 +1,80 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @group functional
*/
class phpbb_functional_extension_permission_lang_test extends phpbb_functional_test_case
{
protected $phpbb_extension_manager;
static private $helper;
static protected $fixtures = array(
'foo/bar/language/en/',
);
static public function setUpBeforeClass()
{
parent::setUpBeforeClass();
self::$helper = new phpbb_test_case_helpers(self);
self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/fixtures/ext/', self::$fixtures);
}
static public function tearDownAfterClass()
{
parent::tearDownAfterClass();
self::$helper->restore_original_ext_dir();
}
public function setUp()
{
parent::setUp();
$this->get_db();
$acl_ary = array(
'auth_option' => 'u_foo',
'is_global' => 1,
);
$sql = 'INSERT INTO phpbb_acl_options ' . $this->db->sql_build_array('INSERT', $acl_ary);
$this->db->sql_query($sql);
$this->phpbb_extension_manager = $this->get_extension_manager();
$this->purge_cache();
$this->login();
$this->admin_login();
$this->add_lang('acp/permissions');
}
public function test_auto_include_permission_lang_from_extensions()
{
$this->phpbb_extension_manager->enable('foo/bar');
// User permissions
$crawler = self::request('GET', 'adm/index.php?i=acp_permissions&icat=16&mode=setting_user_global&sid=' . $this->sid);
// Select admin
$form = $crawler->selectButton($this->lang('SUBMIT'))->form();
$data = array('username[0]' => 'admin');
$form->setValues($data);
$crawler = self::submit($form);
// language from language/en/acp/permissions_phpbb.php
$this->assertContains('Can attach files', $crawler->filter('body')->text());
// language from ext/foo/bar/language/en/permissions_foo.php
$this->assertContains('Can view foo', $crawler->filter('body')->text());
}
}

View File

@@ -32,7 +32,7 @@ class phpbb_functional_fileupload_form_test extends phpbb_functional_test_case
'error' => UPLOAD_ERR_OK,
);
$crawler = $this->client->request(
$crawler = self::$client->request(
'POST',
'posting.php?mode=reply&f=2&t=1&sid=' . $this->sid,
array('add_file' => $this->lang('ADD_FILE')),
@@ -66,9 +66,8 @@ class phpbb_functional_fileupload_form_test extends phpbb_functional_test_case
{
$this->markTestIncomplete('Test fails intermittently.');
$crawler = $this->upload_file('valid.jpg', 'image/jpeg');
$this->assert_response_success();
// ensure there was no error message rendered
$this->assertNotContains('<h2>' . $this->lang('INFORMATION') . '</h2>', $this->client->getResponse()->getContent());
$this->assertNotContains('<h2>' . $this->lang('INFORMATION') . '</h2>', $this->get_content());
$this->assertContains($this->lang('POSTED_ATTACHMENTS'), $crawler->filter('#postform h3')->eq(1)->text());
}
}

View File

@@ -58,7 +58,7 @@ class phpbb_functional_fileupload_remote_test extends phpbb_functional_test_case
public function test_successful_upload()
{
$upload = new fileupload('', array('gif'), 1000);
$file = $upload->remote_upload($this->root_url . 'styles/prosilver/theme/images/forum_read.gif');
$file = $upload->remote_upload(self::$root_url . 'styles/prosilver/theme/images/forum_read.gif');
$this->assertEquals(0, sizeof($file->error));
$this->assertTrue(file_exists($file->filename));
}
@@ -66,7 +66,8 @@ class phpbb_functional_fileupload_remote_test extends phpbb_functional_test_case
public function test_too_large()
{
$upload = new fileupload('', array('gif'), 100);
$file = $upload->remote_upload($this->root_url . 'styles/prosilver/theme/images/forum_read.gif');
$file = $upload->remote_upload(self::$root_url . 'styles/prosilver/theme/images/forum_read.gif');
$this->assertEquals(1, sizeof($file->error));
$this->assertEquals('WRONG_FILESIZE', $file->error[0]);
}
}

View File

@@ -0,0 +1,32 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
class phpbb_ext_foo_bar_acp_main_info
{
function module()
{
return array(
'filename' => 'phpbb_ext_foo_bar_acp_main_module',
'title' => 'ACP_FOOBAR_TITLE',
'version' => '1.0.0',
'modes' => array(
'mode' => array('title' => 'ACP_FOOBAR_MODE', 'auth' => '', 'cat' => array('ACP_FOOBAR_TITLE')),
),
);
}
}

View File

@@ -0,0 +1,28 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
class phpbb_ext_foo_bar_acp_main_module
{
var $u_action;
function main($id, $mode)
{
$this->tpl_name = 'foobar';
$this->page_title = 'Bertie';
}
}

View File

@@ -0,0 +1,3 @@
<!-- INCLUDE overall_header.html -->
Bertie rulez!
<!-- INCLUDE overall_footer.html -->

View File

@@ -0,0 +1,23 @@
{
"name": "foo/bar",
"type": "phpbb3-extension",
"description": "Testing extensions",
"homepage": "",
"version": "1.0.0",
"time": "2013-03-21 01:01:01",
"licence": "GPL-2.0",
"authors": [{
"name": "Joas Schilling",
"username": "nickvergessen",
"email": "nickvergessen@phpbb.com",
"homepage": "http://www.phpbb.com",
"role": "Developer"
}],
"require": {
"php": ">=5.3",
"phpbb": ">=3.1.0-dev"
},
"extra": {
"display-name": "phpBB 3.1 Extension Testing"
}
}

View File

@@ -0,0 +1,6 @@
<?php
// Admin Permissions
$lang = array_merge($lang, array(
'acl_u_foo' => array('lang' => 'Can view foo', 'cat' => 'misc'),
));

View File

@@ -0,0 +1,44 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @group functional
*/
class phpbb_functional_forgot_password_test extends phpbb_functional_test_case
{
public function test_forgot_password_enabled()
{
global $config;
$this->add_lang('ucp');
$crawler = self::request('GET', 'ucp.php?mode=sendpassword');
$this->assertEquals($this->lang('SEND_PASSWORD'), $crawler->filter('h2')->text());
}
public function test_forgot_password_disabled()
{
$this->login();
$this->admin_login();
$this->add_lang('ucp');
$crawler = self::request('GET', 'adm/index.php?sid=' . $this->sid . '&i=acp_board&mode=security');
$form = $crawler->selectButton('Submit')->form();
$values = $form->getValues();
$values["config[allow_password_reset]"] = 0;
$form->setValues($values);
$crawler = self::submit($form);
$this->logout();
$crawler = self::request('GET', 'ucp.php?mode=sendpassword');
$this->assertContains($this->lang('UCP_PASSWORD_RESET_DISABLED', '', ''), $crawler->text());
}
}

View File

@@ -17,18 +17,15 @@ class phpbb_functional_memberlist_test extends phpbb_functional_test_case
$this->create_user('memberlist-test-user');
// logs in as admin
$this->login();
$crawler = $this->request('GET', 'memberlist.php?sid=' . $this->sid);
$this->assert_response_success();
$crawler = self::request('GET', 'memberlist.php?sid=' . $this->sid);
$this->assertContains('memberlist-test-user', $crawler->text());
// restrict by first character
$crawler = $this->request('GET', 'memberlist.php?first_char=m&sid=' . $this->sid);
$this->assert_response_success();
$crawler = self::request('GET', 'memberlist.php?first_char=m&sid=' . $this->sid);
$this->assertContains('memberlist-test-user', $crawler->text());
// make sure results for wrong character are not returned
$crawler = $this->request('GET', 'memberlist.php?first_char=a&sid=' . $this->sid);
$this->assert_response_success();
$crawler = self::request('GET', 'memberlist.php?first_char=a&sid=' . $this->sid);
$this->assertNotContains('memberlist-test-user', $crawler->text());
}
@@ -36,16 +33,13 @@ class phpbb_functional_memberlist_test extends phpbb_functional_test_case
{
$this->login();
// XXX hardcoded user id
$crawler = $this->request('GET', 'memberlist.php?mode=viewprofile&u=2&sid=' . $this->sid);
$this->assert_response_success();
$crawler = self::request('GET', 'memberlist.php?mode=viewprofile&u=2&sid=' . $this->sid);
$this->assertContains('admin', $crawler->filter('h2')->text());
}
protected function get_memberlist_leaders_table_crawler()
{
$crawler = $this->request('GET', 'memberlist.php?mode=leaders&sid=' . $this->sid);
$this->assert_response_success();
$crawler = self::request('GET', 'memberlist.php?mode=leaders&sid=' . $this->sid);
return $crawler->filter('.forumbg-table');
}
@@ -95,5 +89,17 @@ class phpbb_functional_memberlist_test extends phpbb_functional_test_case
$crawler = $this->get_memberlist_leaders_table_crawler();
$this->assertNotContains('memberlist-test-moderator', $crawler->eq(0)->text());
$this->assertContains('memberlist-test-moderator', $crawler->eq(1)->text());
// Add admin to moderators, should be visible as moderator
$this->add_user_group('GLOBAL_MODERATORS', array('admin'), true);
$crawler = $this->get_memberlist_leaders_table_crawler();
$this->assertNotContains('admin', $crawler->eq(0)->text());
$this->assertContains('admin', $crawler->eq(1)->text());
// Add admin to admins as leader, should be visible as admin, not moderator
$this->add_user_group('ADMINISTRATORS', array('admin'), true, true);
$crawler = $this->get_memberlist_leaders_table_crawler();
$this->assertContains('admin', $crawler->eq(0)->text());
$this->assertNotContains('admin', $crawler->eq(1)->text());
}
}

View File

@@ -0,0 +1,85 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/db/db_tools.php';
/**
* @group functional
*/
class phpbb_functional_metadata_manager_test extends phpbb_functional_test_case
{
protected $phpbb_extension_manager;
static private $helper;
static protected $fixtures = array(
'foo/bar/',
);
static public function setUpBeforeClass()
{
parent::setUpBeforeClass();
self::$helper = new phpbb_test_case_helpers(self);
self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/fixtures/ext/', self::$fixtures);
}
static public function tearDownAfterClass()
{
parent::tearDownAfterClass();
self::$helper->restore_original_ext_dir();
}
public function setUp()
{
parent::setUp();
$this->phpbb_extension_manager = $this->get_extension_manager();
$this->purge_cache();
$this->phpbb_extension_manager->enable('foo/bar');
$this->login();
$this->admin_login();
$this->add_lang('acp/extensions');
}
public function test_extensions_list()
{
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&sid=' . $this->sid);
$this->assertContains($this->lang('EXTENSIONS_EXPLAIN'), $crawler->filter('#main')->text());
$this->assertContains('phpBB 3.1 Extension Testing', $crawler->filter('#main')->text());
$this->assertContains('Details', $crawler->filter('#main')->text());
}
public function test_extensions_details()
{
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=details&ext_name=foo%2Fbar&sid=' . $this->sid);
// Test whether the details are displayed
$this->assertContains($this->lang('CLEAN_NAME'), $crawler->filter('#main')->text());
$this->assertContains('foo/bar', $crawler->filter('#meta_name')->text());
$this->assertContains($this->lang('PHP_VERSION'), $crawler->filter('#main')->text());
$this->assertContains('>=5.3', $crawler->filter('#require_php')->text());
// Details should be html escaped
// However, text() only returns the displayed text, so HTML Special Chars are decoded.
// So we test this directly on the content of the response.
$this->assertContains('<p id="require_php">&gt;=5.3</p>', $this->get_content());
}
public function test_extensions_details_notexists()
{
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=details&ext_name=not%2Fexists&sid=' . $this->sid);
// Error message because the files do not exist
$this->assertContains('The required file does not exist:', $crawler->filter('#main')->text());
}
}

View File

@@ -40,10 +40,9 @@ class phpbb_functional_notification_test extends phpbb_functional_test_case
public function test_user_subscriptions($checkbox_name, $expected_status)
{
$this->login();
$crawler = $this->request('GET', 'ucp.php?i=ucp_notifications&mode=notification_options');
$this->assert_response_success();
$crawler = self::request('GET', 'ucp.php?i=ucp_notifications&mode=notification_options');
$cplist = $crawler->filter('.cplist');
$cplist = $crawler->filter('.table1');
if ($expected_status)
{
$this->assert_checkbox_is_checked($cplist, $checkbox_name);

View File

@@ -19,18 +19,17 @@ class phpbb_functional_posting_test extends phpbb_functional_test_case
// Test creating topic
$post = $this->create_topic(2, 'Test Topic 1', 'This is a test topic posted by the testing framework.');
$crawler = $this->request('GET', "viewtopic.php?t={$post['topic_id']}&sid={$this->sid}");
$crawler = self::request('GET', "viewtopic.php?t={$post['topic_id']}&sid={$this->sid}");
$this->assertContains('This is a test topic posted by the testing framework.', $crawler->filter('html')->text());
// Test creating a reply
$post2 = $this->create_post(2, $post['topic_id'], 'Re: Test Topic 1', 'This is a test post posted by the testing framework.');
$crawler = $this->request('GET', "viewtopic.php?t={$post2['topic_id']}&sid={$this->sid}");
$crawler = self::request('GET', "viewtopic.php?t={$post2['topic_id']}&sid={$this->sid}");
$this->assertContains('This is a test post posted by the testing framework.', $crawler->filter('html')->text());
// Test quoting a message
$crawler = $this->request('GET', "posting.php?mode=quote&f=2&t={$post2['topic_id']}&p={$post2['post_id']}&sid={$this->sid}");
$this->assert_response_success();
$crawler = self::request('GET', "posting.php?mode=quote&f=2&t={$post2['topic_id']}&p={$post2['post_id']}&sid={$this->sid}");
$this->assertContains('This is a test post posted by the testing framework.', $crawler->filter('html')->text());
}
@@ -55,7 +54,7 @@ class phpbb_functional_posting_test extends phpbb_functional_test_case
'post' => true,
), $additional_form_data);
return $this->submit_post($posting_url, 'POST_TOPIC', $form_data);
return self::submit_post($posting_url, 'POST_TOPIC', $form_data);
}
/**
@@ -79,7 +78,7 @@ class phpbb_functional_posting_test extends phpbb_functional_test_case
'post' => true,
), $additional_form_data);
return $this->submit_post($posting_url, 'POST_REPLY', $form_data);
return self::submit_post($posting_url, 'POST_REPLY', $form_data);
}
/**
@@ -94,8 +93,7 @@ class phpbb_functional_posting_test extends phpbb_functional_test_case
{
$this->add_lang('posting');
$crawler = $this->request('GET', $posting_url);
$this->assert_response_success();
$crawler = self::request('GET', $posting_url);
$this->assertContains($this->lang($posting_contains), $crawler->filter('html')->text());
$hidden_fields = array(
@@ -119,8 +117,7 @@ class phpbb_functional_posting_test extends phpbb_functional_test_case
// I use a request because the form submission method does not allow you to send data that is not
// contained in one of the actual form fields that the browser sees (i.e. it ignores "hidden" inputs)
// Instead, I send it as a request with the submit button "post" set to true.
$crawler = $this->client->request('POST', $posting_url, $form_data);
$this->assert_response_success();
$crawler = self::request('POST', $posting_url, $form_data);
$this->assertContains($this->lang('POST_STORED'), $crawler->filter('html')->text());
$url = $crawler->selectLink($this->lang('VIEW_MESSAGE', '', ''))->link()->getUri();

View File

@@ -0,0 +1,53 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/common_groups_test.php';
/**
* @group functional
*/
class phpbb_functional_ucp_groups_test extends phpbb_functional_common_groups_test
{
protected $db;
protected function get_url()
{
return 'ucp.php?i=groups&mode=manage&action=edit';
}
protected function get_teampage_settings()
{
if (!isset($this->db))
{
$this->db = $this->get_db();
}
$sql = 'SELECT g.group_legend AS group_legend, t.teampage_position AS group_teampage
FROM ' . GROUPS_TABLE . ' g
LEFT JOIN ' . TEAMPAGE_TABLE . ' t
ON (t.group_id = g.group_id)
WHERE g.group_id = 5';
$result = $this->db->sql_query($sql);
$group_row = $this->db->sql_fetchrow($result);
$this->db->sql_freeresult($result);
return $group_row;
}
public function test_ucp_groups_teampage()
{
$this->group_manage_login();
// Test if group_legend or group_teampage are modified while
// submitting the ucp_group_manage page
$form = $this->get_group_manage_form();
$teampage_settings = $this->get_teampage_settings();
$crawler = self::submit($form);
$this->assertContains($this->lang('GROUP_UPDATED'), $crawler->text());
$this->assertEquals($teampage_settings, $this->get_teampage_settings());
}
}

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_lang">
<column>lang_id</column>
<column>lang_iso</column>
<column>lang_local_name</column>
<column>lang_english_name</column>
<row>
<value>1</value>
<value>en</value>
<value>English</value>
<value>English</value>
</row>
<row>
<value>2</value>
<value>cs</value>
<value>Čeština</value>
<value>Czech</value>
</row>
</table>
</dataset>

View File

@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_sessions">
<column>session_id</column>
<column>session_user_id</column>
<column>session_forum_id</column>
<column>session_time</column>
<column>session_ip</column>
<column>session_viewonline</column>
</table>
<table name="phpbb_users">
<column>user_id</column>
<column>username_clean</column>
<column>username</column>
<column>user_allow_viewonline</column>
<column>user_permissions</column>
<column>user_sig</column>
<column>user_occ</column>
<column>user_interests</column>
<row>
<value>1</value>
<value>anonymous</value>
<value>anonymous</value>
<value>1</value>
<value></value>
<value></value>
<value></value>
<value></value>
</row>
<row>
<value>2</value>
<value>2</value>
<value>2</value>
<value>1</value>
<value></value>
<value></value>
<value></value>
<value></value>
</row>
<row>
<value>3</value>
<value>3</value>
<value>3</value>
<value>1</value>
<value></value>
<value></value>
<value></value>
<value></value>
</row>
<row>
<value>4</value>
<value>4</value>
<value>4</value>
<value>1</value>
<value></value>
<value></value>
<value></value>
<value></value>
</row>
<row>
<value>5</value>
<value>5</value>
<value>5</value>
<value>1</value>
<value></value>
<value></value>
<value></value>
<value></value>
</row>
<row>
<value>6</value>
<value>6</value>
<value>6</value>
<value>0</value>
<value></value>
<value></value>
<value></value>
<value></value>
</row>
<row>
<value>7</value>
<value>7</value>
<value>7</value>
<value>0</value>
<value></value>
<value></value>
<value></value>
<value></value>
</row>
<row>
<value>8</value>
<value>8</value>
<value>8</value>
<value>0</value>
<value></value>
<value></value>
<value></value>
<value></value>
</row>
<row>
<value>9</value>
<value>9</value>
<value>9</value>
<value>0</value>
<value></value>
<value></value>
<value></value>
<value></value>
</row>
<row>
<value>10</value>
<value>10</value>
<value>10</value>
<value>0</value>
<value></value>
<value></value>
<value></value>
<value></value>
</row>
</table>
</dataset>

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_styles">
<column>style_id</column>
<column>style_name</column>
<column>style_active</column>
<column>style_parent_tree</column>
<row>
<value>1</value>
<value>prosilver</value>
<value>1</value>
<value></value>
</row>
<row>
<value>2</value>
<value>subsilver2</value>
<value>1</value>
<value></value>
</row>
<row>
<value>3</value>
<value>zoo</value>
<value>0</value>
<value></value>
</row>
</table>
</dataset>

View File

@@ -0,0 +1,56 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
class phpbb_functions_is_absolute_test extends phpbb_test_case
{
static public function is_absolute_data()
{
return array(
// Empty
array('', false),
// Absolute unix style
array('/etc/phpbb', true),
// Unix does not support \ so that is not an absolute path
array('\etc\phpbb', false),
// Absolute windows style
array('c:\windows', true),
array('C:\Windows', true),
array('c:/windows', true),
array('C:/Windows', true),
// Executable
array('etc/phpbb', false),
array('explorer.exe', false),
// Relative subdir
array('Windows\System32', false),
array('Windows\System32\explorer.exe', false),
array('Windows/System32', false),
array('Windows/System32/explorer.exe', false),
// Relative updir
array('..\Windows\System32', false),
array('..\Windows\System32\explorer.exe', false),
array('../Windows/System32', false),
array('../Windows/System32/explorer.exe', false),
);
}
/**
* @dataProvider is_absolute_data
*/
public function test_is_absolute($path, $expected)
{
$this->assertEquals($expected, phpbb_is_absolute($path));
}
}

View File

@@ -0,0 +1,39 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
class phpbb_functions_language_select_test extends phpbb_database_test_case
{
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/language_select.xml');
}
static public function language_select_data()
{
return array(
array('', '<option value="cs">Čeština</option><option value="en">English</option>'),
array('en', '<option value="cs">Čeština</option><option value="en" selected="selected">English</option>'),
array('cs', '<option value="cs" selected="selected">Čeština</option><option value="en">English</option>'),
array('de', '<option value="cs">Čeština</option><option value="en">English</option>'),
);
}
/**
* @dataProvider language_select_data
*/
public function test_language_select($default, $expected)
{
global $db;
$db = $this->new_dbal();
$this->assertEquals($expected, language_select($default));
}
}

View File

@@ -0,0 +1,227 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_content.php';
class phpbb_functions_obtain_online_test extends phpbb_database_test_case
{
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/obtain_online.xml');
}
protected function setUp()
{
parent::setUp();
global $config, $db;
$db = $this->db = $this->new_dbal();
$config = array(
'load_online_time' => 5,
);
}
static public function obtain_guest_count_data()
{
return array(
array(0, 2),
array(1, 1),
);
}
/**
* @dataProvider obtain_guest_count_data
*/
public function test_obtain_guest_count($forum_id, $expected)
{
$this->db->sql_query('DELETE FROM phpbb_sessions');
$time = time();
$this->create_guest_sessions($time);
$this->assertEquals($expected, obtain_guest_count($forum_id));
}
static public function obtain_users_online_data()
{
return array(
array(0, false, array(
'online_users' => array(2 => 2, 3 => 3, 6 => 6, 7 => 7, 10 => 10),
'hidden_users' => array(6 => 6, 7 => 7, 10 => 10),
'total_online' => 5,
'visible_online' => 2,
'hidden_online' => 3,
'guests_online' => 0,
)),
array(0, true, array(
'online_users' => array(2 => 2, 3 => 3, 6 => 6, 7 => 7, 10 => 10),
'hidden_users' => array(6 => 6, 7 => 7, 10 => 10),
'total_online' => 7,
'visible_online' => 2,
'hidden_online' => 3,
'guests_online' => 2,
)),
array(1, false, array(
'online_users' => array(3 => 3, 7 => 7),
'hidden_users' => array(7 => 7),
'total_online' => 2,
'visible_online' => 1,
'hidden_online' => 1,
'guests_online' => 0,
)),
array(1, true, array(
'online_users' => array(3 => 3, 7 => 7),
'hidden_users' => array(7 => 7),
'total_online' => 3,
'visible_online' => 1,
'hidden_online' => 1,
'guests_online' => 1,
)),
array(2, false, array(
'online_users' => array(),
'hidden_users' => array(),
'total_online' => 0,
'visible_online' => 0,
'hidden_online' => 0,
'guests_online' => 0,
)),
array(2, true, array(
'online_users' => array(),
'hidden_users' => array(),
'total_online' => 0,
'visible_online' => 0,
'hidden_online' => 0,
'guests_online' => 0,
)),
);
}
/**
* @dataProvider obtain_users_online_data
*/
public function test_obtain_users_online($forum_id, $display_guests, $expected)
{
$this->db->sql_query('DELETE FROM phpbb_sessions');
global $config;
$config['load_online_guests'] = $display_guests;
$time = time();
$this->create_guest_sessions($time);
$this->create_user_sessions($time);
$this->assertEquals($expected, obtain_users_online($forum_id));
}
static public function obtain_users_online_string_data()
{
return array(
array(0, false, array(
'online_userlist' => 'REGISTERED_USERS 2, 3',
'l_online_users' => 'ONLINE_USERS_TOTAL 5 REG_USERS_TOTAL 2 HIDDEN_USERS_TOTAL 3',
)),
array(0, true, array(
'online_userlist' => 'REGISTERED_USERS 2, 3',
'l_online_users' => 'ONLINE_USERS_TOTAL_GUESTS 7 REG_USERS_TOTAL 2 HIDDEN_USERS_TOTAL 3 GUEST_USERS_TOTAL 2',
)),
array(1, false, array(
'online_userlist' => 'BROWSING_FORUM 3',
'l_online_users' => 'ONLINE_USERS_TOTAL 2 REG_USERS_TOTAL 1 HIDDEN_USERS_TOTAL 1',
)),
array(1, true, array(
'online_userlist' => 'BROWSING_FORUM_GUESTS 1 3',
'l_online_users' => 'ONLINE_USERS_TOTAL_GUESTS 3 REG_USERS_TOTAL 1 HIDDEN_USERS_TOTAL 1 GUEST_USERS_TOTAL 1',
)),
array(2, false, array(
'online_userlist' => 'BROWSING_FORUM NO_ONLINE_USERS',
'l_online_users' => 'ONLINE_USERS_TOTAL 0 REG_USERS_TOTAL 0 HIDDEN_USERS_TOTAL 0',
)),
array(2, true, array(
'online_userlist' => 'BROWSING_FORUM_GUESTS 0 NO_ONLINE_USERS',
'l_online_users' => 'ONLINE_USERS_TOTAL_GUESTS 0 REG_USERS_TOTAL 0 HIDDEN_USERS_TOTAL 0 GUEST_USERS_TOTAL 0',
)),
);
}
/**
* @dataProvider obtain_users_online_string_data
*/
public function test_obtain_users_online_string($forum_id, $display_guests, $expected)
{
$this->db->sql_query('DELETE FROM phpbb_sessions');
global $config, $user, $auth, $phpbb_dispatcher;
$config['load_online_guests'] = $display_guests;
$user = new phpbb_mock_lang();
$user->lang = $this->load_language();
$auth = $this->getMock('phpbb_auth');
$acl_get_map = array(
array('u_viewonline', true),
array('u_viewprofile', true),
);
$auth->expects($this->any())
->method('acl_get')
->with($this->stringContains('_'),
$this->anything())
->will($this->returnValueMap($acl_get_map));
$phpbb_dispatcher = new phpbb_mock_event_dispatcher();
$time = time();
$this->create_guest_sessions($time);
$this->create_user_sessions($time);
$online_users = obtain_users_online($forum_id);
$this->assertEquals($expected, obtain_users_online_string($online_users, $forum_id));
}
protected function create_guest_sessions($time)
{
$this->add_session(1, '0001', '192.168.0.1', 0, true, $time);
$this->add_session(1, '0002', '192.168.0.2', 1, true, $time);
$this->add_session(1, '0003', '192.168.0.3', 0, true, $time, 10);
$this->add_session(1, '0004', '192.168.0.4', 1, true, $time, 10);
}
protected function create_user_sessions($time)
{
$this->add_session(2, '0005', '192.168.0.5', 0, true, $time);
$this->add_session(3, '0006', '192.168.0.6', 1, true, $time);
$this->add_session(4, '0007', '192.168.0.7', 0, true, $time, 10);
$this->add_session(5, '0008', '192.168.0.8', 1, true, $time, 10);
$this->add_session(6, '0005', '192.168.0.9', 0, false, $time);
$this->add_session(7, '0006', '192.168.0.10', 1, false, $time);
$this->add_session(8, '0007', '192.168.0.11', 0, false, $time, 10);
$this->add_session(9, '0008', '192.168.0.12', 1, false, $time, 10);
$this->add_session(10, '009', '192.168.0.13', 0, false, $time);
}
protected function add_session($user_id, $session_id, $user_ip, $forum_id, $view_online, $time, $time_delta = 0)
{
$sql_ary = array(
'session_id' => $user_id . '_' . $forum_id . '_session00000000000000000' . $session_id,
'session_user_id' => $user_id,
'session_ip' => $user_ip,
'session_forum_id' => $forum_id,
'session_time' => $time - $time_delta * 60,
'session_viewonline' => $view_online,
);
$this->db->sql_query('INSERT INTO phpbb_sessions ' . $this->db->sql_build_array('INSERT', $sql_ary));
}
protected function load_language()
{
return array(
'NO_ONLINE_USERS' => 'NO_ONLINE_USERS',
'REGISTERED_USERS' => 'REGISTERED_USERS',
'BROWSING_FORUM' => 'BROWSING_FORUM %s',
'BROWSING_FORUM_GUEST' => 'BROWSING_FORUM_GUEST %s %d',
'BROWSING_FORUM_GUESTS' => 'BROWSING_FORUM_GUESTS %s %d',
);
}
}

View File

@@ -0,0 +1,41 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
class phpbb_functions_style_select_test extends phpbb_database_test_case
{
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/style_select.xml');
}
static public function style_select_data()
{
return array(
array('', false, '<option value="1">prosilver</option><option value="2">subsilver2</option>'),
array('', true, '<option value="1">prosilver</option><option value="2">subsilver2</option><option value="3">zoo</option>'),
array('1', false, '<option value="1" selected="selected">prosilver</option><option value="2">subsilver2</option>'),
array('1', true, '<option value="1" selected="selected">prosilver</option><option value="2">subsilver2</option><option value="3">zoo</option>'),
array('3', false, '<option value="1">prosilver</option><option value="2">subsilver2</option>'),
array('3', true, '<option value="1">prosilver</option><option value="2">subsilver2</option><option value="3" selected="selected">zoo</option>'),
);
}
/**
* @dataProvider style_select_data
*/
public function test_style_select($default, $all, $expected)
{
global $db;
$db = $this->new_dbal();
$this->assertEquals($expected, style_select($default, $all));
}
}

View File

@@ -0,0 +1,121 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
class phpbb_functions_validate_hex_colour_test extends phpbb_test_case
{
public function positive_match_data()
{
return array(
array('a00'),
array('AFF'),
array('AA0000'),
array('aa00FF'),
array('000'),
array('000000'),
);
}
public function negative_match_data()
{
return array(
// Invalid prefix
array('#aa0'),
array('#AA0000'),
array('vAA0000'),
// Invalid suffix
array('AA0000v'),
// Correct length, but out of hex range
array('ag0'),
array('AAG000'),
// Too long
array('AA00000'),
array('AA0000 '),
array('AA0000 abf'),
array('AA0000 AA0000'),
// empty()
array('0'),
);
}
public function optional_only_data()
{
return array(
// The empty colour, i.e. "no colour".
array(''),
);
}
public function strict_negative_match_data()
{
return array_merge(
$this->negative_match_data(),
$this->optional_only_data()
);
}
public function nonstrict_positive_match_data()
{
return array_merge(
$this->positive_match_data(),
$this->optional_only_data()
);
}
/**
* @dataProvider positive_match_data
*/
public function test_strict_positive_match($input)
{
$this->assertFalse(
phpbb_validate_hex_colour($input, false),
"Failed asserting that $input passes as a valid hex colour."
);
}
/**
* @dataProvider strict_negative_match_data
*/
public function test_strict_negative_match($input)
{
$this->assertSame(
'WRONG_DATA',
phpbb_validate_hex_colour($input, false),
"Failed asserting that $input does not pass as a valid hex colour."
);
}
/**
* @dataProvider nonstrict_positive_match_data
*/
public function test_nonstrict_positive_match($input)
{
$this->assertFalse(
phpbb_validate_hex_colour($input, true),
"Failed asserting that $input passes as a valid or optional hex colour."
);
}
/**
* @dataProvider negative_match_data
*/
public function test_nonstrict_negative_match($input)
{
$this->assertSame(
'WRONG_DATA',
phpbb_validate_hex_colour($input, true),
"Failed asserting that $input does not pass as a valid or optional hex colour."
);
}
}

View File

@@ -49,6 +49,7 @@ class phpbb_functions_acp_build_cfg_template_test extends phpbb_test_case
global $user, $phpbb_dispatcher;
$phpbb_dispatcher = new phpbb_mock_event_dispatcher();
$user = new phpbb_mock_user();
$user->lang = new phpbb_mock_lang();
$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars));
@@ -58,20 +59,20 @@ class phpbb_functions_acp_build_cfg_template_test extends phpbb_test_case
{
return array(
array(
array('dimension', 20, 255),
'key_name',
array('dimension', 5, 15),
'number_key_name',
array('config_key_name_width' => 10, 'config_key_name_height' => 20),
'config_key_name',
array(),
'<input id="key_name" type="text" size="20" maxlength="255" name="config[config_key_name_width]" value="10" /> x <input type="text" size="20" maxlength="255" name="config[config_key_name_height]" value="20" />',
'<input id="number_key_name" type="number" size="2" maxlength="2" min="5" max="15" name="config[config_key_name_width]" value="10" /> x <input type="number" size="2" maxlength="2" min="5" max="15" name="config[config_key_name_height]" value="20" />',
),
array(
array('dimension', 0, 255),
'key_name',
array('dimension', 0, 15),
'number_key_name',
array('config_key_name_width' => 10, 'config_key_name_height' => 20),
'config_key_name',
array(),
'<input id="key_name" type="text" maxlength="255" name="config[config_key_name_width]" value="10" /> x <input type="text" maxlength="255" name="config[config_key_name_height]" value="20" />',
'<input id="number_key_name" type="number" size="2" maxlength="2" min="0" max="15" name="config[config_key_name_width]" value="10" /> x <input type="number" size="2" maxlength="2" min="0" max="15" name="config[config_key_name_height]" value="20" />',
),
);
}
@@ -84,6 +85,43 @@ class phpbb_functions_acp_build_cfg_template_test extends phpbb_test_case
global $user, $phpbb_dispatcher;
$phpbb_dispatcher = new phpbb_mock_event_dispatcher();
$user = new phpbb_mock_user();
$user->lang = new phpbb_mock_lang();
$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars));
}
public function build_cfg_template_number_data()
{
return array(
array(
array('number', 5, 15),
'number_key_name',
array('config_key_name' => 10),
'config_key_name',
array(),
'<input id="number_key_name" type="number" maxlength="2" min="5" max="15" name="config[config_key_name]" value="10" />',
),
array(
array('number', -1, 9999),
'number_key_name',
array('config_key_name' => 10),
'config_key_name',
array(),
'<input id="number_key_name" type="number" maxlength="4" min="-1" max="9999" name="config[config_key_name]" value="10" />',
),
);
}
/**
* @dataProvider build_cfg_template_number_data
*/
public function test_build_cfg_template_number($tpl_type, $key, $new, $config_key, $vars, $expected)
{
global $user, $phpbb_dispatcher;
$phpbb_dispatcher = new phpbb_mock_event_dispatcher();
$user = new phpbb_mock_user();
$user->lang = new phpbb_mock_lang();
$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars));
@@ -111,6 +149,7 @@ class phpbb_functions_acp_build_cfg_template_test extends phpbb_test_case
global $user, $phpbb_dispatcher;
$phpbb_dispatcher = new phpbb_mock_event_dispatcher();
$user = new phpbb_mock_user();
$user->lang = new phpbb_mock_lang();
$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars));
@@ -162,6 +201,7 @@ class phpbb_functions_acp_build_cfg_template_test extends phpbb_test_case
global $user, $phpbb_dispatcher;
$phpbb_dispatcher = new phpbb_mock_event_dispatcher();
$user = new phpbb_mock_user();
$user->lang = new phpbb_mock_lang();
$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars));
@@ -189,6 +229,7 @@ class phpbb_functions_acp_build_cfg_template_test extends phpbb_test_case
global $user, $phpbb_dispatcher;
$phpbb_dispatcher = new phpbb_mock_event_dispatcher();
$user = new phpbb_mock_user();
$user->lang = new phpbb_mock_lang();
$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars));

View File

@@ -32,13 +32,18 @@ class phpbb_lock_db_test extends phpbb_database_test_case
public function test_new_lock()
{
$this->assertFalse($this->lock->owns_lock());
$this->assertTrue($this->lock->acquire());
$this->assertTrue($this->lock->owns_lock());
$this->assertTrue(isset($this->config['test_lock']), 'Lock was created');
$lock2 = new phpbb_lock_db('test_lock', $this->config, $this->db);
$this->assertFalse($lock2->acquire());
$this->assertFalse($lock2->owns_lock());
$this->lock->release();
$this->assertFalse($this->lock->owns_lock());
$this->assertEquals('0', $this->config['test_lock'], 'Lock was released');
}
@@ -50,31 +55,40 @@ class phpbb_lock_db_test extends phpbb_database_test_case
public function test_double_lock()
{
$this->assertFalse($this->lock->owns_lock());
$this->assertTrue($this->lock->acquire());
$this->assertTrue($this->lock->owns_lock());
$this->assertTrue(isset($this->config['test_lock']), 'Lock was created');
$value = $this->config['test_lock'];
$this->assertFalse($this->lock->acquire());
$this->assertTrue($this->lock->owns_lock());
$this->assertEquals($value, $this->config['test_lock'], 'Second lock failed');
$this->lock->release();
$this->assertFalse($this->lock->owns_lock());
$this->assertEquals('0', $this->config['test_lock'], 'Lock was released');
}
public function test_double_unlock()
{
$this->assertTrue($this->lock->acquire());
$this->assertTrue($this->lock->owns_lock());
$this->assertFalse(empty($this->config['test_lock']), 'First lock is acquired');
$this->lock->release();
$this->assertFalse($this->lock->owns_lock());
$this->assertEquals('0', $this->config['test_lock'], 'First lock is released');
$lock2 = new phpbb_lock_db('test_lock', $this->config, $this->db);
$this->assertTrue($lock2->acquire());
$this->assertTrue($lock2->owns_lock());
$this->assertFalse(empty($this->config['test_lock']), 'Second lock is acquired');
$this->lock->release();
$this->assertTrue($lock2->owns_lock());
$this->assertFalse(empty($this->config['test_lock']), 'Double release of first lock is ignored');
$lock2->release();

View File

@@ -26,15 +26,21 @@ class phpbb_lock_flock_test extends phpbb_test_case
$lock = new phpbb_lock_flock($path);
$ok = $lock->acquire();
$this->assertTrue($ok);
$this->assertTrue($lock->owns_lock());
$lock->release();
$this->assertFalse($lock->owns_lock());
$ok = $lock->acquire();
$this->assertTrue($ok);
$this->assertTrue($lock->owns_lock());
$lock->release();
$this->assertFalse($lock->owns_lock());
$ok = $lock->acquire();
$this->assertTrue($ok);
$this->assertTrue($lock->owns_lock());
$lock->release();
$this->assertFalse($lock->owns_lock());
}
/* This hangs the process.
@@ -77,15 +83,18 @@ class phpbb_lock_flock_test extends phpbb_test_case
$ok = $lock->acquire();
$delta = time() - $start;
$this->assertTrue($ok);
$this->assertTrue($lock->owns_lock());
$this->assertGreaterThan(0.5, $delta, 'First lock acquired too soon');
$lock->release();
$this->assertFalse($lock->owns_lock());
// acquire again, this should be instantaneous
$start = time();
$ok = $lock->acquire();
$delta = time() - $start;
$this->assertTrue($ok);
$this->assertTrue($lock->owns_lock());
$this->assertLessThan(0.1, $delta, 'Second lock not acquired instantaneously');
// reap the child
@@ -99,8 +108,10 @@ class phpbb_lock_flock_test extends phpbb_test_case
$lock = new phpbb_lock_flock($path);
$ok = $lock->acquire();
$this->assertTrue($ok);
$this->assertTrue($lock->owns_lock());
sleep(2);
$lock->release();
$this->assertFalse($lock->owns_lock());
// and go away silently
pcntl_exec('/usr/bin/env', array('true'));

View File

@@ -30,4 +30,9 @@ class phpbb_mock_lang implements ArrayAccess
public function offsetUnset($offset)
{
}
public function lang()
{
return implode(' ', func_get_args());
}
}

View File

@@ -0,0 +1,21 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
class phpbb_mock_metadata_manager extends phpbb_extension_metadata_manager
{
public function set_metadata($metadata)
{
$this->metadata = $metadata;
}
public function merge_metadata($metadata)
{
$this->metadata = array_merge($this->metadata, $metadata);
}
}

View File

@@ -29,14 +29,14 @@
</row>
</table>
<table name="phpbb_notifications">
<column>item_type</column>
<column>notification_type_id</column>
<column>user_id</column>
<column>item_id</column>
<column>item_parent_id</column>
<column>notification_read</column>
<column>notification_data</column>
<row>
<value>bookmark</value>
<value>1</value>
<value>5</value>
<value>1</value>
<value>1</value>
@@ -45,9 +45,11 @@
</row>
</table>
<table name="phpbb_notification_types">
<column>notification_type</column>
<column>notification_type_id</column>
<column>notification_type_name</column>
<column>notification_type_enabled</column>
<row>
<value>1</value>
<value>bookmark</value>
<value>1</value>
</row>

View File

@@ -21,14 +21,14 @@
</row>
</table>
<table name="phpbb_notifications">
<column>item_type</column>
<column>notification_type_id</column>
<column>user_id</column>
<column>item_id</column>
<column>item_parent_id</column>
<column>notification_read</column>
<column>notification_data</column>
<row>
<value>post</value>
<value>1</value>
<value>5</value>
<value>1</value>
<value>1</value>
@@ -36,7 +36,7 @@
<value></value>
</row>
<row>
<value>post</value>
<value>1</value>
<value>8</value>
<value>1</value>
<value>1</value>
@@ -45,9 +45,11 @@
</row>
</table>
<table name="phpbb_notification_types">
<column>notification_type</column>
<column>notification_type_id</column>
<column>notification_type_name</column>
<column>notification_type_enabled</column>
<row>
<value>1</value>
<value>post</value>
<value>1</value>
</row>

View File

@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_notifications">
<column>item_type</column>
<column>notification_type_id</column>
<column>user_id</column>
<column>item_id</column>
<column>item_parent_id</column>
<column>notification_read</column>
<column>notification_data</column>
<row>
<value>post_in_queue</value>
<value>1</value>
<value>6</value>
<value>1</value>
<value>1</value>
@@ -17,9 +17,11 @@
</row>
</table>
<table name="phpbb_notification_types">
<column>notification_type</column>
<column>notification_type_id</column>
<column>notification_type_name</column>
<column>notification_type_enabled</column>
<row>
<value>1</value>
<value>post_in_queue</value>
<value>1</value>
</row>

View File

@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_notifications">
<column>item_type</column>
<column>notification_type_id</column>
<column>user_id</column>
<column>item_id</column>
<column>item_parent_id</column>
<column>notification_read</column>
<column>notification_data</column>
<row>
<value>quote</value>
<value>1</value>
<value>5</value>
<value>1</value>
<value>1</value>
@@ -17,9 +17,11 @@
</row>
</table>
<table name="phpbb_notification_types">
<column>notification_type</column>
<column>notification_type_id</column>
<column>notification_type_name</column>
<column>notification_type_enabled</column>
<row>
<value>1</value>
<value>quote</value>
<value>1</value>
</row>

View File

@@ -19,7 +19,7 @@ if (!defined('IN_PHPBB'))
* Notifications service class
* @package notifications
*/
class phpbb_mock_notifications_notification_manager extends phpbb_notification_manager
class phpbb_notification_manager_helper extends phpbb_notification_manager
{
public function set_var($name, $value)
{
@@ -28,12 +28,10 @@ class phpbb_mock_notifications_notification_manager extends phpbb_notification_m
// Extra dependencies for get_*_class functions
protected $auth = null;
protected $cache = null;
protected $config = null;
public function setDependencies($auth, $cache, $config)
public function setDependencies($auth, $config)
{
$this->auth = $auth;
$this->cache = $cache;
$this->config = $config;
}
@@ -44,7 +42,7 @@ class phpbb_mock_notifications_notification_manager extends phpbb_notification_m
{
$item_type = 'phpbb_notification_type_' . $item_type;
$item = new $item_type($this->user_loader, $this->db, $this->cache, $this->user, $this->auth, $this->config, $this->phpbb_root_path, $this->php_ext, $this->notification_types_table, $this->notifications_table, $this->user_notifications_table);
$item = new $item_type($this->user_loader, $this->db, $this->cache->get_driver(), $this->user, $this->auth, $this->config, $this->phpbb_root_path, $this->php_ext, $this->notification_types_table, $this->notifications_table, $this->user_notifications_table);
$item->set_notification_manager($this);
@@ -60,7 +58,7 @@ class phpbb_mock_notifications_notification_manager extends phpbb_notification_m
{
$method_name = 'phpbb_notification_method_' . $method_name;
$method = new $method_name($this->user_loader, $this->db, $this->cache, $this->user, $this->auth, $this->config, $this->phpbb_root_path, $this->php_ext, $this->notification_types_table, $this->notifications_table, $this->user_notifications_table);
$method = new $method_name($this->user_loader, $this->db, $this->cache->get_driver(), $this->user, $this->auth, $this->config, $this->phpbb_root_path, $this->php_ext, $this->notification_types_table, $this->notifications_table, $this->user_notifications_table);
$method->set_notification_manager($this);

View File

@@ -7,6 +7,8 @@
*
*/
require_once dirname(__FILE__) . '/manager_helper.php';
class phpbb_notification_test extends phpbb_database_test_case
{
protected $notifications, $db, $container, $user, $config, $auth, $cache;
@@ -31,19 +33,26 @@ class phpbb_notification_test extends phpbb_database_test_case
'allow_topic_notify' => true,
'allow_forum_notify' => true,
));
$this->user = new phpbb_mock_user();
$this->user = new phpbb_user();
$this->user_loader = new phpbb_user_loader($this->db, $phpbb_root_path, $phpEx, 'phpbb_users');
$this->auth = new phpbb_mock_notifications_auth();
$this->cache = new phpbb_mock_cache();
$this->cache = new phpbb_cache_service(
new phpbb_cache_driver_null(),
$this->config,
$this->db,
$phpbb_root_path,
$phpEx
);
$this->container = new phpbb_mock_container_builder();
$this->notifications = new phpbb_mock_notifications_notification_manager(
$this->notifications = new phpbb_notification_manager_helper(
array(),
array(),
$this->container,
$this->user_loader,
$this->db,
$this->cache,
$this->user,
$phpbb_root_path,
$phpEx,
@@ -52,7 +61,7 @@ class phpbb_notification_test extends phpbb_database_test_case
'phpbb_user_notifications'
);
$this->notifications->setDependencies($this->auth, $this->cache, $this->config);
$this->notifications->setDependencies($this->auth, $this->config);
$types = array();
foreach (array(
@@ -87,7 +96,36 @@ class phpbb_notification_test extends phpbb_database_test_case
{
global $phpbb_root_path, $phpEx;
return new $type($this->user_loader, $this->db, $this->cache, $this->user, $this->auth, $this->config, $phpbb_root_path, $phpEx, 'phpbb_notification_types', 'phpbb_notifications', 'phpbb_user_notifications');
return new $type($this->user_loader, $this->db, $this->cache->get_driver(), $this->user, $this->auth, $this->config, $phpbb_root_path, $phpEx, 'phpbb_notification_types', 'phpbb_notifications', 'phpbb_user_notifications');
}
public function test_get_notification_type_id()
{
// They should be inserted the first time
$this->assertEquals(1, $this->notifications->get_notification_type_id('post'));
$this->assertEquals(2, $this->notifications->get_notification_type_id('quote'));
$this->assertEquals(3, $this->notifications->get_notification_type_id('test'));
$this->assertEquals(array(
'test' => 3,
'quote' => 2,
'post' => 1,
),
$this->notifications->get_notification_type_ids(array(
'test',
'quote',
'post',
)
));
$this->assertEquals(2, $this->notifications->get_notification_type_id('quote'));
try
{
$this->assertEquals(3, $this->notifications->get_notification_type_id('fail'));
$this->fail('Non-existent type should throw an exception');
}
catch (Exception $e) {}
}
public function test_get_subscription_types()
@@ -121,6 +159,20 @@ class phpbb_notification_test extends phpbb_database_test_case
public function test_notifications()
{
$this->db->sql_query('DELETE FROM phpbb_notification_types');
$types = array('quote', 'bookmark', 'post', 'test');
foreach ($types as $id => $type)
{
$this->db->sql_query('INSERT INTO phpbb_notification_types ' .
$this->db->sql_build_array('INSERT', array(
'notification_type_id' => ($id + 1),
'notification_type_name' => $type,
'notification_type_enabled' => 1,
))
);
}
// Used to test post notifications later
$this->db->sql_query('INSERT INTO ' . TOPICS_WATCH_TABLE . ' ' . $this->db->sql_build_array('INSERT', array(
'topic_id' => 2,
@@ -195,7 +247,7 @@ class phpbb_notification_test extends phpbb_database_test_case
$expected = array(
1 => array(
'item_type' => 'test',
'notification_type_id' => 4,
'item_id' => 1,
'item_parent_id' => 1,
'user_id' => 0,
@@ -204,7 +256,7 @@ class phpbb_notification_test extends phpbb_database_test_case
'notification_data' => array(),
),
2 => array(
'item_type' => 'test',
'notification_type_id' => 4,
'item_id' => 2,
'item_parent_id' => 2,
'user_id' => 0,
@@ -213,7 +265,7 @@ class phpbb_notification_test extends phpbb_database_test_case
'notification_data' => array(),
),
3 => array(
'item_type' => 'test',
'notification_type_id' => 4,
'item_id' => 3,
'item_parent_id' => 2,
'user_id' => 0,
@@ -222,7 +274,7 @@ class phpbb_notification_test extends phpbb_database_test_case
'notification_data' => array(),
),
4 => array(
'item_type' => 'post',
'notification_type_id' => 3,
'item_id' => 4,
'item_parent_id' => 2,
'user_id' => 0,
@@ -238,7 +290,7 @@ class phpbb_notification_test extends phpbb_database_test_case
),
),
5 => array(
'item_type' => 'bookmark',
'notification_type_id' => 2,
'item_id' => 5,
'item_parent_id' => 2,
'user_id' => 0,
@@ -301,7 +353,7 @@ class phpbb_notification_test extends phpbb_database_test_case
$expected = array(
1 => array(
'item_type' => 'test',
'notification_type_id' => 4,
'item_id' => 1,
'item_parent_id' => 2,
'user_id' => 0,
@@ -310,7 +362,7 @@ class phpbb_notification_test extends phpbb_database_test_case
'notification_data' => array(),
),
2 => array(
'item_type' => 'test',
'notification_type_id' => 4,
'item_id' => 2,
'item_parent_id' => 2,
'user_id' => 0,
@@ -319,7 +371,7 @@ class phpbb_notification_test extends phpbb_database_test_case
'notification_data' => array(),
),
3 => array(
'item_type' => 'test',
'notification_type_id' => 4,
'item_id' => 3,
'item_parent_id' => 2,
'user_id' => 0,
@@ -328,7 +380,7 @@ class phpbb_notification_test extends phpbb_database_test_case
'notification_data' => array(),
),
4 => array(
'item_type' => 'post',
'notification_type_id' => 3,
'item_id' => 4,
'item_parent_id' => 2,
'user_id' => 0,
@@ -344,7 +396,7 @@ class phpbb_notification_test extends phpbb_database_test_case
),
),
5 => array(
'item_type' => 'bookmark',
'notification_type_id' => 2,
'item_id' => 5,
'item_parent_id' => 2,
'user_id' => 0,

View File

@@ -52,9 +52,6 @@ class phpbb_notification_submit_post_base extends phpbb_database_test_case
$this->db = $this->new_dbal();
$db = $this->db;
// Cache
$cache = new phpbb_mock_cache();
// Auth
$auth = $this->getMock('phpbb_auth');
$auth->expects($this->any())
@@ -72,6 +69,14 @@ class phpbb_notification_submit_post_base extends phpbb_database_test_case
set_config(null, null, null, $config);
set_config_count(null, null, null, $config);
$cache = new phpbb_cache_service(
new phpbb_cache_driver_null(),
$config,
$db,
$phpbb_root_path,
$phpEx
);
// Event dispatcher
$phpbb_dispatcher = new phpbb_mock_event_dispatcher();
@@ -94,23 +99,28 @@ class phpbb_notification_submit_post_base extends phpbb_database_test_case
$user_loader = new phpbb_user_loader($db, $phpbb_root_path, $phpEx, USERS_TABLE);
// Notification Manager
$phpbb_notifications = new phpbb_notification_manager(array(), array(),
$phpbb_container, $user_loader, $db, $user,
$phpbb_root_path, $phpEx,
NOTIFICATION_TYPES_TABLE, NOTIFICATIONS_TABLE, USER_NOTIFICATIONS_TABLE);
$phpbb_container->set('notification_manager', $phpbb_notifications);
// Notification Types
$notification_types = array('quote', 'bookmark', 'post', 'post_in_queue');
$notification_types = array('quote', 'bookmark', 'post', 'post_in_queue', 'topic', 'approve_topic', 'approve_post');
$notification_types_array = array();
foreach ($notification_types as $type)
{
$class_name = 'phpbb_notification_type_' . $type;
$phpbb_container->set('notification.type.' . $type, new $class_name(
$user_loader, $db, $cache, $user, $auth, $config,
$class = new $class_name(
$user_loader, $db, $cache->get_driver(), $user, $auth, $config,
$phpbb_root_path, $phpEx,
NOTIFICATION_TYPES_TABLE, NOTIFICATIONS_TABLE, USER_NOTIFICATIONS_TABLE));
NOTIFICATION_TYPES_TABLE, NOTIFICATIONS_TABLE, USER_NOTIFICATIONS_TABLE);
$phpbb_container->set('notification.type.' . $type, $class);
$notification_types_array['notification.type.' . $type] = $class;
}
// Notification Manager
$phpbb_notifications = new phpbb_notification_manager($notification_types_array, array(),
$phpbb_container, $user_loader, $db, $cache, $user,
$phpbb_root_path, $phpEx,
NOTIFICATION_TYPES_TABLE, NOTIFICATIONS_TABLE, USER_NOTIFICATIONS_TABLE);
$phpbb_container->set('notification_manager', $phpbb_notifications);
}
/**
@@ -119,8 +129,9 @@ class phpbb_notification_submit_post_base extends phpbb_database_test_case
public function test_submit_post($additional_post_data, $expected_before, $expected_after)
{
$sql = 'SELECT user_id, item_id, item_parent_id
FROM ' . NOTIFICATIONS_TABLE . "
WHERE item_type = '" . $this->item_type . "'
FROM ' . NOTIFICATIONS_TABLE . ' n, ' . NOTIFICATION_TYPES_TABLE . " nt
WHERE nt.notification_type_name = '" . $this->item_type . "'
AND n.notification_type_id = nt.notification_type_id
ORDER BY user_id, item_id ASC";
$result = $this->db->sql_query($sql);
$this->assertEquals($expected_before, $this->db->sql_fetchrowset($result));
@@ -131,8 +142,9 @@ class phpbb_notification_submit_post_base extends phpbb_database_test_case
submit_post('reply', '', 'poster-name', POST_NORMAL, $poll_data, $post_data, false, false);
$sql = 'SELECT user_id, item_id, item_parent_id
FROM ' . NOTIFICATIONS_TABLE . "
WHERE item_type = '" . $this->item_type . "'
FROM ' . NOTIFICATIONS_TABLE . ' n, ' . NOTIFICATION_TYPES_TABLE . " nt
WHERE nt.notification_type_name = '" . $this->item_type . "'
AND n.notification_type_id = nt.notification_type_id
ORDER BY user_id ASC, item_id ASC";
$result = $this->db->sql_query($sql);
$this->assertEquals($expected_after, $this->db->sql_fetchrowset($result));

View File

@@ -86,6 +86,104 @@ abstract class phpbb_search_common_test_case extends phpbb_search_test_case
array('-fooo', '-baar'),
array(),
),
array(
'fooo -fooo',
'all',
true,
array('fooo', '-fooo'),
array(),
),
array(
'fooo fooo-',
'all',
true,
array('fooo', 'fooo'),
array(),
),
array(
'-fooo fooo',
'all',
true,
array('-fooo', 'fooo'),
array(),
),
array(
'fooo- fooo',
'all',
true,
array('fooo', 'fooo'),
array(),
),
array(
'fooo-baar fooo',
'all',
true,
array('fooo', 'baar', 'fooo'),
array(),
),
array(
'fooo-baar -fooo',
'all',
true,
array('fooo', 'baar', '-fooo'),
array(),
),
array(
'fooo-baar fooo-',
'all',
true,
array('fooo', 'baar', 'fooo'),
array(),
),
array(
'fooo-baar baar',
'all',
true,
array('fooo', 'baar', 'baar'),
array(),
),
array(
'fooo-baar -baar',
'all',
true,
array('fooo', 'baar', '-baar'),
array(),
),
array(
'fooo-baar baar-',
'all',
true,
array('fooo', 'baar', 'baar'),
array(),
),
array(
'fooo-baar fooo-baar',
'all',
true,
array('fooo', 'baar', 'fooo', 'baar'),
array(),
),
array(
'fooo-baar -fooo-baar',
'all',
true,
array('fooo', 'baar', '-fooo', 'baar'),
array(),
),
array(
'fooo-baar fooo-baar-',
'all',
true,
array('fooo', 'baar', 'fooo', 'baar'),
array(),
),
array(
'fooo-baar-baaz',
'all',
true,
array('fooo', 'baar', 'baaz'),
array(),
),
);
}

View File

@@ -0,0 +1,6 @@
|{VARIABLE}|
{VARIABLE}|{VARIABLE}|
|{VARIABLE}
<div class="{VARIABLE}">test</div>

View File

@@ -0,0 +1 @@
<!-- EVENT event_variable_spacing -->

View File

@@ -16,9 +16,10 @@ class phpbb_template_template_events_test extends phpbb_template_template_test_c
return array(
/*
array(
'', // file
'', // Description
'', // dataset
array(), // style names
'', // file
array(), // vars
array(), // block vars
array(), // destroy

View File

@@ -0,0 +1,87 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/template_test_case.php';
class phpbb_template_template_spacing_test extends phpbb_template_template_test_case
{
public function template_data()
{
return array(
/*
array(
'', // Description
'', // dataset
array(), // style names
'', // file
array(), // vars
array(), // block vars
array(), // destroy
'', // expected result
),
*/
array(
'Spacing in templates',
'ext_trivial',
array(),
'variable_spacing.html',
array(
'VARIABLE' => '{}',
),
array(),
array(),
'|{}|
{}|{}|
|{}
<div class="{}">test</div>',
),
);
}
/**
* @dataProvider template_data
*/
public function test_template($desc, $dataset, $style_names, $file, array $vars, array $block_vars, array $destroy, $expected)
{
// Run test
$cache_file = $this->template->cachepath . str_replace('/', '.', $file) . '.php';
$this->run_template($file, $vars, $block_vars, $destroy, $expected, $cache_file);
}
/**
* @dataProvider template_data
*/
public function test_event($desc, $dataset, $style_names, $file, array $vars, array $block_vars, array $destroy, $expected)
{
// Reset the engine state
$this->setup_engine_for_events($dataset, $style_names);
// Run test
$cache_file = $this->template->cachepath . str_replace('/', '.', $file) . '.php';
$this->run_template($file, $vars, $block_vars, $destroy, $expected, $cache_file);
}
protected function setup_engine_for_events($dataset, $style_names, array $new_config = array())
{
global $phpbb_root_path, $phpEx, $user;
$defaults = $this->config_defaults();
$config = new phpbb_config(array_merge($defaults, $new_config));
$this->template_path = dirname(__FILE__) . "/datasets/$dataset/styles/silver/template";
$this->style_resource_locator = new phpbb_style_resource_locator();
$this->extension_manager = new phpbb_mock_filesystem_extension_manager(
dirname(__FILE__) . "/datasets/$dataset/"
);
$this->template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, new phpbb_template_context, $this->extension_manager);
$this->style_provider = new phpbb_style_path_provider();
$this->style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, $this->style_provider, $this->template);
$this->style->set_custom_style('silver', array($this->template_path), $style_names, '');
}
}

View File

@@ -132,6 +132,20 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(),
"xyz\nabc\nabc\nbar\nbar\nabc",
),
array(
'define_advanced.html',
array(),
array('loop' => array(array(), array(), array(), array(), array(), array(), array()), 'test' => array(array()), 'test.deep' => array(array()), 'test.deep.defines' => array(array())),
array(),
"abc\nzxc\ncde\nbcd",
),
array(
'define_unclosed.html',
array(),
array(),
array(),
"test",
),
array(
'expressions.html',
array(),

View File

@@ -7,5 +7,3 @@
{$VALUE}
<!-- UNDEFINE $VALUE -->
{$VALUE}
<!-- DEFINE $VALUE -->

View File

@@ -0,0 +1,12 @@
<!-- DEFINE $VALUE -->
abc
<!-- ENDDEFINE -->
{$VALUE}
<!-- DEFINE $VALUE1 -->
bcd
<!-- ENDDEFINE -->
<!-- DEFINE $VALUE2 -->
cde
<!-- ENDDEFINE -->
<!-- INCLUDE define_include2.html -->
{$INCLUDED_VALUE3}

View File

@@ -0,0 +1,11 @@
<!-- DEFINE $INCLUDED_VALUE1 -->
zxc
<!-- ENDDEFINE -->
<!-- DEFINE $INCLUDED_VALUE2 -->
qwe
<!-- ENDDEFINE -->
{$INCLUDED_VALUE1}
<!-- DEFINE $INCLUDED_VALUE3 -->
{$VALUE2}
{$VALUE1}
<!-- ENDDEFINE -->

View File

@@ -0,0 +1,2 @@
<!-- DEFINE $VALUE -->
test

View File

@@ -0,0 +1,6 @@
|{VARIABLE}|
{VARIABLE}|{VARIABLE}|
|{VARIABLE}
<div class="{VARIABLE}">test</div>

View File

@@ -11,6 +11,8 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
{
static private $already_connected;
private $db_connections;
protected $test_case_helpers;
protected $fixture_xml_data;
@@ -28,6 +30,22 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
'phpbb_database_test_case' => array('already_connected'),
);
$this->db_connections = array();
}
protected function tearDown()
{
parent::tearDown();
// Close all database connections from this test
if (!empty($this->db_connections))
{
foreach ($this->db_connections as $db)
{
$db->sql_close();
}
}
}
protected function setUp()
@@ -44,6 +62,21 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
}
}
/**
* Performs synchronisations for a given table/column set on the database
*
* @param array $table_column_map Information about the tables/columns to synchronise
*
* @return null
*/
protected function database_synchronisation($table_column_map)
{
$config = $this->get_database_config();
$manager = $this->create_connection_manager($config);
$manager->connect();
$manager->database_synchronisation($table_column_map);
}
public function createXMLDataSet($path)
{
$db_config = $this->get_database_config();
@@ -121,6 +154,8 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
$db = new $config['dbms']();
$db->sql_connect($config['dbhost'], $config['dbuser'], $config['dbpasswd'], $config['dbname'], $config['dbport']);
$this->db_connections[] = $db;
return $db;
}

View File

@@ -142,6 +142,28 @@ class phpbb_database_test_connection_manager
}
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
switch ($this->config['dbms'])
{
case 'phpbb_db_driver_mysql':
case 'phpbb_db_driver_mysqli':
$this->pdo->exec('SET NAMES utf8');
/*
* The phpBB MySQL drivers set the STRICT_ALL_TABLES and
* STRICT_TRANS_TABLES flags/modes, so as a minimum requirement
* we want to make sure those are set for the PDO side of the
* test suite.
*
* The TRADITIONAL flag implies STRICT_ALL_TABLES and
* STRICT_TRANS_TABLES as well as other useful strictness flags
* the phpBB MySQL driver does not set.
*/
$this->pdo->exec("SET SESSION sql_mode='TRADITIONAL'");
break;
default:
}
}
/**
@@ -457,12 +479,33 @@ class phpbb_database_test_connection_manager
* @return null
*/
public function post_setup_synchronisation($xml_data_set)
{
$table_names = $xml_data_set->getTableNames();
$tables = array();
foreach ($table_names as $table)
{
$tables[$table] = $xml_data_set->getTableMetaData($table)->getColumns();
}
$this->database_synchronisation($tables);
}
/**
* Performs synchronisations on the database after a fixture has been loaded
*
* @param array $table_column_map Array of tables/columns to synchronise
* array(table1 => array(column1, column2))
*
* @return null
*/
public function database_synchronisation($table_column_map)
{
$this->ensure_connected(__METHOD__);
$queries = array();
// Get escaped versions of the table names used in the fixture
$table_names = array_map(array($this->pdo, 'PDO::quote'), $xml_data_set->getTableNames());
// Get escaped versions of the table names to synchronise
$table_names = array_map(array($this->pdo, 'PDO::quote'), array_keys($table_column_map));
switch ($this->config['dbms'])
{
@@ -519,7 +562,7 @@ class phpbb_database_test_connection_manager
while ($row = $result->fetch(PDO::FETCH_ASSOC))
{
// Get the columns used in the fixture for this table
$column_names = $xml_data_set->getTableMetaData($row['table_name'])->getColumns();
$column_names = $table_column_map[$row['table_name']];
// Skip sequences that weren't specified in the fixture
if (!in_array($row['column_name'], $column_names))

View File

@@ -12,8 +12,9 @@ require_once __DIR__ . '/../../phpBB/includes/functions_install.php';
class phpbb_functional_test_case extends phpbb_test_case
{
protected $client;
protected $root_url;
static protected $client;
static protected $cookieJar;
static protected $root_url;
protected $cache = null;
protected $db = null;
@@ -39,6 +40,7 @@ class phpbb_functional_test_case extends phpbb_test_case
parent::setUpBeforeClass();
self::$config = phpbb_test_case_helpers::get_test_config();
self::$root_url = self::$config['phpbb_functional_url'];
// Important: this is used both for installation and by
// test cases for querying the tables.
@@ -64,12 +66,12 @@ class phpbb_functional_test_case extends phpbb_test_case
$this->bootstrap();
$this->cookieJar = new CookieJar;
$this->client = new Goutte\Client(array(), null, $this->cookieJar);
self::$cookieJar = new CookieJar;
self::$client = new Goutte\Client(array(), null, self::$cookieJar);
// Reset the curl handle because it is 0 at this point and not a valid
// resource
$this->client->getClient()->getCurlMulti()->reset(true);
$this->root_url = self::$config['phpbb_functional_url'];
self::$client->getClient()->getCurlMulti()->reset(true);
// Clear the language array so that things
// that were added in other tests are gone
$this->lang = array();
@@ -77,9 +79,55 @@ class phpbb_functional_test_case extends phpbb_test_case
$this->purge_cache();
}
public function request($method, $path)
/**
* Perform a request to page
*
* @param string $method HTTP Method
* @param string $path Page path, relative from phpBB root path
* @param array $form_data An array of form field values
* @param bool $assert_response_html Should we perform standard assertions for a normal html page
* @return Symfony\Component\DomCrawler\Crawler
*/
static public function request($method, $path, $form_data = array(), $assert_response_html = true)
{
return $this->client->request($method, $this->root_url . $path);
$crawler = self::$client->request($method, self::$root_url . $path, $form_data);
if ($assert_response_html)
{
self::assert_response_html();
}
return $crawler;
}
/**
* Submits a form
*
* @param Symfony\Component\DomCrawler\Form $form A Form instance
* @param array $values An array of form field values
* @param bool $assert_response_html Should we perform standard assertions for a normal html page
* @return Symfony\Component\DomCrawler\Crawler
*/
static public function submit(Symfony\Component\DomCrawler\Form $form, array $values = array(), $assert_response_html = true)
{
$crawler = self::$client->submit($form, $values);
if ($assert_response_html)
{
self::assert_response_html();
}
return $crawler;
}
/**
* Get Client Content
*
* @return string HTML page
*/
static public function get_content()
{
return self::$client->getResponse()->getContent();
}
// bootstrap, called after board is set up
@@ -148,11 +196,13 @@ class phpbb_functional_test_case extends phpbb_test_case
self::$config['table_prefix'],
array()
);
$container = new phpbb_mock_container_builder();
$container->set('migrator', $migrator);
$extension_manager = new phpbb_extension_manager(
new phpbb_mock_container_builder(),
$container,
$db,
$config,
$migrator,
new phpbb_filesystem(),
self::$config['table_prefix'] . 'ext',
dirname(__FILE__) . '/',
@@ -181,26 +231,73 @@ class phpbb_functional_test_case extends phpbb_test_case
}
}
// begin data
$data = array();
self::$cookieJar = new CookieJar;
self::$client = new Goutte\Client(array(), null, self::$cookieJar);
// Set client manually so we can increase the cURL timeout
self::$client->setClient(new Guzzle\Http\Client('', array(
Guzzle\Http\Client::DISABLE_REDIRECTS => true,
'curl.options' => array(
CURLOPT_TIMEOUT => 120,
),
)));
$data = array_merge($data, self::$config);
$data = array_merge($data, array(
'default_lang' => 'en',
'admin_name' => 'admin',
'admin_pass1' => 'admin',
'admin_pass2' => 'admin',
'board_email' => 'nobody@example.com',
));
// Reset the curl handle because it is 0 at this point and not a valid
// resource
self::$client->getClient()->getCurlMulti()->reset(true);
$parseURL = parse_url(self::$config['phpbb_functional_url']);
$data = array_merge($data, array(
$crawler = self::request('GET', 'install/index.php?mode=install');
self::assertContains('Welcome to Installation', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form();
$crawler = self::submit($form);
self::assertContains('Installation compatibility', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form();
$crawler = self::submit($form);
self::assertContains('Database configuration', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form(array(
// Installer uses 3.0-style dbms name
'dbms' => str_replace('phpbb_db_driver_', '', self::$config['dbms']),
'dbhost' => self::$config['dbhost'],
'dbport' => self::$config['dbport'],
'dbname' => self::$config['dbname'],
'dbuser' => self::$config['dbuser'],
'dbpasswd' => self::$config['dbpasswd'],
'table_prefix' => self::$config['table_prefix'],
));
$crawler = self::submit($form);
self::assertContains('Successful connection', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form();
$crawler = self::submit($form);
self::assertContains('Administrator configuration', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form(array(
'default_lang' => 'en',
'admin_name' => 'admin',
'admin_pass1' => 'adminadmin',
'admin_pass2' => 'adminadmin',
'board_email' => 'nobody@example.com',
));
$crawler = self::submit($form);
self::assertContains('Tests passed', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form();
$crawler = self::submit($form);
self::assertContains('The configuration file has been written.', $crawler->filter('#main')->text());
file_put_contents($phpbb_root_path . "config.$phpEx", phpbb_create_config_file_data(self::$config, self::$config['dbms'], true, true));
$form = $crawler->selectButton('submit')->form();
$crawler = self::submit($form);
self::assertContains('The settings on this page are only necessary to set if you know that you require something different from the default.', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form(array(
'email_enable' => true,
'smtp_delivery' => true,
'smtp_host' => 'nxdomain.phpbb.com',
'smtp_auth' => '',
'smtp_auth' => 'PLAIN',
'smtp_user' => 'nxuser',
'smtp_pass' => 'nxpass',
'cookie_secure' => false,
@@ -210,50 +307,17 @@ class phpbb_functional_test_case extends phpbb_test_case
'server_port' => isset($parseURL['port']) ? (int) $parseURL['port'] : 80,
'script_path' => $parseURL['path'],
));
// end data
$content = self::do_request('install');
self::assertNotSame(false, $content);
self::assertContains('Welcome to Installation', $content);
$crawler = self::submit($form);
self::assertContains('The database tables used by phpBB', $crawler->filter('#main')->text());
self::assertContains('have been created and populated with some initial data.', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form();
// Installer uses 3.0-style dbms name
$data['dbms'] = str_replace('phpbb_db_driver_', '', $data['dbms']);
$content = self::do_request('create_table', $data);
self::assertNotSame(false, $content);
self::assertContains('The database tables used by phpBB', $content);
// 3.0 or 3.1
self::assertContains('have been created and populated with some initial data.', $content);
$content = self::do_request('config_file', $data);
self::assertNotSame(false, $content);
self::assertContains('Configuration file', $content);
file_put_contents($phpbb_root_path . "config.$phpEx", phpbb_create_config_file_data($data, self::$config['dbms'], true, true));
$content = self::do_request('final', $data);
self::assertNotSame(false, $content);
self::assertContains('You have successfully installed', $content);
$crawler = self::submit($form);
self::assertContains('You have successfully installed', $crawler->text());
copy($phpbb_root_path . "config.$phpEx", $phpbb_root_path . "config_test.$phpEx");
}
static private function do_request($sub, $post_data = null)
{
$context = null;
if ($post_data)
{
$context = stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => http_build_query($post_data),
'ignore_errors' => true,
),
));
}
return file_get_contents(self::$config['phpbb_functional_url'] . 'install/index.php?mode=install&sub=' . $sub, false, $context);
}
static private function recreate_database($config)
{
$db_conn_mgr = new phpbb_database_test_connection_manager($config);
@@ -312,7 +376,7 @@ class phpbb_functional_test_case extends phpbb_test_case
'user_lang' => 'en',
'user_timezone' => 0,
'user_dateformat' => '',
'user_password' => phpbb_hash($username),
'user_password' => phpbb_hash($username . $username),
);
return user_add($user_row);
}
@@ -359,7 +423,7 @@ class phpbb_functional_test_case extends phpbb_test_case
return group_user_del($group_id, false, $usernames, $group_name);
}
protected function add_user_group($group_name, $usernames)
protected function add_user_group($group_name, $usernames, $default = false, $leader = false)
{
global $db, $cache, $auth, $config, $phpbb_dispatcher, $phpbb_log, $phpbb_container, $phpbb_root_path, $phpEx;
@@ -398,22 +462,21 @@ class phpbb_functional_test_case extends phpbb_test_case
$group_id = (int) $db->sql_fetchfield('group_id');
$db->sql_freeresult($result);
return group_user_add($group_id, false, $usernames, $group_name);
return group_user_add($group_id, false, $usernames, $group_name, $default, $leader);
}
protected function login($username = 'admin')
{
$this->add_lang('ucp');
$crawler = $this->request('GET', 'ucp.php');
$crawler = self::request('GET', 'ucp.php');
$this->assertContains($this->lang('LOGIN_EXPLAIN_UCP'), $crawler->filter('html')->text());
$form = $crawler->selectButton($this->lang('LOGIN'))->form();
$crawler = $this->client->submit($form, array('username' => $username, 'password' => $username));
$this->assert_response_success();
$crawler = self::submit($form, array('username' => $username, 'password' => $username . $username));
$this->assertContains($this->lang('LOGIN_REDIRECT'), $crawler->filter('html')->text());
$cookies = $this->cookieJar->all();
$cookies = self::$cookieJar->all();
// The session id is stored in a cookie that ends with _sid - we assume there is only one such cookie
foreach ($cookies as $cookie);
@@ -425,6 +488,16 @@ class phpbb_functional_test_case extends phpbb_test_case
}
}
protected function logout()
{
$this->add_lang('ucp');
$crawler = self::request('GET', 'ucp.php?sid=' . $this->sid . '&mode=logout');
$this->assertContains($this->lang('LOGOUT_REDIRECT'), $crawler->filter('#message')->text());
unset($this->sid);
}
/**
* Login to the ACP
* You must run login() before calling this.
@@ -440,7 +513,7 @@ class phpbb_functional_test_case extends phpbb_test_case
return;
}
$crawler = $this->request('GET', 'adm/index.php?sid=' . $this->sid);
$crawler = self::request('GET', 'adm/index.php?sid=' . $this->sid);
$this->assertContains($this->lang('LOGIN_ADMIN_CONFIRM'), $crawler->filter('html')->text());
$form = $crawler->selectButton($this->lang('LOGIN'))->form();
@@ -449,11 +522,10 @@ class phpbb_functional_test_case extends phpbb_test_case
{
if (strpos($field, 'password_') === 0)
{
$crawler = $this->client->submit($form, array('username' => $username, $field => $username));
$this->assert_response_success();
$crawler = self::submit($form, array('username' => $username, $field => $username . $username));
$this->assertContains($this->lang('LOGIN_ADMIN_SUCCESS'), $crawler->filter('html')->text());
$cookies = $this->cookieJar->all();
$cookies = self::$cookieJar->all();
// The session id is stored in a cookie that ends with _sid - we assume there is only one such cookie
foreach ($cookies as $cookie);
@@ -518,22 +590,38 @@ class phpbb_functional_test_case extends phpbb_test_case
$this->assertContains(html_entity_decode($this->lang($needle), ENT_QUOTES), $haystack, $message);
}
/*
* Perform some basic assertions for the page
*
* Checks for debug/error output before the actual page content and the status code
*
* @param mixed $status_code Expected status code, false to disable check
* @return null
*/
static public function assert_response_html($status_code = 200)
{
if ($status_code !== false)
{
self::assert_response_status_code($status_code);
}
// Any output before the doc type means there was an error
$content = self::$client->getResponse()->getContent();
self::assertStringStartsWith('<!DOCTYPE', trim($content), 'Output found before DOCTYPE specification.');
}
/**
* Heuristic function to check that the response is success.
*
* When php decides to die with a fatal error, it still sends 200 OK
* status code. This assertion tries to catch that.
*
* @param int $status_code Expected status code
* @return null
*/
public function assert_response_success()
static public function assert_response_status_code($status_code = 200)
{
$this->assertEquals(200, $this->client->getResponse()->getStatus());
$content = $this->client->getResponse()->getContent();
$this->assertNotContains('Fatal error:', $content);
$this->assertNotContains('Notice:', $content);
$this->assertNotContains('Warning:', $content);
$this->assertNotContains('[phpBB Debug]', $content);
self::assertEquals($status_code, self::$client->getResponse()->getStatus());
}
public function assert_filter($crawler, $expr, $msg = null)

View File

@@ -18,6 +18,58 @@ class phpbb_test_case_helpers
$this->test_case = $test_case;
}
private $copied_files = array();
/**
* This should only be called once before the tests are run.
* This is used to copy the fixtures to the phpBB install
*/
public function copy_ext_fixtures($fixtures_dir, $fixtures)
{
global $phpbb_root_path;
$this->copied_files = array();
if (file_exists($phpbb_root_path . 'ext/'))
{
// First, move any extensions setup on the board to a temp directory
$this->copied_files = $this->copy_dir($phpbb_root_path . 'ext/', $phpbb_root_path . 'store/temp_ext/');
// Then empty the ext/ directory on the board (for accurate test cases)
$this->empty_dir($phpbb_root_path . 'ext/');
}
// Copy our ext/ files from the test case to the board
foreach ($fixtures as $fixture)
{
$this->copied_files = array_merge($this->copied_files, $this->copy_dir($fixtures_dir . $fixture, $phpbb_root_path . 'ext/' . $fixture));
}
}
/**
* This should only be called once after the tests are run.
* This is used to remove the fixtures from the phpBB install
*/
public function restore_original_ext_dir()
{
global $phpbb_root_path;
// Copy back the board installed extensions from the temp directory
if (file_exists($phpbb_root_path . 'store/temp_ext/'))
{
$this->copy_dir($phpbb_root_path . 'store/temp_ext/', $phpbb_root_path . 'ext/');
}
// Remove all of the files we copied around (from board ext -> temp_ext, from test ext -> board ext)
$this->remove_files($this->copied_files);
$this->copied_files = array();
if (file_exists($phpbb_root_path . 'store/temp_ext/'))
{
$this->empty_dir($phpbb_root_path . 'store/temp_ext/');
}
}
public function setExpectedTriggerError($errno, $message = '')
{
$exceptionName = '';

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_forums">
<column>forum_id</column>
<column>parent_id</column>
<column>left_id</column>
<column>right_id</column>
<column>forum_parents</column>
<column>forum_name</column>
<column>forum_desc</column>
<column>forum_rules</column>
</table>
</dataset>

View File

@@ -0,0 +1,115 @@
<?php
/**
*
* @package tree
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
class phpbb_tests_tree_nestedset_forum_base extends phpbb_database_test_case
{
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/phpbb_forums.xml');
}
protected $forum_data = array(
// \__/
1 => array('forum_id' => 1, 'parent_id' => 0, 'user_id' => 0, 'left_id' => 1, 'right_id' => 6, 'forum_parents' => 'a:0:{}'),
2 => array('forum_id' => 2, 'parent_id' => 1, 'user_id' => 0, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => 'a:0:{}'),
3 => array('forum_id' => 3, 'parent_id' => 1, 'user_id' => 0, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => 'a:0:{}'),
// \ /
// \/
4 => array('forum_id' => 4, 'parent_id' => 0, 'user_id' => 0, 'left_id' => 7, 'right_id' => 12, 'forum_parents' => 'a:0:{}'),
5 => array('forum_id' => 5, 'parent_id' => 4, 'user_id' => 0, 'left_id' => 8, 'right_id' => 11, 'forum_parents' => 'a:0:{}'),
6 => array('forum_id' => 6, 'parent_id' => 5, 'user_id' => 0, 'left_id' => 9, 'right_id' => 10, 'forum_parents' => 'a:0:{}'),
// \_ _/
// \/
7 => array('forum_id' => 7, 'parent_id' => 0, 'user_id' => 0, 'left_id' => 13, 'right_id' => 22, 'forum_parents' => 'a:0:{}'),
8 => array('forum_id' => 8, 'parent_id' => 7, 'user_id' => 0, 'left_id' => 14, 'right_id' => 15, 'forum_parents' => 'a:0:{}'),
9 => array('forum_id' => 9, 'parent_id' => 7, 'user_id' => 0, 'left_id' => 16, 'right_id' => 19, 'forum_parents' => 'a:0:{}'),
10 => array('forum_id' => 10, 'parent_id' => 9, 'user_id' => 0, 'left_id' => 17, 'right_id' => 18, 'forum_parents' => 'a:0:{}'),
11 => array('forum_id' => 11, 'parent_id' => 7, 'user_id' => 0, 'left_id' => 20, 'right_id' => 21, 'forum_parents' => 'a:0:{}'),
// Non-existent forums
0 => array('forum_id' => 0, 'parent_id' => 0, 'user_id' => 0, 'left_id' => 0, 'right_id' => 0, 'forum_parents' => 'a:0:{}'),
200 => array('forum_id' => 200, 'parent_id' => 0, 'user_id' => 0, 'left_id' => 0, 'right_id' => 0, 'forum_parents' => 'a:0:{}'),
);
protected $set,
$config,
$lock,
$db;
public function setUp()
{
parent::setUp();
$this->db = $this->new_dbal();
global $config;
$config = $this->config = new phpbb_config(array('nestedset_forum_lock' => 0));
set_config(null, null, null, $this->config);
$this->lock = new phpbb_lock_db('nestedset_forum_lock', $this->config, $this->db);
$this->set = new phpbb_tree_nestedset_forum($this->db, $this->lock, 'phpbb_forums');
$this->set_up_forums();
}
protected function set_up_forums()
{
static $forums;
if (empty($forums))
{
$this->create_forum('Parent with two flat children');
$this->create_forum('Flat child #1', 1);
$this->create_forum('Flat child #2', 1);
$this->create_forum('Parent with two nested children');
$this->create_forum('Nested child #1', 4);
$this->create_forum('Nested child #2', 5);
$this->create_forum('Parent with flat and nested children');
$this->create_forum('Mixed child #1', 7);
$this->create_forum('Mixed child #2', 7);
$this->create_forum('Nested child #1 of Mixed child #2', 9);
$this->create_forum('Mixed child #3', 7);
// Updating forum_parents column here so it's not empty
// This is required, so we can see whether the methods
// correctly clear the values.
$sql = "UPDATE phpbb_forums
SET forum_parents = 'a:0:{}'";
$this->db->sql_query($sql);
// Copy the forums into a static array, so we can reuse the list later
$sql = 'SELECT *
FROM phpbb_forums';
$result = $this->db->sql_query($sql);
$forums = $this->db->sql_fetchrowset($result);
$this->db->sql_freeresult($result);
}
else
{
$buffer = new phpbb_db_sql_insert_buffer($this->db, 'phpbb_forums');
$buffer->insert_all($forums);
$buffer->flush();
$this->database_synchronisation(array(
'phpbb_forums' => array('forum_id'),
));
}
}
protected function create_forum($name, $parent_id = 0)
{
$forum = $this->set->insert(array('forum_name' => $name, 'forum_desc' => '', 'forum_rules' => ''));
$this->set->change_parent($forum['forum_id'], $parent_id);
}
}

View File

@@ -0,0 +1,119 @@
<?php
/**
*
* @package tree
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/nestedset_forum_base.php';
class phpbb_tests_tree_nestedset_forum_get_data_test extends phpbb_tests_tree_nestedset_forum_base
{
public function get_path_and_subtree_data_data()
{
return array(
array(1, true, true, array(1, 2, 3)),
array(1, true, false, array(2, 3)),
array(1, false, true, array(3, 2, 1)),
array(1, false, false, array(3, 2)),
array(2, true, true, array(1, 2)),
array(2, true, false, array(1)),
array(2, false, true, array(2, 1)),
array(2, false, false, array(1)),
array(5, true, true, array(4, 5, 6)),
array(5, true, false, array(4, 6)),
array(5, false, true, array(6, 5, 4)),
array(5, false, false, array(6, 4)),
);
}
/**
* @dataProvider get_path_and_subtree_data_data
*/
public function test_get_path_and_subtree_data($forum_id, $order_asc, $include_item, $expected)
{
$this->assertEquals($expected, array_keys($this->set->get_path_and_subtree_data($forum_id, $order_asc, $include_item)));
}
public function get_path_data_data()
{
return array(
array(1, true, true, array(1)),
array(1, true, false, array()),
array(1, false, true, array(1)),
array(1, false, false, array()),
array(2, true, true, array(1, 2)),
array(2, true, false, array(1)),
array(2, false, true, array(2, 1)),
array(2, false, false, array(1)),
array(5, true, true, array(4, 5)),
array(5, true, false, array(4)),
array(5, false, true, array(5, 4)),
array(5, false, false, array(4)),
);
}
/**
* @dataProvider get_path_data_data
*/
public function test_get_path_data($forum_id, $order_asc, $include_item, $expected)
{
$this->assertEquals($expected, array_keys($this->set->get_path_data($forum_id, $order_asc, $include_item)));
}
public function get_subtree_data_data()
{
return array(
array(1, true, true, array(1, 2, 3)),
array(1, true, false, array(2, 3)),
array(1, false, true, array(3, 2, 1)),
array(1, false, false, array(3, 2)),
array(2, true, true, array(2)),
array(2, true, false, array()),
array(2, false, true, array(2)),
array(2, false, false, array()),
array(5, true, true, array(5, 6)),
array(5, true, false, array(6)),
array(5, false, true, array(6, 5)),
array(5, false, false, array(6)),
);
}
/**
* @dataProvider get_subtree_data_data
*/
public function test_get_subtree_data($forum_id, $order_asc, $include_item, $expected)
{
$this->assertEquals($expected, array_keys($this->set->get_subtree_data($forum_id, $order_asc, $include_item)));
}
public function get_path_basic_data_data()
{
return array(
array(1, '', array()),
array(1, serialize(array()), array()),
array(2, '', array(1)),
array(2, serialize(array(1 => array())), array(1)),
array(10, '', array(7, 9)),
array(10, serialize(array(7 => array(), 9 => array())), array(7, 9)),
);
}
/**
* @dataProvider get_path_basic_data_data
*/
public function test_get_path_basic_data($forum_id, $forum_parents, $expected)
{
$forum_data = $this->forum_data[$forum_id];
$forum_data['forum_parents'] = $forum_parents;
$this->assertEquals($expected, array_keys($this->set->get_path_basic_data($forum_data)));
}
}

View File

@@ -0,0 +1,120 @@
<?php
/**
*
* @package tree
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/nestedset_forum_base.php';
class phpbb_tests_tree_nestedset_forum_add_remove_test extends phpbb_tests_tree_nestedset_forum_base
{
public function delete_data()
{
return array(
array(1, array(1, 2, 3), array(
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 2, 'right_id' => 5),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 3, 'right_id' => 4),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 16),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 8, 'right_id' => 9),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 10, 'right_id' => 13),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 11, 'right_id' => 12),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15),
)),
array(2, array(2), array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 4),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 5, 'right_id' => 10),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 6, 'right_id' => 9),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 7, 'right_id' => 8),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 11, 'right_id' => 20),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 12, 'right_id' => 13),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 17),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 15, 'right_id' => 16),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 18, 'right_id' => 19),
)),
);
}
/**
* @dataProvider delete_data
*/
public function test_delete($forum_id, $expected_deleted, $expected)
{
$this->assertEquals($expected_deleted, $this->set->delete($forum_id));
$result = $this->db->sql_query("SELECT forum_id, parent_id, left_id, right_id
FROM phpbb_forums
ORDER BY left_id, forum_id ASC");
$this->assertEquals($expected, $this->db->sql_fetchrowset($result));
}
public function delete_throws_data()
{
return array(
array('Not an item', 0),
array('Item does not exist', 200),
);
}
/**
* @dataProvider delete_throws_data
*
* @expectedException OutOfBoundsException
* @expectedExceptionMessage FORUM_NESTEDSET_INVALID_ITEM
*/
public function test_delete_throws($explain, $forum_id)
{
$this->set->delete($forum_id);
}
public function insert_data()
{
return array(
array(array(
'forum_desc' => '',
'forum_rules' => '',
'forum_id' => 12,
'parent_id' => 0,
'left_id' => 23,
'right_id' => 24,
'forum_parents' => '',
), array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 12),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 8, 'right_id' => 11),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 9, 'right_id' => 10),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21),
array('forum_id' => 12, 'parent_id' => 0, 'left_id' => 23, 'right_id' => 24),
)),
);
}
/**
* @dataProvider insert_data
*/
public function test_insert($expected_data, $expected)
{
$this->assertEquals($expected_data, $this->set->insert(array(
'forum_desc' => '',
'forum_rules' => '',
)));
$result = $this->db->sql_query('SELECT forum_id, parent_id, left_id, right_id
FROM phpbb_forums
ORDER BY left_id, forum_id ASC');
$this->assertEquals($expected, $this->db->sql_fetchrowset($result));
}
}

View File

@@ -0,0 +1,569 @@
<?php
/**
*
* @package tree
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/nestedset_forum_base.php';
class phpbb_tests_tree_nestedset_forum_move_test extends phpbb_tests_tree_nestedset_forum_base
{
public function move_data()
{
return array(
array('Move first item up',
1, 1, false, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 12),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 8, 'right_id' => 11),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 9, 'right_id' => 10),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21),
)),
array('Move last item down',
7, -1, false, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 12),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 8, 'right_id' => 11),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 9, 'right_id' => 10),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21),
)),
array('Move first item down',
1, -1, true, array(
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 2, 'right_id' => 5),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 3, 'right_id' => 4),
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 12),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 8, 'right_id' => 9),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 10, 'right_id' => 11),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21),
)),
array('Move second item up',
4, 1, true, array(
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 2, 'right_id' => 5),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 3, 'right_id' => 4),
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 12),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 8, 'right_id' => 9),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 10, 'right_id' => 11),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21),
)),
array('Move last item up',
7, 1, true, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 16),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 8, 'right_id' => 9),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 10, 'right_id' => 13),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 11, 'right_id' => 12),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 17, 'right_id' => 22),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 18, 'right_id' => 21),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 19, 'right_id' => 20),
)),
array('Move last item up by 2',
7, 2, true, array(
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 10),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 2, 'right_id' => 3),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 4, 'right_id' => 7),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 5, 'right_id' => 6),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 8, 'right_id' => 9),
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 11, 'right_id' => 16),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 12, 'right_id' => 13),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 14, 'right_id' => 15),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 17, 'right_id' => 22),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 18, 'right_id' => 21),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 19, 'right_id' => 20),
)),
array('Move last item up by 100',
7, 100, true, array(
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 10),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 2, 'right_id' => 3),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 4, 'right_id' => 7),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 5, 'right_id' => 6),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 8, 'right_id' => 9),
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 11, 'right_id' => 16),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 12, 'right_id' => 13),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 14, 'right_id' => 15),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 17, 'right_id' => 22),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 18, 'right_id' => 21),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 19, 'right_id' => 20),
)),
);
}
/**
* @dataProvider move_data
*/
public function test_move($explain, $forum_id, $delta, $expected_moved, $expected)
{
$this->assertEquals($expected_moved, $this->set->move($forum_id, $delta));
$result = $this->db->sql_query("SELECT forum_id, parent_id, left_id, right_id
FROM phpbb_forums
ORDER BY left_id, forum_id ASC");
$this->assertEquals($expected, $this->db->sql_fetchrowset($result));
}
public function move_down_data()
{
return array(
array('Move last item down',
7, false, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 12),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 8, 'right_id' => 11),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 9, 'right_id' => 10),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21),
)),
array('Move first item down',
1, true, array(
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 2, 'right_id' => 5),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 3, 'right_id' => 4),
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 12),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 8, 'right_id' => 9),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 10, 'right_id' => 11),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21),
)),
);
}
/**
* @dataProvider move_down_data
*/
public function test_move_down($explain, $forum_id, $expected_moved, $expected)
{
$this->assertEquals($expected_moved, $this->set->move_down($forum_id));
$result = $this->db->sql_query("SELECT forum_id, parent_id, left_id, right_id
FROM phpbb_forums
ORDER BY left_id, forum_id ASC");
$this->assertEquals($expected, $this->db->sql_fetchrowset($result));
}
public function move_up_data()
{
return array(
array('Move first item up',
1, false, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 12),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 8, 'right_id' => 11),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 9, 'right_id' => 10),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21),
)),
array('Move second item up',
4, true, array(
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 2, 'right_id' => 5),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 3, 'right_id' => 4),
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 12),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 8, 'right_id' => 9),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 10, 'right_id' => 11),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21),
)),
);
}
/**
* @dataProvider move_up_data
*/
public function test_move_up($explain, $forum_id, $expected_moved, $expected)
{
$this->assertEquals($expected_moved, $this->set->move_up($forum_id));
$result = $this->db->sql_query("SELECT forum_id, parent_id, left_id, right_id
FROM phpbb_forums
ORDER BY left_id, forum_id ASC");
$this->assertEquals($expected, $this->db->sql_fetchrowset($result));
}
public function move_children_data()
{
return array(
array('Item has no children',
2, 1, false, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 12, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 8, 'right_id' => 11, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 9, 'right_id' => 10, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21, 'forum_parents' => 'a:0:{}'),
)),
array('Move to same parent',
4, 4, false, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 12, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 8, 'right_id' => 11, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 9, 'right_id' => 10, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21, 'forum_parents' => 'a:0:{}'),
)),
array('Move single child up',
5, 1, true, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 8, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 6, 'parent_id' => 1, 'left_id' => 6, 'right_id' => 7, 'forum_parents' => ''),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 9, 'right_id' => 12, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 10, 'right_id' => 11, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21, 'forum_parents' => 'a:0:{}'),
)),
array('Move nested children up',
4, 1, true, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 10, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 5, 'parent_id' => 1, 'left_id' => 6, 'right_id' => 9, 'forum_parents' => ''),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 7, 'right_id' => 8, 'forum_parents' => ''),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 11, 'right_id' => 12, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21, 'forum_parents' => 'a:0:{}'),
)),
array('Move single child down',
5, 7, true, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 10, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 8, 'right_id' => 9, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 11, 'right_id' => 22, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 12, 'right_id' => 13, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 17, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 15, 'right_id' => 16, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 18, 'right_id' => 19, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 6, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21, 'forum_parents' => ''),
)),
array('Move nested children down',
4, 7, true, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 8, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 9, 'right_id' => 22, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 10, 'right_id' => 11, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 12, 'right_id' => 15, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 13, 'right_id' => 14, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 17, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 5, 'parent_id' => 7, 'left_id' => 18, 'right_id' => 21, 'forum_parents' => ''),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 19, 'right_id' => 20, 'forum_parents' => ''),
)),
array('Move single child to parent 0',
5, 0, true, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 10, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 8, 'right_id' => 9, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 11, 'right_id' => 20, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 12, 'right_id' => 13, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 17, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 15, 'right_id' => 16, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 18, 'right_id' => 19, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 6, 'parent_id' => 0, 'left_id' => 21, 'right_id' => 22, 'forum_parents' => ''),
)),
array('Move nested children to parent 0',
4, 0, true, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 8, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 9, 'right_id' => 18, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 10, 'right_id' => 11, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 12, 'right_id' => 15, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 13, 'right_id' => 14, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 17, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 5, 'parent_id' => 0, 'left_id' => 19, 'right_id' => 22, 'forum_parents' => ''),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 20, 'right_id' => 21, 'forum_parents' => ''),
)),
);
}
/**
* @dataProvider move_children_data
*/
public function test_move_children($explain, $forum_id, $target_id, $expected_moved, $expected)
{
$this->assertEquals($expected_moved, $this->set->move_children($forum_id, $target_id));
$result = $this->db->sql_query("SELECT forum_id, parent_id, left_id, right_id, forum_parents
FROM phpbb_forums
ORDER BY left_id, forum_id ASC");
$this->assertEquals($expected, $this->db->sql_fetchrowset($result));
}
public function move_children_throws_item_data()
{
return array(
array('Item 0 does not exist', 0, 5),
array('Item does not exist', 200, 5),
);
}
/**
* @dataProvider move_children_throws_item_data
*
* @expectedException OutOfBoundsException
* @expectedExceptionMessage FORUM_NESTEDSET_INVALID_ITEM
*/
public function test_move_children_throws_item($explain, $forum_id, $target_id)
{
$this->set->move_children($forum_id, $target_id);
}
public function move_children_throws_parent_data()
{
return array(
array('New parent is child', 4, 5),
array('New parent is child 2', 7, 9),
array('New parent does not exist', 1, 200),
);
}
/**
* @dataProvider move_children_throws_parent_data
*
* @expectedException OutOfBoundsException
* @expectedExceptionMessage FORUM_NESTEDSET_INVALID_PARENT
*/
public function test_move_children_throws_parent($explain, $forum_id, $target_id)
{
$this->set->move_children($forum_id, $target_id);
}
public function change_parent_data()
{
return array(
array('Move single child up',
6, 1, true, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 8, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 6, 'parent_id' => 1, 'left_id' => 6, 'right_id' => 7, 'forum_parents' => ''),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 9, 'right_id' => 12, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 10, 'right_id' => 11, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21, 'forum_parents' => 'a:0:{}'),
)),
array('Move nested children up',
5, 1, true, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 10, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 5, 'parent_id' => 1, 'left_id' => 6, 'right_id' => 9, 'forum_parents' => ''),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 7, 'right_id' => 8, 'forum_parents' => ''),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 11, 'right_id' => 12, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21, 'forum_parents' => 'a:0:{}'),
)),
array('Move single child down',
6, 7, true, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 10, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 8, 'right_id' => 9, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 11, 'right_id' => 22, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 12, 'right_id' => 13, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 17, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 15, 'right_id' => 16, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 18, 'right_id' => 19, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 6, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21, 'forum_parents' => ''),
)),
array('Move nested children down',
5, 7, true, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 8, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 9, 'right_id' => 22, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 10, 'right_id' => 11, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 12, 'right_id' => 15, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 13, 'right_id' => 14, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 17, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 5, 'parent_id' => 7, 'left_id' => 18, 'right_id' => 21, 'forum_parents' => ''),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 19, 'right_id' => 20, 'forum_parents' => ''),
)),
array('Move single child to parent 0',
6, 0, true, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 10, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 8, 'right_id' => 9, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 11, 'right_id' => 20, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 12, 'right_id' => 13, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 17, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 15, 'right_id' => 16, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 18, 'right_id' => 19, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 6, 'parent_id' => 0, 'left_id' => 21, 'right_id' => 22, 'forum_parents' => ''),
)),
array('Move nested children to parent 0',
5, 0, true, array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 8, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 9, 'right_id' => 18, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 10, 'right_id' => 11, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 12, 'right_id' => 15, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 13, 'right_id' => 14, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 17, 'forum_parents' => 'a:0:{}'),
array('forum_id' => 5, 'parent_id' => 0, 'left_id' => 19, 'right_id' => 22, 'forum_parents' => ''),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 20, 'right_id' => 21, 'forum_parents' => ''),
)),
);
}
/**
* @dataProvider change_parent_data
*/
public function test_change_parent($explain, $forum_id, $target_id, $expected_moved, $expected)
{
$this->assertEquals($expected_moved, $this->set->change_parent($forum_id, $target_id));
$result = $this->db->sql_query("SELECT forum_id, parent_id, left_id, right_id, forum_parents
FROM phpbb_forums
ORDER BY left_id, forum_id ASC");
$this->assertEquals($expected, $this->db->sql_fetchrowset($result));
}
public function change_parent_throws_item_data()
{
return array(
array('Item 0 does not exist', 0, 5),
array('Item does not exist', 200, 5),
);
}
/**
* @dataProvider change_parent_throws_item_data
*
* @expectedException OutOfBoundsException
* @expectedExceptionMessage FORUM_NESTEDSET_INVALID_ITEM
*/
public function test_change_parent_throws_item($explain, $forum_id, $target_id)
{
$this->set->change_parent($forum_id, $target_id);
}
public function change_parent_throws_parent_data()
{
return array(
array('New parent is child', 4, 5),
array('New parent is child 2', 7, 9),
array('New parent does not exist', 1, 200),
);
}
/**
* @dataProvider change_parent_throws_parent_data
*
* @expectedException OutOfBoundsException
* @expectedExceptionMessage FORUM_NESTEDSET_INVALID_PARENT
*/
public function test_change_parent_throws_parent($explain, $forum_id, $target_id)
{
$this->set->change_parent($forum_id, $target_id);
}
}

View File

@@ -0,0 +1,72 @@
<?php
/**
*
* @package tree
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/nestedset_forum_base.php';
class phpbb_tests_tree_nestedset_forum_regenerate_test extends phpbb_tests_tree_nestedset_forum_base
{
protected $fixed_set = array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6, 'forum_parents' => ''),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3, 'forum_parents' => ''),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5, 'forum_parents' => ''),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 12, 'forum_parents' => ''),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 8, 'right_id' => 11, 'forum_parents' => ''),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 9, 'right_id' => 10, 'forum_parents' => ''),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22, 'forum_parents' => ''),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15, 'forum_parents' => ''),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19, 'forum_parents' => ''),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18, 'forum_parents' => ''),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21, 'forum_parents' => ''),
);
public function regenerate_left_right_ids_data()
{
return array(
array('UPDATE phpbb_forums
SET left_id = 0,
right_id = 0', false),
array('UPDATE phpbb_forums
SET left_id = 28,
right_id = 28
WHERE left_id > 12', false),
array('UPDATE phpbb_forums
SET left_id = left_id * 2,
right_id = right_id * 2', false),
array('UPDATE phpbb_forums
SET left_id = left_id * 2,
right_id = right_id * 2
WHERE left_id > 12', false),
array('UPDATE phpbb_forums
SET left_id = left_id - 4,
right_id = right_id * 4
WHERE left_id > 4', false),
array('UPDATE phpbb_forums
SET left_id = 0,
right_id = 0
WHERE left_id > 12', true),
);
}
/**
* @dataProvider regenerate_left_right_ids_data
*/
public function test_regenerate_left_right_ids($breaking_query, $reset_ids)
{
$result = $this->db->sql_query($breaking_query);
$this->assertEquals(23, $this->set->regenerate_left_right_ids(1, 0, $reset_ids));
$result = $this->db->sql_query('SELECT forum_id, parent_id, left_id, right_id, forum_parents
FROM phpbb_forums
ORDER BY left_id, forum_id ASC');
$this->assertEquals($this->fixed_set, $this->db->sql_fetchrowset($result));
}
}

View File

@@ -0,0 +1,116 @@
<?php
/**
*
* @package tree
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/nestedset_forum_base.php';
class pphpbb_tests_tree_nestedset_forum_test extends phpbb_tests_tree_nestedset_forum_base
{
public function forum_constructor_data()
{
return array(
array(array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6),
array('forum_id' => 2, 'parent_id' => 1, 'left_id' => 2, 'right_id' => 3),
array('forum_id' => 3, 'parent_id' => 1, 'left_id' => 4, 'right_id' => 5),
array('forum_id' => 4, 'parent_id' => 0, 'left_id' => 7, 'right_id' => 12),
array('forum_id' => 5, 'parent_id' => 4, 'left_id' => 8, 'right_id' => 11),
array('forum_id' => 6, 'parent_id' => 5, 'left_id' => 9, 'right_id' => 10),
array('forum_id' => 7, 'parent_id' => 0, 'left_id' => 13, 'right_id' => 22),
array('forum_id' => 8, 'parent_id' => 7, 'left_id' => 14, 'right_id' => 15),
array('forum_id' => 9, 'parent_id' => 7, 'left_id' => 16, 'right_id' => 19),
array('forum_id' => 10, 'parent_id' => 9, 'left_id' => 17, 'right_id' => 18),
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21),
)),
);
}
/**
* @dataProvider forum_constructor_data
*/
public function test_forum_constructor($expected)
{
$result = $this->db->sql_query('SELECT forum_id, parent_id, left_id, right_id
FROM phpbb_forums
ORDER BY left_id, forum_id ASC');
$this->assertEquals($expected, $this->db->sql_fetchrowset($result));
}
public function get_sql_where_data()
{
return array(
array('SELECT forum_id
FROM phpbb_forums
%s
ORDER BY forum_id ASC',
'WHERE', '', array(
array('forum_id' => 1),
array('forum_id' => 2),
array('forum_id' => 3),
array('forum_id' => 4),
array('forum_id' => 5),
array('forum_id' => 6),
array('forum_id' => 7),
array('forum_id' => 8),
array('forum_id' => 9),
array('forum_id' => 10),
array('forum_id' => 11),
)),
array('SELECT f.forum_id
FROM phpbb_forums f
%s
ORDER BY f.forum_id ASC',
'WHERE', 'f.', array(
array('forum_id' => 1),
array('forum_id' => 2),
array('forum_id' => 3),
array('forum_id' => 4),
array('forum_id' => 5),
array('forum_id' => 6),
array('forum_id' => 7),
array('forum_id' => 8),
array('forum_id' => 9),
array('forum_id' => 10),
array('forum_id' => 11),
)),
array('SELECT forum_id
FROM phpbb_forums
WHERE forum_id < 4 %s
ORDER BY forum_id ASC',
'AND', '', array(
array('forum_id' => 1),
array('forum_id' => 2),
array('forum_id' => 3),
)),
array('SELECT f.forum_id
FROM phpbb_forums f
WHERE f.forum_id < 4 %s
ORDER BY f.forum_id ASC',
'AND', 'f.', array(
array('forum_id' => 1),
array('forum_id' => 2),
array('forum_id' => 3),
)),
);
}
/**
* @dataProvider get_sql_where_data
*/
public function test_get_sql_where($sql_query, $operator, $column_prefix, $expected)
{
$result = $this->db->sql_query(sprintf($sql_query, $this->set->get_sql_where($operator, $column_prefix)));
$this->assertEquals($expected, $this->db->sql_fetchrowset($result));
}
}

View File

@@ -2,22 +2,38 @@
<dataset>
<table name="phpbb_users">
<column>user_id</column>
<column>user_permissions</column>
<column>username</column>
<column>username_clean</column>
<column>user_sig</column>
<column>user_occ</column>
<column>user_interests</column>
<row>
<value>1</value>
<value></value>
<value>Guest</value>
<value>guest</value>
<value></value>
<value></value>
<value></value>
</row>
<row>
<value>2</value>
<value></value>
<value>Admin</value>
<value>admin</value>
<value></value>
<value></value>
<value></value>
</row>
<row>
<value>3</value>
<value></value>
<value>Test</value>
<value>test</value>
<value></value>
<value></value>
<value></value>
</row>
</table>
</dataset>