aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/RUNNING_TESTS.md38
-rw-r--r--tests/functional/paging_test.php39
-rw-r--r--tests/functional/posting_test.php101
-rw-r--r--tests/functional/report_post_captcha.php61
-rw-r--r--tests/session/creation_test.php (renamed from tests/session/init_test.php)7
-rw-r--r--tests/template/template_test_case.php19
-rw-r--r--tests/test_framework/phpbb_functional_test_case.php154
7 files changed, 297 insertions, 122 deletions
diff --git a/tests/RUNNING_TESTS.md b/tests/RUNNING_TESTS.md
index f89c1fefeb..f2688ab675 100644
--- a/tests/RUNNING_TESTS.md
+++ b/tests/RUNNING_TESTS.md
@@ -50,9 +50,11 @@ Database Tests
By default all tests requiring a database connection will use sqlite. If you
do not have sqlite installed the tests will be skipped. If you wish to run the
tests on a different database you have to create a test_config.php file within
-your tests directory following the same format as phpBB's config.php. An
-example for mysqli can be found below. More information on configuration
-options can be found on the wiki (see below).
+your tests directory following the same format as phpBB's config.php. Testing
+makes use of a seperate database defined in this config file and before running
+the tests each time this database is deleted. An example for mysqli can be
+found below. More information on configuration options can be found on the
+wiki (see below).
<?php
$dbms = 'phpbb_db_driver_mysqli';
@@ -132,8 +134,36 @@ only want the slow tests, run:
$ phpBB/vendor/bin/phpunit --group slow
+Functional tests
+-----------------
+
+Functional tests test software the way a user would. They simulate a user
+browsing the website, but they do these steps in an automated way.
+phpBB allows you to write such tests.
+
+Running
+=======
+
+Running the tests requires your phpBB3 repository to be accessible through a
+local web server. You will need to supply the URL to the webserver in
+the 'tests/test_config.php' file. This is as simple as defining the
+'$phpbb_functional_url' variable, which contains the URL for the directory containing
+the board. Make sure you include the trailing slash. Note that without extensive
+changes to the test framework, you cannot use a board outside of the repository
+on which to run tests.
+
+ $phpbb_functional_url = 'http://localhost/phpBB3/';
+
+To then run the tests, you run PHPUnit, but use the phpunit.xml.functional
+config file instead of the default one. Specify this through the "-c" option:
+
+ $ phpBB/vendor/bin/phpunit -c phpunit.xml.functional
+
+This will change your board's config.php file, but it makes a backup at
+config_dev.php, so you can restore it after the test run is complete.
+
More Information
================
Further information is available on phpbb wiki:
-http://wiki.phpbb.com/Unit_Tests
+http://wiki.phpbb.com/Automated_Tests
diff --git a/tests/functional/paging_test.php b/tests/functional/paging_test.php
new file mode 100644
index 0000000000..d5adc6ad0a
--- /dev/null
+++ b/tests/functional/paging_test.php
@@ -0,0 +1,39 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @group functional
+*/
+class phpbb_functional_paging_test extends phpbb_functional_test_case
+{
+
+ public function test_pagination()
+ {
+ $this->login();
+
+ $post = $this->create_topic(2, 'Test Topic 1', 'This is a test topic posted by the testing framework.');
+ for ($post_id = 1; $post_id < 20; $post_id++)
+ {
+ $this->create_post(2, $post['topic_id'], 'Re: Test Topic 1', 'This is a test post no' . $post_id . ' posted by the testing framework.');
+ }
+ $crawler = self::request('GET', "viewtopic.php?t={$post['topic_id']}&sid={$this->sid}");
+ $this->assertContains('post no9', $crawler->text());
+ $this->assertNotContains('post no19', $crawler->text());
+
+ $next_link = $crawler->filter('#viewtopic > fieldset > a.arrow-right')->attr('href');
+ $crawler = self::request('GET', $next_link);
+ $this->assertContains('post no19', $crawler->text());
+ $this->assertNotContains('post no9', $crawler->text());
+
+ $prev_link = $crawler->filter('#viewtopic > fieldset > a.arrow-left')->attr('href');
+ $crawler = self::request('GET', $prev_link);
+ $this->assertContains('post no9', $crawler->text());
+ $this->assertNotContains('post no19', $crawler->text());
+ }
+}
diff --git a/tests/functional/posting_test.php b/tests/functional/posting_test.php
index 9bcfcc2fda..7fd1e4fdcf 100644
--- a/tests/functional/posting_test.php
+++ b/tests/functional/posting_test.php
@@ -32,105 +32,4 @@ class phpbb_functional_posting_test extends phpbb_functional_test_case
$crawler = self::request('GET', "posting.php?mode=quote&f=2&t={$post2['topic_id']}&p={$post2['post_id']}&sid={$this->sid}");
$this->assertContains('This is a test post posted by the testing framework.', $crawler->filter('html')->text());
}
-
- /**
- * Creates a topic
- *
- * Be sure to login before creating
- *
- * @param int $forum_id
- * @param string $subject
- * @param string $message
- * @param array $additional_form_data Any additional form data to be sent in the request
- * @return array post_id, topic_id
- */
- public function create_topic($forum_id, $subject, $message, $additional_form_data = array())
- {
- $posting_url = "posting.php?mode=post&f={$forum_id}&sid={$this->sid}";
-
- $form_data = array_merge(array(
- 'subject' => $subject,
- 'message' => $message,
- 'post' => true,
- ), $additional_form_data);
-
- return self::submit_post($posting_url, 'POST_TOPIC', $form_data);
- }
-
- /**
- * Creates a post
- *
- * Be sure to login before creating
- *
- * @param int $forum_id
- * @param string $subject
- * @param string $message
- * @param array $additional_form_data Any additional form data to be sent in the request
- * @return array post_id, topic_id
- */
- public function create_post($forum_id, $topic_id, $subject, $message, $additional_form_data = array())
- {
- $posting_url = "posting.php?mode=reply&f={$forum_id}&t={$topic_id}&sid={$this->sid}";
-
- $form_data = array_merge(array(
- 'subject' => $subject,
- 'message' => $message,
- 'post' => true,
- ), $additional_form_data);
-
- return self::submit_post($posting_url, 'POST_REPLY', $form_data);
- }
-
- /**
- * Helper for submitting posts
- *
- * @param string $posting_url
- * @param string $posting_contains
- * @param array $form_data
- * @return array post_id, topic_id
- */
- protected function submit_post($posting_url, $posting_contains, $form_data)
- {
- $this->add_lang('posting');
-
- $crawler = self::request('GET', $posting_url);
- $this->assertContains($this->lang($posting_contains), $crawler->filter('html')->text());
-
- $hidden_fields = array(
- $crawler->filter('[type="hidden"]')->each(function ($node, $i) {
- return array('name' => $node->getAttribute('name'), 'value' => $node->getAttribute('value'));
- }),
- );
-
- foreach ($hidden_fields as $fields)
- {
- foreach($fields as $field)
- {
- $form_data[$field['name']] = $field['value'];
- }
- }
-
- // Bypass time restriction that said that if the lastclick time (i.e. time when the form was opened)
- // is not at least 2 seconds before submission, cancel the form
- $form_data['lastclick'] = 0;
-
- // I use a request because the form submission method does not allow you to send data that is not
- // contained in one of the actual form fields that the browser sees (i.e. it ignores "hidden" inputs)
- // Instead, I send it as a request with the submit button "post" set to true.
- $crawler = self::request('POST', $posting_url, $form_data);
- $this->assertContains($this->lang('POST_STORED'), $crawler->filter('html')->text());
-
- $url = $crawler->selectLink($this->lang('VIEW_MESSAGE', '', ''))->link()->getUri();
-
- $matches = $topic_id = $post_id = false;
- preg_match_all('#&t=([0-9]+)(&p=([0-9]+))?#', $url, $matches);
-
- $topic_id = (int) (isset($matches[1][0])) ? $matches[1][0] : 0;
- $post_id = (int) (isset($matches[3][0])) ? $matches[3][0] : 0;
-
- return array(
- 'topic_id' => $topic_id,
- 'post_id' => $post_id,
- );
- }
}
diff --git a/tests/functional/report_post_captcha.php b/tests/functional/report_post_captcha.php
new file mode 100644
index 0000000000..af713775c5
--- /dev/null
+++ b/tests/functional/report_post_captcha.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ *
+ * @package testing
+ * @copyright (c) 2013 phpBB Group
+ * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+ *
+ */
+
+/**
+ * @group functional
+ */
+class phpbb_functional_report_post_captcha_test extends phpbb_functional_test_case
+{
+ public function test_user_report_post()
+ {
+ $this->login();
+ $crawler = self::request('GET', 'report.php?f=2&p=1');
+ $this->assertNotContains($this->lang('CONFIRM_CODE'), $crawler->filter('html')->text());
+ }
+
+ public function test_guest_report_post()
+ {
+ $crawler = self::request('GET', 'report.php?f=2&p=1');
+ $this->add_lang('mcp');
+ $this->assertContains($this->lang('USER_CANNOT_REPORT'), $crawler->filter('html')->text());
+
+ $this->set_reporting_guest(1);
+ $crawler = self::request('GET', 'report.php?f=2&p=1');
+ $this->assertContains($this->lang('CONFIRM_CODE'), $crawler->filter('html')->text());
+ $this->set_reporting_guest(-1);
+ }
+
+ protected function set_reporting_guest($report_post_allowed)
+ {
+ $this->login();
+ $this->admin_login();
+
+ $crawler = self::request('GET', 'adm/index.php?i=permissions&icat=12&mode=setting_group_local&sid=' . $this->sid);
+ $form = $crawler->selectButton('Submit')->form();
+ $values = $form->getValues();
+ $values["group_id[0]"] = 1;
+ $form->setValues($values);
+ $crawler = self::submit($form);
+
+ $form = $crawler->selectButton('Submit')->form();
+ $values = $form->getValues();
+ $values["forum_id"] = 2;
+ $form->setValues($values);
+ $crawler = self::submit($form);
+
+ $this->add_lang('acp/permissions');
+ $form = $crawler->selectButton($this->lang('APPLY_ALL_PERMISSIONS'))->form();
+ $values = $form->getValues();
+ $values["setting[1][2][f_report]"] = $report_post_allowed;
+ $form->setValues($values);
+ $crawler = self::submit($form);
+
+ $crawler = self::request('GET', 'ucp.php?mode=logout&sid=' . $this->sid);
+ }
+}
diff --git a/tests/session/init_test.php b/tests/session/creation_test.php
index 830de34ed0..6e61f085a6 100644
--- a/tests/session/init_test.php
+++ b/tests/session/creation_test.php
@@ -9,7 +9,7 @@
require_once dirname(__FILE__) . '/testable_factory.php';
-class phpbb_session_init_test extends phpbb_database_test_case
+class phpbb_session_creation_test extends phpbb_database_test_case
{
public function getDataSet()
{
@@ -34,10 +34,11 @@ class phpbb_session_init_test extends phpbb_database_test_case
$this->assertSqlResultEquals(
array(array('session_user_id' => 3)),
$sql,
- 'Check if exacly one session for user id 3 was created'
+ 'Check if exactly one session for user id 3 was created'
);
- $cookie_expire = $session->time_now + 31536000; // default is one year
+ $one_year_in_seconds = 365 * 24 * 60 * 60;
+ $cookie_expire = $session->time_now + $one_year_in_seconds;
$session->check_cookies($this, array(
'u' => array(null, $cookie_expire),
diff --git a/tests/template/template_test_case.php b/tests/template/template_test_case.php
index 3c997cb00e..5d38ebed67 100644
--- a/tests/template/template_test_case.php
+++ b/tests/template/template_test_case.php
@@ -83,9 +83,14 @@ class phpbb_template_template_test_case extends phpbb_test_case
$this->markTestSkipped("Template cache directory ({$template_cache_dir}) is not writable.");
}
- foreach (glob($this->template->cachepath . '*') as $file)
+ $file_array = scandir($template_cache_dir);
+ $file_prefix = basename($this->template->cachepath);
+ foreach ($file_array as $file)
{
- unlink($file);
+ if (strpos($file, $file_prefix) === 0)
+ {
+ unlink($template_cache_dir . '/' . $file);
+ }
}
$this->setup_engine();
@@ -95,9 +100,15 @@ class phpbb_template_template_test_case extends phpbb_test_case
{
if (is_object($this->template))
{
- foreach (glob($this->template->cachepath . '*') as $file)
+ $template_cache_dir = dirname($this->template->cachepath);
+ $file_array = scandir($template_cache_dir);
+ $file_prefix = basename($this->template->cachepath);
+ foreach ($file_array as $file)
{
- unlink($file);
+ if (strpos($file, $file_prefix) === 0)
+ {
+ unlink($template_cache_dir . '/' . $file);
+ }
}
}
}
diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php
index 97fe147d8e..7e2e750e30 100644
--- a/tests/test_framework/phpbb_functional_test_case.php
+++ b/tests/test_framework/phpbb_functional_test_case.php
@@ -219,15 +219,19 @@ class phpbb_functional_test_case extends phpbb_test_case
self::recreate_database(self::$config);
- if (file_exists($phpbb_root_path . "config.$phpEx"))
+ $config_file = $phpbb_root_path . "config.$phpEx";
+ $config_file_dev = $phpbb_root_path . "config_dev.$phpEx";
+ $config_file_test = $phpbb_root_path . "config_test.$phpEx";
+
+ if (file_exists($config_file))
{
- if (!file_exists($phpbb_root_path . "config_dev.$phpEx"))
+ if (!file_exists($config_file_dev))
{
- rename($phpbb_root_path . "config.$phpEx", $phpbb_root_path . "config_dev.$phpEx");
+ rename($config_file, $config_file_dev);
}
else
{
- unlink($phpbb_root_path . "config.$phpEx");
+ unlink($config_file);
}
}
@@ -251,10 +255,12 @@ class phpbb_functional_test_case extends phpbb_test_case
self::assertContains('Welcome to Installation', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form();
+ // install/index.php?mode=install&sub=requirements
$crawler = self::submit($form);
self::assertContains('Installation compatibility', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form();
+ // install/index.php?mode=install&sub=database
$crawler = self::submit($form);
self::assertContains('Database configuration', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form(array(
@@ -268,10 +274,12 @@ class phpbb_functional_test_case extends phpbb_test_case
'table_prefix' => self::$config['table_prefix'],
));
+ // install/index.php?mode=install&sub=database
$crawler = self::submit($form);
self::assertContains('Successful connection', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form();
+ // install/index.php?mode=install&sub=administrator
$crawler = self::submit($form);
self::assertContains('Administrator configuration', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form(array(
@@ -282,16 +290,38 @@ class phpbb_functional_test_case extends phpbb_test_case
'board_email' => 'nobody@example.com',
));
+ // install/index.php?mode=install&sub=administrator
$crawler = self::submit($form);
self::assertContains('Tests passed', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form();
- $crawler = self::submit($form);
- self::assertContains('The configuration file has been written.', $crawler->filter('#main')->text());
- file_put_contents($phpbb_root_path . "config.$phpEx", phpbb_create_config_file_data(self::$config, self::$config['dbms'], true, true));
- $form = $crawler->selectButton('submit')->form();
+ // We have to skip install/index.php?mode=install&sub=config_file
+ // because that step will create a config.php file if phpBB has the
+ // permission to do so. We have to create the config file on our own
+ // in order to get the DEBUG constants defined.
+ $config_php_data = phpbb_create_config_file_data(self::$config, self::$config['dbms'], true, true);
+ $config_created = file_put_contents($config_file, $config_php_data) !== false;
+ if (!$config_created)
+ {
+ self::markTestSkipped("Could not write $config_file file.");
+ }
- $crawler = self::submit($form);
+ // We also have to create a install lock that is normally created by
+ // the installer. The file will be removed by the final step of the
+ // installer.
+ $install_lock_file = $phpbb_root_path . 'cache/install_lock';
+ $lock_created = file_put_contents($install_lock_file, '') !== false;
+ if (!$lock_created)
+ {
+ self::markTestSkipped("Could not create $lock_created file.");
+ }
+ @chmod($install_lock_file, 0666);
+
+ // install/index.php?mode=install&sub=advanced
+ $form_data = $form->getValues();
+ unset($form_data['submit']);
+
+ $crawler = self::request('POST', 'install/index.php?mode=install&sub=advanced', $form_data);
self::assertContains('The settings on this page are only necessary to set if you know that you require something different from the default.', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form(array(
'email_enable' => true,
@@ -308,14 +338,17 @@ class phpbb_functional_test_case extends phpbb_test_case
'script_path' => $parseURL['path'],
));
+ // install/index.php?mode=install&sub=create_table
$crawler = self::submit($form);
self::assertContains('The database tables used by phpBB', $crawler->filter('#main')->text());
self::assertContains('have been created and populated with some initial data.', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form();
+ // install/index.php?mode=install&sub=final
$crawler = self::submit($form);
self::assertContains('You have successfully installed', $crawler->text());
- copy($phpbb_root_path . "config.$phpEx", $phpbb_root_path . "config_test.$phpEx");
+
+ copy($config_file, $config_file_test);
}
static private function recreate_database($config)
@@ -703,4 +736,105 @@ class phpbb_functional_test_case extends phpbb_test_case
return $result;
}
+
+ /**
+ * Creates a topic
+ *
+ * Be sure to login before creating
+ *
+ * @param int $forum_id
+ * @param string $subject
+ * @param string $message
+ * @param array $additional_form_data Any additional form data to be sent in the request
+ * @return array post_id, topic_id
+ */
+ public function create_topic($forum_id, $subject, $message, $additional_form_data = array())
+ {
+ $posting_url = "posting.php?mode=post&f={$forum_id}&sid={$this->sid}";
+
+ $form_data = array_merge(array(
+ 'subject' => $subject,
+ 'message' => $message,
+ 'post' => true,
+ ), $additional_form_data);
+
+ return self::submit_post($posting_url, 'POST_TOPIC', $form_data);
+ }
+
+ /**
+ * Creates a post
+ *
+ * Be sure to login before creating
+ *
+ * @param int $forum_id
+ * @param string $subject
+ * @param string $message
+ * @param array $additional_form_data Any additional form data to be sent in the request
+ * @return array post_id, topic_id
+ */
+ public function create_post($forum_id, $topic_id, $subject, $message, $additional_form_data = array())
+ {
+ $posting_url = "posting.php?mode=reply&f={$forum_id}&t={$topic_id}&sid={$this->sid}";
+
+ $form_data = array_merge(array(
+ 'subject' => $subject,
+ 'message' => $message,
+ 'post' => true,
+ ), $additional_form_data);
+
+ return self::submit_post($posting_url, 'POST_REPLY', $form_data);
+ }
+
+ /**
+ * Helper for submitting posts
+ *
+ * @param string $posting_url
+ * @param string $posting_contains
+ * @param array $form_data
+ * @return array post_id, topic_id
+ */
+ protected function submit_post($posting_url, $posting_contains, $form_data)
+ {
+ $this->add_lang('posting');
+
+ $crawler = self::request('GET', $posting_url);
+ $this->assertContains($this->lang($posting_contains), $crawler->filter('html')->text());
+
+ $hidden_fields = array(
+ $crawler->filter('[type="hidden"]')->each(function ($node, $i) {
+ return array('name' => $node->getAttribute('name'), 'value' => $node->getAttribute('value'));
+ }),
+ );
+
+ foreach ($hidden_fields as $fields)
+ {
+ foreach($fields as $field)
+ {
+ $form_data[$field['name']] = $field['value'];
+ }
+ }
+
+ // Bypass time restriction that said that if the lastclick time (i.e. time when the form was opened)
+ // is not at least 2 seconds before submission, cancel the form
+ $form_data['lastclick'] = 0;
+
+ // I use a request because the form submission method does not allow you to send data that is not
+ // contained in one of the actual form fields that the browser sees (i.e. it ignores "hidden" inputs)
+ // Instead, I send it as a request with the submit button "post" set to true.
+ $crawler = self::request('POST', $posting_url, $form_data);
+ $this->assertContains($this->lang('POST_STORED'), $crawler->filter('html')->text());
+
+ $url = $crawler->selectLink($this->lang('VIEW_MESSAGE', '', ''))->link()->getUri();
+
+ $matches = $topic_id = $post_id = false;
+ preg_match_all('#&t=([0-9]+)(&p=([0-9]+))?#', $url, $matches);
+
+ $topic_id = (int) (isset($matches[1][0])) ? $matches[1][0] : 0;
+ $post_id = (int) (isset($matches[3][0])) ? $matches[3][0] : 0;
+
+ return array(
+ 'topic_id' => $topic_id,
+ 'post_id' => $post_id,
+ );
+ }
}