From 881c7275a2d91eb5c9ab78051d7c1b5f2d5f6718 Mon Sep 17 00:00:00 2001
From: Joas Schilling <coding@schilljs.com>
Date: Tue, 7 Feb 2017 11:49:01 +0100
Subject: [PATCH] Add tests for getFile()

Signed-off-by: Joas Schilling <coding@schilljs.com>
---
 apps/files/lib/Activity/Provider.php       |  23 ++--
 apps/files/tests/Activity/ProviderTest.php | 137 +++++++++++++++++++++
 2 files changed, 149 insertions(+), 11 deletions(-)
 create mode 100644 apps/files/tests/Activity/ProviderTest.php

diff --git a/apps/files/lib/Activity/Provider.php b/apps/files/lib/Activity/Provider.php
index d630f8b845b..624021177fa 100644
--- a/apps/files/lib/Activity/Provider.php
+++ b/apps/files/lib/Activity/Provider.php
@@ -223,28 +223,28 @@ class Provider implements IProvider {
 			case 'deleted_self':
 			case 'restored_self':
 				return [
-					'file' => $this->getRichFileParameter($parameters[0], $event),
+					'file' => $this->getFile($parameters[0], $event),
 				];
 			case 'created_by':
 			case 'changed_by':
 			case 'deleted_by':
 			case 'restored_by':
 				return [
-					'file' => $this->getRichFileParameter($parameters[0], $event),
-					'user' => $this->getRichUserParameter($parameters[1]),
+					'file' => $this->getFile($parameters[0], $event),
+					'user' => $this->getUser($parameters[1]),
 				];
 			case 'renamed_self':
 			case 'moved_self':
 				return [
-					'newfile' => $this->getRichFileParameter($parameters[0]),
-					'oldfile' => $this->getRichFileParameter($parameters[1]),
+					'newfile' => $this->getFile($parameters[0]),
+					'oldfile' => $this->getFile($parameters[1]),
 				];
 			case 'renamed_by':
 			case 'moved_by':
 				return [
-					'newfile' => $this->getRichFileParameter($parameters[0]),
-					'user' => $this->getRichUserParameter($parameters[1]),
-					'oldfile' => $this->getRichFileParameter($parameters[2]),
+					'newfile' => $this->getFile($parameters[0]),
+					'user' => $this->getUser($parameters[1]),
+					'oldfile' => $this->getFile($parameters[2]),
 				];
 		}
 		return [];
@@ -256,10 +256,10 @@ class Provider implements IProvider {
 	 * @return array
 	 * @throws \InvalidArgumentException
 	 */
-	protected function getRichFileParameter($parameter, IEvent $event = null) {
+	protected function getFile($parameter, IEvent $event = null) {
 		if (is_array($parameter)) {
 			$path = reset($parameter);
-			$id = key($parameter);
+			$id = (string) key($parameter);
 		} else if ($event !== null) {
 			// Legacy from before ownCloud 8.2
 			$path = $parameter;
@@ -267,6 +267,7 @@ class Provider implements IProvider {
 		} else {
 			throw new \InvalidArgumentException('Could not generate file parameter');
 		}
+
 		return [
 			'type' => 'file',
 			'id' => $id,
@@ -276,7 +277,7 @@ class Provider implements IProvider {
 		];
 	}
 
-	protected function getRichUserParameter($uid) {
+	protected function getUser($uid) {
 		if (!isset($this->displayNames[$uid])) {
 			$this->displayNames[$uid] = $this->getDisplayName($uid);
 		}
diff --git a/apps/files/tests/Activity/ProviderTest.php b/apps/files/tests/Activity/ProviderTest.php
new file mode 100644
index 00000000000..a79e476df9a
--- /dev/null
+++ b/apps/files/tests/Activity/ProviderTest.php
@@ -0,0 +1,137 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Joas Schilling <coding@schilljs.com>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Files\Tests\Activity;
+
+
+use OCA\Files\Activity\Provider;
+use OCP\Activity\IEvent;
+use OCP\Activity\IEventMerger;
+use OCP\Activity\IManager;
+use OCP\IURLGenerator;
+use OCP\IUserManager;
+use OCP\L10N\IFactory;
+use Test\TestCase;
+
+/**
+ * Class ProviderTest
+ *
+ * @package OCA\Files\Tests\Activity
+ */
+class ProviderTest extends TestCase {
+
+	/** @var IFactory|\PHPUnit_Framework_MockObject_MockObject */
+	protected $l10nFactory;
+	/** @var IURLGenerator|\PHPUnit_Framework_MockObject_MockObject */
+	protected $url;
+	/** @var IManager|\PHPUnit_Framework_MockObject_MockObject */
+	protected $activityManager;
+	/** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */
+	protected $userManager;
+	/** @var IEventMerger|\PHPUnit_Framework_MockObject_MockObject */
+	protected $eventMerger;
+
+	public function setUp() {
+		parent::setUp();
+
+		$this->l10nFactory = $this->createMock(IFactory::class);
+		$this->url = $this->createMock(IURLGenerator::class);
+		$this->activityManager = $this->createMock(IManager::class);
+		$this->userManager = $this->createMock(IUserManager::class);
+		$this->eventMerger = $this->createMock(IEventMerger::class);
+	}
+
+	/**
+	 * @param string[] $methods
+	 * @return Provider|\PHPUnit_Framework_MockObject_MockObject
+	 */
+	protected function getProvider(array $methods = []) {
+		if (!empty($methods)) {
+			return $this->getMockBuilder(Provider::class)
+				->setConstructorArgs([
+					$this->l10nFactory,
+					$this->url,
+					$this->activityManager,
+					$this->userManager,
+					$this->eventMerger,
+				])
+				->setMethods($methods)
+				->getMock();
+		}
+		return new Provider(
+			$this->l10nFactory,
+			$this->url,
+			$this->activityManager,
+			$this->userManager,
+			$this->eventMerger
+		);
+	}
+
+	public function dataGetFile() {
+		return [
+			[[42 => '/FortyTwo.txt'], null, '42', 'FortyTwo.txt', 'FortyTwo.txt'],
+			[['23' => '/Twenty/Three.txt'], null, '23', 'Three.txt', 'Twenty/Three.txt'],
+			['/Foo/Bar.txt', '128', '128', 'Bar.txt', 'Foo/Bar.txt'], // Legacy from ownCloud 8.2 and before
+		];
+	}
+
+	/**
+	 * @dataProvider dataGetFile
+	 * @param mixed $parameter
+	 * @param mixed $eventId
+	 * @param int $id
+	 * @param string $name
+	 * @param string $path
+	 */
+	public function testGetFile($parameter, $eventId, $id, $name, $path) {
+		$provider = $this->getProvider();
+
+		if ($eventId !== null) {
+			$event = $this->createMock(IEvent::class);
+			$event->expects($this->once())
+				->method('getObjectId')
+				->willReturn($eventId);
+		} else {
+			$event = null;
+		}
+
+		$this->url->expects($this->once())
+			->method('linkToRouteAbsolute')
+			->with('files.viewcontroller.showFile', ['fileid' => $id])
+			->willReturn('link-' . $id);
+
+		$result = self::invokePrivate($provider, 'getFile', [$parameter, $event]);
+
+		$this->assertSame('file', $result['type']);
+		$this->assertSame($id, $result['id']);
+		$this->assertSame($name, $result['name']);
+		$this->assertSame($path, $result['path']);
+		$this->assertSame('link-' . $id, $result['link']);
+	}
+
+	/**
+	 * @expectedException \InvalidArgumentException
+	 */
+	public function testGetFileThrows() {
+		$provider = $this->getProvider();
+		self::invokePrivate($provider, 'getFile', ['/Foo/Bar.txt', null]);
+	}
+}
-- 
GitLab