From e2c67a8e42beefe1631a90feeb2215e2137c944b Mon Sep 17 00:00:00 2001
From: Oleg Pudeyev <oleg@bsdpower.com>
Date: Wed, 12 Dec 2012 21:46:38 -0500
Subject: [ticket/11162] Rename tricky updates to database helper.

PHPBB3-11162
---
 .../fixtures/bookmarks_duplicates.xml              |  47 ++++++++++
 .../fixtures/topics_watch_duplicates.xml           |  80 ++++++++++++++++
 ...rows_avoiding_duplicates_notify_status_test.php | 101 +++++++++++++++++++++
 .../update_rows_avoiding_duplicates_test.php       |  71 +++++++++++++++
 4 files changed, 299 insertions(+)
 create mode 100644 tests/functions_database_helper/fixtures/bookmarks_duplicates.xml
 create mode 100644 tests/functions_database_helper/fixtures/topics_watch_duplicates.xml
 create mode 100644 tests/functions_database_helper/update_rows_avoiding_duplicates_notify_status_test.php
 create mode 100644 tests/functions_database_helper/update_rows_avoiding_duplicates_test.php

(limited to 'tests/functions_database_helper')

diff --git a/tests/functions_database_helper/fixtures/bookmarks_duplicates.xml b/tests/functions_database_helper/fixtures/bookmarks_duplicates.xml
new file mode 100644
index 0000000000..d49f76b073
--- /dev/null
+++ b/tests/functions_database_helper/fixtures/bookmarks_duplicates.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dataset>
+	<table name="phpbb_bookmarks">
+		<column>user_id</column>
+		<column>topic_id</column>
+
+		<!-- one entry for this topic -->
+		<row>
+			<value>1</value>
+			<value>1</value>
+		</row>
+
+		<!-- non-conflicting entries -->
+		<row>
+			<value>2</value>
+			<value>2</value>
+		</row>
+		<row>
+			<value>3</value>
+			<value>3</value>
+		</row>
+
+		<!-- conflicting entries -->
+		<row>
+			<value>1</value>
+			<value>4</value>
+		</row>
+		<row>
+			<value>1</value>
+			<value>5</value>
+		</row>
+
+		<!-- conflicting and non-conflicting entries -->
+		<row>
+			<value>1</value>
+			<value>6</value>
+		</row>
+		<row>
+			<value>1</value>
+			<value>7</value>
+		</row>
+		<row>
+			<value>2</value>
+			<value>6</value>
+		</row>
+	</table>
+</dataset>
diff --git a/tests/functions_database_helper/fixtures/topics_watch_duplicates.xml b/tests/functions_database_helper/fixtures/topics_watch_duplicates.xml
new file mode 100644
index 0000000000..c387bb737a
--- /dev/null
+++ b/tests/functions_database_helper/fixtures/topics_watch_duplicates.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dataset>
+	<table name="phpbb_topics_watch">
+		<column>user_id</column>
+		<column>topic_id</column>
+		<column>notify_status</column>
+
+		<!-- one entry for this topic -->
+		<row>
+			<value>1</value>
+			<value>1</value>
+			<value>1</value>
+		</row>
+
+		<!-- non-conflicting entries -->
+		<row>
+			<value>1</value>
+			<value>2</value>
+			<value>1</value>
+		</row>
+		<row>
+			<value>2</value>
+			<value>3</value>
+			<value>0</value>
+		</row>
+
+		<!-- conflicting entries, same notify status -->
+		<row>
+			<value>1</value>
+			<value>4</value>
+			<value>1</value>
+		</row>
+		<row>
+			<value>1</value>
+			<value>5</value>
+			<value>1</value>
+		</row>
+
+		<!-- conflicting entries, notify status 0 into 1 -->
+		<row>
+			<value>1</value>
+			<value>6</value>
+			<value>0</value>
+		</row>
+		<row>
+			<value>1</value>
+			<value>7</value>
+			<value>1</value>
+		</row>
+
+		<!-- conflicting entries, notify status 1 into 0 -->
+		<row>
+			<value>1</value>
+			<value>8</value>
+			<value>1</value>
+		</row>
+		<row>
+			<value>1</value>
+			<value>9</value>
+			<value>0</value>
+		</row>
+
+		<!-- conflicting and non-conflicting entries -->
+		<row>
+			<value>1</value>
+			<value>10</value>
+			<value>0</value>
+		</row>
+		<row>
+			<value>1</value>
+			<value>11</value>
+			<value>1</value>
+		</row>
+		<row>
+			<value>2</value>
+			<value>10</value>
+			<value>1</value>
+		</row>
+	</table>
+</dataset>
diff --git a/tests/functions_database_helper/update_rows_avoiding_duplicates_notify_status_test.php b/tests/functions_database_helper/update_rows_avoiding_duplicates_notify_status_test.php
new file mode 100644
index 0000000000..6c0f2da1e1
--- /dev/null
+++ b/tests/functions_database_helper/update_rows_avoiding_duplicates_notify_status_test.php
@@ -0,0 +1,101 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_database_helper.php';
+
+class phpbb_update_rows_avoiding_duplicates_notify_status_test extends phpbb_database_test_case
+{
+	public function getDataSet()
+	{
+		return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/topics_watch_duplicates.xml');
+	}
+
+	public static function fixture_data()
+	{
+		return array(
+			// description
+			// from array
+			// to value
+			// expected count with to value post update
+			// expected notify_status values
+			array(
+				'trivial',
+				array(1),
+				1000,
+				1,
+				1,
+			),
+			array(
+				'no conflict',
+				array(2),
+				3,
+				2,
+				1,
+			),
+			array(
+				'conflict, same notify status',
+				array(4),
+				5,
+				1,
+				1,
+			),
+			array(
+				'conflict, notify status 0 into 1',
+				array(6),
+				7,
+				1,
+				0,
+			),
+			array(
+				'conflict, notify status 1 into 0',
+				array(8),
+				9,
+				1,
+				0,
+			),
+			array(
+				'conflict and no conflict',
+				array(10),
+				11,
+				2,
+				0,
+			),
+		);
+	}
+
+	/**
+	* @dataProvider fixture_data
+	*/
+	public function test_update($description, $from, $to, $expected_result_count, $expected_notify_status)
+	{
+		$db = $this->new_dbal();
+
+		phpbb_update_rows_avoiding_duplicates_notify_status($db, TOPICS_WATCH_TABLE, 'topic_id', $from, $to);
+
+		$sql = 'SELECT COUNT(*) AS remaining_rows
+			FROM ' . TOPICS_WATCH_TABLE . '
+			WHERE topic_id = ' . (int) $to;
+		$result = $db->sql_query($sql);
+		$result_count = $db->sql_fetchfield('remaining_rows');
+		$db->sql_freeresult($result);
+
+		$this->assertEquals($expected_result_count, $result_count);
+
+		// user id of 1 is the user being updated
+		$sql = 'SELECT notify_status
+			FROM ' . TOPICS_WATCH_TABLE . '
+			WHERE topic_id = ' . (int) $to . '
+                        AND user_id = 1';
+		$result = $db->sql_query($sql);
+		$notify_status = $db->sql_fetchfield('notify_status');
+		$db->sql_freeresult($result);
+
+		$this->assertEquals($expected_notify_status, $notify_status);
+	}
+}
diff --git a/tests/functions_database_helper/update_rows_avoiding_duplicates_test.php b/tests/functions_database_helper/update_rows_avoiding_duplicates_test.php
new file mode 100644
index 0000000000..2f01d29d15
--- /dev/null
+++ b/tests/functions_database_helper/update_rows_avoiding_duplicates_test.php
@@ -0,0 +1,71 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_database_helper.php';
+
+class phpbb_update_rows_avoiding_duplicates_test extends phpbb_database_test_case
+{
+	public function getDataSet()
+	{
+		return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/bookmarks_duplicates.xml');
+	}
+
+	public static function fixture_data()
+	{
+		return array(
+			// description
+			// from array
+			// to value
+			// expected count with to value post update
+			array(
+				'trivial',
+				array(1),
+				10,
+				1,
+			),
+			array(
+				'no conflict',
+				array(2),
+				3,
+				2,
+			),
+			array(
+				'conflict',
+				array(4),
+				5,
+				1,
+			),
+			array(
+				'conflict and no conflict',
+				array(6),
+				7,
+				2,
+			),
+		);
+	}
+
+	/**
+	* @dataProvider fixture_data
+	*/
+	public function test_update($description, $from, $to, $expected_result_count)
+	{
+		$db = $this->new_dbal();
+
+		phpbb_update_rows_avoiding_duplicates($db, BOOKMARKS_TABLE, 'topic_id', $from, $to);
+
+		$sql = 'SELECT COUNT(*) AS remaining_rows
+			FROM ' . BOOKMARKS_TABLE . '
+			WHERE topic_id = ' . (int) $to;
+		$result = $db->sql_query($sql);
+		$result_count = $db->sql_fetchfield('remaining_rows');
+		$db->sql_freeresult($result);
+
+		$this->assertEquals($expected_result_count, $result_count);
+	}
+}
-- 
cgit v1.2.1