summaryrefslogtreecommitdiffstats
path: root/tests/lib/DB/ConnectionTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lib/DB/ConnectionTest.php')
-rw-r--r--tests/lib/DB/ConnectionTest.php200
1 files changed, 200 insertions, 0 deletions
diff --git a/tests/lib/DB/ConnectionTest.php b/tests/lib/DB/ConnectionTest.php
new file mode 100644
index 00000000000..b9c55c23339
--- /dev/null
+++ b/tests/lib/DB/ConnectionTest.php
@@ -0,0 +1,200 @@
+<?php
+
+/**
+ * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace Test\DB;
+
+use Doctrine\DBAL\Platforms\SqlitePlatform;
+use OC\DB\MDB2SchemaManager;
+use OCP\DB\QueryBuilder\IQueryBuilder;
+
+/**
+ * Class Connection
+ *
+ * @group DB
+ *
+ * @package Test\DB
+ */
+class ConnectionTest extends \Test\TestCase {
+ /**
+ * @var \OCP\IDBConnection
+ */
+ private $connection;
+
+ public static function setUpBeforeClass() {
+ self::dropTestTable();
+ parent::setUpBeforeClass();
+ }
+
+ public static function tearDownAfterClass() {
+ self::dropTestTable();
+ parent::tearDownAfterClass();
+ }
+
+ protected static function dropTestTable() {
+ if (\OC::$server->getConfig()->getSystemValue('dbtype', 'sqlite') !== 'oci') {
+ \OC::$server->getDatabaseConnection()->dropTable('table');
+ }
+ }
+
+ public function setUp() {
+ parent::setUp();
+ $this->connection = \OC::$server->getDatabaseConnection();
+ }
+
+ public function tearDown() {
+ parent::tearDown();
+ $this->connection->dropTable('table');
+ }
+
+ /**
+ * @param string $table
+ */
+ public function assertTableExist($table) {
+ if ($this->connection->getDatabasePlatform() instanceof SqlitePlatform) {
+ // sqlite removes the tables after closing the DB
+ $this->assertTrue(true);
+ } else {
+ $this->assertTrue($this->connection->tableExists($table), 'Table ' . $table . ' exists.');
+ }
+ }
+
+ /**
+ * @param string $table
+ */
+ public function assertTableNotExist($table) {
+ if ($this->connection->getDatabasePlatform() instanceof SqlitePlatform) {
+ // sqlite removes the tables after closing the DB
+ $this->assertTrue(true);
+ } else {
+ $this->assertFalse($this->connection->tableExists($table), 'Table ' . $table . " doesn't exist.");
+ }
+ }
+
+ private function makeTestTable() {
+ $schemaManager = new MDB2SchemaManager($this->connection);
+ $schemaManager->createDbFromStructure(__DIR__ . '/testschema.xml');
+ }
+
+ public function testTableExists() {
+ $this->assertTableNotExist('table');
+ $this->makeTestTable();
+ $this->assertTableExist('table');
+ }
+
+ /**
+ * @depends testTableExists
+ */
+ public function testDropTable() {
+ $this->makeTestTable();
+ $this->assertTableExist('table');
+ $this->connection->dropTable('table');
+ $this->assertTableNotExist('table');
+ }
+
+ private function getTextValueByIntergerField($integerField) {
+ $builder = $this->connection->getQueryBuilder();
+ $query = $builder->select('textfield')
+ ->from('table')
+ ->where($builder->expr()->eq('integerfield', $builder->createNamedParameter($integerField, IQueryBuilder::PARAM_INT)));
+
+ $result = $query->execute();
+ return $result->fetchColumn();
+ }
+
+ public function testSetValues() {
+ $this->makeTestTable();
+ $this->connection->setValues('table', [
+ 'integerfield' => 1
+ ], [
+ 'textfield' => 'foo',
+ 'clobfield' => 'not_null'
+ ]);
+
+ $this->assertEquals('foo', $this->getTextValueByIntergerField(1));
+ }
+
+ public function testSetValuesOverWrite() {
+ $this->makeTestTable();
+ $this->connection->setValues('table', [
+ 'integerfield' => 1
+ ], [
+ 'textfield' => 'foo',
+ 'clobfield' => 'not_null'
+ ]);
+
+ $this->connection->setValues('table', [
+ 'integerfield' => 1
+ ], [
+ 'textfield' => 'bar'
+ ]);
+
+ $this->assertEquals('bar', $this->getTextValueByIntergerField(1));
+ }
+
+ public function testSetValuesOverWritePrecondition() {
+ $this->makeTestTable();
+ $this->connection->setValues('table', [
+ 'integerfield' => 1
+ ], [
+ 'textfield' => 'foo',
+ 'booleanfield' => true,
+ 'clobfield' => 'not_null'
+ ]);
+
+ $this->connection->setValues('table', [
+ 'integerfield' => 1
+ ], [
+ 'textfield' => 'bar'
+ ], [
+ 'booleanfield' => true
+ ]);
+
+ $this->assertEquals('bar', $this->getTextValueByIntergerField(1));
+ }
+
+ /**
+ * @expectedException \OCP\PreConditionNotMetException
+ */
+ public function testSetValuesOverWritePreconditionFailed() {
+ $this->makeTestTable();
+ $this->connection->setValues('table', [
+ 'integerfield' => 1
+ ], [
+ 'textfield' => 'foo',
+ 'booleanfield' => true,
+ 'clobfield' => 'not_null'
+ ]);
+
+ $this->connection->setValues('table', [
+ 'integerfield' => 1
+ ], [
+ 'textfield' => 'bar'
+ ], [
+ 'booleanfield' => false
+ ]);
+ }
+
+ public function testSetValuesSameNoError() {
+ $this->makeTestTable();
+ $this->connection->setValues('table', [
+ 'integerfield' => 1
+ ], [
+ 'textfield' => 'foo',
+ 'clobfield' => 'not_null'
+ ]);
+
+ // this will result in 'no affected rows' on certain optimizing DBs
+ // ensure the PreConditionNotMetException isn't thrown
+ $this->connection->setValues('table', [
+ 'integerfield' => 1
+ ], [
+ 'textfield' => 'foo'
+ ]);
+ }
+}