1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @group functional
*/
class phpbb_functional_posting_test extends phpbb_functional_test_case
{
public function test_post_new_topic()
{
$this->login();
// Test creating topic
$post = $this->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.');
$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());
// Test quoting a message
$crawler = $this->request('GET', "posting.php?mode=quote&f=2&t={$post2['topic_id']}&p={$post2['post_id']}&sid={$this->sid}");
$this->assert_response_success();
$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 $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->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->assert_response_success();
$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->assert_response_success();
$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,
);
}
}
|