diff options
author | Nathan Guse <nathaniel.guse@gmail.com> | 2012-07-28 14:59:55 -0500 |
---|---|---|
committer | Unknown Bliss <m@michaelcullum.com> | 2012-09-01 15:05:47 +0100 |
commit | 500879520c40a71f0b83799ab3e59c86c12a801a (patch) | |
tree | 48730f977cf9c079b76be7d1f063994dcbf4d680 | |
parent | 8c5786636a534baf28b4820a730f85948c3dccf4 (diff) | |
download | forums-500879520c40a71f0b83799ab3e59c86c12a801a.tar forums-500879520c40a71f0b83799ab3e59c86c12a801a.tar.gz forums-500879520c40a71f0b83799ab3e59c86c12a801a.tar.bz2 forums-500879520c40a71f0b83799ab3e59c86c12a801a.tar.xz forums-500879520c40a71f0b83799ab3e59c86c12a801a.zip |
[ticket/10631] Metadata manager tests
PHPBB3-10631
-rw-r--r-- | phpBB/includes/extension/metadata_manager.php | 59 | ||||
-rw-r--r-- | tests/extension/ext/foo/composer.json | 22 | ||||
-rw-r--r-- | tests/extension/metadata_manager_test.php | 374 | ||||
-rw-r--r-- | tests/extension/phpbb_extension_metadata_manager_test.php | 54 |
4 files changed, 426 insertions, 83 deletions
diff --git a/phpBB/includes/extension/metadata_manager.php b/phpBB/includes/extension/metadata_manager.php index 27b04d4c08..c7f52b7c02 100644 --- a/phpBB/includes/extension/metadata_manager.php +++ b/phpBB/includes/extension/metadata_manager.php @@ -178,36 +178,37 @@ class phpbb_extension_metadata_manager 'version' => '#.+#', ); - if (isset($fields[$name])) + switch ($name) { - if (!isset($this->metadata[$name])) - { - throw new phpbb_extension_exception("Required meta field '$name' has not been set."); - } - - if (!preg_match($fields[$name], $this->metadata[$name])) - { - throw new phpbb_extension_exception("Meta field '$name' is invalid."); - } - } - - // Validate all fields - if ($name == 'all') - { - $this->validate('display'); + case 'all': + $this->validate('display'); - $this->validate_enable(); - } + $this->validate_enable(); + break; - // Validate display fields - if ($name == 'display') - { - foreach ($fields as $field => $data) - { - $this->validate($field); - } + case 'display': + foreach ($fields as $field => $data) + { + $this->validate($field); + } - $this->validate_authors(); + $this->validate_authors(); + break; + + default: + if (isset($fields[$name])) + { + if (!isset($this->metadata[$name])) + { + throw new phpbb_extension_exception("Required meta field '$name' has not been set."); + } + + if (!preg_match($fields[$name], $this->metadata[$name])) + { + throw new phpbb_extension_exception("Meta field '$name' is invalid."); + } + } + break; } return true; @@ -218,7 +219,7 @@ class phpbb_extension_metadata_manager * * @return boolean True when passes validation, throws exception if invalid */ - private function validate_authors() + public function validate_authors() { if (empty($this->metadata['authors'])) { @@ -258,7 +259,7 @@ class phpbb_extension_metadata_manager * * @return boolean True when passes validation */ - private function validate_require_phpbb() + public function validate_require_phpbb() { if (!isset($this->metadata['require']['phpbb'])) { @@ -273,7 +274,7 @@ class phpbb_extension_metadata_manager * * @return boolean True when passes validation */ - private function validate_require_php() + public function validate_require_php() { if (!isset($this->metadata['require']['php'])) { diff --git a/tests/extension/ext/foo/composer.json b/tests/extension/ext/foo/composer.json new file mode 100644 index 0000000000..14af677dac --- /dev/null +++ b/tests/extension/ext/foo/composer.json @@ -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": "GNU GPL v2", + "authors": [{ + "name": "Nathan Guse", + "username": "EXreaction", + "email": "nathaniel.guse@gmail.com", + "homepage": "http://lithiumstudios.org", + "role": "N/A" + }], + "require": { + "php": ">=5.3", + "phpbb": "3.1.0-dev" + }, + "extra": { + "display-name": "phpBB Foo Extension" + } +} diff --git a/tests/extension/metadata_manager_test.php b/tests/extension/metadata_manager_test.php new file mode 100644 index 0000000000..67630e9f36 --- /dev/null +++ b/tests/extension/metadata_manager_test.php @@ -0,0 +1,374 @@ +<?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 $phpbb_root_path; + + public function getDataSet() + { + return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/extensions.xml'); + } + + protected function setUp() + { + parent::setUp(); + + $this->phpbb_root_path = dirname(__FILE__) . '/'; + + $this->extension_manager = new phpbb_extension_manager( + $this->new_dbal(), + new phpbb_config(array()), + 'phpbb_ext', + $this->phpbb_root_path, + '.php', + new phpbb_mock_cache + ); + } + + // Should fail from missing composer.json + public function test_bar() + { + $ext_name = 'bar'; + + $manager = new phpbb_extension_metadata_manager_test( + $ext_name, + $this->new_dbal(), + $this->extension_manager, + $this->phpbb_root_path, + '.php', + new phpbb_template( + $this->phpbb_root_path, + '.php', + new phpbb_config(array()), + new phpbb_user(), + new phpbb_style_resource_locator() + ), + new phpbb_config(array()) + ); + + 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 = new phpbb_extension_metadata_manager_test( + $ext_name, + $this->new_dbal(), + $this->extension_manager, + $this->phpbb_root_path, + '.php', + new phpbb_template( + $this->phpbb_root_path, + '.php', + new phpbb_config(array()), + new phpbb_user(), + new phpbb_style_resource_locator() + ), + new phpbb_config(array()) + ); + + 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() + { + $ext_name = 'validator'; + + $manager = new phpbb_extension_metadata_manager_test( + $ext_name, + $this->new_dbal(), + $this->extension_manager, + $this->phpbb_root_path, + '.php', + new phpbb_template( + $this->phpbb_root_path, + '.php', + new phpbb_config(array()), + new phpbb_user(), + new phpbb_style_resource_locator() + ), + new phpbb_config(array( + 'version' => '3.1.0', + )) + ); + + // Non-existant data + try + { + $manager->validate('name'); + } + catch(phpbb_extension_exception $e) {} + $this->assertEquals((string) $e, 'Required meta field \'name\' has not been set.'); + + try + { + $manager->validate('type'); + } + catch(phpbb_extension_exception $e) {} + $this->assertEquals((string) $e, 'Required meta field \'type\' has not been set.'); + + try + { + $manager->validate('licence'); + } + catch(phpbb_extension_exception $e) {} + $this->assertEquals((string) $e, 'Required meta field \'licence\' has not been set.'); + + try + { + $manager->validate('version'); + } + catch(phpbb_extension_exception $e) {} + $this->assertEquals((string) $e, 'Required meta field \'version\' has not been set.'); + + try + { + $manager->validate_authors(); + } + 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(); + } + catch(phpbb_extension_exception $e) {} + $this->assertEquals((string) $e, 'Required meta field \'author name\' has not been set.'); + + + // Invalid data + $manager->set_metadata(array( + 'name' => 'asdf', + 'type' => 'asdf', + 'licence' => '', + 'version' => '', + )); + + try + { + $manager->validate('name'); + } + catch(phpbb_extension_exception $e) {} + $this->assertEquals((string) $e, 'Meta field \'name\' is invalid.'); + + try + { + $manager->validate('type'); + } + catch(phpbb_extension_exception $e) {} + $this->assertEquals((string) $e, 'Meta field \'type\' is invalid.'); + + try + { + $manager->validate('licence'); + } + catch(phpbb_extension_exception $e) {} + $this->assertEquals((string) $e, 'Meta field \'licence\' is invalid.'); + + try + { + $manager->validate('version'); + } + catch(phpbb_extension_exception $e) {} + $this->assertEquals((string) $e, 'Meta field \'version\' is invalid.'); + + + // 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); + } + + + // 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); + } + } +} + +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); + } +}
\ No newline at end of file diff --git a/tests/extension/phpbb_extension_metadata_manager_test.php b/tests/extension/phpbb_extension_metadata_manager_test.php deleted file mode 100644 index 0d115d37eb..0000000000 --- a/tests/extension/phpbb_extension_metadata_manager_test.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php -/** -* -* @package testing -* @copyright (c) 2011 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ - -class phpbb_extension_metadata_manager_test extends phpbb_database_test_case -{ - protected $class_loader; - protected $extension_manager; - - public function getDataSet() - { - return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/extensions.xml'); - } - - protected function setUp() - { - parent::setUp(); - - $this->extension_manager = new phpbb_extension_manager( - $this->new_dbal(), - new phpbb_config(array()), - 'phpbb_ext', - dirname(__FILE__) . '/', - '.php', - new phpbb_mock_cache - ); - } - - public function test_bar() - { - $phpbb_extension_metadata_manager = new phpbb_extension_metadata_manager( - 'bar', - $this->new_dbal(), - $this->extension_manager, - dirname(__FILE__) . '/', - '.php', - new phpbb_template( - dirname(__FILE__) . '/', - '.php', - new phpbb_config(array()), - new phpbb_user(), - new phpbb_style_resource_locator() - ), - new phpbb_config(array()) - ); - - //$this->assertEquals(array('bar', 'foo', 'vendor/moo'), array_keys($this->extension_manager->all_available())); - } -}
\ No newline at end of file |