aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files/tests/ActivityTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files/tests/ActivityTest.php')
-rw-r--r--apps/files/tests/ActivityTest.php375
1 files changed, 375 insertions, 0 deletions
diff --git a/apps/files/tests/ActivityTest.php b/apps/files/tests/ActivityTest.php
new file mode 100644
index 00000000000..bc062dd0542
--- /dev/null
+++ b/apps/files/tests/ActivityTest.php
@@ -0,0 +1,375 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ * @author Morris Jobke <hey@morrisjobke.de>
+ *
+ * @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 OCA\Files\Tests;
+
+use OCA\Files\Activity;
+use Test\TestCase;
+
+/**
+ * Class ActivityTest
+ *
+ * @group DB
+ * @package OCA\Files\Tests
+ */
+class ActivityTest extends TestCase {
+
+ /** @var \OCP\Activity\IManager */
+ private $activityManager;
+
+ /** @var \OCP\IRequest|\PHPUnit_Framework_MockObject_MockObject */
+ protected $request;
+
+ /** @var \OCP\IUserSession|\PHPUnit_Framework_MockObject_MockObject */
+ protected $session;
+
+ /** @var \OCP\IConfig|\PHPUnit_Framework_MockObject_MockObject */
+ protected $config;
+
+ /** @var \OCA\Files\ActivityHelper|\PHPUnit_Framework_MockObject_MockObject */
+ protected $activityHelper;
+
+ /** @var \OCP\L10N\IFactory|\PHPUnit_Framework_MockObject_MockObject */
+ protected $l10nFactory;
+
+ /** @var \OCA\Files\Activity */
+ protected $activityExtension;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->request = $this->getMockBuilder('OCP\IRequest')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->session = $this->getMockBuilder('OCP\IUserSession')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->config = $this->getMockBuilder('OCP\IConfig')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->activityHelper = $this->getMockBuilder('OCA\Files\ActivityHelper')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->activityManager = new \OC\Activity\Manager(
+ $this->request,
+ $this->session,
+ $this->config
+ );
+
+ $this->l10nFactory = $this->getMockBuilder('OCP\L10N\IFactory')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $deL10n = $this->getMockBuilder('OC_L10N')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $deL10n->expects($this->any())
+ ->method('t')
+ ->willReturnCallback(function ($argument) {
+ return 'translate(' . $argument . ')';
+ });
+
+ $this->l10nFactory->expects($this->any())
+ ->method('get')
+ ->willReturnMap([
+ ['files', null, new \OC_L10N('files', 'en')],
+ ['files', 'en', new \OC_L10N('files', 'en')],
+ ['files', 'de', $deL10n],
+ ]);
+
+ $this->activityExtension = $activityExtension = new Activity(
+ $this->l10nFactory,
+ $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(),
+ $this->activityManager,
+ $this->activityHelper,
+ \OC::$server->getDatabaseConnection(),
+ $this->config
+ );
+
+ $this->activityManager->registerExtension(function() use ($activityExtension) {
+ return $activityExtension;
+ });
+ }
+
+ public function testNotificationTypes() {
+ $result = $this->activityExtension->getNotificationTypes('en');
+ $this->assertTrue(is_array($result), 'Asserting getNotificationTypes() returns an array');
+ $this->assertCount(5, $result);
+ $this->assertArrayHasKey(Activity::TYPE_SHARE_CREATED, $result);
+ $this->assertArrayHasKey(Activity::TYPE_SHARE_CHANGED, $result);
+ $this->assertArrayHasKey(Activity::TYPE_FAVORITES, $result);
+ $this->assertArrayHasKey(Activity::TYPE_SHARE_DELETED, $result);
+ $this->assertArrayHasKey(Activity::TYPE_SHARE_RESTORED, $result);
+ }
+
+ public function testDefaultTypes() {
+ $result = $this->activityExtension->getDefaultTypes('stream');
+ $this->assertTrue(is_array($result), 'Asserting getDefaultTypes(stream) returns an array');
+ $this->assertCount(4, $result);
+ $result = array_flip($result);
+ $this->assertArrayHasKey(Activity::TYPE_SHARE_CREATED, $result);
+ $this->assertArrayHasKey(Activity::TYPE_SHARE_CHANGED, $result);
+ $this->assertArrayNotHasKey(Activity::TYPE_FAVORITES, $result);
+ $this->assertArrayHasKey(Activity::TYPE_SHARE_DELETED, $result);
+ $this->assertArrayHasKey(Activity::TYPE_SHARE_RESTORED, $result);
+
+ $result = $this->activityExtension->getDefaultTypes('email');
+ $this->assertFalse($result, 'Asserting getDefaultTypes(email) returns false');
+ }
+
+ public function testTranslate() {
+ $this->assertFalse(
+ $this->activityExtension->translate('files_sharing', '', [], false, false, 'en'),
+ 'Asserting that no translations are set for files_sharing'
+ );
+
+ // Test english
+ $this->assertNotFalse(
+ $this->activityExtension->translate('files', 'deleted_self', ['file'], false, false, 'en'),
+ 'Asserting that translations are set for files.deleted_self'
+ );
+ $this->assertStringStartsWith(
+ 'You deleted ',
+ $this->activityExtension->translate('files', 'deleted_self', ['file'], false, false, 'en')
+ );
+
+ // Test translation
+ $this->assertNotFalse(
+ $this->activityExtension->translate('files', 'deleted_self', ['file'], false, false, 'de'),
+ 'Asserting that translations are set for files.deleted_self'
+ );
+ $this->assertStringStartsWith(
+ 'translate(You deleted ',
+ $this->activityExtension->translate('files', 'deleted_self', ['file'], false, false, 'de')
+ );
+ }
+
+ public function testGetSpecialParameterList() {
+ $this->assertFalse(
+ $this->activityExtension->getSpecialParameterList('files_sharing', ''),
+ 'Asserting that no special parameters are set for files_sharing'
+ );
+ }
+
+ public function typeIconData() {
+ return [
+ [Activity::TYPE_SHARE_CHANGED, 'icon-change'],
+ [Activity::TYPE_SHARE_CREATED, 'icon-add-color'],
+ [Activity::TYPE_SHARE_DELETED, 'icon-delete-color'],
+ [Activity::TYPE_SHARE_RESTORED, false],
+ [Activity::TYPE_FAVORITES, false],
+ ['unknown type', false],
+ ];
+ }
+
+ /**
+ * @dataProvider typeIconData
+ *
+ * @param string $type
+ * @param mixed $expected
+ */
+ public function testTypeIcon($type, $expected) {
+ $this->assertSame($expected, $this->activityExtension->getTypeIcon($type));
+ }
+
+ public function testGroupParameter() {
+ $this->assertFalse(
+ $this->activityExtension->getGroupParameter(['app' => 'files_sharing']),
+ 'Asserting that no group parameters are set for files_sharing'
+ );
+ }
+
+ public function testNavigation() {
+ $result = $this->activityExtension->getNavigation();
+ $this->assertCount(1, $result['top']);
+ $this->assertArrayHasKey(Activity::FILTER_FAVORITES, $result['top']);
+
+ $this->assertCount(1, $result['apps']);
+ $this->assertArrayHasKey(Activity::FILTER_FILES, $result['apps']);
+ }
+
+ public function testIsFilterValid() {
+ $this->assertTrue($this->activityExtension->isFilterValid(Activity::FILTER_FAVORITES));
+ $this->assertTrue($this->activityExtension->isFilterValid(Activity::FILTER_FILES));
+ $this->assertFalse($this->activityExtension->isFilterValid('unknown filter'));
+ }
+
+ public function filterNotificationTypesData() {
+ return [
+ [
+ Activity::FILTER_FILES,
+ [
+ 'NT0',
+ Activity::TYPE_SHARE_CREATED,
+ Activity::TYPE_SHARE_CHANGED,
+ Activity::TYPE_SHARE_DELETED,
+ Activity::TYPE_SHARE_RESTORED,
+ Activity::TYPE_FAVORITES,
+ ], [
+ Activity::TYPE_SHARE_CREATED,
+ Activity::TYPE_SHARE_CHANGED,
+ Activity::TYPE_SHARE_DELETED,
+ Activity::TYPE_SHARE_RESTORED,
+ ],
+ ],
+ [
+ Activity::FILTER_FILES,
+ [
+ 'NT0',
+ Activity::TYPE_SHARE_CREATED,
+ Activity::TYPE_FAVORITES,
+ ],
+ [
+ Activity::TYPE_SHARE_CREATED,
+ ],
+ ],
+ [
+ Activity::FILTER_FAVORITES,
+ [
+ 'NT0',
+ Activity::TYPE_SHARE_CREATED,
+ Activity::TYPE_SHARE_CHANGED,
+ Activity::TYPE_SHARE_DELETED,
+ Activity::TYPE_SHARE_RESTORED,
+ Activity::TYPE_FAVORITES,
+ ], [
+ Activity::TYPE_SHARE_CREATED,
+ Activity::TYPE_SHARE_CHANGED,
+ Activity::TYPE_SHARE_DELETED,
+ Activity::TYPE_SHARE_RESTORED,
+ ],
+ ],
+ [
+ 'unknown filter',
+ [
+ 'NT0',
+ Activity::TYPE_SHARE_CREATED,
+ Activity::TYPE_SHARE_CHANGED,
+ Activity::TYPE_SHARE_DELETED,
+ Activity::TYPE_SHARE_RESTORED,
+ Activity::TYPE_FAVORITES,
+ ],
+ false,
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider filterNotificationTypesData
+ *
+ * @param string $filter
+ * @param array $types
+ * @param mixed $expected
+ */
+ public function testFilterNotificationTypes($filter, $types, $expected) {
+ $result = $this->activityExtension->filterNotificationTypes($types, $filter);
+ $this->assertEquals($expected, $result);
+ }
+
+ public function queryForFilterData() {
+ return [
+ [
+ new \RuntimeException(),
+ '`app` = ?',
+ ['files']
+ ],
+ [
+ [
+ 'items' => [],
+ 'folders' => [],
+ ],
+ ' CASE WHEN `app` <> ? THEN 1 WHEN `app` = ? AND ((`type` <> ? AND `type` <> ?)) THEN 1 ELSE 0 END = 1 ',
+ ['files', 'files', Activity::TYPE_SHARE_CREATED, Activity::TYPE_SHARE_CHANGED]
+ ],
+ [
+ [
+ 'items' => ['file.txt', 'folder'],
+ 'folders' => ['folder'],
+ ],
+ ' CASE WHEN `app` <> ? THEN 1 WHEN `app` = ? AND ((`type` <> ? AND `type` <> ?) OR `file` = ? OR `file` = ? OR `file` LIKE ?) THEN 1 ELSE 0 END = 1 ',
+ ['files', 'files', Activity::TYPE_SHARE_CREATED, Activity::TYPE_SHARE_CHANGED, 'file.txt', 'folder', 'folder/%']
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider queryForFilterData
+ *
+ * @param mixed $will
+ * @param string $query
+ * @param array $parameters
+ */
+ public function testQueryForFilter($will, $query, $parameters) {
+ $this->mockUserSession('test');
+
+ $this->config->expects($this->any())
+ ->method('getUserValue')
+ ->willReturnMap([
+ ['test', 'activity', 'notify_stream_' . Activity::TYPE_FAVORITES, false, true],
+ ]);
+ if (is_array($will)) {
+ $this->activityHelper->expects($this->any())
+ ->method('getFavoriteFilePaths')
+ ->with('test')
+ ->willReturn($will);
+ } else {
+ $this->activityHelper->expects($this->any())
+ ->method('getFavoriteFilePaths')
+ ->with('test')
+ ->willThrowException($will);
+ }
+
+ $result = $this->activityExtension->getQueryForFilter('all');
+ $this->assertEquals([$query, $parameters], $result);
+
+ $this->executeQueryForFilter($result);
+ }
+
+ public function executeQueryForFilter(array $result) {
+ list($resultQuery, $resultParameters) = $result;
+ $resultQuery = str_replace('`file`', '`user`', $resultQuery);
+ $resultQuery = str_replace('`type`', '`key`', $resultQuery);
+
+ $connection = \OC::$server->getDatabaseConnection();
+ // Test the query on the privatedata table, because the activity table
+ // does not exist in core
+ $result = $connection->executeQuery('SELECT * FROM `*PREFIX*privatedata` WHERE ' . $resultQuery, $resultParameters);
+ $rows = $result->fetchAll();
+ $result->closeCursor();
+ }
+
+ protected function mockUserSession($user) {
+ $mockUser = $this->getMockBuilder('\OCP\IUser')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $mockUser->expects($this->any())
+ ->method('getUID')
+ ->willReturn($user);
+
+ $this->session->expects($this->any())
+ ->method('isLoggedIn')
+ ->willReturn(true);
+ $this->session->expects($this->any())
+ ->method('getUser')
+ ->willReturn($mockUser);
+ }
+}