1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-02-24 12:03:21 +01:00

[ticket/8610] Move posting helpers to separate file

This is to prevent cluttering up the functional test case class more

PHPBB3-8610
This commit is contained in:
Nathan Guse 2012-12-13 23:09:45 -06:00
parent 9eb9fa2b9d
commit d739745ea4
3 changed files with 137 additions and 105 deletions

View File

@ -15,15 +15,19 @@ class phpbb_functional_posting_test extends phpbb_functional_test_case
public function test_post_new_topic()
{
$this->login();
include(__DIR__ . './../test_framework/posting_helpers.php');
$posting_helper = new phpbb_test_framework_posting_helpers($this);
// Test creating topic
$post = $this->create_topic(2, 'Test Topic 1', 'This is a test topic posted by the testing framework.');
$post = $posting_helper->create_topic(2, 'Test Topic 1', 'This is a test topic posted by the testing framework.');
$crawler = $this->request('GET', "viewtopic.php?t={$post['topic_id']}&sid={$this->sid}");
$this->assertContains('This is a test topic posted by the testing framework.', $crawler->filter('html')->text());
// Test creating a reply
$post2 = $this->create_post(2, $post['topic_id'], 'Re: Test Topic 1', 'This is a test post posted by the testing framework.');
$post2 = $posting_helper->create_post(2, $post['topic_id'], 'Re: Test Topic 1', 'This is a test post posted by the testing framework.');
$crawler = $this->request('GET', "viewtopic.php?t={$post2['topic_id']}&sid={$this->sid}");
$this->assertContains('This is a test post posted by the testing framework.', $crawler->filter('html')->text());

View File

@ -275,107 +275,6 @@ class phpbb_functional_test_case extends phpbb_test_case
return user_add($user_row);
}
/**
* 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
*/
protected 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 $this->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
*/
protected 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 $this->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 = $this->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 = $this->client->request('POST', $posting_url, $form_data);
$this->assertContains($this->lang('POST_STORED'), $crawler->filter('html')->text());
$url = $crawler->selectLink(str_replace('%s', '', $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,
);
}
protected function login($username = 'admin')
{
$this->add_lang('ucp');
@ -400,7 +299,7 @@ class phpbb_functional_test_case extends phpbb_test_case
}
}
protected function add_lang($lang_file)
public function add_lang($lang_file)
{
if (is_array($lang_file))
{
@ -422,7 +321,7 @@ class phpbb_functional_test_case extends phpbb_test_case
$this->lang = array_merge($this->lang, $lang);
}
protected function lang()
public function lang()
{
$args = func_get_args();
$key = $args[0];
@ -451,4 +350,14 @@ class phpbb_functional_test_case extends phpbb_test_case
$content = $this->client->getResponse()->getContent();
$this->assertNotContains('Fatal error:', $content);
}
public function get_sid()
{
return $this->sid;
}
public function get_client()
{
return $this->client;
}
}

View File

@ -0,0 +1,119 @@
<?php
/**
*
* @package testing
* @copyright (c) 2008 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
class phpbb_test_framework_posting_helpers
{
protected $test_case;
public function __construct($test_case)
{
$this->test_case = $test_case;
}
/**
* 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->test_case->get_sid()}";
$form_data = array_merge(array(
'subject' => $subject,
'message' => $message,
'post' => true,
), $additional_form_data);
return $this->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->test_case->get_sid()}";
$form_data = array_merge(array(
'subject' => $subject,
'message' => $message,
'post' => true,
), $additional_form_data);
return $this->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->test_case->add_lang('posting');
$crawler = $this->test_case->request('GET', $posting_url);
$this->test_case->assertContains($this->test_case->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 = $this->test_case->get_client()->request('POST', $posting_url, $form_data);
$this->test_case->assertContains($this->test_case->lang('POST_STORED'), $crawler->filter('html')->text());
$url = $crawler->selectLink($this->test_case->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,
);
}
}