diff options
| -rw-r--r-- | phpBB/includes/mcp/mcp_topic.php | 4 | ||||
| -rw-r--r-- | tests/functional/mcp_test.php | 67 | ||||
| -rw-r--r-- | tests/functional/posting_test.php | 101 | ||||
| -rw-r--r-- | tests/test_framework/phpbb_functional_test_case.php | 131 | 
4 files changed, 200 insertions, 103 deletions
diff --git a/phpBB/includes/mcp/mcp_topic.php b/phpBB/includes/mcp/mcp_topic.php index 76985488b7..8e0e89e3da 100644 --- a/phpBB/includes/mcp/mcp_topic.php +++ b/phpBB/includes/mcp/mcp_topic.php @@ -668,10 +668,10 @@ function merge_posts($topic_id, $to_topic_id)  			}  			// If the topic no longer exist, we will update the topic watch table. -			phpbb_update_rows_avoiding_duplicates_notify_status($db, TOPICS_WATCH_TABLE, 'topic_id', $topic_ids, $to_topic_id); +			phpbb_update_rows_avoiding_duplicates_notify_status($db, TOPICS_WATCH_TABLE, 'topic_id', array($topic_id), $to_topic_id);  			// If the topic no longer exist, we will update the bookmarks table. -			phpbb_update_rows_avoiding_duplicates($db, BOOKMARKS_TABLE, 'topic_id', $topic_id, $to_topic_id); +			phpbb_update_rows_avoiding_duplicates($db, BOOKMARKS_TABLE, 'topic_id', array($topic_id), $to_topic_id);  		}  		// Link to the new topic diff --git a/tests/functional/mcp_test.php b/tests/functional/mcp_test.php new file mode 100644 index 0000000000..f65a7d0784 --- /dev/null +++ b/tests/functional/mcp_test.php @@ -0,0 +1,67 @@ +<?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_mcp_test extends phpbb_functional_test_case +{ +	public function test_post_new_topic() +	{ +		$this->login(); + +		// Test creating topic +		$post = $this->create_topic(2, 'Test Topic 2', 'Testing move post with "Move posts" option from Quick-Moderator Tools.'); + +		$crawler = self::request('GET', "viewtopic.php?t={$post['topic_id']}&sid={$this->sid}"); +		$this->assertContains('Testing move post with "Move posts" option from Quick-Moderator Tools.', $crawler->filter('html')->text()); + +		return $crawler; +	} + +	/** +	* @depends test_post_new_topic +	*/ +	public function test_handle_quickmod($crawler) +	{ +		// Test moving a post +		$form = $crawler->selectButton('Go')->eq(1)->form(); +		$form['action']->select('merge'); +		$crawler = self::submit($form); + +		return $crawler; +	} + +	/** +	* @depends test_handle_quickmod +	*/ +	public function test_move_post_to_topic($crawler) +	{ +		// Select the post in MCP +		$form = $crawler->selectButton($this->lang('SUBMIT'))->form(array( +			'to_topic_id'	=> 1, +		)); +		$form['post_id_list'][0]->tick(); +		$crawler = self::submit($form); +		$this->assertContains($this->lang('MERGE_POSTS'), $crawler->filter('html')->text()); + +		return $crawler; +	} + +	/** +	* @depends test_move_post_to_topic +	*/ +	public function test_confirm_result($crawler) +	{ +		$this->add_lang('mcp'); +		$form = $crawler->selectButton('Yes')->form(); +		$crawler = self::submit($form); +		$this->assertContains($this->lang('POSTS_MERGED_SUCCESS'), $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/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php index 684d7a84cb..7d8b4a3144 100644 --- a/tests/test_framework/phpbb_functional_test_case.php +++ b/tests/test_framework/phpbb_functional_test_case.php @@ -593,4 +593,135 @@ class phpbb_functional_test_case extends phpbb_test_case  	{  		self::assertEquals($status_code, self::$client->getResponse()->getStatus());  	} + +	/** +	* 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 int $topic_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(); + +		return array( +			'topic_id'	=> $this->get_parameter_from_link($url, 't'), +			'post_id'	=> $this->get_parameter_from_link($url, 'p'), +		); +	} + +	/** +	* Returns the requested parameter from a URL +	* +	* @param	string	$url +	* @param	string	$parameter +	* @return		string	Value of the parameter in the URL, null if not set +	*/ +	public function get_parameter_from_link($url, $parameter) +	{ +		if (strpos($url, '?') === false) +		{ +			return null; +		} + +		$url_parts = explode('?', $url); +		if (isset($url_parts[1])) +		{ +			$url_parameters = $url_parts[1]; +			if (strpos($url_parameters, '#') !== false) +			{ +				$url_parameters = explode('#', $url_parameters); +				$url_parameters = $url_parameters[0]; +			} + +			foreach (explode('&', $url_parameters) as $url_param) +			{ +				list($param, $value) = explode('=', $url_param); +				if ($param == $parameter) +				{ +					return $value; +				} +			} +		} +		return null; +	}  }  | 
