1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-06-05 05:55:15 +02:00
php-phpbb/tests/extension/metadata_manager_test.php
Marc Alexander 0fe95a032b
[ticket/16956] Remove router cache flag
The deferred purge will be used in the future instead. The cache flag in the
router only causes additional issues by trying to rebuild the routing
mid-request

PHPBB3-16956
2022-01-31 16:52:19 +01:00

370 lines
8.8 KiB
PHP

<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
{
protected $class_loader;
protected $extension_manager;
protected $cache;
protected $config;
protected $db;
protected $db_tools;
protected $table_prefix;
protected $phpbb_root_path;
protected $phpEx;
protected $migrator;
protected $template;
protected $user;
public function getDataSet()
{
return $this->createXMLDataSet(__DIR__ . '/fixtures/extensions.xml');
}
protected function setUp(): void
{
parent::setUp();
$this->config = new \phpbb\config\config(array(
'version' => '3.1.0',
));
$this->db = $this->new_dbal();
$factory = new \phpbb\db\tools\factory();
$this->db_tools = $factory->get($this->db);
$this->phpbb_root_path = __DIR__ . '/';
$this->phpEx = 'php';
$this->cache = new \phpbb\cache\service(new phpbb_mock_cache(), $this->config, $this->db, $this->phpbb_root_path, $this->phpEx);
$this->table_prefix = 'phpbb_';
$container = new phpbb_mock_container_builder();
$cache_path = $this->phpbb_root_path . 'cache/twig';
$context = new \phpbb\template\context();
$loader = new \phpbb\template\twig\loader(new \phpbb\filesystem\filesystem(), '');
$filesystem = new \phpbb\filesystem\filesystem();
$phpbb_path_helper = new \phpbb\path_helper(
new \phpbb\symfony_request(
new phpbb_mock_request()
),
$filesystem,
$this->createMock('\phpbb\request\request'),
$this->phpbb_root_path,
$this->phpEx
);
$twig = new \phpbb\template\twig\environment(
$this->config,
$filesystem,
$phpbb_path_helper,
$cache_path,
null,
$loader,
new \phpbb\event\dispatcher($container),
array(
'cache' => false,
'debug' => false,
'auto_reload' => true,
'autoescape' => false,
)
);
$this->migrator = new \phpbb\db\migrator(
$container,
$this->config,
$this->db,
$this->db_tools,
'phpbb_migrations',
$this->phpbb_root_path,
'php',
$this->table_prefix,
array(),
new \phpbb\db\migration\helper()
);
$container->set('migrator', $this->migrator);
$this->extension_manager = new \phpbb\extension\manager(
$container,
$this->db,
$this->config,
new \phpbb\filesystem\filesystem(),
'phpbb_ext',
$this->phpbb_root_path,
$this->phpEx,
$this->cache
);
global $phpbb_root_path;
$lang_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $this->phpEx);
$lang_loader->set_extension_manager($this->extension_manager);
$lang = new \phpbb\language\language($lang_loader);
$this->user = new \phpbb\user($lang, '\phpbb\datetime');
$this->template = new phpbb\template\twig\twig($phpbb_path_helper, $this->config, $context, $twig, $cache_path, $this->user, array(new \phpbb\template\twig\extension($context, $twig, $this->user)));
$twig->setLexer(new \phpbb\template\twig\lexer($twig));
}
// Should fail from missing composer.json
public function test_bar()
{
$ext_name = 'vendor3/bar';
$manager = $this->get_metadata_manager($ext_name);
try
{
$manager->get_metadata();
}
catch (\phpbb\extension\exception $e)
{
$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
$this->assertEquals($message, $this->user->lang('FILE_NOT_FOUND', $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 = 'vendor2/foo';
$manager = $this->get_metadata_manager($ext_name);
try
{
$metadata = $manager->get_metadata();
}
catch (\phpbb\extension\exception $e)
{
$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
$this->fail($message);
}
$json = json_decode(file_get_contents($this->phpbb_root_path . 'ext/vendor2/foo/composer.json'), true);
array_walk_recursive($json, array($manager, 'sanitize_json'));
$this->assertEquals($metadata, $json);
}
public function validator_non_existing_data()
{
return array(
array('name'),
array('type'),
array('license'),
array('version'),
);
}
/**
* @dataProvider validator_non_existing_data
*/
public function test_validator_non_existing($field_name)
{
$manager = $this->get_metadata_manager('validator');
try
{
$manager->validate($field_name);
$this->fail('Exception not triggered');
}
catch (\phpbb\extension\exception $e)
{
$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
$this->assertEquals($message, $this->user->lang('META_FIELD_NOT_SET', $field_name));
}
}
public function test_validator_non_existing_authors()
{
$manager = $this->get_metadata_manager('validator');
try
{
$manager->validate_authors();
$this->fail('Exception not triggered');
}
catch (\phpbb\extension\exception $e)
{
$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
$this->assertEquals($message, $this->user->lang('META_FIELD_NOT_SET', 'authors'));
}
$manager->merge_metadata(array(
'authors' => array(
array(),
),
));
try
{
$manager->validate_authors();
$this->fail('Exception not triggered');
}
catch (\phpbb\extension\exception $e)
{
$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
$this->assertEquals($message, $this->user->lang('META_FIELD_NOT_SET', 'author name'));
}
}
public function validator_invalid_data()
{
return array(
array('name', 'asdf'),
array('type', 'asdf'),
array('license', ''),
array('version', ''),
);
}
/**
* @dataProvider validator_invalid_data
*/
public function test_validator_invalid($field_name, $field_value)
{
$manager = $this->get_metadata_manager('validator');
// Invalid data
$manager->set_metadata(array(
$field_name => $field_value,
));
try
{
$manager->validate($field_name);
$this->fail('Exception not triggered');
}
catch (\phpbb\extension\exception $e)
{
$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
$this->assertEquals($message, $this->user->lang('META_FIELD_INVALID', $field_name));
}
}
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' => 'phpbb-extension',
'license' => 'GPL v2',
'version' => '1.0.0',
));
try
{
$this->assertEquals(true, $manager->validate('enable'));
}
catch (\phpbb\extension\exception $e)
{
$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
}
}
public function validator_requirements_data()
{
return array(
array(
'10.0.0',
'100.2.0',
false,
false,
'Versions are not compared at the moment',
),
array(
'5.3.0',
'3.1.0-beta',
true,
true,
),
array(
'>' . phpversion(),
'>3.1.0',
false,
false,
'Versions are not compared at the moment',
),
array(
'<' . phpversion(),
'<3.1.0',
false,
false,
'Versions are not compared at the moment',
),
array(
phpversion(),
'3.1.0',
true,
true,
),
array(
'>=' . phpversion(),
'>=3.1.0',
true,
true,
),
array(
'<=' . phpversion(),
'<=3.1.0',
true,
true,
),
);
}
/**
* @dataProvider validator_requirements_data
*/
public function test_validator_requirements($php_version, $phpbb_version, $expected_php, $expected_phpbb, $incomplete_reason = '')
{
if ($incomplete_reason)
{
$this->markTestIncomplete($incomplete_reason);
}
$ext_name = 'validator';
$manager = $this->get_metadata_manager($ext_name);
// Too high of requirements
$manager->merge_metadata(array(
'require' => array(
'php' => $php_version,
),
'extra' => array(
'soft-require' => array(
'phpbb/phpbb' => $phpbb_version, // config is set to 3.1.0
),
),
));
$this->assertEquals($expected_php, $manager->validate_require_php());
$this->assertEquals($expected_phpbb, $manager->validate_require_phpbb());
}
/**
* Get an instance of the metadata manager
*
* @param string $ext_name
* @return phpbb_mock_metadata_manager
*/
private function get_metadata_manager($ext_name)
{
return new phpbb_mock_metadata_manager(
$ext_name,
$this->extension_manager->get_extension_path($ext_name, true)
);
}
}