mirror of
https://github.com/phpbb/phpbb.git
synced 2025-08-06 16:56:44 +02:00
Merge branch 'develop' of https://github.com/phpbb/phpbb3 into ticket/10714
* 'develop' of https://github.com/phpbb/phpbb3: (645 commits) [ticket/10679] Update module basename, we added the xcp_ prefix in 3.1 [ticket/10679] Use module_auth to limit access to the module [ticket/10679] Add new permission for changing profile field information [ticket/11219] Coding guidelines and naming consistency changes [ticket/10841] Revert more whitespace changes. [ticket/10841] Revert whitespace changes. [ticket/10841] adding space after if [ticket/10841] removing unnecessary spacing [ticket/10841] changing affectedrows check to COUNT in sql [ticket/10841] Modifying style and language selectors in UCP [ticket/11247] Fix wrong property reference in flock class. [ticket/10602] Avoid a race condition. [ticket/10602] Use last_queue_run for its intended purpose. [ticket/10716] Collect standard error from executed php process. [ticket/10716] Skip test if php is not in PATH. [ticket/10716] Exclude our dependencies from linting. [ticket/10103] New and improved wording. [ticket/10716] Only lint on php 5.3+. [ticket/10103] Assert with messages. [ticket/10103] assertLessThan/assertGreaterThan. ...
This commit is contained in:
@@ -72,6 +72,21 @@ to connect to that database in phpBB.
|
||||
Additionally, you will need to be running the DbUnit fork from
|
||||
https://github.com/phpbb/dbunit/tree/phpbb.
|
||||
|
||||
Redis
|
||||
-----
|
||||
|
||||
In order to run tests for the Redis cache driver, at least one of Redis host
|
||||
or port must be specified in test configuration. This can be done via
|
||||
test_config.php as follows:
|
||||
|
||||
<?php
|
||||
$phpbb_redis_host = 'localhost';
|
||||
$phpbb_redis_port = 6379;
|
||||
|
||||
Or via environment variables as follows:
|
||||
|
||||
$ PHPBB_TEST_REDIS_HOST=localhost PHPBB_TEST_REDIS_PORT=6379 phpunit
|
||||
|
||||
Running
|
||||
=======
|
||||
|
||||
|
53
tests/cache/apc_driver_test.php
vendored
Normal file
53
tests/cache/apc_driver_test.php
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* @package testing
|
||||
* @copyright (c) 2012 phpBB Group
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
||||
*
|
||||
*/
|
||||
|
||||
// Important: apc.enable_cli=1 must be in php.ini.
|
||||
// http://forums.devshed.com/php-development-5/apc-problem-561290.html
|
||||
// http://php.net/manual/en/apc.configuration.php
|
||||
|
||||
require_once dirname(__FILE__) . '/common_test_case.php';
|
||||
|
||||
class phpbb_cache_apc_driver_test extends phpbb_cache_common_test_case
|
||||
{
|
||||
protected static $config;
|
||||
protected $driver;
|
||||
|
||||
public function getDataSet()
|
||||
{
|
||||
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/config.xml');
|
||||
}
|
||||
|
||||
static public function setUpBeforeClass()
|
||||
{
|
||||
if (!extension_loaded('apc'))
|
||||
{
|
||||
self::markTestSkipped('APC extension is not loaded');
|
||||
}
|
||||
|
||||
$php_ini = new phpbb_php_ini;
|
||||
|
||||
if (!$php_ini->get_bool('apc.enabled'))
|
||||
{
|
||||
self::markTestSkipped('APC is not enabled. Make sure apc.enabled=1 in php.ini');
|
||||
}
|
||||
|
||||
if (PHP_SAPI == 'cli' && !$php_ini->get_bool('apc.enable_cli'))
|
||||
{
|
||||
self::markTestSkipped('APC is not enabled for CLI. Set apc.enable_cli=1 in php.ini');
|
||||
}
|
||||
}
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->driver = new phpbb_cache_driver_apc;
|
||||
$this->driver->purge();
|
||||
}
|
||||
}
|
109
tests/cache/cache_test.php
vendored
109
tests/cache/cache_test.php
vendored
@@ -1,109 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* @package testing
|
||||
* @copyright (c) 2010 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_cache_test extends phpbb_database_test_case
|
||||
{
|
||||
private $cache_dir;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$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
|
||||
// or failed run earlier
|
||||
$this->remove_cache_dir();
|
||||
}
|
||||
$this->create_cache_dir();
|
||||
}
|
||||
|
||||
protected function tearDown()
|
||||
{
|
||||
if (file_exists($this->cache_dir))
|
||||
{
|
||||
$this->remove_cache_dir();
|
||||
}
|
||||
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
private function create_cache_dir()
|
||||
{
|
||||
$this->get_test_case_helpers()->makedirs($this->cache_dir);
|
||||
}
|
||||
|
||||
private function remove_cache_dir()
|
||||
{
|
||||
$iterator = new DirectoryIterator($this->cache_dir);
|
||||
foreach ($iterator as $file)
|
||||
{
|
||||
if ($file != '.' && $file != '..')
|
||||
{
|
||||
unlink($this->cache_dir . '/' . $file);
|
||||
}
|
||||
}
|
||||
rmdir($this->cache_dir);
|
||||
}
|
||||
|
||||
public function test_cache_driver_file()
|
||||
{
|
||||
$driver = new phpbb_cache_driver_file($this->cache_dir);
|
||||
$driver->put('test_key', 'test_value');
|
||||
$driver->save();
|
||||
|
||||
$this->assertEquals(
|
||||
'test_value',
|
||||
$driver->get('test_key'),
|
||||
'File ACM put and get'
|
||||
);
|
||||
}
|
||||
|
||||
public function test_cache_sql()
|
||||
{
|
||||
$driver = new phpbb_cache_driver_file($this->cache_dir);
|
||||
|
||||
global $db, $cache;
|
||||
$db = $this->new_dbal();
|
||||
$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();
|
||||
}
|
||||
}
|
97
tests/cache/common_test_case.php
vendored
Normal file
97
tests/cache/common_test_case.php
vendored
Normal file
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* @package testing
|
||||
* @copyright (c) 2012 phpBB Group
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
||||
*
|
||||
*/
|
||||
|
||||
abstract class phpbb_cache_common_test_case extends phpbb_database_test_case
|
||||
{
|
||||
public function test_get_put_exists()
|
||||
{
|
||||
$this->assertFalse($this->driver->_exists('test_key'));
|
||||
$this->assertSame(false, $this->driver->get('test_key'));
|
||||
|
||||
$this->driver->put('test_key', 'test_value');
|
||||
|
||||
$this->assertTrue($this->driver->_exists('test_key'));
|
||||
$this->assertEquals(
|
||||
'test_value',
|
||||
$this->driver->get('test_key'),
|
||||
'File ACM put and get'
|
||||
);
|
||||
}
|
||||
|
||||
public function test_purge()
|
||||
{
|
||||
$this->driver->put('test_key', 'test_value');
|
||||
|
||||
$this->assertEquals(
|
||||
'test_value',
|
||||
$this->driver->get('test_key'),
|
||||
'File ACM put and get'
|
||||
);
|
||||
|
||||
$this->driver->purge();
|
||||
|
||||
$this->assertSame(false, $this->driver->get('test_key'));
|
||||
}
|
||||
|
||||
public function test_destroy()
|
||||
{
|
||||
$this->driver->put('first_key', 'first_value');
|
||||
$this->driver->put('second_key', 'second_value');
|
||||
|
||||
$this->assertEquals(
|
||||
'first_value',
|
||||
$this->driver->get('first_key')
|
||||
);
|
||||
$this->assertEquals(
|
||||
'second_value',
|
||||
$this->driver->get('second_key')
|
||||
);
|
||||
|
||||
$this->driver->destroy('first_key');
|
||||
|
||||
$this->assertFalse($this->driver->_exists('first_key'));
|
||||
$this->assertEquals(
|
||||
'second_value',
|
||||
$this->driver->get('second_key')
|
||||
);
|
||||
}
|
||||
|
||||
public function test_cache_sql()
|
||||
{
|
||||
global $db, $cache;
|
||||
$db = $this->new_dbal();
|
||||
$cache = new phpbb_cache_service($this->driver);
|
||||
|
||||
$sql = "SELECT * FROM phpbb_config
|
||||
WHERE config_name = 'foo'";
|
||||
|
||||
$result = $db->sql_query($sql, 300);
|
||||
$first_result = $db->sql_fetchrow($result);
|
||||
$expected = array('config_name' => 'foo', 'config_value' => '23', 'is_dynamic' => 0);
|
||||
$this->assertEquals($expected, $first_result);
|
||||
|
||||
$sql = 'DELETE FROM phpbb_config';
|
||||
$result = $db->sql_query($sql);
|
||||
|
||||
$sql = "SELECT * FROM phpbb_config
|
||||
WHERE config_name = 'foo'";
|
||||
$result = $db->sql_query($sql, 300);
|
||||
|
||||
$this->assertEquals($expected, $db->sql_fetchrow($result));
|
||||
|
||||
$sql = "SELECT * FROM phpbb_config
|
||||
WHERE config_name = 'foo'";
|
||||
$result = $db->sql_query($sql);
|
||||
|
||||
$no_cache_result = $db->sql_fetchrow($result);
|
||||
$this->assertSame(false, $no_cache_result);
|
||||
|
||||
$db->sql_close();
|
||||
}
|
||||
}
|
69
tests/cache/file_driver_test.php
vendored
Normal file
69
tests/cache/file_driver_test.php
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* @package testing
|
||||
* @copyright (c) 2010 phpBB Group
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
||||
*
|
||||
*/
|
||||
|
||||
require_once dirname(__FILE__) . '/common_test_case.php';
|
||||
|
||||
class phpbb_cache_file_driver_test extends phpbb_cache_common_test_case
|
||||
{
|
||||
private $cache_dir;
|
||||
protected $driver;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$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
|
||||
// or failed run earlier
|
||||
$this->remove_cache_dir();
|
||||
}
|
||||
$this->create_cache_dir();
|
||||
|
||||
$this->driver = new phpbb_cache_driver_file($this->cache_dir);
|
||||
}
|
||||
|
||||
protected function tearDown()
|
||||
{
|
||||
if (file_exists($this->cache_dir))
|
||||
{
|
||||
$this->remove_cache_dir();
|
||||
}
|
||||
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
private function create_cache_dir()
|
||||
{
|
||||
$this->get_test_case_helpers()->makedirs($this->cache_dir);
|
||||
}
|
||||
|
||||
private function remove_cache_dir()
|
||||
{
|
||||
$iterator = new DirectoryIterator($this->cache_dir);
|
||||
foreach ($iterator as $file)
|
||||
{
|
||||
if ($file != '.' && $file != '..')
|
||||
{
|
||||
unlink($this->cache_dir . '/' . $file);
|
||||
}
|
||||
}
|
||||
rmdir($this->cache_dir);
|
||||
}
|
||||
}
|
74
tests/cache/null_driver_test.php
vendored
Normal file
74
tests/cache/null_driver_test.php
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* @package testing
|
||||
* @copyright (c) 2012 phpBB Group
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
||||
*
|
||||
*/
|
||||
|
||||
class phpbb_cache_null_driver_test extends phpbb_database_test_case
|
||||
{
|
||||
protected $driver;
|
||||
|
||||
public function getDataSet()
|
||||
{
|
||||
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/config.xml');
|
||||
}
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->driver = new phpbb_cache_driver_null;
|
||||
}
|
||||
|
||||
public function test_get_put()
|
||||
{
|
||||
$this->assertSame(false, $this->driver->get('key'));
|
||||
|
||||
$this->driver->put('key', 'value');
|
||||
|
||||
// null driver does not cache
|
||||
$this->assertSame(false, $this->driver->get('key'));
|
||||
}
|
||||
|
||||
public function test_purge()
|
||||
{
|
||||
// does nothing
|
||||
$this->driver->purge();
|
||||
}
|
||||
|
||||
public function test_destroy()
|
||||
{
|
||||
// does nothing
|
||||
$this->driver->destroy('foo');
|
||||
}
|
||||
|
||||
public function test_cache_sql()
|
||||
{
|
||||
global $db, $cache;
|
||||
$db = $this->new_dbal();
|
||||
$cache = new phpbb_cache_service($this->driver);
|
||||
|
||||
$sql = "SELECT * FROM phpbb_config
|
||||
WHERE config_name = 'foo'";
|
||||
$result = $db->sql_query($sql, 300);
|
||||
$first_result = $db->sql_fetchrow($result);
|
||||
$expected = array('config_name' => 'foo', 'config_value' => '23', 'is_dynamic' => 0);
|
||||
$this->assertEquals($expected, $first_result);
|
||||
|
||||
$sql = 'DELETE FROM phpbb_config';
|
||||
$result = $db->sql_query($sql);
|
||||
|
||||
// As null cache driver does not actually cache,
|
||||
// this should return no results
|
||||
$sql = "SELECT * FROM phpbb_config
|
||||
WHERE config_name = 'foo'";
|
||||
$result = $db->sql_query($sql, 300);
|
||||
|
||||
$this->assertSame(false, $db->sql_fetchrow($result));
|
||||
|
||||
$db->sql_close();
|
||||
}
|
||||
}
|
49
tests/cache/redis_driver_test.php
vendored
Normal file
49
tests/cache/redis_driver_test.php
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
<?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__) . '/common_test_case.php';
|
||||
|
||||
class phpbb_cache_redis_driver_test extends phpbb_cache_common_test_case
|
||||
{
|
||||
protected static $config;
|
||||
protected $driver;
|
||||
|
||||
public function getDataSet()
|
||||
{
|
||||
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/config.xml');
|
||||
}
|
||||
|
||||
static public function setUpBeforeClass()
|
||||
{
|
||||
if (!extension_loaded('redis'))
|
||||
{
|
||||
self::markTestSkipped('redis extension is not loaded');
|
||||
}
|
||||
|
||||
$config = phpbb_test_case_helpers::get_test_config();
|
||||
if (isset($config['redis_host']) || isset($config['redis_port']))
|
||||
{
|
||||
$host = isset($config['redis_host']) ? $config['redis_host'] : 'localhost';
|
||||
$port = isset($config['redis_port']) ? $config['redis_port'] : 6379;
|
||||
self::$config = array('host' => $host, 'port' => $port);
|
||||
}
|
||||
else
|
||||
{
|
||||
self::markTestSkipped('Test redis host/port is not specified');
|
||||
}
|
||||
}
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->driver = new phpbb_cache_driver_redis(self::$config['host'], self::$config['port']);
|
||||
$this->driver->purge();
|
||||
}
|
||||
}
|
0
tests/compress/archive/.gitkeep
Normal file
0
tests/compress/archive/.gitkeep
Normal file
173
tests/compress/compress_test.php
Normal file
173
tests/compress/compress_test.php
Normal 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);
|
||||
}
|
||||
}
|
0
tests/compress/extract/.gitkeep
Normal file
0
tests/compress/extract/.gitkeep
Normal file
1
tests/compress/fixtures/1.txt
Normal file
1
tests/compress/fixtures/1.txt
Normal file
@@ -0,0 +1 @@
|
||||
1
|
BIN
tests/compress/fixtures/archive.tar
Normal file
BIN
tests/compress/fixtures/archive.tar
Normal file
Binary file not shown.
BIN
tests/compress/fixtures/archive.tar.bz2
Normal file
BIN
tests/compress/fixtures/archive.tar.bz2
Normal file
Binary file not shown.
BIN
tests/compress/fixtures/archive.tar.gz
Normal file
BIN
tests/compress/fixtures/archive.tar.gz
Normal file
Binary file not shown.
BIN
tests/compress/fixtures/archive.zip
Normal file
BIN
tests/compress/fixtures/archive.zip
Normal file
Binary file not shown.
1
tests/compress/fixtures/dir/2.txt
Normal file
1
tests/compress/fixtures/dir/2.txt
Normal file
@@ -0,0 +1 @@
|
||||
2
|
1
tests/compress/fixtures/dir/3.txt
Normal file
1
tests/compress/fixtures/dir/3.txt
Normal file
@@ -0,0 +1 @@
|
||||
3
|
1
tests/compress/fixtures/dir/subdir/4.txt
Normal file
1
tests/compress/fixtures/dir/subdir/4.txt
Normal file
@@ -0,0 +1 @@
|
||||
4
|
3
tests/controller/config/routing.yml
Normal file
3
tests/controller/config/routing.yml
Normal file
@@ -0,0 +1,3 @@
|
||||
core_controller:
|
||||
pattern: /core_foo
|
||||
defaults: { _controller: core_foo.controller:bar }
|
3
tests/controller/config/services.yml
Normal file
3
tests/controller/config/services.yml
Normal file
@@ -0,0 +1,3 @@
|
||||
services:
|
||||
core_foo.controller:
|
||||
class: phpbb_controller_foo
|
76
tests/controller/controller_test.php
Normal file
76
tests/controller/controller_test.php
Normal file
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* @package testing
|
||||
* @copyright (c) 2012 phpBB Group
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
||||
*
|
||||
*/
|
||||
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\Routing\Route;
|
||||
use Symfony\Component\Routing\RouteCollection;
|
||||
use Symfony\Component\Config\FileLocator;
|
||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
|
||||
|
||||
class phpbb_controller_test extends phpbb_test_case
|
||||
{
|
||||
public function setUp()
|
||||
{
|
||||
$this->extension_manager = new phpbb_mock_extension_manager(
|
||||
dirname(__FILE__) . '/',
|
||||
array(
|
||||
'foo' => array(
|
||||
'ext_name' => 'foo',
|
||||
'ext_active' => '1',
|
||||
'ext_path' => 'ext/foo/',
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
public function test_provider()
|
||||
{
|
||||
$provider = new phpbb_controller_provider;
|
||||
$routes = $provider
|
||||
->import_paths_from_finder($this->extension_manager->get_finder())
|
||||
->find('./tests/controller/');
|
||||
|
||||
// This will need to be updated if any new routes are defined
|
||||
$this->assertEquals(2, sizeof($routes));
|
||||
}
|
||||
|
||||
public function test_controller_resolver()
|
||||
{
|
||||
$container = new ContainerBuilder();
|
||||
// YamlFileLoader only uses one path at a time, so we need to loop
|
||||
// through all of the ones we are using.
|
||||
foreach (array(__DIR__.'/config', __DIR__.'/ext/foo/config') as $path)
|
||||
{
|
||||
$loader = new YamlFileLoader($container, new FileLocator($path));
|
||||
$loader->load('services.yml');
|
||||
}
|
||||
|
||||
// Autoloading classes within the tests folder does not work
|
||||
// so I'll include them manually.
|
||||
if (!class_exists('phpbb_ext_foo_controller'))
|
||||
{
|
||||
include(__DIR__.'/ext/foo/controller.php');
|
||||
}
|
||||
if (!class_exists('phpbb_controller_foo'))
|
||||
{
|
||||
include(__DIR__.'/includes/controller/foo.php');
|
||||
}
|
||||
|
||||
$resolver = new phpbb_controller_resolver(new phpbb_user, $container);
|
||||
$symfony_request = new Request();
|
||||
$symfony_request->attributes->set('_controller', 'foo.controller:handle');
|
||||
|
||||
$this->assertEquals($resolver->getController($symfony_request), array(new phpbb_ext_foo_controller, 'handle'));
|
||||
|
||||
$symfony_request = new Request();
|
||||
$symfony_request->attributes->set('_controller', 'core_foo.controller:bar');
|
||||
|
||||
$this->assertEquals($resolver->getController($symfony_request), array(new phpbb_controller_foo, 'bar'));
|
||||
}
|
||||
}
|
3
tests/controller/ext/foo/config/routing.yml
Normal file
3
tests/controller/ext/foo/config/routing.yml
Normal file
@@ -0,0 +1,3 @@
|
||||
controller1:
|
||||
pattern: /foo
|
||||
defaults: { _controller: foo.controller:handle }
|
3
tests/controller/ext/foo/config/services.yml
Normal file
3
tests/controller/ext/foo/config/services.yml
Normal file
@@ -0,0 +1,3 @@
|
||||
services:
|
||||
foo.controller:
|
||||
class: phpbb_ext_foo_controller
|
16
tests/controller/ext/foo/controller.php
Normal file
16
tests/controller/ext/foo/controller.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class phpbb_ext_foo_controller
|
||||
{
|
||||
/**
|
||||
* Handle method
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
return new Response('Test', 200);
|
||||
}
|
||||
}
|
16
tests/controller/includes/controller/foo.php
Normal file
16
tests/controller/includes/controller/foo.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class phpbb_controller_foo
|
||||
{
|
||||
/**
|
||||
* Bar method
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function bar()
|
||||
{
|
||||
return new Response('bar()', 200);
|
||||
}
|
||||
}
|
@@ -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()
|
||||
{
|
||||
|
@@ -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()
|
||||
{
|
||||
|
@@ -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()
|
||||
{
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -1,41 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* @package testing
|
||||
* @copyright (c) 2010 phpBB Group
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
||||
*
|
||||
*/
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
public function test_manager_finds_shipped_tasks()
|
||||
{
|
||||
$tasks = array();
|
||||
foreach ($this->provider as $task)
|
||||
{
|
||||
$tasks[] = $task;
|
||||
}
|
||||
sort($tasks);
|
||||
|
||||
$this->assertEquals(array(
|
||||
'phpbb_cron_task_core_dummy_task',
|
||||
'phpbb_cron_task_core_second_dummy_task',
|
||||
'phpbb_ext_testext_cron_dummy_task',
|
||||
), $tasks);
|
||||
}
|
||||
}
|
@@ -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()
|
||||
{
|
||||
}
|
||||
|
@@ -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()
|
||||
{
|
||||
}
|
||||
|
@@ -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()
|
||||
{
|
||||
}
|
||||
|
@@ -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'),
|
||||
|
55
tests/dbal/write_sequence_test.php
Normal file
55
tests/dbal/write_sequence_test.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?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_dbal_write_sequence_test extends phpbb_database_test_case
|
||||
{
|
||||
public function getDataSet()
|
||||
{
|
||||
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/three_users.xml');
|
||||
}
|
||||
|
||||
static public function write_sequence_data()
|
||||
{
|
||||
return array(
|
||||
array(
|
||||
'ticket/11219',
|
||||
4,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider write_sequence_data
|
||||
*/
|
||||
public function test_write_sequence($username, $expected)
|
||||
{
|
||||
$db = $this->new_dbal();
|
||||
|
||||
$sql = 'INSERT INTO phpbb_users ' . $db->sql_build_array('INSERT', array(
|
||||
'username' => $username,
|
||||
'username_clean' => $username,
|
||||
'user_permissions' => '',
|
||||
'user_sig' => '',
|
||||
'user_occ' => '',
|
||||
'user_interests' => '',
|
||||
));
|
||||
$db->sql_query($sql);
|
||||
|
||||
$this->assertEquals($expected, $db->sql_nextid());
|
||||
|
||||
$sql = "SELECT user_id
|
||||
FROM phpbb_users
|
||||
WHERE username_clean = '" . $db->sql_escape($username) . "'";
|
||||
$result = $db->sql_query_limit($sql, 1);
|
||||
|
||||
$this->assertEquals($expected, $db->sql_fetchfield('user_id'));
|
||||
}
|
||||
}
|
72
tests/di/create_container_test.php
Normal file
72
tests/di/create_container_test.php
Normal file
@@ -0,0 +1,72 @@
|
||||
<?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_container.php';
|
||||
require_once dirname(__FILE__) . '/../../phpBB/includes/db/dbal.php';
|
||||
|
||||
class phpbb_di_container_test extends phpbb_test_case
|
||||
{
|
||||
public function test_phpbb_create_container()
|
||||
{
|
||||
$phpbb_root_path = __DIR__ . '/../../phpBB/';
|
||||
$extensions = array(
|
||||
new phpbb_di_extension_config(__DIR__ . '/fixtures/config.php'),
|
||||
new phpbb_di_extension_core($phpbb_root_path),
|
||||
);
|
||||
$container = phpbb_create_container($extensions, $phpbb_root_path, 'php');
|
||||
|
||||
$this->assertInstanceOf('Symfony\Component\DependencyInjection\ContainerBuilder', $container);
|
||||
}
|
||||
|
||||
public function test_phpbb_create_install_container()
|
||||
{
|
||||
$phpbb_root_path = __DIR__ . '/../../phpBB/';
|
||||
$extensions = array(
|
||||
new phpbb_di_extension_config(__DIR__ . '/fixtures/config.php'),
|
||||
new phpbb_di_extension_core($phpbb_root_path),
|
||||
);
|
||||
$container = phpbb_create_install_container($phpbb_root_path, 'php');
|
||||
|
||||
$this->assertInstanceOf('Symfony\Component\DependencyInjection\ContainerBuilder', $container);
|
||||
$this->assertTrue($container->isFrozen());
|
||||
}
|
||||
|
||||
public function test_phpbb_create_compiled_container()
|
||||
{
|
||||
$phpbb_root_path = __DIR__ . '/../../phpBB/';
|
||||
$extensions = array(
|
||||
new phpbb_di_extension_config(__DIR__ . '/fixtures/config.php'),
|
||||
new phpbb_di_extension_core($phpbb_root_path),
|
||||
);
|
||||
$container = phpbb_create_compiled_container($extensions, array(), $phpbb_root_path, 'php');
|
||||
|
||||
$this->assertInstanceOf('Symfony\Component\DependencyInjection\ContainerBuilder', $container);
|
||||
$this->assertTrue($container->isFrozen());
|
||||
}
|
||||
}
|
||||
|
||||
class dbal_container_mock extends dbal
|
||||
{
|
||||
public function sql_connect()
|
||||
{
|
||||
}
|
||||
|
||||
public function sql_query()
|
||||
{
|
||||
}
|
||||
|
||||
public function sql_fetchrow()
|
||||
{
|
||||
}
|
||||
|
||||
public function sql_freeresult()
|
||||
{
|
||||
}
|
||||
}
|
11
tests/di/fixtures/config.php
Normal file
11
tests/di/fixtures/config.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
// phpBB 3.1.x auto-generated configuration file
|
||||
// Do not change anything in this file!
|
||||
$dbms = 'container_mock';
|
||||
$dbhost = '127.0.0.1';
|
||||
$dbport = '';
|
||||
$dbname = 'phpbb';
|
||||
$dbuser = 'root';
|
||||
$dbpasswd = '';
|
||||
$table_prefix = 'phpbb_';
|
||||
$acm_type = 'phpbb_cache_driver_null';
|
@@ -11,7 +11,7 @@ class phpbb_event_dispatcher_test extends phpbb_test_case
|
||||
{
|
||||
public function test_trigger_event()
|
||||
{
|
||||
$dispatcher = new phpbb_event_dispatcher();
|
||||
$dispatcher = new phpbb_event_dispatcher(new phpbb_mock_container_builder());
|
||||
|
||||
$dispatcher->addListener('core.test_event', function (phpbb_event_data $event) {
|
||||
$event['foo'] = $event['foo'] . '2';
|
||||
|
205
tests/extension/acp.php
Normal file
205
tests/extension/acp.php
Normal 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());
|
||||
}
|
||||
}
|
22
tests/extension/ext/foo/composer.json
Normal file
22
tests/extension/ext/foo/composer.json
Normal 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"
|
||||
}
|
||||
}
|
22
tests/extension/ext/vendor/moo/composer.json
vendored
Normal file
22
tests/extension/ext/vendor/moo/composer.json
vendored
Normal 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"
|
||||
}
|
||||
}
|
@@ -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'
|
||||
|
431
tests/extension/metadata_manager_test.php
Normal file
431
tests/extension/metadata_manager_test.php
Normal 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);
|
||||
}
|
||||
}
|
5
tests/fixtures/empty.xml
vendored
Normal file
5
tests/fixtures/empty.xml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<dataset>
|
||||
<table name="phpbb_posts">
|
||||
</table>
|
||||
</dataset>
|
@@ -15,18 +15,21 @@ class phpbb_functional_browse_test extends phpbb_functional_test_case
|
||||
public function test_index()
|
||||
{
|
||||
$crawler = $this->request('GET', 'index.php');
|
||||
$this->assert_response_success();
|
||||
$this->assertGreaterThan(0, $crawler->filter('.topiclist')->count());
|
||||
}
|
||||
|
||||
public function test_viewforum()
|
||||
{
|
||||
$crawler = $this->request('GET', 'viewforum.php?f=2');
|
||||
$this->assert_response_success();
|
||||
$this->assertGreaterThan(0, $crawler->filter('.topiclist')->count());
|
||||
}
|
||||
|
||||
public function test_viewtopic()
|
||||
{
|
||||
$crawler = $this->request('GET', 'viewtopic.php?t=1');
|
||||
$this->assert_response_success();
|
||||
$this->assertGreaterThan(0, $crawler->filter('.postbody')->count());
|
||||
}
|
||||
}
|
||||
|
@@ -13,6 +13,14 @@
|
||||
class phpbb_functional_extension_controller_test extends phpbb_functional_test_case
|
||||
{
|
||||
protected $phpbb_extension_manager;
|
||||
|
||||
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',
|
||||
);
|
||||
|
||||
/**
|
||||
* This should only be called once before the tests are run.
|
||||
* This is used to copy the fixtures to the phpBB install
|
||||
@@ -22,15 +30,11 @@ class phpbb_functional_extension_controller_test extends phpbb_functional_test_c
|
||||
global $phpbb_root_path;
|
||||
parent::setUpBeforeClass();
|
||||
|
||||
// these directories need to be created before the files can be copied
|
||||
$directories = array(
|
||||
$phpbb_root_path . 'ext/error/class/',
|
||||
$phpbb_root_path . 'ext/error/classtype/',
|
||||
$phpbb_root_path . 'ext/error/disabled/',
|
||||
$phpbb_root_path . 'ext/foo/bar/',
|
||||
$phpbb_root_path . 'ext/foo/bar/styles/prosilver/template/',
|
||||
$phpbb_root_path . 'ext/foobar/',
|
||||
$phpbb_root_path . 'ext/foobar/styles/prosilver/template/',
|
||||
$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)
|
||||
@@ -41,30 +45,36 @@ class phpbb_functional_extension_controller_test extends phpbb_functional_test_c
|
||||
}
|
||||
}
|
||||
|
||||
$fixtures = array(
|
||||
'error/class/controller.php',
|
||||
'error/class/ext.php',
|
||||
'error/classtype/controller.php',
|
||||
'error/classtype/ext.php',
|
||||
'error/disabled/controller.php',
|
||||
'error/disabled/ext.php',
|
||||
'foo/bar/controller.php',
|
||||
'foo/bar/ext.php',
|
||||
'foo/bar/styles/prosilver/template/foobar_body.html',
|
||||
'foobar/controller.php',
|
||||
'foobar/ext.php',
|
||||
'foobar/styles/prosilver/template/foobar_body.html',
|
||||
);
|
||||
|
||||
foreach ($fixtures as $fixture)
|
||||
foreach (self::$fixtures as $fixture)
|
||||
{
|
||||
if (!copy("tests/functional/fixtures/ext/$fixture", "{$phpbb_root_path}ext/$fixture"))
|
||||
{
|
||||
echo 'Could not copy file ' . $fixture;
|
||||
}
|
||||
copy(
|
||||
"tests/functional/fixtures/ext/$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
|
||||
*/
|
||||
static public function tearDownAfterClass()
|
||||
{
|
||||
global $phpbb_root_path;
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
@@ -75,70 +85,67 @@ class phpbb_functional_extension_controller_test extends phpbb_functional_test_c
|
||||
}
|
||||
|
||||
/**
|
||||
* Check an extension at ./ext/foobar/ which should have the class
|
||||
* phpbb_ext_foobar_controller
|
||||
*/
|
||||
public function test_foobar()
|
||||
{
|
||||
$this->phpbb_extension_manager->enable('foobar');
|
||||
$crawler = $this->request('GET', 'index.php?ext=foobar');
|
||||
$this->assertContains("This is for testing purposes.", $crawler->filter('#page-body')->text());
|
||||
$this->phpbb_extension_manager->purge('foobar');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check an extension at ./ext/foo/bar/ which should have the class
|
||||
* phpbb_ext_foo_bar_controller
|
||||
* Check a controller for extension foo/bar.
|
||||
*/
|
||||
public function test_foo_bar()
|
||||
{
|
||||
$this->phpbb_extension_manager->enable('foo/bar');
|
||||
$crawler = $this->request('GET', 'index.php?ext=foo/bar');
|
||||
$this->assertContains("This is for testing purposes.", $crawler->filter('#page-body')->text());
|
||||
$crawler = $this->request('GET', 'app.php?controller=foo/bar');
|
||||
$this->assert_response_success();
|
||||
$this->assertContains("foo/bar controller handle() method", $crawler->filter('body')->text());
|
||||
$this->phpbb_extension_manager->purge('foo/bar');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the error produced by extension at ./ext/error/class which has class
|
||||
* phpbb_ext_foobar_controller
|
||||
* Check the output of a controller using the template system
|
||||
*/
|
||||
public function test_error_class_name()
|
||||
public function test_controller_with_template()
|
||||
{
|
||||
$this->phpbb_extension_manager->enable('error/class');
|
||||
$crawler = $this->request('GET', 'index.php?ext=error/class');
|
||||
$this->assertContains("The extension error/class is missing a controller class and cannot be accessed through the front-end.", $crawler->filter('#message')->text());
|
||||
$this->phpbb_extension_manager->purge('error/class');
|
||||
$this->phpbb_extension_manager->enable('foo/bar');
|
||||
$crawler = $this->request('GET', 'app.php?controller=foo/template');
|
||||
$this->assert_response_success();
|
||||
$this->assertContains("I am a variable", $crawler->filter('#content')->text());
|
||||
$this->phpbb_extension_manager->purge('foo/bar');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the error produced by extension at ./ext/error/classtype which has class
|
||||
* phpbb_ext_error_classtype_controller but does not implement phpbb_extension_controller_interface
|
||||
* Check the error produced by calling a controller without a required
|
||||
* argument.
|
||||
*/
|
||||
public function test_error_class_type()
|
||||
public function test_missing_argument()
|
||||
{
|
||||
$this->phpbb_extension_manager->enable('error/classtype');
|
||||
$crawler = $this->request('GET', 'index.php?ext=error/classtype');
|
||||
$this->assertContains("The extension controller class phpbb_ext_error_classtype_controller is not an instance of the phpbb_extension_controller_interface.", $crawler->filter('#message')->text());
|
||||
$this->phpbb_extension_manager->purge('error/classtype');
|
||||
$this->phpbb_extension_manager->enable('foo/bar');
|
||||
$crawler = $this->request('GET', 'app.php?controller=foo/baz');
|
||||
$this->assertEquals(500, $this->client->getResponse()->getStatus());
|
||||
$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');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the error produced by extension at ./ext/error/disabled that is (obviously)
|
||||
* a disabled extension
|
||||
* Check the status code resulting from an exception thrown by a controller
|
||||
*/
|
||||
public function test_error_ext_disabled()
|
||||
public function test_exception_should_result_in_500_status_code()
|
||||
{
|
||||
$crawler = $this->request('GET', 'index.php?ext=error/disabled');
|
||||
$this->assertContains("The extension error/disabled is not enabled", $crawler->filter('#message')->text());
|
||||
$this->phpbb_extension_manager->enable('foo/bar');
|
||||
$crawler = $this->request('GET', 'app.php?controller=foo/exception');
|
||||
$this->assertEquals(500, $this->client->getResponse()->getStatus());
|
||||
$this->assertContains('Exception thrown from foo/exception route', $crawler->filter('body')->text());
|
||||
$this->phpbb_extension_manager->purge('foo/bar');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the error produced by extension at ./ext/error/404 that is (obviously)
|
||||
* not existant
|
||||
* Check the error produced by extension at ./ext/does/not/exist.
|
||||
*
|
||||
* If an extension is disabled, its routes are not loaded. Because we
|
||||
* are not looking for a controller based on a specified extension,
|
||||
* we don't know the difference between a route in a disabled
|
||||
* extension and a route that is not defined anyway; it is the same
|
||||
* error message.
|
||||
*/
|
||||
public function test_error_ext_missing()
|
||||
public function test_error_ext_disabled_or_404()
|
||||
{
|
||||
$crawler = $this->request('GET', 'index.php?ext=error/404');
|
||||
$this->assertContains("The extension error/404 does not exist.", $crawler->filter('#message')->text());
|
||||
$crawler = $this->request('GET', 'app.php?controller=does/not/exist');
|
||||
$this->assertEquals(404, $this->client->getResponse()->getStatus());
|
||||
$this->assertContains('No route found for "GET /does/not/exist"', $crawler->filter('body')->text());
|
||||
}
|
||||
}
|
||||
|
@@ -64,6 +64,9 @@ class phpbb_functional_fileupload_form_test extends phpbb_functional_test_case
|
||||
public function test_valid_file()
|
||||
{
|
||||
$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->assertContains($this->lang('POSTED_ATTACHMENTS'), $crawler->filter('#postform h3')->eq(1)->text());
|
||||
}
|
||||
}
|
||||
|
@@ -1,14 +0,0 @@
|
||||
<?php
|
||||
|
||||
class phpbb_ext_foobar_controller extends phpbb_extension_controller
|
||||
{
|
||||
public function handle()
|
||||
{
|
||||
$this->template->set_filenames(array(
|
||||
'body' => 'index_body.html'
|
||||
));
|
||||
|
||||
page_header('Test extension');
|
||||
page_footer();
|
||||
}
|
||||
}
|
@@ -1,6 +0,0 @@
|
||||
<?php
|
||||
|
||||
class phpbb_ext_error_class_ext extends phpbb_extension_base
|
||||
{
|
||||
|
||||
}
|
@@ -1,15 +0,0 @@
|
||||
<?php
|
||||
|
||||
class phpbb_ext_error_classtype_controller
|
||||
{
|
||||
public function handle()
|
||||
{
|
||||
global $template;
|
||||
$template->set_filenames(array(
|
||||
'body' => 'index_body.html'
|
||||
));
|
||||
|
||||
page_header('Test extension');
|
||||
page_footer();
|
||||
}
|
||||
}
|
@@ -1,6 +0,0 @@
|
||||
<?php
|
||||
|
||||
class phpbb_ext_error_classtype_ext extends phpbb_extension_base
|
||||
{
|
||||
|
||||
}
|
@@ -1,14 +0,0 @@
|
||||
<?php
|
||||
|
||||
class phpbb_ext_error_disabled_controller extends phpbb_extension_controller
|
||||
{
|
||||
public function handle()
|
||||
{
|
||||
$this->template->set_filenames(array(
|
||||
'body' => 'index_body.html'
|
||||
));
|
||||
|
||||
page_header('Test extension');
|
||||
page_footer();
|
||||
}
|
||||
}
|
@@ -1,6 +0,0 @@
|
||||
<?php
|
||||
|
||||
class phpbb_ext_error_disabled_ext extends phpbb_extension_base
|
||||
{
|
||||
|
||||
}
|
15
tests/functional/fixtures/ext/foo/bar/config/routing.yml
Normal file
15
tests/functional/fixtures/ext/foo/bar/config/routing.yml
Normal file
@@ -0,0 +1,15 @@
|
||||
foo_bar_controller:
|
||||
pattern: /foo/bar
|
||||
defaults: { _controller: foo_bar.controller:handle }
|
||||
|
||||
foo_baz_controller:
|
||||
pattern: /foo/baz
|
||||
defaults: { _controller: foo_bar.controller:baz }
|
||||
|
||||
foo_template_controller:
|
||||
pattern: /foo/template
|
||||
defaults: { _controller: foo_bar.controller:template }
|
||||
|
||||
foo_exception_controller:
|
||||
pattern: /foo/exception
|
||||
defaults: { _controller: foo_bar.controller:exception }
|
@@ -0,0 +1,6 @@
|
||||
services:
|
||||
foo_bar.controller:
|
||||
class: phpbb_ext_foo_bar_controller
|
||||
arguments:
|
||||
- @controller.helper
|
||||
- @template
|
@@ -1,14 +0,0 @@
|
||||
<?php
|
||||
|
||||
class phpbb_ext_foo_bar_controller extends phpbb_extension_controller
|
||||
{
|
||||
public function handle()
|
||||
{
|
||||
$this->template->set_filenames(array(
|
||||
'body' => 'foobar_body.html'
|
||||
));
|
||||
|
||||
page_header('Test extension');
|
||||
page_footer();
|
||||
}
|
||||
}
|
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class phpbb_ext_foo_bar_controller
|
||||
{
|
||||
protected $template;
|
||||
|
||||
public function __construct(phpbb_controller_helper $helper, phpbb_template $template)
|
||||
{
|
||||
$this->template = $template;
|
||||
$this->helper = $helper;
|
||||
}
|
||||
|
||||
public function handle()
|
||||
{
|
||||
return new Response('foo/bar controller handle() method', 200);
|
||||
}
|
||||
|
||||
public function baz($test)
|
||||
{
|
||||
return new Response('Value of "test" URL argument is: ' . $test);
|
||||
}
|
||||
|
||||
public function template()
|
||||
{
|
||||
$this->template->assign_var('A_VARIABLE', 'I am a variable');
|
||||
|
||||
return $this->helper->render('foo_bar_body.html');
|
||||
}
|
||||
|
||||
public function exception()
|
||||
{
|
||||
throw new phpbb_controller_exception('Exception thrown from foo/exception route');
|
||||
}
|
||||
}
|
@@ -2,5 +2,5 @@
|
||||
|
||||
class phpbb_ext_foo_bar_ext extends phpbb_extension_base
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
@@ -1,5 +1,3 @@
|
||||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<div id="welcome">This is for testing purposes.</div>
|
||||
|
||||
<div id="content">{A_VARIABLE}</div>
|
||||
<!-- INCLUDE overall_footer.html -->
|
@@ -1,14 +0,0 @@
|
||||
<?php
|
||||
|
||||
class phpbb_ext_foobar_controller extends phpbb_extension_controller
|
||||
{
|
||||
public function handle()
|
||||
{
|
||||
$this->template->set_filenames(array(
|
||||
'body' => 'foobar_body.html'
|
||||
));
|
||||
|
||||
page_header('Test extension');
|
||||
page_footer();
|
||||
}
|
||||
}
|
@@ -1,6 +0,0 @@
|
||||
<?php
|
||||
|
||||
class phpbb_ext_foobar_ext extends phpbb_extension_base
|
||||
{
|
||||
|
||||
}
|
@@ -1,5 +0,0 @@
|
||||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<div id="welcome">This is for testing purposes.</div>
|
||||
|
||||
<!-- INCLUDE overall_footer.html -->
|
102
tests/functional/posting_test.php
Normal file
102
tests/functional/posting_test.php
Normal 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());
|
||||
}
|
||||
}
|
44
tests/functions/clean_path_test.php
Normal file
44
tests/functions/clean_path_test.php
Normal 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);
|
||||
}
|
||||
}
|
71
tests/functions/get_formatted_filesize_test.php
Normal file
71
tests/functions/get_formatted_filesize_test.php
Normal file
@@ -0,0 +1,71 @@
|
||||
<?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_get_formatted_filesize_test extends phpbb_test_case
|
||||
{
|
||||
public function get_formatted_filesize_test_data()
|
||||
{
|
||||
return array(
|
||||
// exact powers of 2
|
||||
array(1, '1 BYTES'),
|
||||
array(1024, '1 KIB'),
|
||||
array(1048576, '1 MIB'),
|
||||
array(1073741824, '1 GIB'),
|
||||
array(1099511627776, '1 TIB'),
|
||||
|
||||
// exact powers of 10
|
||||
array(1000, '1000 BYTES'),
|
||||
array(1000000, '976.56 KIB'),
|
||||
array(1000000000, '953.67 MIB'),
|
||||
array(1000000000000, '931.32 GIB'),
|
||||
array(100000000000000, '90.95 TIB'),
|
||||
|
||||
array(0, '0 BYTES'),
|
||||
array(2, '2 BYTES'),
|
||||
|
||||
array(1023, '1023 BYTES'),
|
||||
array(1025, '1 KIB'),
|
||||
array(1048575, '1024 KIB'),
|
||||
|
||||
// String values
|
||||
// exact powers of 2
|
||||
array('1', '1 BYTES'),
|
||||
array('1024', '1 KIB'),
|
||||
array('1048576', '1 MIB'),
|
||||
array('1073741824', '1 GIB'),
|
||||
array('1099511627776', '1 TIB'),
|
||||
|
||||
// exact powers of 10
|
||||
array('1000', '1000 BYTES'),
|
||||
array('1000000', '976.56 KIB'),
|
||||
array('1000000000', '953.67 MIB'),
|
||||
array('1000000000000', '931.32 GIB'),
|
||||
array('100000000000000', '90.95 TIB'),
|
||||
|
||||
array('0', '0 BYTES'),
|
||||
array('2', '2 BYTES'),
|
||||
|
||||
array('1023', '1023 BYTES'),
|
||||
array('1025', '1 KIB'),
|
||||
array('1048575', '1024 KIB'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider get_formatted_filesize_test_data
|
||||
*/
|
||||
public function test_get_formatted_filesize($input, $expected)
|
||||
{
|
||||
$output = get_formatted_filesize($input);
|
||||
|
||||
$this->assertEquals($expected, $output);
|
||||
}
|
||||
}
|
74
tests/lint_test.php
Normal file
74
tests/lint_test.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* @package testing
|
||||
* @copyright (c) 2012 phpBB Group
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
||||
*
|
||||
*/
|
||||
|
||||
class phpbb_lint_test extends phpbb_test_case
|
||||
{
|
||||
static protected $exclude;
|
||||
|
||||
static public function setUpBeforeClass()
|
||||
{
|
||||
$output = array();
|
||||
$status = 1;
|
||||
exec('(php -v) 2>&1', $output, $status);
|
||||
if ($status)
|
||||
{
|
||||
$output = implode("\n", $output);
|
||||
self::markTestSkipped("php is not in PATH or broken: $output");
|
||||
}
|
||||
|
||||
self::$exclude = array(
|
||||
// PHP Fatal error: Cannot declare class Container because the name is already in use in /var/www/projects/phpbb3/tests/../phpBB/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1-1.php on line 20
|
||||
// https://gist.github.com/e003913ffd493da63cbc
|
||||
dirname(__FILE__) . '/../phpBB/vendor',
|
||||
);
|
||||
}
|
||||
|
||||
public function test_lint()
|
||||
{
|
||||
if (version_compare(PHP_VERSION, '5.3.0', '<'))
|
||||
{
|
||||
$this->markTestSkipped('phpBB uses PHP 5.3 syntax in some files, linting on PHP < 5.3 will fail');
|
||||
}
|
||||
|
||||
$root = dirname(__FILE__) . '/..';
|
||||
$this->check($root);
|
||||
}
|
||||
|
||||
protected function check($root)
|
||||
{
|
||||
$dh = opendir($root);
|
||||
while (($filename = readdir($dh)) !== false)
|
||||
{
|
||||
if ($filename == '.' || $filename == '..' || $filename == 'git')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
$path = $root . '/' . $filename;
|
||||
// skip symlinks to avoid infinite loops
|
||||
if (is_link($path))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (is_dir($path) && !in_array($path, self::$exclude))
|
||||
{
|
||||
$this->check($path);
|
||||
}
|
||||
else if (substr($filename, strlen($filename)-4) == '.php')
|
||||
{
|
||||
// assume php binary is called php and it is in PATH
|
||||
$cmd = '(php -l ' . escapeshellarg($path) . ') 2>&1';
|
||||
$output = array();
|
||||
$status = 1;
|
||||
exec($cmd, $output, $status);
|
||||
$output = implode("\n", $output);
|
||||
$this->assertEquals(0, $status, "php -l failed for $path:\n$output");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
109
tests/lock/flock_test.php
Normal file
109
tests/lock/flock_test.php
Normal file
@@ -0,0 +1,109 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* @package testing
|
||||
* @copyright (c) 2012 phpBB Group
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
||||
*
|
||||
*/
|
||||
|
||||
class phpbb_lock_flock_test extends phpbb_test_case
|
||||
{
|
||||
public function test_lock()
|
||||
{
|
||||
$path = __DIR__ . '/../tmp/precious';
|
||||
|
||||
$lock = new phpbb_lock_flock($path);
|
||||
$ok = $lock->acquire();
|
||||
$this->assertTrue($ok);
|
||||
$lock->release();
|
||||
}
|
||||
|
||||
public function test_consecutive_locking()
|
||||
{
|
||||
$path = __DIR__ . '/../tmp/precious';
|
||||
|
||||
$lock = new phpbb_lock_flock($path);
|
||||
$ok = $lock->acquire();
|
||||
$this->assertTrue($ok);
|
||||
$lock->release();
|
||||
|
||||
$ok = $lock->acquire();
|
||||
$this->assertTrue($ok);
|
||||
$lock->release();
|
||||
|
||||
$ok = $lock->acquire();
|
||||
$this->assertTrue($ok);
|
||||
$lock->release();
|
||||
}
|
||||
|
||||
/* This hangs the process.
|
||||
public function test_concurrent_locking_fail()
|
||||
{
|
||||
$path = __DIR__ . '/../tmp/precious';
|
||||
|
||||
$lock1 = new phpbb_lock_flock($path);
|
||||
$ok = $lock1->acquire();
|
||||
$this->assertTrue($ok);
|
||||
|
||||
$lock2 = new phpbb_lock_flock($path);
|
||||
$ok = $lock2->acquire();
|
||||
$this->assertFalse($ok);
|
||||
|
||||
$lock->release();
|
||||
$ok = $lock2->acquire();
|
||||
$this->assertTrue($ok);
|
||||
}
|
||||
*/
|
||||
|
||||
public function test_concurrent_locking()
|
||||
{
|
||||
if (!function_exists('pcntl_fork'))
|
||||
{
|
||||
$this->markTestSkipped('pcntl extension and pcntl_fork are required for this test');
|
||||
}
|
||||
|
||||
$path = __DIR__ . '/../tmp/precious';
|
||||
|
||||
$pid = pcntl_fork();
|
||||
if ($pid)
|
||||
{
|
||||
// parent
|
||||
// wait 0.5 s, acquire the lock, note how long it took
|
||||
sleep(1);
|
||||
|
||||
$lock = new phpbb_lock_flock($path);
|
||||
$start = time();
|
||||
$ok = $lock->acquire();
|
||||
$delta = time() - $start;
|
||||
$this->assertTrue($ok);
|
||||
$this->assertGreaterThan(0.5, $delta, 'First lock acquired too soon');
|
||||
|
||||
$lock->release();
|
||||
|
||||
// acquire again, this should be instantaneous
|
||||
$start = time();
|
||||
$ok = $lock->acquire();
|
||||
$delta = time() - $start;
|
||||
$this->assertTrue($ok);
|
||||
$this->assertLessThan(0.1, $delta, 'Second lock not acquired instantaneously');
|
||||
|
||||
// reap the child
|
||||
$status = null;
|
||||
pcntl_waitpid($pid, $status);
|
||||
}
|
||||
else
|
||||
{
|
||||
// child
|
||||
// immediately acquire the lock and sleep for 2 s
|
||||
$lock = new phpbb_lock_flock($path);
|
||||
$ok = $lock->acquire();
|
||||
$this->assertTrue($ok);
|
||||
sleep(2);
|
||||
$lock->release();
|
||||
|
||||
// and go away silently
|
||||
pcntl_exec('/usr/bin/env', array('true'));
|
||||
}
|
||||
}
|
||||
}
|
@@ -123,6 +123,7 @@ class phpbb_mock_cache implements phpbb_cache_driver_interface
|
||||
}
|
||||
public function sql_save($query, $query_result, $ttl)
|
||||
{
|
||||
return $query_result;
|
||||
}
|
||||
public function sql_exists($query_id)
|
||||
{
|
||||
|
160
tests/mock/container_builder.php
Normal file
160
tests/mock/container_builder.php
Normal file
@@ -0,0 +1,160 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* @package testing
|
||||
* @copyright (c) 2012 phpBB Group
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
||||
*
|
||||
*/
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
use Symfony\Component\DependencyInjection\ScopeInterface;
|
||||
|
||||
class phpbb_mock_container_builder implements ContainerInterface
|
||||
{
|
||||
/**
|
||||
* Sets a service.
|
||||
*
|
||||
* @param string $id The service identifier
|
||||
* @param object $service The service instance
|
||||
* @param string $scope The scope of the service
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function set($id, $service, $scope = self::SCOPE_CONTAINER)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a service.
|
||||
*
|
||||
* @param string $id The service identifier
|
||||
* @param int $invalidBehavior The behavior when the service does not exist
|
||||
*
|
||||
* @return object The associated service
|
||||
*
|
||||
* @throws InvalidArgumentException if the service is not defined
|
||||
* @throws ServiceCircularReferenceException When a circular reference is detected
|
||||
* @throws ServiceNotFoundException When the service is not defined
|
||||
*
|
||||
* @see Reference
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the given service is defined.
|
||||
*
|
||||
* @param string $id The service identifier
|
||||
*
|
||||
* @return Boolean true if the service is defined, false otherwise
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function has($id)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a parameter.
|
||||
*
|
||||
* @param string $name The parameter name
|
||||
*
|
||||
* @return mixed The parameter value
|
||||
*
|
||||
* @throws InvalidArgumentException if the parameter is not defined
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function getParameter($name)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a parameter exists.
|
||||
*
|
||||
* @param string $name The parameter name
|
||||
*
|
||||
* @return Boolean The presence of parameter in container
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function hasParameter($name)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a parameter.
|
||||
*
|
||||
* @param string $name The parameter name
|
||||
* @param mixed $value The parameter value
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function setParameter($name, $value)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Enters the given scope
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function enterScope($name)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Leaves the current scope, and re-enters the parent scope
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function leaveScope($name)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a scope to the container
|
||||
*
|
||||
* @param ScopeInterface $scope
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function addScope(ScopeInterface $scope)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether this container has the given scope
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return Boolean
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function hasScope($name)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether the given scope is currently active.
|
||||
*
|
||||
* It does however not check if the scope actually exists.
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return Boolean
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function isScopeActive($name)
|
||||
{
|
||||
}
|
||||
}
|
@@ -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);
|
||||
|
@@ -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(
|
||||
|
@@ -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.
|
||||
|
@@ -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<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<3\t\t");
|
||||
|
||||
$this->type_cast_helper->recursive_set_var($data, array(0 => ''), true, false);
|
||||
|
||||
$this->assertEquals($expected, $data);
|
||||
}
|
||||
}
|
||||
|
106
tests/search/common_test_case.php
Normal file
106
tests/search/common_test_case.php
Normal file
@@ -0,0 +1,106 @@
|
||||
<?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__) . '/../test_framework/phpbb_search_test_case.php';
|
||||
|
||||
abstract class phpbb_search_common_test_case extends phpbb_search_test_case
|
||||
{
|
||||
public function keywords()
|
||||
{
|
||||
return array(
|
||||
// keywords
|
||||
// terms
|
||||
// ok
|
||||
// split words
|
||||
// common words
|
||||
array(
|
||||
'fooo',
|
||||
'all',
|
||||
true,
|
||||
array('fooo'),
|
||||
array(),
|
||||
),
|
||||
array(
|
||||
'fooo baar',
|
||||
'all',
|
||||
true,
|
||||
array('fooo', 'baar'),
|
||||
array(),
|
||||
),
|
||||
// leading, trailing and multiple spaces
|
||||
array(
|
||||
' fooo baar ',
|
||||
'all',
|
||||
true,
|
||||
array('fooo', 'baar'),
|
||||
array(),
|
||||
),
|
||||
// words too short
|
||||
array(
|
||||
'f',
|
||||
'all',
|
||||
false,
|
||||
null,
|
||||
// short words count as "common" words
|
||||
array('f'),
|
||||
),
|
||||
array(
|
||||
'f o o',
|
||||
'all',
|
||||
false,
|
||||
null,
|
||||
array('f', 'o', 'o'),
|
||||
),
|
||||
array(
|
||||
'f -o -o',
|
||||
'all',
|
||||
false,
|
||||
null,
|
||||
array('f', '-o', '-o'),
|
||||
),
|
||||
array(
|
||||
'fooo -baar',
|
||||
'all',
|
||||
true,
|
||||
array('-baar', 'fooo'),
|
||||
array(),
|
||||
),
|
||||
// all negative
|
||||
array(
|
||||
'-fooo',
|
||||
'all',
|
||||
true,
|
||||
array('-fooo'),
|
||||
array(),
|
||||
),
|
||||
array(
|
||||
'-fooo -baar',
|
||||
'all',
|
||||
true,
|
||||
array('-fooo', '-baar'),
|
||||
array(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider keywords
|
||||
*/
|
||||
public function test_split_keywords($keywords, $terms, $ok, $split_words, $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($split_words, $this->search->get_split_words());
|
||||
}
|
||||
$this->assert_array_content_equals($common, $this->search->get_common_words());
|
||||
}
|
||||
}
|
43
tests/search/fixtures/posts.xml
Normal file
43
tests/search/fixtures/posts.xml
Normal 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>
|
40
tests/search/mysql_test.php
Normal file
40
tests/search/mysql_test.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?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__) . '/common_test_case.php';
|
||||
|
||||
class phpbb_search_mysql_test extends phpbb_search_common_test_case
|
||||
{
|
||||
protected $db;
|
||||
protected $search;
|
||||
|
||||
public function getDataSet()
|
||||
{
|
||||
return $this->createXMLDataSet(dirname(__FILE__) . '/../fixtures/empty.xml');
|
||||
}
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
global $phpbb_root_path, $phpEx, $config, $user, $cache;
|
||||
|
||||
parent::setUp();
|
||||
|
||||
// dbal uses cache
|
||||
$cache = new phpbb_cache_service(new phpbb_cache_driver_null);
|
||||
|
||||
// set config values
|
||||
$config['fulltext_mysql_min_word_len'] = 4;
|
||||
$config['fulltext_mysql_max_word_len'] = 254;
|
||||
|
||||
$this->db = $this->new_dbal();
|
||||
$error = null;
|
||||
$class = self::get_search_wrapper('phpbb_search_fulltext_mysql');
|
||||
$this->search = new $class($error, $phpbb_root_path, $phpEx, null, $config, $this->db, $user);
|
||||
}
|
||||
}
|
158
tests/search/native_test.php
Normal file
158
tests/search/native_test.php
Normal file
@@ -0,0 +1,158 @@
|
||||
<?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__) . '/../test_framework/phpbb_search_test_case.php';
|
||||
|
||||
class phpbb_search_native_test extends phpbb_search_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_service(new phpbb_cache_driver_null);
|
||||
|
||||
$this->db = $this->new_dbal();
|
||||
$error = null;
|
||||
$class = self::get_search_wrapper('phpbb_search_fulltext_native');
|
||||
$this->search = new $class($error, $phpbb_root_path, $phpEx, null, $config, $this->db, $user);
|
||||
}
|
||||
|
||||
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(
|
||||
'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());
|
||||
}
|
||||
}
|
40
tests/search/postgres_test.php
Normal file
40
tests/search/postgres_test.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?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__) . '/common_test_case.php';
|
||||
|
||||
class phpbb_search_postgres_test extends phpbb_search_common_test_case
|
||||
{
|
||||
protected $db;
|
||||
protected $search;
|
||||
|
||||
public function getDataSet()
|
||||
{
|
||||
return $this->createXMLDataSet(dirname(__FILE__) . '/../fixtures/empty.xml');
|
||||
}
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
global $phpbb_root_path, $phpEx, $config, $user, $cache;
|
||||
|
||||
parent::setUp();
|
||||
|
||||
// dbal uses cache
|
||||
$cache = new phpbb_cache_service(new phpbb_cache_driver_null);
|
||||
|
||||
// set config values
|
||||
$config['fulltext_postgres_min_word_len'] = 4;
|
||||
$config['fulltext_postgres_max_word_len'] = 254;
|
||||
|
||||
$this->db = $this->new_dbal();
|
||||
$error = null;
|
||||
$class = self::get_search_wrapper('phpbb_search_fulltext_postgres');
|
||||
$this->search = new $class($error, $phpbb_root_path, $phpEx, null, $config, $this->db, $user);
|
||||
}
|
||||
}
|
@@ -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));
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -62,7 +62,7 @@ class phpbb_template_template_locate_test extends phpbb_template_template_test_c
|
||||
$this->setup_engine();
|
||||
|
||||
// Locate template
|
||||
$result = $this->template->locate($files, $return_default, $return_full_path);
|
||||
$result = $this->style_resource_locator->get_first_template_location($files, $return_default, $return_full_path);
|
||||
$this->assertSame($expected, $result);
|
||||
}
|
||||
}
|
||||
|
@@ -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(),
|
||||
|
@@ -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, '');
|
||||
}
|
||||
|
@@ -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), '');
|
||||
}
|
||||
|
1
tests/template/templates/include_variables.html
Normal file
1
tests/template/templates/include_variables.html
Normal file
@@ -0,0 +1 @@
|
||||
<!-- INCLUDE {SUBDIR}/variable.html -->
|
@@ -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}
|
||||
|
2
tests/template/templates/includephp_variables.html
Normal file
2
tests/template/templates/includephp_variables.html
Normal file
@@ -0,0 +1,2 @@
|
||||
Path includes variables.
|
||||
<!-- INCLUDEPHP ../tests/template/{TEMPLATES}/_dummy_include.php.inc -->
|
0
tests/template/templates/subdir/parent_only.js
Normal file
0
tests/template/templates/subdir/parent_only.js
Normal file
1
tests/template/templates/subdir/variable.html
Normal file
1
tests/template/templates/subdir/variable.html
Normal file
@@ -0,0 +1 @@
|
||||
{VARIABLE}
|
@@ -13,6 +13,8 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
|
||||
|
||||
protected $test_case_helpers;
|
||||
|
||||
protected $fixture_xml_data;
|
||||
|
||||
public function __construct($name = NULL, array $data = array(), $dataName = '')
|
||||
{
|
||||
parent::__construct($name, $data, $dataName);
|
||||
@@ -28,6 +30,20 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
|
||||
);
|
||||
}
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
// Resynchronise tables if a fixture was loaded
|
||||
if (isset($this->fixture_xml_data))
|
||||
{
|
||||
$config = $this->get_database_config();
|
||||
$manager = $this->create_connection_manager($config);
|
||||
$manager->connect();
|
||||
$manager->post_setup_synchronisation($this->fixture_xml_data);
|
||||
}
|
||||
}
|
||||
|
||||
public function createXMLDataSet($path)
|
||||
{
|
||||
$db_config = $this->get_database_config();
|
||||
@@ -47,7 +63,9 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
|
||||
$path = $meta_data['uri'];
|
||||
}
|
||||
|
||||
return parent::createXMLDataSet($path);
|
||||
$this->fixture_xml_data = parent::createXMLDataSet($path);
|
||||
|
||||
return $this->fixture_xml_data;
|
||||
}
|
||||
|
||||
public function get_test_case_helpers()
|
||||
@@ -137,8 +155,24 @@ 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];
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -166,12 +166,6 @@ class phpbb_database_test_connection_manager
|
||||
switch ($this->config['dbms'])
|
||||
{
|
||||
case 'sqlite':
|
||||
if (file_exists($this->config['dbhost']))
|
||||
{
|
||||
unlink($this->config['dbhost']);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'firebird':
|
||||
$this->connect();
|
||||
// Drop all of the tables
|
||||
@@ -432,4 +426,111 @@ class phpbb_database_test_connection_manager
|
||||
$this->pdo->exec($query);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs synchronisations on the database after a fixture has been loaded
|
||||
*
|
||||
* @param PHPUnit_Extensions_Database_DataSet_XmlDataSet $xml_data_set Information about the tables contained within the loaded fixture
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function post_setup_synchronisation($xml_data_set)
|
||||
{
|
||||
$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());
|
||||
|
||||
switch ($this->config['dbms'])
|
||||
{
|
||||
case 'oracle':
|
||||
// Get all of the information about the sequences
|
||||
$sql = "SELECT t.table_name, tc.column_name, d.referenced_name as sequence_name, s.increment_by, s.min_value
|
||||
FROM USER_TRIGGERS t
|
||||
JOIN USER_DEPENDENCIES d ON (d.name = t.trigger_name)
|
||||
JOIN USER_TRIGGER_COLS tc ON (tc.trigger_name = t.trigger_name)
|
||||
JOIN USER_SEQUENCES s ON (s.sequence_name = d.referenced_name)
|
||||
WHERE d.referenced_type = 'SEQUENCE'
|
||||
AND d.type = 'TRIGGER'
|
||||
AND t.table_name IN (" . implode(', ', array_map('strtoupper', $table_names)) . ')';
|
||||
|
||||
$result = $this->pdo->query($sql);
|
||||
|
||||
while ($row = $result->fetch(PDO::FETCH_ASSOC))
|
||||
{
|
||||
// Get the current max value of the table
|
||||
$sql = "SELECT MAX({$row['COLUMN_NAME']}) AS max FROM {$row['TABLE_NAME']}";
|
||||
$max_result = $this->pdo->query($sql);
|
||||
$max_row = $max_result->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$max_row)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
$max_val = (int) $max_row['MAX'];
|
||||
$max_val++;
|
||||
|
||||
/**
|
||||
* This is not the "proper" way, but the proper way does not allow you to completely reset
|
||||
* tables with no rows since you have to select the next value to make the change go into effect.
|
||||
* You would have to go past the minimum value to set it correctly, but that's illegal.
|
||||
* Since we have no objects attached to our sequencers (triggers aren't attached), this works fine.
|
||||
*/
|
||||
$queries[] = 'DROP SEQUENCE ' . $row['SEQUENCE_NAME'];
|
||||
$queries[] = "CREATE SEQUENCE {$row['SEQUENCE_NAME']}
|
||||
MINVALUE {$row['MIN_VALUE']}
|
||||
INCREMENT BY {$row['INCREMENT_BY']}
|
||||
START WITH $max_val";
|
||||
}
|
||||
break;
|
||||
|
||||
case 'postgres':
|
||||
// Get the sequences attached to the tables
|
||||
$sql = 'SELECT column_name, table_name FROM information_schema.columns
|
||||
WHERE table_name IN (' . implode(', ', $table_names) . ")
|
||||
AND strpos(column_default, '_seq''::regclass') > 0";
|
||||
$result = $this->pdo->query($sql);
|
||||
|
||||
$setval_queries = array();
|
||||
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();
|
||||
|
||||
// Skip sequences that weren't specified in the fixture
|
||||
if (!in_array($row['column_name'], $column_names))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get the old value if it exists, or use 1 if it doesn't
|
||||
$sql = "SELECT COALESCE((SELECT MAX({$row['column_name']}) + 1 FROM {$row['table_name']}), 1) AS val";
|
||||
$result_max = $this->pdo->query($sql);
|
||||
$row_max = $result_max->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($row_max)
|
||||
{
|
||||
$seq_name = $this->pdo->quote($row['table_name'] . '_seq');
|
||||
$max_val = (int) $row_max['val'];
|
||||
|
||||
// The last parameter is false so that the system doesn't increment it again
|
||||
$setval_queries[] = "SETVAL($seq_name, $max_val, false)";
|
||||
}
|
||||
}
|
||||
|
||||
// Combine all of the SETVALs into one query
|
||||
if (sizeof($setval_queries))
|
||||
{
|
||||
$queries[] = 'SELECT ' . implode(', ', $setval_queries);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
foreach ($queries as $query)
|
||||
{
|
||||
$this->pdo->exec($query);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -51,6 +51,7 @@ class phpbb_functional_test_case extends phpbb_test_case
|
||||
// that were added in other tests are gone
|
||||
$this->lang = array();
|
||||
$this->add_lang('common');
|
||||
$this->purge_cache();
|
||||
}
|
||||
|
||||
public function request($method, $path)
|
||||
@@ -125,6 +126,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",
|
||||
@@ -198,7 +200,7 @@ class phpbb_functional_test_case extends phpbb_test_case
|
||||
$this->do_request('create_table', $data);
|
||||
|
||||
$this->do_request('config_file', $data);
|
||||
file_put_contents($phpbb_root_path . "config.$phpEx", phpbb_create_config_file_data($data, self::$config['dbms'], array(), true));
|
||||
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");
|
||||
@@ -251,6 +253,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))
|
||||
@@ -287,4 +331,31 @@ 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function assert_response_success()
|
||||
{
|
||||
$this->assertEquals(200, $this->client->getResponse()->getStatus());
|
||||
$content = $this->client->getResponse()->getContent();
|
||||
$this->assertNotContains('Fatal error:', $content);
|
||||
}
|
||||
}
|
||||
|
29
tests/test_framework/phpbb_search_test_case.php
Normal file
29
tests/test_framework/phpbb_search_test_case.php
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* @package testing
|
||||
* @copyright (c) 2012 phpBB Group
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
||||
*
|
||||
*/
|
||||
|
||||
abstract class phpbb_search_test_case extends phpbb_database_test_case
|
||||
{
|
||||
static protected function get_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; }
|
||||
public function get_split_words() { return \$this->split_words; }
|
||||
}
|
||||
";
|
||||
eval($code);
|
||||
}
|
||||
return $wrapped;
|
||||
}
|
||||
}
|
@@ -91,6 +91,15 @@ class phpbb_test_case_helpers
|
||||
{
|
||||
$config['phpbb_functional_url'] = $phpbb_functional_url;
|
||||
}
|
||||
|
||||
if (isset($phpbb_redis_host))
|
||||
{
|
||||
$config['redis_host'] = $phpbb_redis_host;
|
||||
}
|
||||
if (isset($phpbb_redis_port))
|
||||
{
|
||||
$config['redis_port'] = $phpbb_redis_port;
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($_SERVER['PHPBB_TEST_DBMS']))
|
||||
@@ -113,6 +122,124 @@ class phpbb_test_case_helpers
|
||||
));
|
||||
}
|
||||
|
||||
if (isset($_SERVER['PHPBB_TEST_REDIS_HOST']))
|
||||
{
|
||||
$config['redis_host'] = $_SERVER['PHPBB_TEST_REDIS_HOST'];
|
||||
}
|
||||
|
||||
if (isset($_SERVER['PHPBB_TEST_REDIS_PORT']))
|
||||
{
|
||||
$config['redis_port'] = $_SERVER['PHPBB_TEST_REDIS_PORT'];
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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/';
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user