summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/PhpBB3.php43
-rw-r--r--test/PhpBB3Test.php19
2 files changed, 58 insertions, 4 deletions
diff --git a/src/PhpBB3.php b/src/PhpBB3.php
index b12841f..5a60712 100644
--- a/src/PhpBB3.php
+++ b/src/PhpBB3.php
@@ -81,6 +81,39 @@ class PhpBB3 {
}
}
+ public function topicExists($topicId) {
+ global $db;
+
+ if (!is_int($topicId)) {
+ trigger_error('topic id is not an integer', E_USER_ERROR);
+ }
+
+ if ($topicId < 0) {
+ trigger_error('topic id is negative', E_USER_ERROR);
+ }
+
+ $sql = 'SELECT 1 FROM ' . TOPICS_TABLE . ' ' .
+ 'WHERE topic_id = ' . $topicId . ' LIMIT 1';
+
+ $result = $db->sql_query($sql);
+
+ $rows = $db->sql_fetchrowset($result);
+ $db->sql_freeresult($result);
+
+ switch (count($rows)) {
+ case 0:
+ return false;
+
+ case 1:
+ return true;
+
+ default:
+ # Should be impossible due to LIMIT 1.
+ trigger_error("Too many rows returned: $sql", E_USER_ERROR);
+ break;
+ }
+ }
+
public function postMessage($postType, $forumId, $topicId, $msg) {
if ($postType != 'post' && $postType != 'reply') {
trigger_error('bad post type: ' . $postType, E_USER_ERROR);
@@ -94,10 +127,12 @@ class PhpBB3 {
trigger_error('forum does not exist: ' . $forumId, E_USER_ERROR);
}
- if ($topicId !== null) {
- if (!is_int($topicId) || $topicId < 0) {
- trigger_error('bad topic id: ' . $topicId, E_USER_ERROR);
- }
+ if (!is_int($topicId)) {
+ trigger_error('bad topic id: ' . $topicId, E_USER_ERROR);
+ }
+
+ if ($postType == 'reply' && !$this->topicExists($topicId)) {
+ trigger_error('topic does not exist: ' . $topicId, E_USER_ERROR);
}
if ($msg === null) {
diff --git a/test/PhpBB3Test.php b/test/PhpBB3Test.php
index a853b8b..1ff9b88 100644
--- a/test/PhpBB3Test.php
+++ b/test/PhpBB3Test.php
@@ -99,4 +99,23 @@ EOF;
array(2, true, null)
);
}
+
+ /**
+ * @dataProvider providerTopicExists
+ */
+ public function testTopicExists($topic_id, $expected, $ex) {
+ if ($ex) $this->setExpectedException($ex);
+ $run = 'topicExists(' . $topic_id . ')';
+ $this->assertEquals($expected, $this->exec_kludge($run));
+ }
+
+ public function providerTopicExists() {
+ return array(
+ array('bogus', null, 'PHPUnit_Framework_Error'),
+ array(3.5, null, 'PHPUnit_Framework_Error'),
+ array(-1, null, 'PHPUnit_Framework_Error'),
+ array(0, false, null),
+ array(1, true, null)
+ );
+ }
}