[ticket/17535] Update PHPUnit to v.10

PHPBB-17535
This commit is contained in:
rxu 2025-07-14 17:02:21 +07:00
parent 30ee379576
commit d7db296eab
No known key found for this signature in database
GPG key ID: 8117904FEDEFDD17
56 changed files with 529 additions and 574 deletions

View file

@ -249,7 +249,7 @@ jobs:
DB: ${{steps.database-type.outputs.db}} DB: ${{steps.database-type.outputs.db}}
if: ${{ matrix.SLOWTESTS != 1 && matrix.NOTESTS != 1 }} if: ${{ matrix.SLOWTESTS != 1 && matrix.NOTESTS != 1 }}
run: | run: |
phpBB/vendor/bin/phpunit --configuration .github/phpunit-$DB-github.xml --verbose --stop-on-error phpBB/vendor/bin/phpunit --configuration .github/phpunit-$DB-github.xml --stop-on-error
- name: Slow tests - name: Slow tests
env: env:
@ -378,7 +378,7 @@ jobs:
env: env:
DB: ${{steps.database-type.outputs.db}} DB: ${{steps.database-type.outputs.db}}
run: | run: |
phpBB/vendor/bin/phpunit --configuration .github/phpunit-$DB-github.xml --verbose --stop-on-error phpBB/vendor/bin/phpunit --configuration .github/phpunit-$DB-github.xml --stop-on-error
# Other database types, namely sqlite3 and mssql # Other database types, namely sqlite3 and mssql
other-tests: other-tests:
@ -491,7 +491,7 @@ jobs:
env: env:
DB: ${{steps.database-type.outputs.db}} DB: ${{steps.database-type.outputs.db}}
run: | run: |
phpBB/vendor/bin/phpunit --configuration .github/phpunit-$DB-github.xml --verbose --stop-on-error phpBB/vendor/bin/phpunit --configuration .github/phpunit-$DB-github.xml --display-all-issues --stop-on-error
# Test with IIS & PostgreSQL on Windows # Test with IIS & PostgreSQL on Windows
windows-tests: windows-tests:
@ -606,8 +606,8 @@ jobs:
- name: Run unit tests - name: Run unit tests
if: ${{ matrix.type == 'unit' }} if: ${{ matrix.type == 'unit' }}
run: | run: |
phpBB/vendor/bin/phpunit --configuration .github/phpunit-psql-windows-github.xml --verbose --stop-on-error --exclude-group functional,slow phpBB/vendor/bin/phpunit --configuration .github/phpunit-psql-windows-github.xml --stop-on-error --exclude-group functional,slow
- name: Run functional tests - name: Run functional tests
if: ${{ matrix.type == 'functional' }} if: ${{ matrix.type == 'functional' }}
run: | run: |
phpBB/vendor/bin/phpunit --configuration .github/phpunit-psql-windows-github.xml --verbose --stop-on-error --group functional phpBB/vendor/bin/phpunit --configuration .github/phpunit-psql-windows-github.xml --stop-on-error --group functional

View file

@ -65,7 +65,7 @@
"laravel/homestead": "~14.4", "laravel/homestead": "~14.4",
"misantron/dbunit": "~5.0", "misantron/dbunit": "~5.0",
"phing/phing": "~2.4", "phing/phing": "~2.4",
"phpunit/phpunit": "^9.0", "phpunit/phpunit": "^10.0",
"squizlabs/php_codesniffer": "~3.4", "squizlabs/php_codesniffer": "~3.4",
"symfony/browser-kit": "^6.3", "symfony/browser-kit": "^6.3",
"symfony/css-selector": "^6.3", "symfony/css-selector": "^6.3",

609
phpBB/composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -573,7 +573,7 @@ class container_builder
} }
$config_data = $this->config_php_file->get_all(); $config_data = $this->config_php_file->get_all();
if (!empty($config_data)) if (!empty($config_data) && !empty($config_data['dbms']))
{ {
if ($this->dbal_connection === null) if ($this->dbal_connection === null)
{ {
@ -592,6 +592,10 @@ class container_builder
} }
$this->container->set('dbal.conn.driver', $this->dbal_connection); $this->container->set('dbal.conn.driver', $this->dbal_connection);
} }
else
{
return;
}
} }
/** /**

View file

@ -21,15 +21,15 @@ class phpbb_attachment_manager_test extends \phpbb_test_case
{ {
$this->delete = $this->getMockBuilder('\phpbb\attachment\delete') $this->delete = $this->getMockBuilder('\phpbb\attachment\delete')
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(['delete', 'unlink_attachment']) ->onlyMethods(['delete', 'unlink_attachment'])
->getMock(); ->getMock();
$this->resync = $this->getMockBuilder('\phpbb\attachment\resync') $this->resync = $this->getMockBuilder('\phpbb\attachment\resync')
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(['resync']) ->onlyMethods(['resync'])
->getMock(); ->getMock();
$this->upload = $this->getMockBuilder('\phpbb\attachment\upload') $this->upload = $this->getMockBuilder('\phpbb\attachment\upload')
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(['upload']) ->onlyMethods(['upload'])
->getMock(); ->getMock();
} }

View file

@ -365,7 +365,7 @@ class phpbb_attachment_upload_test extends \phpbb_database_test_case
public function test_image_upload($is_image, $plupload_active, $config_data, $expected) public function test_image_upload($is_image, $plupload_active, $config_data, $expected)
{ {
$filespec = $this->getMockBuilder('\phpbb\files\filespec_storage') $filespec = $this->getMockBuilder('\phpbb\files\filespec_storage')
->setMethods(array( ->onlyMethods(array(
'init_error', 'init_error',
'is_image', 'is_image',
'move_file', 'move_file',

View file

@ -74,8 +74,10 @@ class phpbb_auth_provider_apache_test extends phpbb_database_test_case
->will($this->returnValue(true)); ->will($this->returnValue(true));
$this->request->expects($this->exactly(2)) $this->request->expects($this->exactly(2))
->method('server') ->method('server')
->withConsecutive(['PHP_AUTH_USER'], ['PHP_AUTH_PW']) ->willReturnCallback(fn(string $arg) => match(true) {
->will($this->onConsecutiveCalls($this->returnValue('foobar'), $this->returnValue('example'))); $arg === 'PHP_AUTH_USER' => 'foobar',
$arg === 'PHP_AUTH_PW' => 'example',
});
$expected = array( $expected = array(
'status' => LOGIN_SUCCESS, 'status' => LOGIN_SUCCESS,
@ -102,8 +104,10 @@ class phpbb_auth_provider_apache_test extends phpbb_database_test_case
->will($this->returnValue(true)); ->will($this->returnValue(true));
$this->request->expects($this->exactly(2)) $this->request->expects($this->exactly(2))
->method('server') ->method('server')
->withConsecutive(['PHP_AUTH_USER'], ['PHP_AUTH_PW']) ->willReturnCallback(fn(string $arg) => match(true) {
->will($this->onConsecutiveCalls($this->returnValue('foobar'), $this->returnValue('example'))); $arg === 'PHP_AUTH_USER' => 'foobar',
$arg === 'PHP_AUTH_PW' => 'example',
});
$expected = array( $expected = array(
'user_id' => 1, 'user_id' => 1,

View file

@ -12,6 +12,7 @@
*/ */
require_once __DIR__ . '/driver/foobar.php'; require_once __DIR__ . '/driver/foobar.php';
require_once __DIR__ . '/driver/barfoo.php';
class phpbb_avatar_manager_test extends \phpbb_database_test_case class phpbb_avatar_manager_test extends \phpbb_database_test_case
{ {
@ -62,15 +63,15 @@ class phpbb_avatar_manager_test extends \phpbb_database_test_case
// $this->avatar_foobar will be needed later on // $this->avatar_foobar will be needed later on
$this->avatar_foobar = $this->getMockBuilder('\phpbb\avatar\driver\foobar') $this->avatar_foobar = $this->getMockBuilder('\phpbb\avatar\driver\foobar')
->setMethods(array('get_name')) ->onlyMethods(array('get_name'))
->setConstructorArgs(array($this->config, $imagesize, $phpbb_root_path, $phpEx, $path_helper, $cache)) ->setConstructorArgs(array($this->config, $imagesize, $phpbb_root_path, $phpEx, $path_helper, $cache))
->getMock(); ->getMock();
$this->avatar_foobar->expects($this->any()) $this->avatar_foobar->expects($this->any())
->method('get_name') ->method('get_name')
->will($this->returnValue('avatar.driver.foobar')); ->will($this->returnValue('avatar.driver.foobar'));
// barfoo driver can't be mocked with constructor arguments
$this->avatar_barfoo = $this->getMockBuilder('\phpbb\avatar\driver\barfoo') $this->avatar_barfoo = $this->getMockBuilder('\phpbb\avatar\driver\barfoo')
->setMethods(array('get_name', 'get_config_name')) ->onlyMethods(array('get_name', 'get_config_name'))
->setConstructorArgs(array($this->config, $imagesize, $phpbb_root_path, $phpEx, $path_helper, $cache))
->getMock(); ->getMock();
$this->avatar_barfoo->expects($this->any()) $this->avatar_barfoo->expects($this->any())
->method('get_name') ->method('get_name')
@ -89,14 +90,14 @@ class phpbb_avatar_manager_test extends \phpbb_database_test_case
if ($driver !== 'upload') if ($driver !== 'upload')
{ {
$cur_avatar = $this->getMockBuilder('\phpbb\avatar\driver\\' . $driver) $cur_avatar = $this->getMockBuilder('\phpbb\avatar\driver\\' . $driver)
->setMethods(array('get_name')) ->onlyMethods(array('get_name'))
->setConstructorArgs(array($this->config, $imagesize, $phpbb_root_path, $phpEx, $path_helper, $cache)) ->setConstructorArgs(array($this->config, $imagesize, $phpbb_root_path, $phpEx, $path_helper, $cache))
->getMock(); ->getMock();
} }
else else
{ {
$cur_avatar = $this->getMockBuilder('\phpbb\avatar\driver\\' . $driver) $cur_avatar = $this->getMockBuilder('\phpbb\avatar\driver\\' . $driver)
->setMethods(array('get_name')) ->onlyMethods(array('get_name'))
->setConstructorArgs(array($this->config, $phpbb_root_path, $phpEx, $storage, $path_helper, $routing_helper, $dispatcher, $files_factory, $php_ini)) ->setConstructorArgs(array($this->config, $phpbb_root_path, $phpEx, $storage, $path_helper, $routing_helper, $dispatcher, $files_factory, $php_ini))
->getMock(); ->getMock();
} }
@ -302,7 +303,7 @@ class phpbb_avatar_manager_test extends \phpbb_database_test_case
global $phpbb_root_path, $phpEx; global $phpbb_root_path, $phpEx;
$user = $this->getMockBuilder('\phpbb\user') $user = $this->getMockBuilder('\phpbb\user')
->setMethods(array()) ->onlyMethods(['lang'])
->setConstructorArgs(array(new \phpbb\language\language(new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx)), '\phpbb\datetime')) ->setConstructorArgs(array(new \phpbb\language\language(new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx)), '\phpbb\datetime'))
->getMock(); ->getMock();
$lang_array = array( $lang_array = array(

View file

@ -14,13 +14,14 @@
define('IN_PHPBB', true); define('IN_PHPBB', true);
define('PHPBB_ENVIRONMENT', 'test'); define('PHPBB_ENVIRONMENT', 'test');
global $phpbb_class_loader, $phpbb_class_loader_mock, $phpbb_class_loader_ext, $phpbb_class_loader_tests;
global $phpbb_root_path, $phpEx, $table_prefix;
$phpbb_root_path = 'phpBB/'; $phpbb_root_path = 'phpBB/';
$phpEx = 'php'; $phpEx = 'php';
global $table_prefix;
require_once $phpbb_root_path . 'includes/startup.php';
$table_prefix = 'phpbb_'; $table_prefix = 'phpbb_';
require_once $phpbb_root_path . 'includes/startup.php';
require_once $phpbb_root_path . 'includes/constants.php'; require_once $phpbb_root_path . 'includes/constants.php';
require_once $phpbb_root_path . 'phpbb/class_loader.' . $phpEx; require_once $phpbb_root_path . 'phpbb/class_loader.' . $phpEx;
require_once $phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx; require_once $phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx;

View file

@ -454,7 +454,7 @@ class phpbb_captcha_turnstile_test extends \phpbb_database_test_case
->expects($matcher) ->expects($matcher)
->method('assign_vars') ->method('assign_vars')
->willReturnCallback(function ($template_data) use ($matcher, $expected) { ->willReturnCallback(function ($template_data) use ($matcher, $expected) {
$callNr = $matcher->getInvocationCount(); $callNr = $matcher->numberOfInvocations();
$this->assertEquals($expected[$callNr], $template_data); $this->assertEquals($expected[$callNr], $template_data);
}); });

View file

@ -76,7 +76,7 @@ class phpbb_console_command_cron_list_test extends phpbb_test_case
)); ));
$mock_router = $this->getMockBuilder('\phpbb\routing\router') $mock_router = $this->getMockBuilder('\phpbb\routing\router')
->setMethods(array('setContext', 'generate')) ->onlyMethods(array('setContext', 'generate'))
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$mock_router->method('setContext') $mock_router->method('setContext')

View file

@ -53,7 +53,7 @@ class phpbb_console_command_cron_run_test extends phpbb_database_test_case
)); ));
$mock_router = $this->getMockBuilder('\phpbb\routing\router') $mock_router = $this->getMockBuilder('\phpbb\routing\router')
->setMethods(array('setContext', 'generate')) ->onlyMethods(array('setContext', 'generate'))
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$mock_router->method('setContext') $mock_router->method('setContext')
@ -132,7 +132,7 @@ class phpbb_console_command_cron_run_test extends phpbb_database_test_case
)); ));
$mock_router = $this->getMockBuilder('\phpbb\routing\router') $mock_router = $this->getMockBuilder('\phpbb\routing\router')
->setMethods(array('setContext', 'generate')) ->onlyMethods(array('setContext', 'generate'))
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$mock_router->method('setContext') $mock_router->method('setContext')
@ -180,7 +180,7 @@ class phpbb_console_command_cron_run_test extends phpbb_database_test_case
)); ));
$mock_router = $this->getMockBuilder('\phpbb\routing\router') $mock_router = $this->getMockBuilder('\phpbb\routing\router')
->setMethods(array('setContext', 'generate')) ->onlyMethods(array('setContext', 'generate'))
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$mock_router->method('setContext') $mock_router->method('setContext')

View file

@ -62,7 +62,7 @@ class phpbb_console_user_add_test extends phpbb_console_user_base
return $response; return $response;
}; };
$helper = $this->getMockBuilder('\Symfony\Component\Console\Helper\QuestionHelper') $helper = $this->getMockBuilder('\Symfony\Component\Console\Helper\QuestionHelper')
->setMethods(['ask']) ->onlyMethods(['ask'])
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$helper->expects($this->any()) $helper->expects($this->any())

View file

@ -13,7 +13,7 @@
require_once __DIR__ . '/common_helper_route.php'; require_once __DIR__ . '/common_helper_route.php';
class phpbb_controller_helper_route_test extends phpbb_controller_common_helper_route class phpbb_controller_helper_route_root_test extends phpbb_controller_common_helper_route
{ {
protected function get_phpbb_root_path() protected function get_phpbb_root_path()
{ {

View file

@ -84,7 +84,7 @@ class phpbb_cron_manager_test extends \phpbb_test_case
)); ));
$mock_router = $this->getMockBuilder('\phpbb\routing\router') $mock_router = $this->getMockBuilder('\phpbb\routing\router')
->setMethods(array('setContext', 'generate')) ->onlyMethods(array('setContext', 'generate'))
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$mock_router->method('setContext') $mock_router->method('setContext')

View file

@ -111,7 +111,8 @@ class phpbb_cron_wrapper_test extends phpbb_template_template_test_case
{ {
$this->task = $this->getMockBuilder(\phpbb\cron\task\task::class) $this->task = $this->getMockBuilder(\phpbb\cron\task\task::class)
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(['get_name', 'run', 'is_runnable', 'should_run', 'some_method']) ->onlyMethods(['get_name', 'run', 'is_runnable', 'should_run'])
->addMethods(['some_method'])
->getMock(); ->getMock();
$this->routing_helper = $this->createMock(\phpbb\routing\helper::class); $this->routing_helper = $this->createMock(\phpbb\routing\helper::class);

View file

@ -31,15 +31,23 @@ class phpbb_dbal_connect_test extends phpbb_database_test_case
// Failure to connect results in a trigger_error call in dbal. // Failure to connect results in a trigger_error call in dbal.
// phpunit converts triggered errors to exceptions. // phpunit converts triggered errors to exceptions.
// In particular there should be no fatals here. // In particular there should be no fatals here.
try
if ($db->get_sql_layer() === 'mysqli')
{ {
$db->sql_connect($config['dbhost'], 'phpbbogus', 'phpbbogus', 'phpbbogus', $config['dbport']); $this->setExpectedTriggerError(E_WARNING);
$this->assertFalse(true);
} }
catch (Exception $e) else if ($db->get_sql_layer() !== 'sqlite3')
{ {
// should have a legitimate message $this->setExpectedTriggerError(E_USER_ERROR);
$this->assertNotEmpty($e->getMessage()); }
// For SQLite3, connection will be successful anyway as phpBB driver uses SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE flags
$result = $db->sql_connect($config['dbhost'], 'phpbbogus', 'phpbbogus', 'phpbbogus', $config['dbport']);
if ($db->get_sql_layer() === 'sqlite3')
{
$this->assertTrue($result);
} }
} }
} }

View file

@ -404,11 +404,19 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case
->will($this->returnValue(true)); ->will($this->returnValue(true));
// drop tables // drop tables
$db_tools->expects($this->exactly(2))->method('schema_drop_table') $matcher = $this->exactly(2);
->withConsecutive( $db_tools->expects($matcher)->method('schema_drop_table')
[$this->isInstanceOf(Schema::class), 'dropped_table_1', true], ->willReturnCallback(function() use ($matcher) {
[$this->isInstanceOf(Schema::class), 'dropped_table_2', true] $args = func_get_args();
); $schema = array_shift($args);
$this->assertInstanceOf(\Doctrine\DBAL\Schema\Schema::class, $schema);
match($matcher->numberOfInvocations())
{
1 => $this->assertEquals($args, ['dropped_table_1', true]),
2 => $this->assertEquals($args, ['dropped_table_2', true]),
};
}
);
$db_tools->perform_schema_changes(array( $db_tools->perform_schema_changes(array(
'drop_tables' => array( 'drop_tables' => array(
@ -432,11 +440,18 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case
->will($this->returnValue(true)); ->will($this->returnValue(true));
// drop columns // drop columns
$db_tools->expects($this->exactly(2))->method('schema_column_remove') $matcher = $this->exactly(2);
->withConsecutive( $db_tools->expects($matcher)->method('schema_column_remove')
[$this->isInstanceOf(Schema::class), 'existing_table', 'dropped_column_1', true], ->willReturnCallback(function() use ($matcher) {
[$this->isInstanceOf(Schema::class), 'existing_table', 'dropped_column_2', true] $args = func_get_args();
); $schema = array_shift($args);
$this->assertInstanceOf(\Doctrine\DBAL\Schema\Schema::class, $schema);
match($matcher->numberOfInvocations()) {
1 => $this->assertEquals($args, ['existing_table', 'dropped_column_1', true]),
2 => $this->assertEquals($args, ['existing_table', 'dropped_column_2', true]),
};
}
);
$db_tools->perform_schema_changes(array( $db_tools->perform_schema_changes(array(
'drop_columns' => array( 'drop_columns' => array(

View file

@ -15,7 +15,7 @@ namespace
{ {
require_once __DIR__ . '/fixtures/ext/vendor/enabled_4/di/extension.php'; require_once __DIR__ . '/fixtures/ext/vendor/enabled_4/di/extension.php';
class phpbb_di_container_test extends \phpbb_test_case class phpbb_di_create_container_test extends \phpbb_test_case
{ {
protected $config_php; protected $config_php;
@ -73,7 +73,8 @@ namespace
// Checks the construction of a dumped container // Checks the construction of a dumped container
$container = $this->builder->get_container(); $container = $this->builder->get_container();
$this->assertInstanceOf('phpbb_cache_container', $container); $this->assertEquals('phpbb_cache_container', $container::class);
$this->assertInstanceOf('Symfony\Component\DependencyInjection\Container', $container);
$this->assertTrue($container->isCompiled()); $this->assertTrue($container->isCompiled());
} }
@ -100,7 +101,8 @@ namespace
// Checks the construction of a dumped container // Checks the construction of a dumped container
$container = $this->builder->get_container(); $container = $this->builder->get_container();
$this->assertNotInstanceOf('phpbb_cache_container', $container); $this->assertNotEquals('phpbb_cache_container', $container::class);
$this->assertEquals('Symfony\Component\DependencyInjection\ContainerBuilder', $container::class);
$this->assertInstanceOf('Symfony\Component\DependencyInjection\ContainerBuilder', $container); $this->assertInstanceOf('Symfony\Component\DependencyInjection\ContainerBuilder', $container);
$this->assertTrue($container->isCompiled()); $this->assertTrue($container->isCompiled());
} }

View file

@ -1,7 +1,7 @@
<?php <?php
// phpBB 3.1.x auto-generated configuration file // phpBB 3.1.x auto-generated configuration file
// Do not change anything in this file! // Do not change anything in this file!
$dbms = 'mysql'; $dbms = ''; // Set this to empty value to avoid failed connection attempt as this will produce unwanted error/exception
$dbhost = '127.0.0.1'; $dbhost = '127.0.0.1';
$dbport = ''; $dbport = '';
$dbname = 'phpbb'; $dbname = 'phpbb';

View file

@ -11,7 +11,7 @@
* *
*/ */
class exception_listener extends phpbb_test_case class exception_listener_test extends phpbb_test_case
{ {
public function phpbb_exception_data() public function phpbb_exception_data()
{ {

View file

@ -229,6 +229,11 @@ class phpbb_functional_download_test extends phpbb_functional_test_case
if (!empty($data['forums'])) if (!empty($data['forums']))
{ {
array_walk($data['forums'], function(&$value, $key)
{
$value = $this->db->sql_escape($value);
}
);
$sql = 'SELECT * $sql = 'SELECT *
FROM phpbb_forums FROM phpbb_forums
WHERE ' . $this->db->sql_in_set('forum_name', $data['forums']); WHERE ' . $this->db->sql_in_set('forum_name', $data['forums']);
@ -245,6 +250,11 @@ class phpbb_functional_download_test extends phpbb_functional_test_case
if (!empty($data['topics'])) if (!empty($data['topics']))
{ {
array_walk($data['topics'], function(&$value, $key)
{
$value = $this->db->sql_escape($value);
}
);
$sql = 'SELECT * $sql = 'SELECT *
FROM phpbb_topics FROM phpbb_topics
WHERE ' . $this->db->sql_in_set('topic_title', $data['topics']); WHERE ' . $this->db->sql_in_set('topic_title', $data['topics']);
@ -262,6 +272,11 @@ class phpbb_functional_download_test extends phpbb_functional_test_case
$post_ids = array(); $post_ids = array();
if (!empty($data['posts'])) if (!empty($data['posts']))
{ {
array_walk($data['posts'], function(&$value, $key)
{
$value = $this->db->sql_escape($value);
}
);
$sql = 'SELECT * $sql = 'SELECT *
FROM phpbb_posts FROM phpbb_posts
WHERE ' . $this->db->sql_in_set('post_subject', $data['posts']); WHERE ' . $this->db->sql_in_set('post_subject', $data['posts']);
@ -276,7 +291,7 @@ class phpbb_functional_download_test extends phpbb_functional_test_case
} }
$this->db->sql_freeresult($result); $this->db->sql_freeresult($result);
if (isset($data['attachments'])) if (isset($data['attachments']) && !empty($post_ids))
{ {
$sql = 'SELECT * $sql = 'SELECT *
FROM phpbb_attachments FROM phpbb_attachments

View file

@ -23,16 +23,10 @@ class phpbb_functional_feed_test extends phpbb_functional_test_case
protected function setUp(): void protected function setUp(): void
{ {
parent::setUp(); parent::setUp();
$this->purge_cache();
}
public function __construct($name = null, array $data = array(), $dataName = '') $this->setBackupStaticPropertiesExcludeList([
{
parent::__construct($name, $data, $dataName);
$this->backupStaticAttributesExcludeList += [
'phpbb_functional_feed_test' => ['init_values'], 'phpbb_functional_feed_test' => ['init_values'],
]; ]);
$this->purge_cache(); $this->purge_cache();
} }

View file

@ -18,13 +18,13 @@ class phpbb_functional_ucp_allow_pm_test extends phpbb_functional_test_case
{ {
protected static $data = array(); protected static $data = array();
public function __construct() protected function setUp(): void
{ {
parent::__construct(); parent::setUp();
$this->backupStaticAttributesExcludeList += [ $this->setBackupStaticPropertiesExcludeList([
'phpbb_functional_ucp_allow_pm_test' => ['data'], 'phpbb_functional_ucp_allow_pm_test' => ['data'],
]; ]);
} }
// user A sends a PM to user B where B accepts PM // user A sends a PM to user B where B accepts PM

View file

@ -14,7 +14,7 @@
/** /**
* @group functional * @group functional
*/ */
class phpbb_functional_visibility_unapproved_test extends phpbb_functional_test_case class phpbb_functional_visibility_unapproved_posts_test extends phpbb_functional_test_case
{ {
protected $data = []; protected $data = [];

View file

@ -11,7 +11,7 @@
* *
*/ */
class phpbb_functions_parse_cfg_file extends phpbb_test_case class phpbb_functions_parse_cfg_file_test extends phpbb_test_case
{ {
public function parse_cfg_file_data() public function parse_cfg_file_data()
{ {

View file

@ -15,7 +15,7 @@ require_once __DIR__ . '/../../phpBB/includes/functions_user.php';
require_once __DIR__ . '/../mock/cache.php'; require_once __DIR__ . '/../mock/cache.php';
require_once __DIR__ . '/validate_data_helper.php'; require_once __DIR__ . '/validate_data_helper.php';
class phpbb_functions_validate_data_test extends phpbb_database_test_case class phpbb_functions_validate_username_test extends phpbb_database_test_case
{ {
protected $db; protected $db;
protected $cache; protected $cache;

View file

@ -13,7 +13,7 @@
require_once __DIR__ . '/../../phpBB/includes/functions_acp.php'; require_once __DIR__ . '/../../phpBB/includes/functions_acp.php';
class phpbb_functions_acp_built_select_test extends phpbb_test_case class phpbb_functions_acp_build_select_test extends phpbb_test_case
{ {
protected function setUp(): void protected function setUp(): void
{ {

View file

@ -124,97 +124,97 @@ class phpbb_functions_content_get_context_test extends TestCase
public function data_get_context_unicode(): array public function data_get_context_unicode(): array
{ {
return [ return [
'text contains words and length greater than text' => [ 'text contains words and length greater than text unicode' => [
'text' => 'Это пример текста, содержащего разнообразные слова, включая пример, текст и слова.', 'text' => 'Это пример текста, содержащего разнообразные слова, включая пример, текст и слова.',
'words' => ['пример', 'слова'], 'words' => ['пример', 'слова'],
'length' => 100, 'length' => 100,
'expected' => 'Это пример текста, содержащего разнообразные слова, включая пример, текст и слова.', 'expected' => 'Это пример текста, содержащего разнообразные слова, включая пример, текст и слова.',
], ],
'text contains words and length less than text' => [ 'text contains words and length less than text unicode' => [
'text' => 'Это пример текста, содержащего разнообразные слова, включая шаблон, текст и слова.', 'text' => 'Это пример текста, содержащего разнообразные слова, включая шаблон, текст и слова.',
'words' => ['пример', 'слова'], 'words' => ['пример', 'слова'],
'length' => 50, 'length' => 50,
'expected' => 'Это пример текста, содержащего разнообразные слова ...', 'expected' => 'Это пример текста, содержащего разнообразные слова ...',
], ],
'text does not contain words' => [ 'text does not contain words unicode' => [
'text' => 'Это пример текста, содержащего разнообразные слова, но ни одно из них не совпадает с искомыми.', 'text' => 'Это пример текста, содержащего разнообразные слова, но ни одно из них не совпадает с искомыми.',
'words' => ['nonexistent'], 'words' => ['nonexistent'],
'length' => 50, 'length' => 50,
'expected' => 'Это пример текста, содержащего разнообразные слова ...', 'expected' => 'Это пример текста, содержащего разнообразные слова ...',
], ],
'desired length equal to text length' => [ 'desired length equal to text length unicode' => [
'text' => 'Текст точной длины.', 'text' => 'Текст точной длины.',
'words' => ['Текст', 'точной'], 'words' => ['Текст', 'точной'],
'length' => 19, 'length' => 19,
'expected' => 'Текст точной длины.', 'expected' => 'Текст точной длины.',
], ],
'text with html entities' => [ 'text with html entities unicode' => [
'text' => 'Это пример текста, содержащего &amp; и &lt; и &gt; лексемы.', 'text' => 'Это пример текста, содержащего &amp; и &lt; и &gt; лексемы.',
'words' => ['пример', 'содержащего'], 'words' => ['пример', 'содержащего'],
'length' => 40, 'length' => 40,
'expected' => 'Это пример текста, содержащего &amp; и &lt; и ...', 'expected' => 'Это пример текста, содержащего &amp; и &lt; и ...',
], ],
'text with html entities and contains last word' => [ 'text with html entities and contains last word unicode' => [
'text' => 'Это пример текста, содержащего &amp; и &lt; и &gt; лексемы.', 'text' => 'Это пример текста, содержащего &amp; и &lt; и &gt; лексемы.',
'words' => ['пример', 'лексемы'], 'words' => ['пример', 'лексемы'],
'length' => 40, 'length' => 40,
'expected' => 'Это пример текста ... и &lt; и &gt; лексемы.', 'expected' => 'Это пример текста ... и &lt; и &gt; лексемы.',
], ],
'text with multiple spaces and special characters' => [ 'text with multiple spaces and special characters unicode' => [
'text' => 'Это пример текста, содержащего разнообразные слова.', 'text' => 'Это пример текста, содержащего разнообразные слова.',
'words' => ['пример', 'разнообразные'], 'words' => ['пример', 'разнообразные'],
'length' => 50, 'length' => 50,
'expected' => 'Это пример текста, содержащего разнообразные слова.', 'expected' => 'Это пример текста, содержащего разнообразные слова.',
], ],
'empty text' => [ 'empty text unicode' => [
'text' => '', 'text' => '',
'words' => ['пример', 'слова'], 'words' => ['пример', 'слова'],
'length' => 50, 'length' => 50,
'expected' => '', 'expected' => '',
], ],
'empty words array' => [ 'empty words array unicode' => [
'text' => 'Это пример текста, содержащего разнообразные слова.', 'text' => 'Это пример текста, содержащего разнообразные слова.',
'words' => [], 'words' => [],
'length' => 50, 'length' => 50,
'expected' => 'Это пример текста, содержащего разнообразные слова.', 'expected' => 'Это пример текста, содержащего разнообразные слова.',
], ],
'zero length' => [ 'zero length unicode' => [
'text' => 'Это пример текста.', 'text' => 'Это пример текста.',
'words' => ['пример'], 'words' => ['пример'],
'length' => 0, 'length' => 0,
'expected' => 'Это пример текста.', 'expected' => 'Это пример текста.',
], ],
'negative length' => [ 'negative length unicode' => [
'text' => 'Это пример текста.', 'text' => 'Это пример текста.',
'words' => ['sample'], 'words' => ['sample'],
'length' => -10, 'length' => -10,
'expected' => 'Это пример текста.', 'expected' => 'Это пример текста.',
], ],
'ellipses_beginning' => [ 'ellipses_beginning unicode' => [
'text' => 'раз раз раз раз раз раз раз раз два', 'text' => 'раз раз раз раз раз раз раз раз два',
'words' => ['два'], 'words' => ['два'],
'length' => 10, 'length' => 10,
'expected' => '... раз раз два', 'expected' => '... раз раз два',
], ],
'ellipsis_end' => [ 'ellipsis_end unicode' => [
'text' => 'два раз раз раз раз раз раз раз раз', 'text' => 'два раз раз раз раз раз раз раз раз',
'words' => ['два'], 'words' => ['два'],
'length' => 10, 'length' => 10,
'expected' => 'два раз раз ...', 'expected' => 'два раз раз ...',
], ],
'ellipsis_middle' => [ 'ellipsis_middle unicode' => [
'text' => 'раз слово1 раз раз раз раз раз раз раз раз раз слово2 раз', 'text' => 'раз слово1 раз раз раз раз раз раз раз раз раз слово2 раз',
'words' => ['слово1', 'слово2'], 'words' => ['слово1', 'слово2'],
'length' => 15, 'length' => 15,
'expected' => '... слово1 ... слово2 ...', 'expected' => '... слово1 ... слово2 ...',
], ],
'ellipsis_middle2' => [ 'ellipsis_middle2 unicode' => [
'text' => 'слово1 foo foo foo foo foo foo foo foo foo слово2', 'text' => 'слово1 foo foo foo foo foo foo foo foo foo слово2',
'words' => ['слово1', 'слово2'], 'words' => ['слово1', 'слово2'],
'length' => 10, 'length' => 10,
'expected' => 'слово1 ... слово2', 'expected' => 'слово1 ... слово2',
], ],
'fruits_spanish' => [ 'fruits_spanish unicode' => [
'text' => 'Manzana,plátano,naranja,fresa,mango,uva,piña,pera,kiwi,cereza,sandía,melón,papaya,arándano,durazno', 'text' => 'Manzana,plátano,naranja,fresa,mango,uva,piña,pera,kiwi,cereza,sandía,melón,papaya,arándano,durazno',
'words' => ['piña'], 'words' => ['piña'],
'length' => 20, 'length' => 20,

View file

@ -101,7 +101,7 @@ class phpbb_group_helper_test_case extends phpbb_test_case
// Set up path helper // Set up path helper
$path_helper = $this->getMockBuilder('\phpbb\path_helper') $path_helper = $this->getMockBuilder('\phpbb\path_helper')
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(array()) ->onlyMethods(['get_phpbb_root_path', 'get_php_ext', 'update_web_root_path'])
->getMock(); ->getMock();
$path_helper->method('get_phpbb_root_path') $path_helper->method('get_phpbb_root_path')
->willReturn($phpbb_root_path); ->willReturn($phpbb_root_path);

View file

@ -78,18 +78,20 @@ class phpbb_help_manager_test extends phpbb_test_case
$this->language->expects($this->exactly(count($questions)*2 + 1)) $this->language->expects($this->exactly(count($questions)*2 + 1))
->method('lang') ->method('lang')
->withConsecutive([$block_name], ...$question_ary) ->willReturnCallback(fn(string $arg) => strtoupper($arg));
->will($this->onConsecutiveCalls(strtoupper($block_name), ...$question_ary_upper));
$this->template->expects($this->exactly(count($questions) + 1)) $matcher = $this->exactly(count($questions) + 1);
$this->template->expects($matcher)
->method('assign_block_vars') ->method('assign_block_vars')
->withConsecutive( ->willReturnCallback(function ($arg1, $arg2) use ($matcher, $block_name, $switch_expected, $template_call_args) {
['faq_block', [ $callNr = $matcher->numberOfInvocations();
'BLOCK_TITLE' => strtoupper($block_name), match (true) {
'SWITCH_COLUMN' => $switch_expected, $callNr == 1 => $this->assertEquals([$arg1, $arg2], ['faq_block', [
]], 'BLOCK_TITLE' => strtoupper($block_name),
...$template_call_args 'SWITCH_COLUMN' => $switch_expected,
); ]]),
$callNr > 1 => $this->assertEquals([$arg1, $arg2], $template_call_args[$callNr - 2]),
};});
$this->manager->add_block($block_name, $switch, $questions); $this->manager->add_block($block_name, $switch, $questions);
@ -114,11 +116,7 @@ class phpbb_help_manager_test extends phpbb_test_case
{ {
$this->language->expects($this->exactly(2)) $this->language->expects($this->exactly(2))
->method('lang') ->method('lang')
->withConsecutive( ->willReturnCallback(fn(string $arg) => strtoupper($arg));
[$question],
[$answer]
)
->will($this->onConsecutiveCalls(strtoupper($question), strtoupper($answer)));
$this->template->expects($this->once()) $this->template->expects($this->once())
->method('assign_block_vars') ->method('assign_block_vars')
@ -137,22 +135,23 @@ class phpbb_help_manager_test extends phpbb_test_case
$this->language->expects($this->exactly(2)) $this->language->expects($this->exactly(2))
->method('lang') ->method('lang')
->withConsecutive([$block_name[0]], [$block_name[1]]) ->willReturnCallback(fn(string $arg) => strtoupper($arg));
->will($this->onConsecutiveCalls(strtoupper($block_name[0]), strtoupper($block_name[1])));
$this->template->expects($this->exactly(2)) $matcher = $this->exactly(2);
$this->template->expects($matcher)
->method('assign_block_vars') ->method('assign_block_vars')
->withConsecutive( ->willReturnCallback(function ($arg1, $arg2) use ($matcher, $block_name, $switch_expected) {
['faq_block', [ $callNr = $matcher->numberOfInvocations();
'BLOCK_TITLE' => strtoupper($block_name[0]), match (true) {
'SWITCH_COLUMN' => $switch_expected[0], $callNr == 1 => $this->assertEquals([$arg1, $arg2], ['faq_block', [
]], 'BLOCK_TITLE' => strtoupper($block_name[0]),
['faq_block', [ 'SWITCH_COLUMN' => $switch_expected[0],
'BLOCK_TITLE' => strtoupper($block_name[1]), ]]),
'SWITCH_COLUMN' => $switch_expected[1], $callNr == 2 => $this->assertEquals([$arg1, $arg2], ['faq_block', [
]] 'BLOCK_TITLE' => strtoupper($block_name[1]),
'SWITCH_COLUMN' => $switch_expected[1],
); ]]),
};});
$this->manager->add_block($block_name[0], true); $this->manager->add_block($block_name[0], true);
$this->assertTrue($this->manager->switched_column()); $this->assertTrue($this->manager->switched_column());

View file

@ -57,7 +57,7 @@ class phpbb_installer_database_helper_test extends phpbb_test_case
public function test_validate_table_prefix($expected, $test_string) public function test_validate_table_prefix($expected, $test_string)
{ {
$db_helper_mock = $this->getMockBuilder('\phpbb\install\helper\database') $db_helper_mock = $this->getMockBuilder('\phpbb\install\helper\database')
->setMethods(array('get_available_dbms')) ->onlyMethods(array('get_available_dbms'))
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();

View file

@ -25,9 +25,9 @@ class phpbb_installer_config_test extends phpbb_test_case
$phpbb_root_path = __DIR__ . './../../phpBB/'; $phpbb_root_path = __DIR__ . './../../phpBB/';
$filesystem = $this->createMock('\phpbb\filesystem\filesystem'); $filesystem = $this->createMock('\phpbb\filesystem\filesystem');
$php_ini = $this->getMockBuilder('\bantu\IniGetWrapper\IniGetWrapper') $php_ini = $this->getMockBuilder('\bantu\IniGetWrapper\IniGetWrapper')
->setMethods(array('getInt', 'getBytes')) ->onlyMethods(array('getNumeric', 'getBytes'))
->getMock(); ->getMock();
$php_ini->method('getInt') $php_ini->method('getNumeric')
->willReturn(-1); ->willReturn(-1);
$php_ini->method('getBytes') $php_ini->method('getBytes')
->willReturn(-1); ->willReturn(-1);

View file

@ -546,13 +546,13 @@ class phpbb_mention_controller_test extends phpbb_database_test_case
{ {
$this->request->expects($this->atLeast(2)) $this->request->expects($this->atLeast(2))
->method('variable') ->method('variable')
->withConsecutive( ->willReturnCallback(function() use ($keyword, $topic_id) {
['keyword', '', true], $args = func_get_args();
['topic_id', 0]) return match($args) {
->willReturnOnConsecutiveCalls( ['keyword', '', true, \phpbb\request\request_interface::REQUEST] => $keyword,
$keyword, ['topic_id', 0, false, \phpbb\request\request_interface::REQUEST] => $topic_id,
$topic_id };});
);
$data = json_decode($this->controller->handle()->getContent(), true); $data = json_decode($this->controller->handle()->getContent(), true);
$this->assertEquals($expected_result, $data); $this->assertEquals($expected_result, $data);
} }

View file

@ -120,7 +120,7 @@ class notification_method_email_test extends phpbb_tests_notification_base
$phpbb_container->getParameter('tables.notification_emails'), $phpbb_container->getParameter('tables.notification_emails'),
$phpbb_container->get('messenger.method_collection') $phpbb_container->get('messenger.method_collection')
]) ])
->setMethods(['notify_using_messenger']) ->onlyMethods(['notify_using_messenger'])
->getMock(); ->getMock();
$notification_method_email = $this->notification_method_email; $notification_method_email = $this->notification_method_email;

View file

@ -11,7 +11,7 @@
* *
*/ */
class phpbb_passwords_helper_test extends \phpbb_test_case class phpbb_passwords_drivers_test extends \phpbb_test_case
{ {
/** @var array */ /** @var array */
protected $passwords_drivers = []; protected $passwords_drivers = [];

View file

@ -112,7 +112,7 @@ class phpbb_path_helper_test extends phpbb_test_case
'php', 'php',
'adm/' 'adm/'
]) ])
->setMethods(['get_web_root_path']) ->onlyMethods(['get_web_root_path'])
->getMock(); ->getMock();
$path_helper->method('get_web_root_path') $path_helper->method('get_web_root_path')
->willReturn('/var/www/phpbb/app.php/'); ->willReturn('/var/www/phpbb/app.php/');
@ -257,7 +257,7 @@ class phpbb_path_helper_test extends phpbb_test_case
'php', 'php',
'adm/' 'adm/'
]) ])
->setMethods(['get_web_root_path']) ->onlyMethods(['get_web_root_path'])
->getMock(); ->getMock();
$path_helper->method('get_web_root_path') $path_helper->method('get_web_root_path')
->willReturn('/var/www/phpbb/'); ->willReturn('/var/www/phpbb/');
@ -462,7 +462,7 @@ class phpbb_path_helper_test extends phpbb_test_case
{ {
$symfony_request = $this->getMockBuilder('\phpbb\symfony_request') $symfony_request = $this->getMockBuilder('\phpbb\symfony_request')
->setConstructorArgs([new phpbb_mock_request()]) ->setConstructorArgs([new phpbb_mock_request()])
->setMethods(['get', 'getSchemeAndHttpHost', 'getBasePath', 'getPathInfo']) ->onlyMethods(['get', 'getSchemeAndHttpHost', 'getBasePath', 'getPathInfo'])
->getMock(); ->getMock();
$symfony_request->method('getSchemeAndHttpHost') $symfony_request->method('getSchemeAndHttpHost')
->willReturn('http://www.phpbb.com'); ->willReturn('http://www.phpbb.com');
@ -630,7 +630,7 @@ class phpbb_path_helper_test extends phpbb_test_case
{ {
$symfony_request = $this->getMockBuilder('\phpbb\symfony_request') $symfony_request = $this->getMockBuilder('\phpbb\symfony_request')
->setConstructorArgs([new phpbb_mock_request()]) ->setConstructorArgs([new phpbb_mock_request()])
->setMethods(['getScriptName']) ->onlyMethods(['getScriptName'])
->getMock(); ->getMock();
$symfony_request->method('getScriptName') $symfony_request->method('getScriptName')
->willReturn($script_name); ->willReturn($script_name);

View file

@ -113,7 +113,7 @@ class phpbb_plupload_test extends phpbb_test_case
$config = new \phpbb\config\config([]); $config = new \phpbb\config\config([]);
$ini_wrapper = $this->getMockBuilder('\bantu\IniGetWrapper\IniGetWrapper') $ini_wrapper = $this->getMockBuilder('\bantu\IniGetWrapper\IniGetWrapper')
->setMethods(['getBytes']) ->onlyMethods(['getBytes'])
->getMock(); ->getMock();
$ini_wrapper->method('getBytes') $ini_wrapper->method('getBytes')
->will($this->returnValueMap([ ->will($this->returnValueMap([

View file

@ -33,12 +33,12 @@ class phpbb_profilefield_type_bool_test extends phpbb_test_case
->will($this->returnCallback(array($this, 'return_callback_implode'))); ->will($this->returnCallback(array($this, 'return_callback_implode')));
$lang = $this->getMockBuilder('\phpbb\profilefields\lang_helper') $lang = $this->getMockBuilder('\phpbb\profilefields\lang_helper')
->setMethods(array('get_options_lang', 'is_set', 'get')) ->onlyMethods(array('load_option_lang', 'is_set', 'get'))
->setConstructorArgs(array($db, LANG_TABLE)) ->setConstructorArgs(array($db, LANG_TABLE))
->getMock(); ->getMock();
$lang->expects($this->any()) $lang->expects($this->any())
->method('get_options_lang'); ->method('load_option_lang');
$lang->expects($this->any()) $lang->expects($this->any())
->method('is_set') ->method('is_set')

View file

@ -35,12 +35,12 @@ class phpbb_profilefield_type_dropdown_test extends phpbb_test_case
$template = $this->createMock('\phpbb\template\template'); $template = $this->createMock('\phpbb\template\template');
$lang = $this->getMockBuilder('\phpbb\profilefields\lang_helper') $lang = $this->getMockBuilder('\phpbb\profilefields\lang_helper')
->setMethods(array('get_options_lang', 'is_set', 'get')) ->onlyMethods(array('load_option_lang', 'is_set', 'get'))
->setConstructorArgs(array($db, LANG_TABLE)) ->setConstructorArgs(array($db, LANG_TABLE))
->getMock(); ->getMock();
$lang->expects($this->any()) $lang->expects($this->any())
->method('get_options_lang'); ->method('load_option_lang');
$lang->expects($this->any()) $lang->expects($this->any())
->method('is_set') ->method('is_set')

View file

@ -35,7 +35,7 @@ class phpbb_template_asset_test extends phpbb_test_case
{ {
$path_helper = $this->getMockBuilder('\phpbb\path_helper') $path_helper = $this->getMockBuilder('\phpbb\path_helper')
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(array()) ->onlyMethods(['get_phpbb_root_path'])
->getMock(); ->getMock();
$path_helper->method('get_phpbb_root_path') $path_helper->method('get_phpbb_root_path')

View file

@ -38,7 +38,7 @@ class phpbb_template_extension_test extends phpbb_template_template_test_case
$user->data['user_id'] = 2; $user->data['user_id'] = 2;
$auth = $this->getMockBuilder('phpbb\auth\auth') $auth = $this->getMockBuilder('phpbb\auth\auth')
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(['acl_get']) ->onlyMethods(['acl_get'])
->getMock(); ->getMock();
$auth->method('acl_get') $auth->method('acl_get')
->willReturn(true); ->willReturn(true);

View file

@ -34,25 +34,6 @@ abstract class phpbb_database_test_case extends TestCase
*/ */
private $db_connections_doctrine; private $db_connections_doctrine;
public function __construct($name = NULL, array $data = [], $dataName = '')
{
parent::__construct($name, $data, $dataName);
$this->backupStaticAttributesExcludeList += [
'SebastianBergmann\CodeCoverage\CodeCoverage' => ['instance'],
'SebastianBergmann\CodeCoverage\Filter' => ['instance'],
'SebastianBergmann\CodeCoverage\Util' => ['ignoredLines', 'templateMethods'],
'SebastianBergmann\Timer\Timer' => ['startTimes'],
'PHP_Token_Stream' => ['customTokens'],
'PHP_Token_Stream_CachingFactory' => ['cache'],
'phpbb_database_test_case' => ['already_connected'],
];
$this->db_connections = [];
$this->db_connections_doctrine = [];
}
/** /**
* @return array List of extensions that should be set up * @return array List of extensions that should be set up
*/ */
@ -135,6 +116,20 @@ abstract class phpbb_database_test_case extends TestCase
{ {
parent::setUp(); parent::setUp();
$this->setBackupStaticPropertiesExcludeList([
'SebastianBergmann\CodeCoverage\CodeCoverage' => ['instance'],
'SebastianBergmann\CodeCoverage\Filter' => ['instance'],
'SebastianBergmann\CodeCoverage\Util' => ['ignoredLines', 'templateMethods'],
'SebastianBergmann\Timer\Timer' => ['startTimes'],
'PHP_Token_Stream' => ['customTokens'],
'PHP_Token_Stream_CachingFactory' => ['cache'],
'phpbb_database_test_case' => ['already_connected'],
]);
$this->db_connections = [];
$this->db_connections_doctrine = [];
// Resynchronise tables if a fixture was loaded // Resynchronise tables if a fixture was loaded
if (isset($this->fixture_xml_data)) if (isset($this->fixture_xml_data))
{ {

View file

@ -87,6 +87,10 @@ class phpbb_functional_test_case extends phpbb_test_case
{ {
parent::setUp(); parent::setUp();
$this->setBackupStaticPropertiesExcludeList([
'phpbb_functional_test_case' => ['config', 'already_installed'],
]);
if (!self::$install_success) if (!self::$install_success)
{ {
$this->fail('Installing phpBB has failed.'); $this->fail('Installing phpBB has failed.');
@ -97,6 +101,9 @@ class phpbb_functional_test_case extends phpbb_test_case
self::$cookieJar = new CookieJar; self::$cookieJar = new CookieJar;
// Force native client on windows platform // Force native client on windows platform
self::$http_client = strtolower(substr(PHP_OS, 0, 3)) === 'win' ? new NativeHttpClient() : HttpClient::create(); self::$http_client = strtolower(substr(PHP_OS, 0, 3)) === 'win' ? new NativeHttpClient() : HttpClient::create();
self::$http_client->withOptions([
'timeout' => 60,
]);
self::$client = new HttpBrowser(self::$http_client, null, self::$cookieJar); self::$client = new HttpBrowser(self::$http_client, null, self::$cookieJar);
// Clear the language array so that things // Clear the language array so that things
@ -216,15 +223,6 @@ class phpbb_functional_test_case extends phpbb_test_case
{ {
} }
public function __construct($name = NULL, array $data = [], $dataName = '')
{
parent::__construct($name, $data, $dataName);
$this->backupStaticAttributesExcludeList += [
'phpbb_functional_test_case' => ['config', 'already_installed'],
];
}
/** /**
* @return \phpbb\db\driver\driver_interface * @return \phpbb\db\driver\driver_interface
*/ */
@ -307,7 +305,7 @@ class phpbb_functional_test_case extends phpbb_test_case
$container->set('event_dispatcher', $phpbb_dispatcher); $container->set('event_dispatcher', $phpbb_dispatcher);
$cache = $this->getMockBuilder('\phpbb\cache\service') $cache = $this->getMockBuilder('\phpbb\cache\service')
->setConstructorArgs([$this->get_cache_driver(), $config, $this->db, $phpbb_dispatcher, $phpbb_root_path, $phpEx]) ->setConstructorArgs([$this->get_cache_driver(), $config, $this->db, $phpbb_dispatcher, $phpbb_root_path, $phpEx])
->setMethods(['deferred_purge']) ->onlyMethods(['deferred_purge'])
->getMock(); ->getMock();
$cache->method('deferred_purge') $cache->method('deferred_purge')
->willReturnCallback([$cache, 'purge']); ->willReturnCallback([$cache, 'purge']);
@ -550,7 +548,15 @@ class phpbb_functional_test_case extends phpbb_test_case
$iohandler->set_input('script_path', $parseURL['path']); $iohandler->set_input('script_path', $parseURL['path']);
$iohandler->set_input('submit_server', 'submit'); $iohandler->set_input('submit_server', 'submit');
$installer->run(); try
{
$installer->run();
}
catch (\Throwable $e)
{
// Do nothing but catch the exception as PHPUnit here throws
// "PHPUnit\Event\Code\NoTestCaseObjectOnCallStackException: Cannot find TestCase object on call stack"
}
copy($config_file, $config_file_test); copy($config_file, $config_file_test);
@ -568,7 +574,10 @@ class phpbb_functional_test_case extends phpbb_test_case
} }
global $phpbb_container; global $phpbb_container;
$phpbb_container->reset(); if (!empty($phpbb_container))
{
$phpbb_container->reset();
}
// Purge cache to remove cached files // Purge cache to remove cached files
$phpbb_container = new phpbb_mock_container_builder(); $phpbb_container = new phpbb_mock_container_builder();

View file

@ -17,11 +17,9 @@ class phpbb_test_case extends TestCase
{ {
protected $test_case_helpers; protected $test_case_helpers;
public function __construct($name = NULL, array $data = array(), $dataName = '') protected function setUp(): void
{ {
parent::__construct($name, $data, $dataName); $this->setBackupStaticPropertiesExcludeList([
$this->backupStaticAttributesExcludeList += [
'SebastianBergmann\CodeCoverage\CodeCoverage' => ['instance'], 'SebastianBergmann\CodeCoverage\CodeCoverage' => ['instance'],
'SebastianBergmann\CodeCoverage\Filter' => ['instance'], 'SebastianBergmann\CodeCoverage\Filter' => ['instance'],
'SebastianBergmann\CodeCoverage\Util' => ['ignoredLines', 'templateMethods'], 'SebastianBergmann\CodeCoverage\Util' => ['ignoredLines', 'templateMethods'],
@ -30,7 +28,7 @@ class phpbb_test_case extends TestCase
'PHP_Token_Stream_CachingFactory' => ['cache'], 'PHP_Token_Stream_CachingFactory' => ['cache'],
'phpbb_database_test_case' => ['already_connected', 'last_post_timestamp'], 'phpbb_database_test_case' => ['already_connected', 'last_post_timestamp'],
]; ]);
} }
public function get_test_case_helpers() public function get_test_case_helpers()

View file

@ -434,7 +434,7 @@ class phpbb_test_case_helpers
->disallowMockingUnknownTypes() ->disallowMockingUnknownTypes()
->getMock(); ->getMock();
$mb = $this->test_case->getMockBuilder('phpbb\\textformatter\\data_access'); $mb = $this->test_case->getMockBuilder('phpbb\\textformatter\\data_access');
$mb->setMethods(array('get_bbcodes', 'get_censored_words', 'get_smilies', 'get_styles')); $mb->onlyMethods(array('get_bbcodes', 'get_censored_words', 'get_smilies', 'get_styles'));
$mb->setConstructorArgs(array( $mb->setConstructorArgs(array(
$db_driver, $db_driver,
'phpbb_bbcodes', 'phpbb_bbcodes',
@ -488,7 +488,7 @@ class phpbb_test_case_helpers
{ {
$path_helper = $this->test_case->getMockBuilder('phpbb\\path_helper') $path_helper = $this->test_case->getMockBuilder('phpbb\\path_helper')
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(array('get_web_root_path')) ->onlyMethods(array('get_web_root_path'))
->getMock(); ->getMock();
$path_helper->expects($this->test_case->any()) $path_helper->expects($this->test_case->any())
->method('get_web_root_path') ->method('get_web_root_path')
@ -578,7 +578,7 @@ class phpbb_test_case_helpers
$user = $this->test_case->getMockBuilder('\phpbb\user') $user = $this->test_case->getMockBuilder('\phpbb\user')
->setConstructorArgs(array($lang, '\phpbb\datetime')) ->setConstructorArgs(array($lang, '\phpbb\datetime'))
->setMethods(array('format_date')) ->onlyMethods(array('format_date'))
->getMock(); ->getMock();
$user->expects($this->test_case->any()) $user->expects($this->test_case->any())
->method('format_date') ->method('format_date')

View file

@ -296,14 +296,19 @@ class phpbb_textformatter_s9e_factory_test extends phpbb_database_test_case
public function test_configure_events() public function test_configure_events()
{ {
$this->dispatcher = $this->createMock('phpbb\\event\\dispatcher_interface'); $this->dispatcher = $this->createMock('phpbb\\event\\dispatcher_interface');
$matcher = $this->exactly(2);
$this->dispatcher $this->dispatcher
->expects($this->exactly(2)) ->expects($matcher)
->method('trigger_event') ->method('trigger_event')
->withConsecutive( ->willReturnCallback(function($event, $vars) use ($matcher) {
['core.text_formatter_s9e_configure_before', $this->callback(array($this, 'configure_event_callback'))], $callNr = $matcher->numberOfInvocations();
['core.text_formatter_s9e_configure_after', $this->callback(array($this, 'configure_event_callback'))] match($callNr) {
) 1 => $this->assertEquals('core.text_formatter_s9e_configure_before', $event),
->will($this->returnArgument(1)); 2 => $this->assertEquals('core.text_formatter_s9e_configure_after', $event),
};
$this->assertTrue($this->configure_event_callback($vars));
return $vars;
});
$this->get_factory()->get_configurator(); $this->get_factory()->get_configurator();
} }

View file

@ -101,19 +101,18 @@ class phpbb_textformatter_s9e_parser_test extends phpbb_test_case
public function test_options($adapter_method, $adapter_arg, $concrete_method, $concrete_arg) public function test_options($adapter_method, $adapter_arg, $concrete_method, $concrete_arg)
{ {
$mock = $this->getMockBuilder('s9e\\TextFormatter\\Parser') $mock = $this->getMockBuilder('s9e\\TextFormatter\\Parser')
->setMethods([$concrete_method]) ->onlyMethods([$concrete_method])
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$concrete_args = (array) $concrete_arg; $concrete_args = (array) $concrete_arg;
array_walk($concrete_args, function(&$value) $matcher = $this->exactly(count($concrete_args));
{ $mock->expects($matcher)
$value = (array) $value;
}
);
$mock->expects($this->exactly(count($concrete_args)))
->method($concrete_method) ->method($concrete_method)
->withConsecutive(...$concrete_args); ->willReturnCallback(function ($arg) use ($concrete_args, $matcher) {
$callNr = $matcher->numberOfInvocations();
$this->assertEquals($arg, $concrete_args[$callNr - 1]);
});
$cache = new phpbb_mock_cache; $cache = new phpbb_mock_cache;
$cache->put('_foo_parser', $mock); $cache->put('_foo_parser', $mock);
@ -219,15 +218,22 @@ class phpbb_textformatter_s9e_parser_test extends phpbb_test_case
$dispatcher $dispatcher
); );
$matcher = $this->exactly(2);
$dispatcher $dispatcher
->expects($this->exactly(2)) ->expects($matcher)
->method('trigger_event') ->method('trigger_event')
->withConsecutive( ->willReturnCallback(function($event, $vars) use ($matcher) {
['core.text_formatter_s9e_parse_before', $this->callback(array($this, 'parse_before_event_callback'))], $callNr = $matcher->numberOfInvocations();
['core.text_formatter_s9e_parse_after', $this->callback(array($this, 'parse_after_event_callback'))] match($callNr) {
) 1 => $this->assertEquals('core.text_formatter_s9e_parse_before', $event),
->will($this->returnArgument(1)); 2 => $this->assertEquals('core.text_formatter_s9e_parse_after', $event),
};
match($callNr) {
1 => $this->assertTrue($this->parse_before_event_callback($vars)),
2 => $this->assertTrue($this->parse_after_event_callback($vars)),
};
return $vars;
});
$parser->parse('...'); $parser->parse('...');
} }

View file

@ -421,15 +421,22 @@ class phpbb_textformatter_s9e_renderer_test extends phpbb_test_case
$dispatcher $dispatcher
); );
$matcher = $this->exactly(2);
$dispatcher $dispatcher
->expects($this->exactly(2)) ->expects($matcher)
->method('trigger_event') ->method('trigger_event')
->withConsecutive( ->willReturnCallback(function($event, $vars) use ($matcher) {
['core.text_formatter_s9e_render_before', $this->callback(array($this, 'render_before_event_callback'))], $callNr = $matcher->numberOfInvocations();
['core.text_formatter_s9e_render_after', $this->callback(array($this, 'render_after_event_callback'))] match($callNr) {
) 1 => $this->assertEquals('core.text_formatter_s9e_render_before', $event),
->will($this->returnArgument(1)); 2 => $this->assertEquals('core.text_formatter_s9e_render_after', $event),
};
match($callNr) {
1 => $this->assertTrue($this->render_before_event_callback($vars)),
2 => $this->assertTrue($this->render_after_event_callback($vars)),
};
return $vars;
});
$renderer->render('<t>...</t>'); $renderer->render('<t>...</t>');
} }

View file

@ -14,7 +14,7 @@
/* /*
* @group slow * @group slow
*/ */
class phpbb_version_helper_fetch_test extends phpbb_test_case class phpbb_version_fetch_test extends phpbb_test_case
{ {
protected $cache, $version_helper; protected $cache, $version_helper;

View file

@ -41,7 +41,7 @@ class version_helper_remote_test extends \phpbb_test_case
$phpbb_dispatcher = new phpbb_mock_event_dispatcher(); $phpbb_dispatcher = new phpbb_mock_event_dispatcher();
$db = new \phpbb\db\driver\factory($container); $db = new \phpbb\db\driver\factory($container);
$this->cache = $this->getMockBuilder('\phpbb\cache\service') $this->cache = $this->getMockBuilder('\phpbb\cache\service')
->setMethods(array('get')) ->addMethods(array('get'))
->setConstructorArgs(array(new \phpbb\cache\driver\dummy(), $config, $db, $phpbb_dispatcher, '../../', 'php')) ->setConstructorArgs(array(new \phpbb\cache\driver\dummy(), $config, $db, $phpbb_dispatcher, '../../', 'php'))
->getMock(); ->getMock();

View file

@ -208,7 +208,7 @@ class phpbb_version_helper_test extends phpbb_test_case
$version_helper = $this $version_helper = $this
->getMockBuilder('\phpbb\version_helper') ->getMockBuilder('\phpbb\version_helper')
->setMethods(array( ->onlyMethods(array(
'get_versions_matching_stability', 'get_versions_matching_stability',
)) ))
->setConstructorArgs(array( ->setConstructorArgs(array(
@ -324,7 +324,7 @@ class phpbb_version_helper_test extends phpbb_test_case
$version_helper = $this $version_helper = $this
->getMockBuilder('\phpbb\version_helper') ->getMockBuilder('\phpbb\version_helper')
->setMethods(array( ->onlyMethods(array(
'get_versions_matching_stability', 'get_versions_matching_stability',
)) ))
->setConstructorArgs(array( ->setConstructorArgs(array(
@ -581,7 +581,7 @@ class phpbb_version_helper_test extends phpbb_test_case
$version_helper = $this $version_helper = $this
->getMockBuilder('\phpbb\version_helper') ->getMockBuilder('\phpbb\version_helper')
->setMethods(array( ->onlyMethods(array(
'get_versions_matching_stability', 'get_versions_matching_stability',
)) ))
->setConstructorArgs(array( ->setConstructorArgs(array(
@ -958,7 +958,7 @@ class phpbb_version_helper_test extends phpbb_test_case
$version_helper = $this $version_helper = $this
->getMockBuilder('\phpbb\version_helper') ->getMockBuilder('\phpbb\version_helper')
->setMethods(array( ->onlyMethods(array(
'get_versions_matching_stability', 'get_versions_matching_stability',
)) ))
->setConstructorArgs(array( ->setConstructorArgs(array(