From 08e6541a882221e22e2f90efae9e807d88ba1e45 Mon Sep 17 00:00:00 2001
From: Bjoern Schiessle <bjoern@schiessle.org>
Date: Wed, 16 Nov 2016 19:01:57 +0100
Subject: [PATCH] fix unit tests

Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
---
 lib/private/Accounts/AccountManager.php    |   1 -
 tests/lib/Accounts/AccountsManagerTest.php | 202 +++++++++++++++++++++
 2 files changed, 202 insertions(+), 1 deletion(-)
 create mode 100644 tests/lib/Accounts/AccountsManagerTest.php

diff --git a/lib/private/Accounts/AccountManager.php b/lib/private/Accounts/AccountManager.php
index 9485f8bc19a..6496a521326 100644
--- a/lib/private/Accounts/AccountManager.php
+++ b/lib/private/Accounts/AccountManager.php
@@ -23,7 +23,6 @@
 
 namespace OC\Accounts;
 
-
 use OCP\IDBConnection;
 use OCP\IUser;
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
diff --git a/tests/lib/Accounts/AccountsManagerTest.php b/tests/lib/Accounts/AccountsManagerTest.php
new file mode 100644
index 00000000000..de88fbcab97
--- /dev/null
+++ b/tests/lib/Accounts/AccountsManagerTest.php
@@ -0,0 +1,202 @@
+<?php
+/**
+ * @author Bjƶrn SchieƟle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace Test\Accounts;
+
+
+use OC\Accounts\AccountManager;
+use OC\Mail\Mailer;
+use OCP\IUser;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Test\TestCase;
+
+/**
+ * Class AccountsManagerTest
+ *
+ * @group DB
+ * @package Test\Accounts
+ */
+class AccountsManagerTest extends TestCase {
+
+	/** @var  \OCP\IDBConnection */
+	private $connection;
+
+	/** @var  EventDispatcherInterface | \PHPUnit_Framework_MockObject_MockObject */
+	private $eventDispatcher;
+
+	/** @var string accounts table name */
+	private $table = 'accounts';
+
+	public function setUp() {
+		parent::setUp();
+		$this->eventDispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface')
+			->disableOriginalConstructor()->getMock();
+		$this->connection = \OC::$server->getDatabaseConnection();
+	}
+
+	public function tearDown() {
+		parent::tearDown();
+		$query = $this->connection->getQueryBuilder();
+		$query->delete($this->table)->execute();
+	}
+
+	/**
+	 * get a instance of the accountManager
+	 *
+	 * @param array $mockedMethods list of methods which should be mocked
+	 * @return \PHPUnit_Framework_MockObject_MockObject | AccountManager
+	 */
+	public function getInstance($mockedMethods = null) {
+		return $this->getMockBuilder('OC\Accounts\AccountManager')
+			->setConstructorArgs([$this->connection, $this->eventDispatcher])
+			->setMethods($mockedMethods)
+			->getMock();
+
+	}
+
+	/**
+	 * @dataProvider dataTrueFalse
+	 *
+	 * @param bool $userAlreadyExists
+	 */
+	public function testUpdateUser($userAlreadyExists) {
+		$accountManager = $this->getInstance(['getUser', 'insertNewUser', 'updateExistingUser']);
+		$user = $this->getMockBuilder('OCP\IUser')->getMock();
+
+		$accountManager->expects($this->once())->method('getUser')->with($user)->willReturn($userAlreadyExists);
+
+		if ($userAlreadyExists) {
+			$accountManager->expects($this->once())->method('updateExistingUser')
+				->with($user, 'data');
+			$accountManager->expects($this->never())->method('insertNewUser');
+		} else {
+			$accountManager->expects($this->once())->method('insertNewUser')
+				->with($user, 'data');
+			$accountManager->expects($this->never())->method('updateExistingUser');
+		}
+
+		$this->eventDispatcher->expects($this->once())->method('dispatch')
+			->willReturnCallback(function($eventName, $event) use ($user) {
+				$this->assertSame('OC\AccountManager::userUpdated', $eventName);
+				$this->assertInstanceOf('Symfony\Component\EventDispatcher\GenericEvent', $event);
+			}
+			);
+
+		$accountManager->updateUser($user, 'data');
+	}
+
+	public function dataTrueFalse() {
+		return [
+			[true],
+			[false]
+		];
+	}
+
+
+	/**
+	 * @dataProvider dataTestGetUser
+	 *
+	 * @param string $setUser
+	 * @param array $setData
+	 * @param IUser $askUser
+	 * @param array $expectedData
+	 * @param book $userAlreadyExists
+	 */
+	public function testGetUser($setUser, $setData, $askUser, $expectedData, $userAlreadyExists) {
+		$accountManager = $this->getInstance(['buildDefaultUserRecord', 'insertNewUser']);
+		if (!$userAlreadyExists) {
+			$accountManager->expects($this->once())->method('buildDefaultUserRecord')
+				->with($askUser)->willReturn($expectedData);
+			$accountManager->expects($this->once())->method('insertNewUser')
+				->with($askUser, $expectedData);
+		}
+		$this->addDummyValuesToTable($setUser, $setData);
+		$this->assertEquals($expectedData,
+			$accountManager->getUser($askUser)
+		);
+	}
+
+	public function dataTestGetUser() {
+		$user1 = $this->getMockBuilder('OCP\IUser')->getMock();
+		$user1->expects($this->any())->method('getUID')->willReturn('user1');
+		$user2 = $this->getMockBuilder('OCP\IUser')->getMock();
+		$user2->expects($this->any())->method('getUID')->willReturn('user2');
+		return [
+			['user1', ['key' => 'value'], $user1, ['key' => 'value'], true],
+			['user1', ['key' => 'value'], $user2, [], false],
+		];
+	}
+
+	public function testUpdateExistingUser() {
+		$user = $this->getMockBuilder('OCP\IUser')->getMock();
+		$user->expects($this->once())->method('getUID')->willReturn('uid');
+		$oldData = ['key' => 'value'];
+		$newData = ['newKey' => 'newValue'];
+
+		$accountManager = $this->getInstance();
+		$this->addDummyValuesToTable('uid', $oldData);
+		$this->invokePrivate($accountManager, 'updateExistingUser', [$user, $newData]);
+		$newDataFromTable = $this->getDataFromTable('uid');
+		$this->assertEquals($newData, $newDataFromTable);
+	}
+
+	public function testInsertNewUser() {
+		$user = $this->getMockBuilder('OCP\IUser')->getMock();
+		$uid = 'uid';
+		$data = ['key' => 'value'];
+
+		$accountManager = $this->getInstance();
+		$user->expects($this->once())->method('getUID')->willReturn($uid);
+		$this->assertNull($this->getDataFromTable($uid));
+		$this->invokePrivate($accountManager, 'insertNewUser', [$user, $data]);
+
+		$dataFromDb = $this->getDataFromTable($uid);
+		$this->assertEquals($data, $dataFromDb);
+	}
+
+	private function addDummyValuesToTable($uid, $data) {
+
+		$query = $this->connection->getQueryBuilder();
+		$query->insert($this->table)
+			->values(
+				[
+					'uid' => $query->createNamedParameter($uid),
+					'data' => $query->createNamedParameter(json_encode($data)),
+				]
+			)
+			->execute();
+	}
+
+	private function getDataFromTable($uid) {
+		$query = $this->connection->getQueryBuilder();
+		$query->select('data')->from($this->table)
+			->where($query->expr()->eq('uid', $query->createParameter('uid')))
+			->setParameter('uid', $uid);
+		$query->execute();
+		$result = $query->execute()->fetchAll();
+
+		if (!empty($result)) {
+			return json_decode($result[0]['data'], true);
+		}
+	}
+
+}
-- 
GitLab