diff options
| -rw-r--r-- | phpBB/includes/functions_install.php | 44 | ||||
| -rw-r--r-- | phpBB/install/install_install.php | 27 | ||||
| -rw-r--r-- | phpunit.xml.dist | 1 | ||||
| -rw-r--r-- | phpunit.xml.functional | 48 | ||||
| -rw-r--r-- | tests/bootstrap.php | 1 | ||||
| -rw-r--r-- | tests/functional/browse_test.php | 26 | ||||
| -rw-r--r-- | tests/test_framework/phpbb_database_test_case.php | 42 | ||||
| -rw-r--r-- | tests/test_framework/phpbb_functional_test_case.php | 148 | ||||
| -rw-r--r-- | tests/test_framework/phpbb_test_case_helpers.php | 55 | ||||
| -rw-r--r-- | vendor/goutte.phar | bin | 0 -> 267414 bytes | 
10 files changed, 328 insertions, 64 deletions
diff --git a/phpBB/includes/functions_install.php b/phpBB/includes/functions_install.php index 4746b2f6e1..7742bb9263 100644 --- a/phpBB/includes/functions_install.php +++ b/phpBB/includes/functions_install.php @@ -104,7 +104,7 @@ function get_available_dbms($dbms = false, $return_unavailable = false, $only_20  			'DRIVER'		=> 'mssqlnative',  			'AVAILABLE'		=> true,  			'2.0.x'			=> false, -		),			 +		),  		'oracle'	=>	array(  			'LABEL'			=> 'Oracle',  			'SCHEMA'		=> 'oracle', @@ -555,3 +555,45 @@ function adjust_language_keys_callback($matches)  		return (!empty($lang[$matches[1]])) ? $db->sql_escape($lang[$matches[1]]) : $db->sql_escape($matches[1]);  	}  } + +function phpbb_create_config_file_data($data, $dbms, $load_extensions, $debug = false) +{ +	$load_extensions = implode(',', $load_extensions); + +	$config_data = "<?php\n"; +	$config_data .= "// phpBB 3.0.x auto-generated configuration file\n// Do not change anything in this file!\n"; + +	$config_data_array = array( +		'dbms'			=> $dbms, +		'dbhost'		=> $data['dbhost'], +		'dbport'		=> $data['dbport'], +		'dbname'		=> $data['dbname'], +		'dbuser'		=> $data['dbuser'], +		'dbpasswd'		=> htmlspecialchars_decode($data['dbpasswd']), +		'table_prefix'	=> $data['table_prefix'], +		'acm_type'		=> 'file', +		'load_extensions'	=> $load_extensions, +	); + +	foreach ($config_data_array as $key => $value) +	{ +		$config_data .= "\${$key} = '" . str_replace("'", "\\'", str_replace('\\', '\\\\', $value)) . "';\n"; +	} + +	$config_data .= "\n@define('PHPBB_INSTALLED', true);\n"; + +	if ($debug) +	{ +		$config_data .= "@define('DEBUG', true);\n"; +		$config_data .= "@define('DEBUG_EXTRA', true);\n"; +	} +	else +	{ +		$config_data .= "// @define('DEBUG', true);\n"; +		$config_data .= "// @define('DEBUG_EXTRA', true);\n"; +	} + +	$config_data .= '?' . '>'; // Done this to prevent highlighting editors getting confused! + +	return $config_data; +} diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php index f8c54678bf..439bebf27e 100644 --- a/phpBB/install/install_install.php +++ b/phpBB/install/install_install.php @@ -876,33 +876,8 @@ class install_install extends module  		@chmod($phpbb_root_path . 'cache/install_lock', 0777); -		$load_extensions = implode(',', $load_extensions); -  		// Time to convert the data provided into a config file -		$config_data = "<?php\n"; -		$config_data .= "// phpBB 3.0.x auto-generated configuration file\n// Do not change anything in this file!\n"; - -		$config_data_array = array( -			'dbms'			=> $available_dbms[$data['dbms']]['DRIVER'], -			'dbhost'		=> $data['dbhost'], -			'dbport'		=> $data['dbport'], -			'dbname'		=> $data['dbname'], -			'dbuser'		=> $data['dbuser'], -			'dbpasswd'		=> htmlspecialchars_decode($data['dbpasswd']), -			'table_prefix'	=> $data['table_prefix'], -			'acm_type'		=> 'file', -			'load_extensions'	=> $load_extensions, -		); - -		foreach ($config_data_array as $key => $value) -		{ -			$config_data .= "\${$key} = '" . str_replace("'", "\\'", str_replace('\\', '\\\\', $value)) . "';\n"; -		} -		unset($config_data_array); - -		$config_data .= "\n@define('PHPBB_INSTALLED', true);\n"; -		$config_data .= "// @define('DEBUG', true);\n"; -		$config_data .= "// @define('DEBUG_EXTRA', true);\n"; +		$config_data = phpbb_create_config_file_data($data, $available_dbms[$data['dbms']]['DRIVER'], $load_extensions);  		// Attempt to write out the config file directly. If it works, this is the easiest way to do it ...  		if ((file_exists($phpbb_root_path . 'config.' . $phpEx) && phpbb_is_writable($phpbb_root_path . 'config.' . $phpEx)) || phpbb_is_writable($phpbb_root_path)) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index a2bf2288cc..27dee48aac 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -19,6 +19,7 @@      <groups>          <exclude> +            <group>functional</group>              <group>slow</group>          </exclude>      </groups> diff --git a/phpunit.xml.functional b/phpunit.xml.functional new file mode 100644 index 0000000000..9facbcff8b --- /dev/null +++ b/phpunit.xml.functional @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<phpunit backupGlobals="true" +         backupStaticAttributes="true" +         colors="true" +         convertErrorsToExceptions="true" +         convertNoticesToExceptions="true" +         convertWarningsToExceptions="true" +         processIsolation="false" +         stopOnFailure="false" +         syntaxCheck="false" +         bootstrap="tests/bootstrap.php" +> +    <testsuites> +        <testsuite name="phpBB Test Suite"> +            <directory suffix="_test.php">./tests/</directory> +        </testsuite> +    </testsuites> + +    <groups> +        <include> +            <group>functional</group> +        </include> +    </groups> + +    <filter> +        <blacklist> +            <directory>./tests/</directory> +        </blacklist> +        <whitelist> +            <directory suffix=".php">./phpBB/includes/</directory> +            <exclude> +                <file>./phpBB/includes/db/firebird.php</file> +                <file>./phpBB/includes/db/mysql.php</file> +                <file>./phpBB/includes/db/mysqli.php</file> +                <file>./phpBB/includes/db/mssql.php</file> +                <file>./phpBB/includes/db/mssql_odbc.php</file> +                <file>./phpBB/includes/db/mssqlnative.php</file> +                <file>./phpBB/includes/db/oracle.php</file> +                <file>./phpBB/includes/db/postgres.php</file> +                <file>./phpBB/includes/db/sqlite.php</file> +                <file>./phpBB/includes/search/fulltext_native.php</file> +                <file>./phpBB/includes/search/fulltext_mysql.php</file> +                <directory suffix=".php">./phpBB/includes/captcha/</directory> +            </exclude> +        </whitelist> +    </filter> +</phpunit> diff --git a/tests/bootstrap.php b/tests/bootstrap.php index b7c3534cde..9a1c8857c0 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -39,3 +39,4 @@ require_once 'test_framework/phpbb_test_case_helpers.php';  require_once 'test_framework/phpbb_test_case.php';  require_once 'test_framework/phpbb_database_test_case.php';  require_once 'test_framework/phpbb_database_test_connection_manager.php'; +require_once 'test_framework/phpbb_functional_test_case.php'; diff --git a/tests/functional/browse_test.php b/tests/functional/browse_test.php new file mode 100644 index 0000000000..9c1d04f35d --- /dev/null +++ b/tests/functional/browse_test.php @@ -0,0 +1,26 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +/** +* @group functional +*/ +class phpbb_functional_browse_test extends phpbb_functional_test_case +{ +	public function test_index() +	{ +		$crawler = $this->request('GET', 'index.php'); +		$this->assertGreaterThan(0, $crawler->filter('.topiclist')->count()); +	} + +	public function test_viewforum() +	{ +		$crawler = $this->request('GET', 'viewforum.php?f=2'); +		$this->assertGreaterThan(0, $crawler->filter('.topiclist')->count()); +	} +} diff --git a/tests/test_framework/phpbb_database_test_case.php b/tests/test_framework/phpbb_database_test_case.php index e1b368dcea..b1484450b8 100644 --- a/tests/test_framework/phpbb_database_test_case.php +++ b/tests/test_framework/phpbb_database_test_case.php @@ -40,46 +40,14 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test  	public function get_database_config()  	{ -		if (isset($_SERVER['PHPBB_TEST_DBMS'])) -		{ -			return array( -				'dbms'		=> isset($_SERVER['PHPBB_TEST_DBMS']) ? $_SERVER['PHPBB_TEST_DBMS'] : '', -				'dbhost'	=> isset($_SERVER['PHPBB_TEST_DBHOST']) ? $_SERVER['PHPBB_TEST_DBHOST'] : '', -				'dbport'	=> isset($_SERVER['PHPBB_TEST_DBPORT']) ? $_SERVER['PHPBB_TEST_DBPORT'] : '', -				'dbname'	=> isset($_SERVER['PHPBB_TEST_DBNAME']) ? $_SERVER['PHPBB_TEST_DBNAME'] : '', -				'dbuser'	=> isset($_SERVER['PHPBB_TEST_DBUSER']) ? $_SERVER['PHPBB_TEST_DBUSER'] : '', -				'dbpasswd'	=> isset($_SERVER['PHPBB_TEST_DBPASSWD']) ? $_SERVER['PHPBB_TEST_DBPASSWD'] : '', -			); -		} -		else if (file_exists(dirname(__FILE__) . '/../test_config.php')) -		{ -			include(dirname(__FILE__) . '/../test_config.php'); - -			return array( -				'dbms'		=> $dbms, -				'dbhost'	=> $dbhost, -				'dbport'	=> $dbport, -				'dbname'	=> $dbname, -				'dbuser'	=> $dbuser, -				'dbpasswd'	=> $dbpasswd, -			); -		} -		else if (extension_loaded('sqlite') && version_compare(PHPUnit_Runner_Version::id(), '3.4.15', '>=')) -		{ -			// Silently use sqlite -			return array( -				'dbms'		=> 'sqlite', -				'dbhost'	=> dirname(__FILE__) . '/../phpbb_unit_tests.sqlite2', // filename -				'dbport'	=> '', -				'dbname'	=> '', -				'dbuser'	=> '', -				'dbpasswd'	=> '', -			); -		} -		else +		$config = phpbb_test_case_helpers::get_test_config(); + +		if (!isset($config['dbms']))  		{  			$this->markTestSkipped('Missing test_config.php: See first error.');  		} + +		return $config;  	}  	public function getConnection() diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php new file mode 100644 index 0000000000..18bf2a84a8 --- /dev/null +++ b/tests/test_framework/phpbb_functional_test_case.php @@ -0,0 +1,148 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once __DIR__ . '/../../vendor/goutte.phar'; +require_once __DIR__ . '/../../phpBB/includes/functions_install.php'; + +class phpbb_functional_test_case extends phpbb_test_case +{ +	protected $client; +	protected $root_url; + +	static protected $config = array(); +	static protected $already_installed = false; + +	public function setUp() +	{ +		if (!isset(self::$config['phpbb_functional_url'])) +		{ +			$this->markTestSkipped('phpbb_functional_url was not set in test_config and wasn\'t set as PHPBB_FUNCTIONAL_URL environment variable either.'); +		} + +		$this->client = new Goutte\Client(); +		$this->root_url = self::$config['phpbb_functional_url']; +	} + +	public function request($method, $path) +	{ +		return $this->client->request($method, $this->root_url . $path); +	} + +	public function __construct($name = NULL, array $data = array(), $dataName = '') +	{ +		parent::__construct($name, $data, $dataName); + +		$this->backupStaticAttributesBlacklist += array( +			'phpbb_functional_test_case' => array('config', 'already_installed'), +		); + +		if (!self::$already_installed) +		{ +			$this->install_board(); +			self::$already_installed = true; +		} +	} + +	protected function install_board() +	{ +		global $phpbb_root_path, $phpEx; + +		self::$config = phpbb_test_case_helpers::get_test_config(); + +		if (!isset(self::$config['phpbb_functional_url'])) +		{ +			return; +		} + +		self::$config['table_prefix'] = 'phpbb_'; +		$this->recreate_database(self::$config); + +		if (file_exists($phpbb_root_path . "config.$phpEx")) +		{ +			if (!file_exists($phpbb_root_path . "config_dev.$phpEx")) +			{ +				rename($phpbb_root_path . "config.$phpEx", $phpbb_root_path . "config_dev.$phpEx"); +			} +			else +			{ +				unlink($phpbb_root_path . "config.$phpEx"); +			} +		} + +		// begin data +		$data = array(); + +		$data = array_merge($data, self::$config); + +		$data = array_merge($data, array( +			'default_lang'	=> 'en', +			'admin_name'	=> 'admin', +			'admin_pass1'	=> 'admin', +			'admin_pass2'	=> 'admin', +			'board_email1'	=> 'nobody@example.com', +			'board_email2'	=> 'nobody@example.com', +		)); + +		$parseURL = parse_url(self::$config['phpbb_functional_url']); + +		$data = array_merge($data, array( +			'email_enable'		=> false, +			'smtp_delivery'		=> false, +			'smtp_host'		=> '', +			'smtp_auth'		=> '', +			'smtp_user'		=> '', +			'smtp_pass'		=> '', +			'cookie_secure'		=> false, +			'force_server_vars'	=> false, +			'server_protocol'	=> $parseURL['scheme'] . '://', +			'server_name'		=> 'localhost', +			'server_port'		=> isset($parseURL['port']) ? (int) $parseURL['port'] : 80, +			'script_path'		=> $parseURL['path'], +		)); +		// end data + +		$content = $this->do_request('install'); +		$this->assertContains('Welcome to Installation', $content); + +		$this->do_request('create_table', $data); + +		file_put_contents($phpbb_root_path . "config.$phpEx", phpbb_create_config_file_data($data, self::$config['dbms'], array(), true)); + +		$this->do_request('config_file', $data); + +		copy($phpbb_root_path . "config.$phpEx", $phpbb_root_path . "config_test.$phpEx"); + +		$this->do_request('final', $data); +	} + +	private function do_request($sub, $post_data = null) +	{ +		$context = null; + +		if ($post_data) +		{ +			$context = stream_context_create(array( +				'http' => array( +					'method'	=> 'POST', +					'header'	=> 'Content-Type: application/x-www-form-urlencoded', +					'content'	=> http_build_query($post_data), +					'ignore_errors' => true, +				), +			)); +		} + +		return file_get_contents(self::$config['phpbb_functional_url'] . 'install/index.php?mode=install&sub=' . $sub, false, $context); +	} + +	private function recreate_database($config) +	{ +		$db_conn_mgr = new phpbb_database_test_connection_manager($config); +		$db_conn_mgr->recreate_db(); +	} +} diff --git a/tests/test_framework/phpbb_test_case_helpers.php b/tests/test_framework/phpbb_test_case_helpers.php index 697dc93501..9177a443ab 100644 --- a/tests/test_framework/phpbb_test_case_helpers.php +++ b/tests/test_framework/phpbb_test_case_helpers.php @@ -46,4 +46,59 @@ class phpbb_test_case_helpers  	{  		mkdir($path, 0777, true);  	} + +	static public function get_test_config() +	{ +		if (extension_loaded('sqlite') && version_compare(PHPUnit_Runner_Version::id(), '3.4.15', '>=')) +		{ +			$config = array( +				'dbms'		=> 'sqlite', +				'dbhost'	=> dirname(__FILE__) . '/../phpbb_unit_tests.sqlite2', // filename +				'dbport'	=> '', +				'dbname'	=> '', +				'dbuser'	=> '', +				'dbpasswd'	=> '', +			); +		} + +		if (file_exists(dirname(__FILE__) . '/../test_config.php')) +		{ +			include(dirname(__FILE__) . '/../test_config.php'); + +			$config = array_merge($config, array( +				'dbms'		=> $dbms, +				'dbhost'	=> $dbhost, +				'dbport'	=> $dbport, +				'dbname'	=> $dbname, +				'dbuser'	=> $dbuser, +				'dbpasswd'	=> $dbpasswd, +			)); + +			if (isset($phpbb_functional_url)) +			{ +				$config['phpbb_functional_url'] = $phpbb_functional_url; +			} +		} + +		if (isset($_SERVER['PHPBB_TEST_DBMS'])) +		{ +			$config = array_merge($config, array( +				'dbms'		=> isset($_SERVER['PHPBB_TEST_DBMS']) ? $_SERVER['PHPBB_TEST_DBMS'] : '', +				'dbhost'	=> isset($_SERVER['PHPBB_TEST_DBHOST']) ? $_SERVER['PHPBB_TEST_DBHOST'] : '', +				'dbport'	=> isset($_SERVER['PHPBB_TEST_DBPORT']) ? $_SERVER['PHPBB_TEST_DBPORT'] : '', +				'dbname'	=> isset($_SERVER['PHPBB_TEST_DBNAME']) ? $_SERVER['PHPBB_TEST_DBNAME'] : '', +				'dbuser'	=> isset($_SERVER['PHPBB_TEST_DBUSER']) ? $_SERVER['PHPBB_TEST_DBUSER'] : '', +				'dbpasswd'	=> isset($_SERVER['PHPBB_TEST_DBPASSWD']) ? $_SERVER['PHPBB_TEST_DBPASSWD'] : '' +			)); +		} + +		if (isset($_SERVER['PHPBB_FUNCTIONAL_URL'])) +		{ +			$config = array_merge($config, array( +				'phpbb_functional_url'	=> isset($_SERVER['PHPBB_FUNCTIONAL_URL']) ? $_SERVER['PHPBB_FUNCTIONAL_URL'] : '', +			)); +		} + +		return $config; +	}  } diff --git a/vendor/goutte.phar b/vendor/goutte.phar Binary files differnew file mode 100644 index 0000000000..20b7166a67 --- /dev/null +++ b/vendor/goutte.phar  | 
