]> source.dussan.org Git - nextcloud-server.git/commitdiff
port of #9500
authorArthur Schiwon <blizzz@owncloud.com>
Mon, 7 Jul 2014 22:19:17 +0000 (00:19 +0200)
committerArthur Schiwon <blizzz@owncloud.com>
Tue, 8 Jul 2014 14:32:01 +0000 (16:32 +0200)
don't trigger update from checkPassword, it is already  called by userExists, this is enough.

do not write to database when the value is the same

add test cases. also split test classes in a file each, looks like only the first class is being executed

also appconfig shall not write to database if the value is unchanged

apps/user_ldap/user_ldap.php
lib/private/appconfig.php
lib/private/preferences.php
tests/lib/appconfig.php
tests/lib/preferences-singleton.php [new file with mode: 0644]
tests/lib/preferences.php

index 9fa2a6b418c8a920dea050fa95f9b12ed7d2727e..ae4dfec51181f8923936d23c15d40433b100a9ab 100644 (file)
@@ -73,7 +73,6 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
                        }
 
                        $user->markLogin();
-                       $user->update();
 
                        return $user->getUsername();
                }
index f20c4a08426d06df32a097960929674003b654c6..1874d9f2b1937358579d622a16875dd68b5f384e 100644 (file)
@@ -183,6 +183,10 @@ class AppConfig implements \OCP\IAppConfig {
                        );
                        $this->conn->insert('*PREFIX*appconfig', $data);
                } else {
+                       $oldValue = $this->getValue($app, $key);
+                       if($oldValue === strval($value)) {
+                               return true;
+                       }
                        $data = array(
                                'configvalue' => $value,
                        );
index d1db25bbf09c8be74b4cd7692d62b45e50df19d2..a849cc23e1a695c3af76f6b3bacb4c2f3a0408d9 100644 (file)
@@ -173,11 +173,16 @@ class Preferences {
         */
        public function setValue($user, $app, $key, $value, $preCondition = null) {
                // Check if the key does exist
-               $query = 'SELECT COUNT(*) FROM `*PREFIX*preferences`'
+               $query = 'SELECT `configvalue` FROM `*PREFIX*preferences`'
                        . ' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?';
-               $count = $this->conn->fetchColumn($query, array($user, $app, $key));
-               $exists = $count > 0;
+               $oldValue = $this->conn->fetchColumn($query, array($user, $app, $key));
+               $exists = $oldValue !== false;
 
+               if($oldValue === strval($value)) {
+                       // no changes
+                       return true;
+               }
+               
                $affectedRows = 0;
 
                if (!$exists && $preCondition === null) {
index 6ae790a9edd774102a40faf8e674823d8de607bc..9257ae45b0ebe307e891392b436dbbb288a4d163 100644 (file)
@@ -95,6 +95,72 @@ class Test_Appconfig extends PHPUnit_Framework_TestCase {
                $this->assertEquals('somevalue', $value['configvalue']);
        }
 
+       public function testSetValueUnchanged() {
+               $statementMock = $this->getMock('\Doctrine\DBAL\Statement', array(), array(), '', false);
+               $statementMock->expects($this->once())
+                       ->method('fetch')
+                       ->will($this->returnValue(false));
+
+               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+               $connectionMock->expects($this->once())
+                       ->method('executeQuery')
+                       ->with($this->equalTo('SELECT `configvalue`, `configkey` FROM `*PREFIX*appconfig`'
+                               .' WHERE `appid` = ?'), $this->equalTo(array('bar')))
+                       ->will($this->returnValue($statementMock));
+               $connectionMock->expects($this->once())
+                       ->method('insert')
+                       ->with($this->equalTo('*PREFIX*appconfig'),
+                               $this->equalTo(
+                                       array(
+                                               'appid' => 'bar',
+                                               'configkey' => 'foo',
+                                               'configvalue' => 'v1',
+                                       )
+                               ));
+               $connectionMock->expects($this->never())
+                       ->method('update');
+
+               $appconfig = new OC\AppConfig($connectionMock);
+               $appconfig->setValue('bar', 'foo', 'v1');
+               $appconfig->setValue('bar', 'foo', 'v1');
+               $appconfig->setValue('bar', 'foo', 'v1');
+       }
+
+       public function testSetValueUnchanged2() {
+               $statementMock = $this->getMock('\Doctrine\DBAL\Statement', array(), array(), '', false);
+               $statementMock->expects($this->once())
+                       ->method('fetch')
+                       ->will($this->returnValue(false));
+
+               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+               $connectionMock->expects($this->once())
+                       ->method('executeQuery')
+                       ->with($this->equalTo('SELECT `configvalue`, `configkey` FROM `*PREFIX*appconfig`'
+                               .' WHERE `appid` = ?'), $this->equalTo(array('bar')))
+                       ->will($this->returnValue($statementMock));
+               $connectionMock->expects($this->once())
+                       ->method('insert')
+                       ->with($this->equalTo('*PREFIX*appconfig'),
+                               $this->equalTo(
+                                       array(
+                                               'appid' => 'bar',
+                                               'configkey' => 'foo',
+                                               'configvalue' => 'v1',
+                                       )
+                               ));
+               $connectionMock->expects($this->once())
+                       ->method('update')
+                       ->with($this->equalTo('*PREFIX*appconfig'),
+                               $this->equalTo(array('configvalue' => 'v2')),
+                               $this->equalTo(array('appid' => 'bar', 'configkey' => 'foo'))
+                               );
+
+               $appconfig = new OC\AppConfig($connectionMock);
+               $appconfig->setValue('bar', 'foo', 'v1');
+               $appconfig->setValue('bar', 'foo', 'v2');
+               $appconfig->setValue('bar', 'foo', 'v2');
+       }
+
        public function testDeleteKey() {
                \OC_Appconfig::deleteKey('testapp', 'deletethis');
                $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*appconfig` WHERE `appid` = ? AND `configkey` = ?');
diff --git a/tests/lib/preferences-singleton.php b/tests/lib/preferences-singleton.php
new file mode 100644 (file)
index 0000000..5204775
--- /dev/null
@@ -0,0 +1,396 @@
+<?php
+/**
+ * Copyright (c) 2013 Christopher Schäpers <christopher@schaepers.it>
+ * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+class Test_Preferences extends PHPUnit_Framework_TestCase {
+       public static function setUpBeforeClass() {
+               $query = \OC_DB::prepare('INSERT INTO `*PREFIX*preferences` VALUES(?, ?, ?, ?)');
+               $query->execute(array("Someuser", "someapp", "somekey", "somevalue"));
+
+               $query->execute(array("Someuser", "getusersapp", "somekey", "somevalue"));
+               $query->execute(array("Anotheruser", "getusersapp", "somekey", "someothervalue"));
+               $query->execute(array("Anuser", "getusersapp", "somekey", "somevalue"));
+
+               $query->execute(array("Someuser", "getappsapp", "somekey", "somevalue"));
+
+               $query->execute(array("Someuser", "getkeysapp", "firstkey", "somevalue"));
+               $query->execute(array("Someuser", "getkeysapp", "anotherkey", "somevalue"));
+               $query->execute(array("Someuser", "getkeysapp", "key-tastic", "somevalue"));
+
+               $query->execute(array("Someuser", "getvalueapp", "key", "a value for a key"));
+
+               $query->execute(array("Deleteuser", "deleteapp", "deletekey", "somevalue"));
+               $query->execute(array("Deleteuser", "deleteapp", "somekey", "somevalue"));
+               $query->execute(array("Deleteuser", "someapp", "somekey", "somevalue"));
+       }
+
+       public static function tearDownAfterClass() {
+               $query = \OC_DB::prepare('DELETE FROM `*PREFIX*preferences` WHERE `userid` = ?');
+               $query->execute(array('Someuser'));
+               $query->execute(array('Anotheruser'));
+               $query->execute(array('Anuser'));
+       }
+
+       public function testGetUsers() {
+               $query = \OC_DB::prepare('SELECT DISTINCT `userid` FROM `*PREFIX*preferences`');
+               $result = $query->execute();
+               $expected = array();
+               while ($row = $result->fetchRow()) {
+                       $expected[] = $row['userid'];
+               }
+
+               $this->assertEquals($expected, \OC_Preferences::getUsers());
+       }
+
+       public function testGetApps() {
+               $query = \OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*preferences` WHERE `userid` = ?');
+               $result = $query->execute(array('Someuser'));
+               $expected = array();
+               while ($row = $result->fetchRow()) {
+                       $expected[] = $row['appid'];
+               }
+
+               $this->assertEquals($expected, \OC_Preferences::getApps('Someuser'));
+       }
+
+       public function testGetKeys() {
+               $query = \OC_DB::prepare('SELECT DISTINCT `configkey` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ?');
+               $result = $query->execute(array('Someuser', 'getkeysapp'));
+               $expected = array();
+               while ($row = $result->fetchRow()) {
+                       $expected[] = $row['configkey'];
+               }
+
+               $this->assertEquals($expected, \OC_Preferences::getKeys('Someuser', 'getkeysapp'));
+       }
+
+       public function testGetValue() {
+               $this->assertNull(\OC_Preferences::getValue('nonexistant', 'nonexistant', 'nonexistant'));
+
+               $this->assertEquals('default', \OC_Preferences::getValue('nonexistant', 'nonexistant', 'nonexistant', 'default'));
+
+               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
+               $result = $query->execute(array('Someuser', 'getvalueapp', 'key'));
+               $row = $result->fetchRow();
+               $expected = $row['configvalue'];
+               $this->assertEquals($expected, \OC_Preferences::getValue('Someuser', 'getvalueapp', 'key'));
+       }
+
+       public function testSetValue() {
+               $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'newvalue'));
+               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
+               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
+               $row = $result->fetchRow();
+               $value = $row['configvalue'];
+               $this->assertEquals('newvalue', $value);
+
+               $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'othervalue'));
+               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
+               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
+               $row = $result->fetchRow();
+               $value = $row['configvalue'];
+               $this->assertEquals('othervalue', $value);
+       }
+
+       public function testSetValueWithPreCondition() {
+               // remove existing key
+               $this->assertTrue(\OC_Preferences::deleteKey('Someuser', 'setvalueapp', 'newkey'));
+
+               // add new preference with pre-condition should fails
+               $this->assertFalse(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'newvalue', 'preCondition'));
+               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
+               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
+               $row = $result->fetchRow();
+               $this->assertFalse($row);
+
+               // add new preference without pre-condition should insert the new value
+               $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'newvalue'));
+               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
+               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
+               $row = $result->fetchRow();
+               $value = $row['configvalue'];
+               $this->assertEquals('newvalue', $value);
+
+               // wrong pre-condition, value should stay the same
+               $this->assertFalse(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'othervalue', 'preCondition'));
+               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
+               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
+               $row = $result->fetchRow();
+               $value = $row['configvalue'];
+               $this->assertEquals('newvalue', $value);
+
+               // correct pre-condition, value should change
+               $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'othervalue', 'newvalue'));
+               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
+               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
+               $row = $result->fetchRow();
+               $value = $row['configvalue'];
+               $this->assertEquals('othervalue', $value);
+       }
+
+       public function testDeleteKey() {
+               $this->assertTrue(\OC_Preferences::deleteKey('Deleteuser', 'deleteapp', 'deletekey'));
+               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
+               $result = $query->execute(array('Deleteuser', 'deleteapp', 'deletekey'));
+               $this->assertEquals(0, count($result->fetchAll()));
+       }
+
+       public function testDeleteApp() {
+               $this->assertTrue(\OC_Preferences::deleteApp('Deleteuser', 'deleteapp'));
+               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ?');
+               $result = $query->execute(array('Deleteuser', 'deleteapp'));
+               $this->assertEquals(0, count($result->fetchAll()));
+       }
+
+       public function testDeleteUser() {
+               $this->assertTrue(\OC_Preferences::deleteUser('Deleteuser'));
+               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?');
+               $result = $query->execute(array('Deleteuser'));
+               $this->assertEquals(0, count($result->fetchAll()));
+       }
+
+       public function testDeleteAppFromAllUsers() {
+               $this->assertTrue(\OC_Preferences::deleteAppFromAllUsers('someapp'));
+               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `appid` = ?');
+               $result = $query->execute(array('someapp'));
+               $this->assertEquals(0, count($result->fetchAll()));
+       }
+}
+
+class Test_Preferences_Object extends PHPUnit_Framework_TestCase {
+       public function testGetUsers()
+       {
+               $statementMock = $this->getMock('\Doctrine\DBAL\Statement', array(), array(), '', false);
+               $statementMock->expects($this->exactly(2))
+                       ->method('fetchColumn')
+                       ->will($this->onConsecutiveCalls('foo', false));
+               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+               $connectionMock->expects($this->once())
+                       ->method('executeQuery')
+                       ->with($this->equalTo('SELECT DISTINCT `userid` FROM `*PREFIX*preferences`'))
+                       ->will($this->returnValue($statementMock));
+
+               $preferences = new OC\Preferences($connectionMock);
+               $apps = $preferences->getUsers();
+               $this->assertEquals(array('foo'), $apps);
+       }
+
+       public function testSetValue()
+       {
+               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+               $connectionMock->expects($this->exactly(2))
+                       ->method('fetchColumn')
+                       ->with($this->equalTo('SELECT COUNT(*) FROM `*PREFIX*preferences`'
+                               .' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'),
+                               $this->equalTo(array('grg', 'bar', 'foo')))
+                       ->will($this->onConsecutiveCalls(0, 1));
+               $connectionMock->expects($this->once())
+                       ->method('insert')
+                       ->with($this->equalTo('*PREFIX*preferences'),
+                               $this->equalTo(
+                                       array(
+                                               'userid' => 'grg',
+                                               'appid' => 'bar',
+                                               'configkey' => 'foo',
+                                               'configvalue' => 'v1',
+                                       )
+                               ));
+               $connectionMock->expects($this->once())
+                       ->method('executeUpdate')
+                       ->with($this->equalTo("UPDATE `*PREFIX*preferences` SET `configvalue` = ?"
+                                               . " WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?"),
+                               $this->equalTo(array('v2', 'grg', 'bar', 'foo'))
+                               );
+
+               $preferences = new OC\Preferences($connectionMock);
+               $preferences->setValue('grg', 'bar', 'foo', 'v1');
+               $preferences->setValue('grg', 'bar', 'foo', 'v2');
+       }
+
+       public function testSetValueUnchanged() {
+               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+               $connectionMock->expects($this->exactly(2))
+                       ->method('fetchColumn')
+                       ->with($this->equalTo('SELECT `configvalue` FROM `*PREFIX*preferences`'
+                               .' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'),
+                               $this->equalTo(array('grg', 'bar', 'foo')))
+                       ->will($this->onConsecutiveCalls(0, 1));
+               $connectionMock->expects($this->once())
+                       ->method('insert')
+                       ->with($this->equalTo('*PREFIX*preferences'),
+                               $this->equalTo(
+                                       array(
+                                               'userid' => 'grg',
+                                               'appid' => 'bar',
+                                               'configkey' => 'foo',
+                                               'configvalue' => 'v1',
+                                       )
+                               ));
+               $connectionMock->expects($this->never())
+                       ->method('executeUpdate');
+
+               $preferences = new OC\Preferences($connectionMock);
+               $preferences->setValue('grg', 'bar', 'foo', 'v1');
+               $preferences->setValue('grg', 'bar', 'foo', 'v1');
+               $preferences->setValue('grg', 'bar', 'foo', 'v1');
+       }
+
+       public function testSetValueUnchanged2() {
+               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+               $connectionMock->expects($this->exactly(2))
+                       ->method('fetchColumn')
+                       ->with($this->equalTo('SELECT `configvalue` FROM `*PREFIX*preferences`'
+                               .' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'),
+                               $this->equalTo(array('grg', 'bar', 'foo')))
+                       ->will($this->onConsecutiveCalls(0, 1));
+               $connectionMock->expects($this->once())
+                       ->method('insert')
+                       ->with($this->equalTo('*PREFIX*preferences'),
+                               $this->equalTo(
+                                       array(
+                                               'userid' => 'grg',
+                                               'appid' => 'bar',
+                                               'configkey' => 'foo',
+                                               'configvalue' => 'v1',
+                                       )
+                               ));
+               $connectionMock->expects($this->once())
+                       ->method('executeUpdate')
+                       ->with($this->equalTo("UPDATE `*PREFIX*preferences` SET `configvalue` = ?"
+                                               . " WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?"),
+                               $this->equalTo(array('v2', 'grg', 'bar', 'foo'))
+                               );
+
+               $preferences = new OC\Preferences($connectionMock);
+               $preferences->setValue('grg', 'bar', 'foo', 'v1');
+               $preferences->setValue('grg', 'bar', 'foo', 'v2');
+               $preferences->setValue('grg', 'bar', 'foo', 'v2');
+       }
+
+       public function testGetUserValues()
+       {
+               $query = \OC_DB::prepare('INSERT INTO `*PREFIX*preferences` VALUES(?, ?, ?, ?)');
+               $query->execute(array('SomeUser', 'testGetUserValues', 'somekey', 'somevalue'));
+               $query->execute(array('AnotherUser', 'testGetUserValues', 'somekey', 'someothervalue'));
+               $query->execute(array('AUser', 'testGetUserValues', 'somekey', 'somevalue'));
+
+               $preferences = new OC\Preferences(\OC_DB::getConnection());
+               $users = array('SomeUser', 'AnotherUser', 'NoValueSet');
+
+               $values = $preferences->getValueForUsers('testGetUserValues', 'somekey', $users);
+               $this->assertUserValues($values);
+
+               // Add a lot of users so the array is chunked
+               for ($i = 1; $i <= 75; $i++) {
+                       array_unshift($users, 'NoValueBefore#' . $i);
+                       array_push($users, 'NoValueAfter#' . $i);
+               }
+
+               $values = $preferences->getValueForUsers('testGetUserValues', 'somekey', $users);
+               $this->assertUserValues($values);
+
+               // Clean DB after the test
+               $query = \OC_DB::prepare('DELETE FROM `*PREFIX*preferences` WHERE `appid` = ?');
+               $query->execute(array('testGetUserValues'));
+       }
+
+       protected function assertUserValues($values) {
+               $this->assertEquals(2, sizeof($values));
+
+               $this->assertArrayHasKey('SomeUser', $values);
+               $this->assertEquals('somevalue', $values['SomeUser']);
+
+               $this->assertArrayHasKey('AnotherUser', $values);
+               $this->assertEquals('someothervalue', $values['AnotherUser']);
+       }
+
+       public function testGetValueUsers()
+       {
+               // Prepare data
+               $query = \OC_DB::prepare('INSERT INTO `*PREFIX*preferences` VALUES(?, ?, ?, ?)');
+               $query->execute(array('SomeUser', 'testGetUsersForValue', 'somekey', 'somevalue'));
+               $query->execute(array('AnotherUser', 'testGetUsersForValue', 'somekey', 'someothervalue'));
+               $query->execute(array('AUser', 'testGetUsersForValue', 'somekey', 'somevalue'));
+
+               $preferences = new OC\Preferences(\OC_DB::getConnection());
+               $result = $preferences->getUsersForValue('testGetUsersForValue', 'somekey', 'somevalue');
+               sort($result);
+               $this->assertEquals(array('AUser', 'SomeUser'), $result);
+
+               // Clean DB after the test
+               $query = \OC_DB::prepare('DELETE FROM `*PREFIX*preferences` WHERE `appid` = ?');
+               $query->execute(array('testGetUsersForValue'));
+       }
+
+       public function testDeleteKey()
+       {
+               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+               $connectionMock->expects($this->once())
+                       ->method('delete')
+                       ->with($this->equalTo('*PREFIX*preferences'),
+                               $this->equalTo(
+                                       array(
+                                               'userid' => 'grg',
+                                               'appid' => 'bar',
+                                               'configkey' => 'foo',
+                                       )
+                               ));
+
+               $preferences = new OC\Preferences($connectionMock);
+               $preferences->deleteKey('grg', 'bar', 'foo');
+       }
+
+       public function testDeleteApp()
+       {
+               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+               $connectionMock->expects($this->once())
+                       ->method('delete')
+                       ->with($this->equalTo('*PREFIX*preferences'),
+                               $this->equalTo(
+                                       array(
+                                               'userid' => 'grg',
+                                               'appid' => 'bar',
+                                       )
+                               ));
+
+               $preferences = new OC\Preferences($connectionMock);
+               $preferences->deleteApp('grg', 'bar');
+       }
+
+       public function testDeleteUser()
+       {
+               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+               $connectionMock->expects($this->once())
+                       ->method('delete')
+                       ->with($this->equalTo('*PREFIX*preferences'),
+                               $this->equalTo(
+                                       array(
+                                               'userid' => 'grg',
+                                       )
+                               ));
+
+               $preferences = new OC\Preferences($connectionMock);
+               $preferences->deleteUser('grg');
+       }
+
+       public function testDeleteAppFromAllUsers()
+       {
+               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+               $connectionMock->expects($this->once())
+                       ->method('delete')
+                       ->with($this->equalTo('*PREFIX*preferences'),
+                               $this->equalTo(
+                                       array(
+                                               'appid' => 'bar',
+                                       )
+                               ));
+
+               $preferences = new OC\Preferences($connectionMock);
+               $preferences->deleteAppFromAllUsers('bar');
+       }
+}
index d31b0257bad7f59df5a6ed220f690cd0e789db39..fe8e3e8b48c3ddd33816c3369c52622d1516161e 100644 (file)
@@ -7,161 +7,6 @@
  * See the COPYING-README file.
  */
 
-class Test_Preferences extends PHPUnit_Framework_TestCase {
-       public static function setUpBeforeClass() {
-               $query = \OC_DB::prepare('INSERT INTO `*PREFIX*preferences` VALUES(?, ?, ?, ?)');
-               $query->execute(array("Someuser", "someapp", "somekey", "somevalue"));
-
-               $query->execute(array("Someuser", "getusersapp", "somekey", "somevalue"));
-               $query->execute(array("Anotheruser", "getusersapp", "somekey", "someothervalue"));
-               $query->execute(array("Anuser", "getusersapp", "somekey", "somevalue"));
-
-               $query->execute(array("Someuser", "getappsapp", "somekey", "somevalue"));
-
-               $query->execute(array("Someuser", "getkeysapp", "firstkey", "somevalue"));
-               $query->execute(array("Someuser", "getkeysapp", "anotherkey", "somevalue"));
-               $query->execute(array("Someuser", "getkeysapp", "key-tastic", "somevalue"));
-
-               $query->execute(array("Someuser", "getvalueapp", "key", "a value for a key"));
-
-               $query->execute(array("Deleteuser", "deleteapp", "deletekey", "somevalue"));
-               $query->execute(array("Deleteuser", "deleteapp", "somekey", "somevalue"));
-               $query->execute(array("Deleteuser", "someapp", "somekey", "somevalue"));
-       }
-
-       public static function tearDownAfterClass() {
-               $query = \OC_DB::prepare('DELETE FROM `*PREFIX*preferences` WHERE `userid` = ?');
-               $query->execute(array('Someuser'));
-               $query->execute(array('Anotheruser'));
-               $query->execute(array('Anuser'));
-       }
-
-       public function testGetUsers() {
-               $query = \OC_DB::prepare('SELECT DISTINCT `userid` FROM `*PREFIX*preferences`');
-               $result = $query->execute();
-               $expected = array();
-               while ($row = $result->fetchRow()) {
-                       $expected[] = $row['userid'];
-               }
-
-               $this->assertEquals($expected, \OC_Preferences::getUsers());
-       }
-
-       public function testGetApps() {
-               $query = \OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*preferences` WHERE `userid` = ?');
-               $result = $query->execute(array('Someuser'));
-               $expected = array();
-               while ($row = $result->fetchRow()) {
-                       $expected[] = $row['appid'];
-               }
-
-               $this->assertEquals($expected, \OC_Preferences::getApps('Someuser'));
-       }
-
-       public function testGetKeys() {
-               $query = \OC_DB::prepare('SELECT DISTINCT `configkey` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ?');
-               $result = $query->execute(array('Someuser', 'getkeysapp'));
-               $expected = array();
-               while ($row = $result->fetchRow()) {
-                       $expected[] = $row['configkey'];
-               }
-
-               $this->assertEquals($expected, \OC_Preferences::getKeys('Someuser', 'getkeysapp'));
-       }
-
-       public function testGetValue() {
-               $this->assertNull(\OC_Preferences::getValue('nonexistant', 'nonexistant', 'nonexistant'));
-
-               $this->assertEquals('default', \OC_Preferences::getValue('nonexistant', 'nonexistant', 'nonexistant', 'default'));
-
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Someuser', 'getvalueapp', 'key'));
-               $row = $result->fetchRow();
-               $expected = $row['configvalue'];
-               $this->assertEquals($expected, \OC_Preferences::getValue('Someuser', 'getvalueapp', 'key'));
-       }
-
-       public function testSetValue() {
-               $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'newvalue'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
-               $row = $result->fetchRow();
-               $value = $row['configvalue'];
-               $this->assertEquals('newvalue', $value);
-
-               $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'othervalue'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
-               $row = $result->fetchRow();
-               $value = $row['configvalue'];
-               $this->assertEquals('othervalue', $value);
-       }
-
-       public function testSetValueWithPreCondition() {
-               // remove existing key
-               $this->assertTrue(\OC_Preferences::deleteKey('Someuser', 'setvalueapp', 'newkey'));
-
-               // add new preference with pre-condition should fails
-               $this->assertFalse(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'newvalue', 'preCondition'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
-               $row = $result->fetchRow();
-               $this->assertFalse($row);
-
-               // add new preference without pre-condition should insert the new value
-               $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'newvalue'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
-               $row = $result->fetchRow();
-               $value = $row['configvalue'];
-               $this->assertEquals('newvalue', $value);
-
-               // wrong pre-condition, value should stay the same
-               $this->assertFalse(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'othervalue', 'preCondition'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
-               $row = $result->fetchRow();
-               $value = $row['configvalue'];
-               $this->assertEquals('newvalue', $value);
-
-               // correct pre-condition, value should change
-               $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'othervalue', 'newvalue'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
-               $row = $result->fetchRow();
-               $value = $row['configvalue'];
-               $this->assertEquals('othervalue', $value);
-       }
-
-       public function testDeleteKey() {
-               $this->assertTrue(\OC_Preferences::deleteKey('Deleteuser', 'deleteapp', 'deletekey'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Deleteuser', 'deleteapp', 'deletekey'));
-               $this->assertEquals(0, count($result->fetchAll()));
-       }
-
-       public function testDeleteApp() {
-               $this->assertTrue(\OC_Preferences::deleteApp('Deleteuser', 'deleteapp'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ?');
-               $result = $query->execute(array('Deleteuser', 'deleteapp'));
-               $this->assertEquals(0, count($result->fetchAll()));
-       }
-
-       public function testDeleteUser() {
-               $this->assertTrue(\OC_Preferences::deleteUser('Deleteuser'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?');
-               $result = $query->execute(array('Deleteuser'));
-               $this->assertEquals(0, count($result->fetchAll()));
-       }
-
-       public function testDeleteAppFromAllUsers() {
-               $this->assertTrue(\OC_Preferences::deleteAppFromAllUsers('someapp'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `appid` = ?');
-               $result = $query->execute(array('someapp'));
-               $this->assertEquals(0, count($result->fetchAll()));
-       }
-}
-
 class Test_Preferences_Object extends PHPUnit_Framework_TestCase {
        public function testGetUsers()
        {
@@ -185,10 +30,69 @@ class Test_Preferences_Object extends PHPUnit_Framework_TestCase {
                $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
                $connectionMock->expects($this->exactly(2))
                        ->method('fetchColumn')
-                       ->with($this->equalTo('SELECT COUNT(*) FROM `*PREFIX*preferences`'
+                       ->with($this->equalTo('SELECT `configvalue` FROM `*PREFIX*preferences`'
+                               .' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'),
+                               $this->equalTo(array('grg', 'bar', 'foo')))
+                       ->will($this->onConsecutiveCalls(false, 'v1'));
+               $connectionMock->expects($this->once())
+                       ->method('insert')
+                       ->with($this->equalTo('*PREFIX*preferences'),
+                               $this->equalTo(
+                                       array(
+                                               'userid' => 'grg',
+                                               'appid' => 'bar',
+                                               'configkey' => 'foo',
+                                               'configvalue' => 'v1',
+                                       )
+                               ));
+               $connectionMock->expects($this->once())
+                       ->method('executeUpdate')
+                       ->with($this->equalTo("UPDATE `*PREFIX*preferences` SET `configvalue` = ?"
+                                               . " WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?"),
+                               $this->equalTo(array('v2', 'grg', 'bar', 'foo'))
+                               );
+
+               $preferences = new OC\Preferences($connectionMock);
+               $preferences->setValue('grg', 'bar', 'foo', 'v1');
+               $preferences->setValue('grg', 'bar', 'foo', 'v2');
+       }
+
+       public function testSetValueUnchanged() {
+               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+               $connectionMock->expects($this->exactly(3))
+                       ->method('fetchColumn')
+                       ->with($this->equalTo('SELECT `configvalue` FROM `*PREFIX*preferences`'
                                .' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'),
                                $this->equalTo(array('grg', 'bar', 'foo')))
-                       ->will($this->onConsecutiveCalls(0, 1));
+                       ->will($this->onConsecutiveCalls(false, 'v1', 'v1'));
+               $connectionMock->expects($this->once())
+                       ->method('insert')
+                       ->with($this->equalTo('*PREFIX*preferences'),
+                               $this->equalTo(
+                                       array(
+                                               'userid' => 'grg',
+                                               'appid' => 'bar',
+                                               'configkey' => 'foo',
+                                               'configvalue' => 'v1',
+                                       )
+                               ));
+               $connectionMock->expects($this->never())
+                       ->method('executeUpdate');
+
+               $preferences = new OC\Preferences($connectionMock);
+               $preferences->setValue('grg', 'bar', 'foo', 'v1');
+               $preferences->setValue('grg', 'bar', 'foo', 'v1');
+               $preferences->setValue('grg', 'bar', 'foo', 'v1');
+       }
+
+       public function testSetValueUnchanged2() {
+               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+               $connectionMock->expects($this->exactly(3))
+                       ->method('fetchColumn')
+                       ->with($this->equalTo('SELECT `configvalue` FROM `*PREFIX*preferences`'
+                               .' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'),
+                               $this->equalTo(array('grg', 'bar', 'foo')))
+                       ->will($this->onConsecutiveCalls(false, 'v1', 'v2'));
                $connectionMock->expects($this->once())
                        ->method('insert')
                        ->with($this->equalTo('*PREFIX*preferences'),
@@ -210,6 +114,7 @@ class Test_Preferences_Object extends PHPUnit_Framework_TestCase {
                $preferences = new OC\Preferences($connectionMock);
                $preferences->setValue('grg', 'bar', 'foo', 'v1');
                $preferences->setValue('grg', 'bar', 'foo', 'v2');
+               $preferences->setValue('grg', 'bar', 'foo', 'v2');
        }
 
        public function testGetUserValues()