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

Merge remote-tracking branch 'upstream/develop' into ticket/11015

* upstream/develop: (666 commits)
  [ticket/11077] Remove code from old global announcements system
  [ticket/11189] Replace DEBUG_EXTRA with DEBUG
  [ticket/11189] Always log critical errors when in cron or in image output
  [ticket/11187] Added a blank array to fix errors in functional tests
  [ticket/10780] Make L_COLON available in the installer.
  [ticket/11183] Remove $load_extensions and weird dl() calls
  [ticket/10970] Added extra documentation to parse_dynamic_path.
  [ticket/10939] Added documentation for phpbb_request::file
  [ticket/10865] Use code tags for install/database_update.php.
  [ticket/10865] Should have been a slash.
  [ticket/10780] Use L_COLON on LDAP page.
  [ticket/10780] Use L_COLON on search backend ACP pages.
  [ticket/10780] Use L_COLON for "download all attachments".
  [ticket/10780] Use colon from language in ucp_pm_compose.php where possible.
  [ticket/10780] Replace colons in phpBB/adm/style/acp_ext_details.html.
  [ticket/10780] Replace colon usage in adm template output with {L_COLON}
  [ticket/10780] Replace colon usage in template output with {L_COLON}
  [ticket/11181] Bump PHP requirement to 5.3.3 (from 5.3.2) [develop-olympus]
  [ticket/11181] Bump PHP requirement to 5.3.3 (from 5.3.2)
  [ticket/10172] Show prosilver birthday list even if there are no birthdays.
  ...

Conflicts:
	phpBB/common.php
	phpBB/download/file.php
	phpBB/includes/db/dbal.php
	phpBB/includes/db/firebird.php
	phpBB/includes/db/mssql.php
	phpBB/includes/db/mssql_odbc.php
	phpBB/includes/db/mssqlnative.php
	phpBB/includes/db/mysql.php
	phpBB/includes/db/mysqli.php
	phpBB/includes/db/oracle.php
	phpBB/includes/db/postgres.php
	phpBB/includes/db/sqlite.php
	phpBB/includes/extension/manager.php
	phpBB/install/database_update.php
This commit is contained in:
Igor Wiedler
2012-11-12 10:33:40 +01:00
449 changed files with 12779 additions and 3043 deletions

View File

@@ -9,7 +9,7 @@
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
class phpbb_cache_test extends phpbb_test_case
class phpbb_cache_test extends phpbb_database_test_case
{
private $cache_dir;
@@ -18,8 +18,15 @@ class phpbb_cache_test extends phpbb_test_case
$this->cache_dir = dirname(__FILE__) . '/../tmp/cache/';
}
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/config.xml');
}
protected function setUp()
{
parent::setUp();
if (file_exists($this->cache_dir))
{
// cache directory possibly left after aborted
@@ -35,6 +42,8 @@ class phpbb_cache_test extends phpbb_test_case
{
$this->remove_cache_dir();
}
parent::tearDown();
}
private function create_cache_dir()
@@ -67,4 +76,35 @@ class phpbb_cache_test extends phpbb_test_case
'File ACM put and get'
);
}
public function test_cache_sql()
{
global $db, $cache;
$db = $this->new_dbal();
$driver = new phpbb_cache_driver_file($this->cache_dir);
$cache = new phpbb_cache_service($driver);
$sql = "SELECT * FROM phpbb_config
WHERE config_name = 'foo'";
$result = $db->sql_query($sql, 300);
$first_result = $db->sql_fetchrow($result);
$this->assertFileExists($this->cache_dir . 'sql_' . md5(preg_replace('/[\n\r\s\t]+/', ' ', $sql)) . '.php');
$sql = "SELECT * FROM phpbb_config
WHERE config_name = 'foo'";
$result = $db->sql_query($sql, 300);
$this->assertEquals($first_result, $db->sql_fetchrow($result));
$sql = "SELECT * FROM phpbb_config
WHERE config_name = 'bar'";
$result = $db->sql_query($sql, 300);
$this->assertNotEquals($first_result, $db->sql_fetchrow($result));
$db->sql_close();
}
}

18
tests/cache/fixtures/config.xml vendored Normal file
View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_config">
<column>config_name</column>
<column>config_value</column>
<column>is_dynamic</column>
<row>
<value>foo</value>
<value>23</value>
<value>0</value>
</row>
<row>
<value>bar</value>
<value>42</value>
<value>1</value>
</row>
</table>
</dataset>

View File

View File

@@ -0,0 +1,173 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 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_admin.php';
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_compress.php';
class phpbb_compress_test extends phpbb_test_case
{
const EXTRACT_DIR = '/extract/';
const ARCHIVE_DIR = '/archive/';
private $path;
protected $filelist = array(
'1.txt',
'dir/2.txt',
'dir/3.txt',
'dir/subdir/4.txt',
);
protected $conflicts = array(
'1_1.txt',
'1_2.txt',
'dir/2_1.txt',
);
protected function setUp()
{
// Required for compress::add_file
global $phpbb_root_path;
$phpbb_root_path = '';
$this->path = dirname(__FILE__) . '/fixtures/';
if (!@extension_loaded('zlib') || !@extension_loaded('bz2'))
{
$this->markTestSkipped('PHP needs to be compiled with --with-zlib and --with-bz2 in order to run these tests');
}
}
protected function tearDown()
{
foreach (array(dirname(__FILE__) . self::EXTRACT_DIR, dirname(__FILE__) . self::ARCHIVE_DIR) as $dir)
{
$this->clear_dir($dir);
}
}
protected function clear_dir($dir)
{
$iterator = new DirectoryIterator($dir);
foreach ($iterator as $fileinfo)
{
$name = $fileinfo->getFilename();
$path = $fileinfo->getPathname();
if ($name[0] !== '.')
{
if ($fileinfo->isDir())
{
$this->clear_dir($path);
rmdir($path);
}
else
{
unlink($path);
}
}
}
}
protected function archive_files($compress)
{
$compress->add_file($this->path . '1.txt', $this->path);
$compress->add_file(
'tests/compress/fixtures/dir/',
'tests/compress/fixtures/',
'',
// The comma here is not an error, this is a comma-separated list
'subdir/4.txt,3.txt'
);
$compress->add_custom_file($this->path . 'dir/3.txt', 'dir/3.txt');
$compress->add_data(file_get_contents($this->path . 'dir/subdir/4.txt'), 'dir/subdir/4.txt');
// Add multiples of the same file to check conflicts are handled
$compress->add_file($this->path . '1.txt', $this->path);
$compress->add_file($this->path . '1.txt', $this->path);
$compress->add_file($this->path . 'dir/2.txt', $this->path);
}
protected function valid_extraction($extra = array())
{
$filelist = array_merge($this->filelist, $extra);
foreach ($filelist as $filename)
{
$path = dirname(__FILE__) . self::EXTRACT_DIR . $filename;
$this->assertTrue(file_exists($path));
// Check the file's contents is correct
$contents = explode('_', basename($filename, '.txt'));
$contents = $contents[0];
$this->assertEquals($contents . "\n", file_get_contents($path));
}
}
public function tar_archive_list()
{
return array(
array('archive.tar', '.tar'),
array('archive.tar.gz', '.tar.gz'),
array('archive.tar.bz2', '.tar.bz2'),
);
}
/**
* @dataProvider tar_archive_list
*/
public function test_extract_tar($filename, $type)
{
$compress = new compress_tar('r', $this->path . $filename);
$compress->extract('tests/compress/' . self::EXTRACT_DIR);
$this->valid_extraction();
}
public function test_extract_zip()
{
$compress = new compress_zip('r', $this->path . 'archive.zip');
$compress->extract('tests/compress/' . self::EXTRACT_DIR);
$this->valid_extraction();
}
/**
* @depends test_extract_tar
* @dataProvider tar_archive_list
*/
public function test_compress_tar($filename, $type)
{
$tar = dirname(__FILE__) . self::ARCHIVE_DIR . $filename;
$compress = new compress_tar('w', $tar);
$this->archive_files($compress);
$compress->close();
$this->assertTrue(file_exists($tar));
$compress->mode = 'r';
$compress->open();
$compress->extract('tests/compress/' . self::EXTRACT_DIR);
$this->valid_extraction($this->conflicts);
}
/**
* @depends test_extract_zip
*/
public function test_compress_zip()
{
$zip = dirname(__FILE__) . self::ARCHIVE_DIR . 'archive.zip';
$compress = new compress_zip('w', $zip);
$this->archive_files($compress);
$compress->close();
$this->assertTrue(file_exists($zip));
$compress = new compress_zip('r', $zip);
$compress->extract('tests/compress/' . self::EXTRACT_DIR);
$this->valid_extraction($this->conflicts);
}
}

View File

View File

@@ -0,0 +1 @@
1

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1 @@
2

View File

@@ -0,0 +1 @@
3

View File

@@ -0,0 +1 @@
4

View File

@@ -9,7 +9,12 @@
class phpbb_ext_testext_cron_dummy_task extends phpbb_cron_task_base
{
public static $was_run = 0;
static public $was_run = 0;
public function get_name()
{
return get_class($this);
}
public function run()
{

View File

@@ -9,7 +9,12 @@
class phpbb_cron_task_core_dummy_task extends phpbb_cron_task_base
{
public static $was_run = 0;
static public $was_run = 0;
public function get_name()
{
return get_class($this);
}
public function run()
{

View File

@@ -9,7 +9,12 @@
class phpbb_cron_task_core_second_dummy_task extends phpbb_cron_task_base
{
public static $was_run = 0;
static public $was_run = 0;
public function get_name()
{
return get_class($this);
}
public function run()
{

View File

@@ -18,10 +18,10 @@ class phpbb_cron_manager_test extends PHPUnit_Framework_TestCase
{
public function setUp()
{
$this->manager = new phpbb_cron_manager(array(
'phpbb_cron_task_core_dummy_task',
'phpbb_cron_task_core_second_dummy_task',
'phpbb_ext_testext_cron_dummy_task',
$this->manager = $this->create_cron_manager(array(
new phpbb_cron_task_core_dummy_task(),
new phpbb_cron_task_core_second_dummy_task(),
new phpbb_ext_testext_cron_dummy_task(),
));
$this->task_name = 'phpbb_cron_task_core_dummy_task';
}
@@ -33,13 +33,6 @@ class phpbb_cron_manager_test extends PHPUnit_Framework_TestCase
$this->assertEquals($this->task_name, $task->get_name());
}
public function test_manager_instantiates_task_by_name()
{
$task = $this->manager->instantiate_task($this->task_name, array());
$this->assertInstanceOf('phpbb_cron_task_wrapper', $task);
$this->assertEquals($this->task_name, $task->get_name());
}
public function test_manager_finds_all_ready_tasks()
{
$tasks = $this->manager->find_all_ready_tasks();
@@ -54,10 +47,10 @@ class phpbb_cron_manager_test extends PHPUnit_Framework_TestCase
public function test_manager_finds_only_ready_tasks()
{
$manager = new phpbb_cron_manager(array(
'phpbb_cron_task_core_simple_ready',
'phpbb_cron_task_core_simple_not_runnable',
'phpbb_cron_task_core_simple_should_not_run',
$manager = $this->create_cron_manager(array(
new phpbb_cron_task_core_simple_ready(),
new phpbb_cron_task_core_simple_not_runnable(),
new phpbb_cron_task_core_simple_should_not_run(),
));
$tasks = $manager->find_all_ready_tasks();
$task_names = $this->tasks_to_names($tasks);
@@ -69,8 +62,15 @@ class phpbb_cron_manager_test extends PHPUnit_Framework_TestCase
$names = array();
foreach ($tasks as $task)
{
$names[] = get_class($task->task);
$names[] = $task->get_name();
}
return $names;
}
private function create_cron_manager($tasks)
{
global $phpbb_root_path, $phpEx;
return new phpbb_cron_manager($tasks, $phpbb_root_path, $phpEx);
}
}

View File

@@ -11,31 +11,40 @@ class phpbb_cron_task_provider_test extends PHPUnit_Framework_TestCase
{
public function setUp()
{
$this->extension_manager = new phpbb_mock_extension_manager(
dirname(__FILE__) . '/',
array(
'testext' => array(
'ext_name' => 'testext',
'ext_active' => true,
'ext_path' => 'ext/testext/'
),
));
$this->provider = new phpbb_cron_task_provider($this->extension_manager);
$this->tasks = array(
'phpbb_cron_task_core_dummy_task',
'phpbb_cron_task_core_second_dummy_task',
'phpbb_ext_testext_cron_dummy_task',
);
$container = $this->getMock('Symfony\Component\DependencyInjection\TaggedContainerInterface');
$container
->expects($this->once())
->method('findTaggedServiceIds')
->will($this->returnValue(array_flip($this->tasks)));
$container
->expects($this->any())
->method('get')
->will($this->returnCallback(function ($name) {
return new $name;
}));
$this->provider = new phpbb_cron_task_provider($container);
}
public function test_manager_finds_shipped_tasks()
{
$tasks = array();
$task_names = array();
foreach ($this->provider as $task)
{
$tasks[] = $task;
$task_names[] = $task->get_name();
}
sort($tasks);
sort($task_names);
$this->assertEquals(array(
'phpbb_cron_task_core_dummy_task',
'phpbb_cron_task_core_second_dummy_task',
'phpbb_ext_testext_cron_dummy_task',
), $tasks);
), $task_names);
}
}

View File

@@ -2,6 +2,11 @@
class phpbb_cron_task_core_simple_not_runnable extends phpbb_cron_task_base
{
public function get_name()
{
return get_class($this);
}
public function run()
{
}

View File

@@ -2,6 +2,11 @@
class phpbb_cron_task_core_simple_ready extends phpbb_cron_task_base
{
public function get_name()
{
return get_class($this);
}
public function run()
{
}

View File

@@ -2,6 +2,11 @@
class phpbb_cron_task_core_simple_should_not_run extends phpbb_cron_task_base
{
public function get_name()
{
return get_class($this);
}
public function run()
{
}

View File

@@ -125,7 +125,7 @@ class phpbb_dbal_select_test extends phpbb_database_test_case
$this->assertEquals($expected, $ary);
}
public static function fetchfield_seek_data()
static public function fetchfield_seek_data()
{
return array(
array(1, 'foobar'),
@@ -151,7 +151,7 @@ class phpbb_dbal_select_test extends phpbb_database_test_case
$this->assertEquals($expected, $field);
}
public static function query_limit_data()
static public function query_limit_data()
{
return array(
array(0, 0, array(array('username_clean' => 'barfoo'),

205
tests/extension/acp.php Normal file
View File

@@ -0,0 +1,205 @@
<?php
/**
*
* @package testing
* @copyright (c) 2011 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
class 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 public function setUpBeforeClass()
{
global $phpbb_root_path;
parent::setUpBeforeClass();
self::$helper = new phpbb_test_case_helpers(self);
// 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__) . '/ext/', $phpbb_root_path . 'ext/'));
}
public function setUp()
{
parent::setUp();
$this->get_db();
// Clear the phpbb_ext table
$this->db->sql_query('DELETE FROM phpbb_ext');
// Insert our base data
$insert_rows = array(
array(
'ext_name' => 'foo',
'ext_active' => true,
'ext_state' => 'b:0;',
),
array(
'ext_name' => 'vendor/moo',
'ext_active' => false,
'ext_state' => 'b:0;',
),
// do not exist
array(
'ext_name' => 'test2',
'ext_active' => true,
'ext_state' => 'b:0;',
),
array(
'ext_name' => 'test3',
'ext_active' => false,
'ext_state' => 'b:0;',
),
);
$this->db->sql_multi_insert('phpbb_ext', $insert_rows);
$this->login();
$this->admin_login();
$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;
// Copy back the board installed extensions from the temp directory
self::$helper->copy_dir($phpbb_root_path . 'store/temp_ext/', $phpbb_root_path . 'ext/');
self::$copied_files[] = $phpbb_root_path . 'store/temp_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);
}
public function test_list()
{
$crawler = $this->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->assertContains('phpBB Foo Extension', $crawler->filter('.ext_enabled')->eq(0)->text());
$this->assertContainsLang('PURGE', $crawler->filter('.ext_enabled')->eq(0)->text());
$this->assertContains('The "test2" extension is not valid.', $crawler->filter('.ext_disabled')->eq(0)->text());
$this->assertContains('The "test3" extension is not valid.', $crawler->filter('.ext_disabled')->eq(1)->text());
$this->assertContains('phpBB Moo Extension', $crawler->filter('.ext_disabled')->eq(2)->text());
$this->assertContainsLang('DETAILS', $crawler->filter('.ext_disabled')->eq(2)->text());
$this->assertContainsLang('ENABLE', $crawler->filter('.ext_disabled')->eq(2)->text());
$this->assertContainsLang('PURGE', $crawler->filter('.ext_disabled')->eq(2)->text());
$this->assertContains('The "bar" extension is not valid.', $crawler->filter('.ext_disabled')->eq(3)->text());
}
public function test_details()
{
$crawler = $this->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',
'CLEAN_NAME' => 'foo/example',
'DESCRIPTION' => 'An example/sample extension to be used for testing purposes in phpBB Development.',
'VERSION' => '1.0.0',
'TIME' => '2012-02-15 01:01:01',
'LICENCE' => 'GPL-2.0',
'PHPBB_VERSION' => '3.1.0-dev',
'PHP_VERSION' => '>=5.3',
'AUTHOR_NAME' => 'Nathan Guse',
'AUTHOR_EMAIL' => 'email@phpbb.com',
'AUTHOR_HOMEPAGE' => 'http://lithiumstudios.org',
'AUTHOR_ROLE' => 'N/A',
);
for ($i = 0; $i < $crawler->filter('dl')->count(); $i++)
{
$text = $crawler->filter('dl')->eq($i)->text();
$match = false;
foreach ($validation as $language_key => $expected)
{
if (strpos($text, $this->lang($language_key)) === 0)
{
$match = true;
$this->assertContains($expected, $text);
}
}
if (!$match)
{
$this->fail('Unexpected field: "' . $text . '"');
}
}
}
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);
$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);
$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);
$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);
$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);
$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);
$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);
$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);
$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);
$this->assertContainsLang('PURGE_SUCCESS', $crawler->filter('html')->text());
}
}

View File

@@ -0,0 +1,22 @@
{
"name": "foo/example",
"type": "phpbb3-extension",
"description": "An example/sample extension to be used for testing purposes in phpBB Development.",
"version": "1.0.0",
"time": "2012-02-15 01:01:01",
"licence": "GPL-2.0",
"authors": [{
"name": "Nathan Guse",
"username": "EXreaction",
"email": "email@phpbb.com",
"homepage": "http://lithiumstudios.org",
"role": "N/A"
}],
"require": {
"php": ">=5.3",
"phpbb": "3.1.0-dev"
},
"extra": {
"display-name": "phpBB Foo Extension"
}
}

View File

@@ -0,0 +1,22 @@
{
"name": "moo/example",
"type": "phpbb3-extension",
"description": "An example/sample extension to be used for testing purposes in phpBB Development.",
"version": "1.0.0",
"time": "2012-02-15 01:01:01",
"licence": "GNU GPL v2",
"authors": [{
"name": "Nathan Guse",
"username": "EXreaction",
"email": "email@phpbb.com",
"homepage": "http://lithiumstudios.org",
"role": "N/A"
}],
"require": {
"php": ">=5.3",
"phpbb": "3.1.0-dev"
},
"extra": {
"display-name": "phpBB Moo Extension"
}
}

View File

@@ -27,6 +27,7 @@ class phpbb_extension_manager_test extends phpbb_database_test_case
$this->extension_manager = new phpbb_extension_manager(
$this->new_dbal(),
new phpbb_config(array()),
'phpbb_ext',
dirname(__FILE__) . '/',
'.php',
@@ -90,6 +91,7 @@ class phpbb_extension_manager_test extends phpbb_database_test_case
{
$extension_manager = new phpbb_extension_manager(
$this->new_dbal(),
new phpbb_config(array()),
'phpbb_ext',
dirname(__FILE__) . '/',
'.php'

View File

@@ -0,0 +1,431 @@
<?php
/**
*
* @package testing
* @copyright (c) 2011 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
class metadata_manager_test extends phpbb_database_test_case
{
protected $class_loader;
protected $extension_manager;
protected $cache;
protected $config;
protected $db;
protected $phpbb_root_path;
protected $phpEx;
protected $template;
protected $user;
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/extensions.xml');
}
protected function setUp()
{
parent::setUp();
$this->cache = new phpbb_mock_cache();
$this->config = new phpbb_config(array(
'version' => '3.1.0',
));
$this->db = $this->new_dbal();
$this->phpbb_root_path = dirname(__FILE__) . '/';
$this->phpEx = '.php';
$this->user = new phpbb_user();
$this->template = new phpbb_template(
$this->phpbb_root_path,
$this->phpEx,
$this->config,
$this->user,
new phpbb_style_resource_locator(),
new phpbb_template_context()
);
$this->extension_manager = new phpbb_extension_manager(
$this->db,
$this->config,
'phpbb_ext',
$this->phpbb_root_path,
$this->phpEx,
$this->cache
);
}
// Should fail from missing composer.json
public function test_bar()
{
$ext_name = 'bar';
$manager = $this->get_metadata_manager($ext_name);
try
{
$manager->get_metadata();
}
catch(phpbb_extension_exception $e){}
$this->assertEquals((string) $e, 'The required file does not exist: ' . $this->phpbb_root_path . $this->extension_manager->get_extension_path($ext_name) . 'composer.json');
}
// Should be the same as a direct json_decode of the composer.json file
public function test_foo()
{
$ext_name = 'foo';
$manager = $this->get_metadata_manager($ext_name);
try
{
$metadata = $manager->get_metadata();
}
catch(phpbb_extension_exception $e)
{
$this->fail($e);
}
$json = json_decode(file_get_contents($this->phpbb_root_path . 'ext/foo/composer.json'), true);
$this->assertEquals($metadata, $json);
}
public function test_validator_non_existant()
{
$ext_name = 'validator';
$manager = $this->get_metadata_manager($ext_name);
// Non-existant data
try
{
$manager->validate('name');
$this->fail('Exception not triggered');
}
catch(phpbb_extension_exception $e)
{
$this->assertEquals((string) $e, 'Required meta field \'name\' has not been set.');
}
try
{
$manager->validate('type');
$this->fail('Exception not triggered');
}
catch(phpbb_extension_exception $e)
{
$this->assertEquals((string) $e, 'Required meta field \'type\' has not been set.');
}
try
{
$manager->validate('licence');
$this->fail('Exception not triggered');
}
catch(phpbb_extension_exception $e)
{
$this->assertEquals((string) $e, 'Required meta field \'licence\' has not been set.');
}
try
{
$manager->validate('version');
$this->fail('Exception not triggered');
}
catch(phpbb_extension_exception $e)
{
$this->assertEquals((string) $e, 'Required meta field \'version\' has not been set.');
}
try
{
$manager->validate_authors();
$this->fail('Exception not triggered');
}
catch(phpbb_extension_exception $e)
{
$this->assertEquals((string) $e, 'Required meta field \'authors\' has not been set.');
}
$manager->merge_metadata(array(
'authors' => array(
array(),
),
));
try
{
$manager->validate_authors();
$this->fail('Exception not triggered');
}
catch(phpbb_extension_exception $e)
{
$this->assertEquals((string) $e, 'Required meta field \'author name\' has not been set.');
}
}
public function test_validator_invalid()
{
$ext_name = 'validator';
$manager = $this->get_metadata_manager($ext_name);
// Invalid data
$manager->set_metadata(array(
'name' => 'asdf',
'type' => 'asdf',
'licence' => '',
'version' => '',
));
try
{
$manager->validate('name');
$this->fail('Exception not triggered');
}
catch(phpbb_extension_exception $e)
{
$this->assertEquals((string) $e, 'Meta field \'name\' is invalid.');
}
try
{
$manager->validate('type');
$this->fail('Exception not triggered');
}
catch(phpbb_extension_exception $e)
{
$this->assertEquals((string) $e, 'Meta field \'type\' is invalid.');
}
try
{
$manager->validate('licence');
$this->fail('Exception not triggered');
}
catch(phpbb_extension_exception $e)
{
$this->assertEquals((string) $e, 'Meta field \'licence\' is invalid.');
}
try
{
$manager->validate('version');
$this->fail('Exception not triggered');
}
catch(phpbb_extension_exception $e)
{
$this->assertEquals((string) $e, 'Meta field \'version\' is invalid.');
}
}
public function test_validator_valid()
{
$ext_name = 'validator';
$manager = $this->get_metadata_manager($ext_name);
// Valid data
$manager->set_metadata(array(
'name' => 'test/foo',
'type' => 'phpbb3-extension',
'licence' => 'GPL v2',
'version' => '1.0.0',
));
try
{
$this->assertEquals(true, $manager->validate('enable'));
}
catch(phpbb_extension_exception $e)
{
$this->fail($e);
}
}
public function test_validator_requirements()
{
$ext_name = 'validator';
$manager = $this->get_metadata_manager($ext_name);
// Too high of requirements
$manager->merge_metadata(array(
'require' => array(
'php' => '10.0.0',
'phpbb' => '3.2.0', // config is set to 3.1.0
),
));
try
{
$this->assertEquals(false, $manager->validate_require_php());
$this->assertEquals(false, $manager->validate_require_phpbb());
}
catch(phpbb_extension_exception $e)
{
$this->fail($e);
}
// Too high of requirements
$manager->merge_metadata(array(
'require' => array(
'php' => '5.3.0',
'phpbb' => '3.1.0-beta', // config is set to 3.1.0
),
));
try
{
$this->assertEquals(true, $manager->validate_require_php());
$this->assertEquals(true, $manager->validate_require_phpbb());
}
catch(phpbb_extension_exception $e)
{
$this->fail($e);
}
// Too high of requirements
$manager->merge_metadata(array(
'require' => array(
'php' => '>' . phpversion(),
'phpbb' => '>3.1.0', // config is set to 3.1.0
),
));
try
{
$this->assertEquals(false, $manager->validate_require_php());
$this->assertEquals(false, $manager->validate_require_phpbb());
}
catch(phpbb_extension_exception $e)
{
$this->fail($e);
}
// Too high of current install
$manager->merge_metadata(array(
'require' => array(
'php' => '<' . phpversion(),
'phpbb' => '<3.1.0', // config is set to 3.1.0
),
));
try
{
$this->assertEquals(false, $manager->validate_require_php());
$this->assertEquals(false, $manager->validate_require_phpbb());
}
catch(phpbb_extension_exception $e)
{
$this->fail($e);
}
// Matching requirements
$manager->merge_metadata(array(
'require' => array(
'php' => phpversion(),
'phpbb' => '3.1.0', // config is set to 3.1.0
),
));
try
{
$this->assertEquals(true, $manager->validate_require_php());
$this->assertEquals(true, $manager->validate_require_phpbb());
}
catch(phpbb_extension_exception $e)
{
$this->fail($e);
}
// Matching requirements
$manager->merge_metadata(array(
'require' => array(
'php' => '>=' . phpversion(),
'phpbb' => '>=3.1.0', // config is set to 3.1.0
),
));
try
{
$this->assertEquals(true, $manager->validate_require_php());
$this->assertEquals(true, $manager->validate_require_phpbb());
}
catch(phpbb_extension_exception $e)
{
$this->fail($e);
}
// Matching requirements
$manager->merge_metadata(array(
'require' => array(
'php' => '<=' . phpversion(),
'phpbb' => '<=3.1.0', // config is set to 3.1.0
),
));
try
{
$this->assertEquals(true, $manager->validate_require_php());
$this->assertEquals(true, $manager->validate_require_phpbb());
}
catch(phpbb_extension_exception $e)
{
$this->fail($e);
}
}
/**
* Get an instance of the metadata manager
*
* @param string $ext_name
* @return phpbb_extension_metadata_manager_test
*/
private function get_metadata_manager($ext_name)
{
return new phpbb_extension_metadata_manager_test(
$ext_name,
$this->db,
$this->extension_manager,
$this->phpbb_root_path,
$this->phpEx,
$this->template,
$this->config
);
}
}
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,102 @@
<?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_posting_test extends phpbb_functional_test_case
{
public function test_post_new_topic()
{
$this->login();
$this->add_lang('posting');
$crawler = $this->request('GET', 'posting.php?mode=post&f=2&sid=' . $this->sid);
$this->assertContains($this->lang('POST_TOPIC'), $crawler->filter('html')->text());
$hidden_fields = array();
$hidden_fields[] = $crawler->filter('[type="hidden"]')->each(function ($node, $i) {
return array('name' => $node->getAttribute('name'), 'value' => $node->getAttribute('value'));
});
$test_message = 'This is a test topic posted by the testing framework.';
$form_data = array(
'subject' => 'Test Topic 1',
'message' => $test_message,
'post' => true,
'f' => 2,
'mode' => 'post',
'sid' => $this->sid,
);
foreach ($hidden_fields as $fields)
{
foreach($fields as $field)
{
$form_data[$field['name']] = $field['value'];
}
}
// Bypass time restriction that said that if the lastclick time (i.e. time when the form was opened)
// is not at least 2 seconds before submission, cancel the form
$form_data['lastclick'] = 0;
// 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.php', $form_data);
$this->assertContains($this->lang('POST_STORED'), $crawler->filter('html')->text());
$crawler = $this->request('GET', 'viewtopic.php?t=2&sid=' . $this->sid);
$this->assertContains($test_message, $crawler->filter('html')->text());
}
public function test_post_reply()
{
$this->login();
$this->add_lang('posting');
$crawler = $this->request('GET', 'posting.php?mode=reply&t=2&f=2&sid=' . $this->sid);
$this->assertContains($this->lang('POST_REPLY'), $crawler->filter('html')->text());
$hidden_fields = array();
$hidden_fields[] = $crawler->filter('[type="hidden"]')->each(function ($node, $i) {
return array('name' => $node->getAttribute('name'), 'value' => $node->getAttribute('value'));
});
$test_message = 'This is a test post posted by the testing framework.';
$form_data = array(
'subject' => 'Re: Test Topic 1',
'message' => $test_message,
'post' => true,
't' => 2,
'f' => 2,
'mode' => 'reply',
'sid' => $this->sid,
);
foreach ($hidden_fields as $fields)
{
foreach($fields as $field)
{
$form_data[$field['name']] = $field['value'];
}
}
// For reasoning behind the following command, see the test_post_new_topic() test
$form_data['lastclick'] = 0;
// Submit the post
$crawler = $this->client->request('POST', 'posting.php', $form_data);
$this->assertContains($this->lang('POST_STORED'), $crawler->filter('html')->text());
$crawler = $this->request('GET', 'viewtopic.php?t=2&sid=' . $this->sid);
$this->assertContains($test_message, $crawler->filter('html')->text());
}
}

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
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
class phpbb_clean_path_test extends phpbb_test_case
{
public function clean_path_test_data()
{
return array(
array('foo', 'foo'),
array('foo/bar', 'foo/bar'),
array('foo/bar/', 'foo/bar/'),
array('foo/./bar', 'foo/bar'),
array('foo/./././bar', 'foo/bar'),
array('foo/bar/.', 'foo/bar'),
array('./foo/bar', './foo/bar'),
array('../foo/bar', '../foo/bar'),
array('one/two/three', 'one/two/three'),
array('one/two/../three', 'one/three'),
array('one/../two/three', 'two/three'),
array('one/two/..', 'one'),
array('one/two/../', 'one/'),
array('one/two/../three/../four', 'one/four'),
array('one/two/three/../../four', 'one/four'),
);
}
/**
* @dataProvider clean_path_test_data
*/
public function test_clean_path($input, $expected)
{
$output = phpbb_clean_path($input);
$this->assertEquals($expected, $output);
}
}

View File

@@ -46,8 +46,9 @@ class phpbb_functions_acp_build_cfg_template_test extends phpbb_test_case
*/
public function test_build_cfg_template_text($tpl_type, $key, $new, $config_key, $vars, $expected)
{
global $user;
global $user, $phpbb_dispatcher;
$phpbb_dispatcher = new phpbb_mock_event_dispatcher();
$user->lang = new phpbb_mock_lang();
$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars));
@@ -80,8 +81,9 @@ class phpbb_functions_acp_build_cfg_template_test extends phpbb_test_case
*/
public function test_build_cfg_template_dimension($tpl_type, $key, $new, $config_key, $vars, $expected)
{
global $user;
global $user, $phpbb_dispatcher;
$phpbb_dispatcher = new phpbb_mock_event_dispatcher();
$user->lang = new phpbb_mock_lang();
$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars));
@@ -106,8 +108,9 @@ class phpbb_functions_acp_build_cfg_template_test extends phpbb_test_case
*/
public function test_build_cfg_template_textarea($tpl_type, $key, $new, $config_key, $vars, $expected)
{
global $user;
global $user, $phpbb_dispatcher;
$phpbb_dispatcher = new phpbb_mock_event_dispatcher();
$user->lang = new phpbb_mock_lang();
$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars));
@@ -156,8 +159,9 @@ class phpbb_functions_acp_build_cfg_template_test extends phpbb_test_case
*/
public function test_build_cfg_template_radio($tpl_type, $key, $new, $config_key, $vars, $expected)
{
global $user;
global $user, $phpbb_dispatcher;
$phpbb_dispatcher = new phpbb_mock_event_dispatcher();
$user->lang = new phpbb_mock_lang();
$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars));
@@ -182,8 +186,9 @@ class phpbb_functions_acp_build_cfg_template_test extends phpbb_test_case
*/
public function test_build_cfg_template_append($tpl_type, $key, $new, $config_key, $vars, $expected)
{
global $user;
global $user, $phpbb_dispatcher;
$phpbb_dispatcher = new phpbb_mock_event_dispatcher();
$user->lang = new phpbb_mock_lang();
$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars));

View File

@@ -0,0 +1,16 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
class phpbb_mock_event_dispatcher
{
public function trigger_event($eventName, $data)
{
return array();
}
}

View File

@@ -11,13 +11,14 @@ class phpbb_mock_request implements phpbb_request_interface
{
protected $data;
public function __construct($get = array(), $post = array(), $cookie = array(), $server = array(), $request = false)
public function __construct($get = array(), $post = array(), $cookie = array(), $server = array(), $request = false, $files = array())
{
$this->data[phpbb_request_interface::GET] = $get;
$this->data[phpbb_request_interface::POST] = $post;
$this->data[phpbb_request_interface::COOKIE] = $cookie;
$this->data[phpbb_request_interface::REQUEST] = ($request === false) ? $post + $get : $request;
$this->data[phpbb_request_interface::SERVER] = $server;
$this->data[phpbb_request_interface::FILES] = $files;
}
public function overwrite($var_name, $value, $super_global = phpbb_request_interface::REQUEST)
@@ -42,6 +43,12 @@ class phpbb_mock_request implements phpbb_request_interface
return $this->server($var_name, $default);
}
public function file($form_name)
{
$super_global = phpbb_request_interface::FILES;
return isset($this->data[$super_global][$form_name]) ? $this->data[$super_global][$form_name] : array();
}
public function is_set_post($name)
{
return $this->is_set($name, phpbb_request_interface::POST);

View File

@@ -16,7 +16,7 @@ class phpbb_privmsgs_delete_user_pms_test extends phpbb_database_test_case
return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/delete_user_pms.xml');
}
public static function delete_user_pms_data()
static public function delete_user_pms_data()
{
return array(
// array(

View File

@@ -61,6 +61,8 @@
<column>author_id</column>
<column>message_subject</column>
<column>message_text</column>
<column>to_address</column>
<column>bcc_address</column>
<row>
<value>1</value>
<value>0</value>
@@ -71,6 +73,8 @@
3 - inbox
4 - nobox
</value>
<value></value>
<value></value>
</row>
<row>
<value>2</value>
@@ -81,6 +85,8 @@
2 - outbox
4 - nobox
</value>
<value></value>
<value></value>
</row>
<row>
<value>3</value>
@@ -90,6 +96,8 @@
<value>
2 - outbox
</value>
<value></value>
<value></value>
</row>
<row>
<value>4</value>
@@ -99,6 +107,8 @@
<value>
3 - nobox
</value>
<value></value>
<value></value>
</row>
<row>
<value>5</value>
@@ -110,6 +120,8 @@
3 - nobox
4 - nobox
</value>
<value></value>
<value></value>
</row>
</table>
<table name="phpbb_privmsgs_to">

View File

@@ -21,6 +21,13 @@ class phpbb_request_test extends phpbb_test_case
$_COOKIE['test'] = 3;
$_REQUEST['test'] = 3;
$_GET['unset'] = '';
$_FILES['test'] = array(
'name' => 'file',
'tmp_name' => 'tmp',
'size' => 256,
'type' => 'application/octet-stream',
'error' => UPLOAD_ERR_OK,
);
$_SERVER['HTTP_HOST'] = 'example.com';
$_SERVER['HTTP_ACCEPT'] = 'application/json';
@@ -42,6 +49,7 @@ class phpbb_request_test extends phpbb_test_case
$this->assertEquals(2, $_GET['test'], 'Checking $_GET after enable_super_globals');
$this->assertEquals(3, $_COOKIE['test'], 'Checking $_COOKIE after enable_super_globals');
$this->assertEquals(3, $_REQUEST['test'], 'Checking $_REQUEST after enable_super_globals');
$this->assertEquals(256, $_FILES['test']['size']);
$_POST['x'] = 2;
$this->assertEquals($_POST, $GLOBALS['_POST'], 'Checking whether $_POST can still be accessed via $GLOBALS[\'_POST\']');
@@ -85,6 +93,23 @@ class phpbb_request_test extends phpbb_test_case
$this->request->header('SOMEVAR');
}
public function test_file()
{
$file = $this->request->file('test');
$this->assertEquals('file', $file['name']);
$this->assertEquals('tmp', $file['tmp_name']);
$this->assertEquals(256, $file['size']);
$this->assertEquals('application/octet-stream', $file['type']);
$this->assertEquals(UPLOAD_ERR_OK, $file['error']);
}
public function test_file_not_exists()
{
$file = $this->request->file('404');
$this->assertTrue(is_array($file));
$this->assertTrue(empty($file));
}
/**
* Checks that directly accessing $_POST will trigger
* an error.

View File

@@ -48,4 +48,24 @@ class phpbb_type_cast_helper_test extends phpbb_test_case
$this->assertEquals($expected, $data);
}
public function test_simple_untrimmed_recursive_set_var()
{
$data = " eviL<3\t\t";
$expected = " eviL&lt;3\t\t";
$this->type_cast_helper->recursive_set_var($data, '', true, false);
$this->assertEquals($expected, $data);
}
public function test_nested_untrimmed_recursive_set_var()
{
$data = array(" eviL<3\t\t");
$expected = array(" eviL&lt;3\t\t");
$this->type_cast_helper->recursive_set_var($data, array(0 => ''), true, false);
$this->assertEquals($expected, $data);
}
}

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_posts">
<column>post_username</column>
<column>post_subject</column>
<column>post_text</column>
<row>
<value>foo</value>
<value>foo</value>
<value>foo</value>
</row>
<row>
<value>bar</value>
<value>bar</value>
<value>bar</value>
</row>
<row>
<value>commonword</value>
<value>commonword</value>
<value>commonword</value>
</row>
</table>
<table name="phpbb_search_wordlist">
<column>word_id</column>
<column>word_text</column>
<column>word_common</column>
<row>
<value>1</value>
<value>foo</value>
<value>0</value>
</row>
<row>
<value>2</value>
<value>bar</value>
<value>0</value>
</row>
<row>
<value>3</value>
<value>commonword</value>
<value>1</value>
</row>
</table>
</dataset>

View File

@@ -0,0 +1,186 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
function phpbb_search_wrapper($class)
{
$wrapped = $class . '_wrapper';
if (!class_exists($wrapped))
{
$code = "
class $wrapped extends $class
{
public function get_must_contain_ids() { return \$this->must_contain_ids; }
public function get_must_not_contain_ids() { return \$this->must_not_contain_ids; }
}
";
eval($code);
}
return $wrapped;
}
class phpbb_search_native_test extends phpbb_database_test_case
{
protected $db;
protected $search;
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/posts.xml');
}
protected function setUp()
{
global $phpbb_root_path, $phpEx, $config, $user, $cache;
parent::setUp();
// dbal uses cache
$cache = new phpbb_cache_driver_null;
$this->db = $this->new_dbal();
$error = null;
$class = phpbb_search_wrapper('phpbb_search_fulltext_native');
$this->search = new $class($error, $phpbb_root_path, $phpEx, null, $config, $this->db, $user);
}
protected function tearDown()
{
parent::tearDown();
}
public function keywords()
{
return array(
// keywords
// terms
// ok
// must contain ids
// must not contain ids
// common words
array(
'foo',
'all',
true,
array(1),
array(),
array(),
),
array(
'foo bar',
'all',
true,
array(1, 2),
array(),
array(),
),
// leading, trailing and multiple spaces
array(
' foo bar ',
'all',
true,
array(1, 2),
array(),
array(),
),
// words too short
array(
'f',
'all',
false,
null,
null,
// short words count as "common" words
array('f'),
),
array(
'f o o',
'all',
false,
null,
null,
array('f', 'o', 'o'),
),
array(
'foo -bar',
'all',
true,
array(1),
array(2),
array(),
),
// all negative
array(
'-foo',
'all',
false,
null,
null,
array(),
),
array(
'-foo -bar',
'all',
false,
null,
null,
array(),
),
// all common
array(
'commonword',
'all',
false,
null,
null,
array('commonword'),
),
// some common
array(
'commonword foo',
'all',
true,
array(1),
array(),
array('commonword'),
),
);
}
/**
* @dataProvider keywords
*/
public function test_split_keywords($keywords, $terms, $ok, $must_contain, $must_not_contain, $common)
{
$rv = $this->search->split_keywords($keywords, $terms);
$this->assertEquals($ok, $rv);
if ($ok)
{
// only check criteria if the search is going to be performed
$this->assert_array_content_equals($must_contain, $this->search->get_must_contain_ids());
$this->assert_array_content_equals($must_not_contain, $this->search->get_must_not_contain_ids());
}
$this->assert_array_content_equals($common, $this->search->get_common_words());
}
public function assert_array_content_equals($one, $two)
{
// http://stackoverflow.com/questions/3838288/phpunit-assert-two-arrays-are-equal-but-order-of-elements-not-important
// but one array_diff is not enough!
if (sizeof(array_diff($one, $two)) || sizeof(array_diff($two, $one)))
{
// get a nice error message
$this->assertEquals($one, $two);
}
else
{
// increase assertion count
$this->assertTrue(true);
}
}
}

View File

@@ -45,6 +45,9 @@ class phpbb_session_append_sid_test extends phpbb_test_case
*/
public function test_append_sid($url, $params, $is_amp, $session_id, $expected, $description)
{
global $phpbb_dispatcher;
$phpbb_dispatcher = new phpbb_mock_event_dispatcher;
$this->assertEquals($expected, append_sid($url, $params, $is_amp, $session_id));
}
}

View File

@@ -23,6 +23,18 @@ class phpbb_template_includephp_test extends phpbb_template_template_test_case
$this->assertEquals("Path is relative to board root.\ntesting included php", $this->display('test'), "Testing INCLUDEPHP");
}
public function test_includephp_variables()
{
$this->setup_engine(array('tpl_allow_php' => true));
$cache_file = $this->template->cachepath . 'includephp_variables.html.php';
$this->run_template('includephp_variables.html', array('TEMPLATES' => 'templates'), array(), array(), "Path includes variables.\ntesting included php", $cache_file);
$this->template->set_filenames(array('test' => 'includephp_variables.html'));
$this->assertEquals("Path includes variables.\ntesting included php", $this->display('test'), "Testing INCLUDEPHP");
}
public function test_includephp_absolute()
{
$path_to_php = dirname(__FILE__) . '/templates/_dummy_include.php.inc';
@@ -36,7 +48,7 @@ class phpbb_template_includephp_test extends phpbb_template_template_test_case
$this->setup_engine(array('tpl_allow_php' => true));
$this->style->set_custom_style('tests', $cache_dir);
$this->style->set_custom_style('tests', $cache_dir, '');
$cache_file = $this->template->cachepath . 'includephp_absolute.html.php';
$this->run_template('includephp_absolute.html', array(), array(), array(), "Path is absolute.\ntesting included php", $cache_file);

View File

@@ -20,11 +20,14 @@ class phpbb_template_template_includejs_test extends phpbb_template_template_tes
$scripts = array(
'<script src="' . $this->test_path . '/templates/parent_and_child.js?assets_version=1"></script>',
'<script src="' . $this->test_path . '/parent_templates/parent_only.js?assets_version=1"></script>',
'<script src="' . $this->test_path . '/templates/child_only.js?assets_version=1"></script>'
'<script src="' . $this->test_path . '/templates/child_only.js?assets_version=1"></script>',
'<script src="' . $this->test_path . '/templates/subdir/parent_only.js?assets_version=1"></script>',
'<script src="' . $this->test_path . '/templates/subdir/subsubdir/parent_only.js?assets_version=1"></script>',
'<script src="' . $this->test_path . '/templates/subdir/parent_only.js?assets_version=1"></script>',
);
// Run test
$cache_file = $this->template->cachepath . 'includejs.html.php';
$this->run_template('includejs.html', array('PARENT' => 'parent_only.js'), array(), array(), implode('', $scripts), $cache_file);
$this->run_template('includejs.html', array('PARENT' => 'parent_only.js', 'SUBDIR' => 'subdir', 'EXT' => 'js'), array(), array(), implode('', $scripts), $cache_file);
}
}

View File

@@ -183,6 +183,13 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(),
'value',
),
array(
'include_variables.html',
array('SUBDIR' => 'subdir', 'VARIABLE' => 'value'),
array(),
array(),
'value',
),
array(
'loop_vars.html',
array(),

View File

@@ -67,7 +67,7 @@ class phpbb_template_template_test_case extends phpbb_test_case
$this->template_path = $this->test_path . '/templates';
$this->style_resource_locator = new phpbb_style_resource_locator();
$this->style_provider = new phpbb_style_path_provider();
$this->template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator);
$this->template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, new phpbb_template_context());
$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('tests', $this->template_path, '');
}

View File

@@ -22,7 +22,7 @@ class phpbb_template_template_test_case_with_tree extends phpbb_template_templat
$this->parent_template_path = $this->test_path . '/parent_templates';
$this->style_resource_locator = new phpbb_style_resource_locator();
$this->style_provider = new phpbb_style_path_provider();
$this->template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator);
$this->template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, new phpbb_template_context());
$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('tests', array($this->template_path, $this->parent_template_path), '');
}

View File

@@ -0,0 +1 @@
<!-- INCLUDE {SUBDIR}/variable.html -->

View File

@@ -2,4 +2,7 @@
<!-- INCLUDEJS {PARENT} -->
<!-- DEFINE $TEST = 'child_only.js' -->
<!-- INCLUDEJS {$TEST} -->
{SCRIPTS}
<!-- INCLUDEJS subdir/{PARENT} -->
<!-- INCLUDEJS {SUBDIR}/subsubdir/{PARENT} -->
<!-- INCLUDEJS {SUBDIR}/parent_only.{EXT} -->
{SCRIPTS}

View File

@@ -0,0 +1,2 @@
Path includes variables.
<!-- INCLUDEPHP ../tests/template/{TEMPLATES}/_dummy_include.php.inc -->

View File

@@ -0,0 +1 @@
{VARIABLE}

View File

@@ -100,8 +100,7 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
$config = $this->get_database_config();
$dbms = $config['dbms'];
$db = new $dbms();
$db = new $config['dbms']();
$db->sql_connect($config['dbhost'], $config['dbuser'], $config['dbpasswd'], $config['dbname'], $config['dbport']);
return $db;
@@ -136,7 +135,7 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
*
* @return string The string with the specified match converted to uppercase
*/
public static function to_upper($matches)
static public function to_upper($matches)
{
return $matches[1] . strtoupper($matches[2]) . $matches[3];
}

View File

@@ -121,6 +121,7 @@ class phpbb_functional_test_case extends phpbb_test_case
{
$this->extension_manager = new phpbb_extension_manager(
$this->get_db(),
new phpbb_config(array()),
self::$config['table_prefix'] . 'ext',
$phpbb_root_path,
".$phpEx",
@@ -193,13 +194,11 @@ class phpbb_functional_test_case extends phpbb_test_case
$this->do_request('create_table', $data);
file_put_contents($phpbb_root_path . "config.$phpEx", phpbb_create_config_file_data($data, self::$config['dbms'], array(), true));
$this->do_request('config_file', $data);
copy($phpbb_root_path . "config.$phpEx", $phpbb_root_path . "config_test.$phpEx");
file_put_contents($phpbb_root_path . "config.$phpEx", phpbb_create_config_file_data($data, self::$config['dbms'], true, true));
$this->do_request('final', $data);
copy($phpbb_root_path . "config.$phpEx", $phpbb_root_path . "config_test.$phpEx");
}
private function do_request($sub, $post_data = null)
@@ -249,6 +248,48 @@ class phpbb_functional_test_case extends phpbb_test_case
}
}
/**
* Login to the ACP
* You must run login() before calling this.
*/
protected function admin_login()
{
$this->add_lang('acp/common');
// Requires login first!
if (empty($this->sid))
{
$this->fail('$this->sid is empty. Make sure you call login() before admin_login()');
return;
}
$crawler = $this->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();
foreach ($form->getValues() as $field => $value)
{
if (strpos($field, 'password_') === 0)
{
$login = $this->client->submit($form, array('username' => 'admin', $field => 'admin'));
$cookies = $this->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);
{
if (substr($cookie->getName(), -4) == '_sid')
{
$this->sid = $cookie->getValue();
}
}
break;
}
}
}
protected function add_lang($lang_file)
{
if (is_array($lang_file))
@@ -285,4 +326,16 @@ class phpbb_functional_test_case extends phpbb_test_case
return call_user_func_array('sprintf', $args);
}
/**
* assertContains for language strings
*
* @param string $needle Search string
* @param string $haystack Search this
* @param string $message Optional failure message
*/
public function assertContainsLang($needle, $haystack, $message = null)
{
$this->assertContains(html_entity_decode($this->lang($needle), ENT_QUOTES), $haystack, $message);
}
}

View File

@@ -78,7 +78,7 @@ class phpbb_test_case_helpers
include($test_config);
$config = array_merge($config, array(
'dbms' => $dbms,
'dbms' => 'phpbb_db_driver_' . $dbms,
'dbhost' => $dbhost,
'dbport' => $dbport,
'dbname' => $dbname,
@@ -115,4 +115,112 @@ class phpbb_test_case_helpers
return $config;
}
/**
* Recursive directory copying function
*
* @param string $source
* @param string $dest
* @return array list of files copied
*/
public function copy_dir($source, $dest)
{
$source = (substr($source, -1) == '/') ? $source : $source . '/';
$dest = (substr($dest, -1) == '/') ? $dest : $dest . '/';
$copied_files = array();
if (!is_dir($dest))
{
$this->makedirs($dest);
}
$files = scandir($source);
foreach ($files as $file)
{
if ($file == '.' || $file == '..')
{
continue;
}
if (is_dir($source . $file))
{
$created_dir = false;
if (!is_dir($dest . $file))
{
$created_dir = true;
$this->makedirs($dest . $file);
}
$copied_files = array_merge($copied_files, self::copy_dir($source . $file, $dest . $file));
if ($created_dir)
{
$copied_files[] = $dest . $file;
}
}
else
{
if (!file_exists($dest . $file))
{
copy($source . $file, $dest . $file);
$copied_files[] = $dest . $file;
}
}
}
return $copied_files;
}
/**
* Remove files/directories that are listed in an array
* Designed for use with $this->copy_dir()
*
* @param array $file_list
*/
public function remove_files($file_list)
{
foreach ($file_list as $file)
{
if (is_dir($file))
{
rmdir($file);
}
else
{
unlink($file);
}
}
}
/**
* Empty directory (remove any subdirectories/files below)
*
* @param array $file_list
*/
public function empty_dir($path)
{
$path = (substr($path, -1) == '/') ? $path : $path . '/';
$files = scandir($path);
foreach ($files as $file)
{
if ($file == '.' || $file == '..')
{
continue;
}
if (is_dir($path . $file))
{
$this->empty_dir($path . $file);
rmdir($path . $file);
}
else
{
unlink($path . $file);
}
}
}
}

View File

@@ -19,7 +19,8 @@ class phpbb_fileupload_test extends phpbb_test_case
{
// Global $config required by unique_id
// Global $user required by several functions dealing with translations
global $config, $user;
// Global $request required by form_upload, local_upload and is_valid
global $config, $user, $request;
if (!is_array($config))
{
@@ -31,6 +32,9 @@ class phpbb_fileupload_test extends phpbb_test_case
$user = new phpbb_mock_user();
$user->lang = new phpbb_mock_lang();
$request = new phpbb_mock_request();
$this->path = __DIR__ . '/fixture/';
}