nextcloud/apps/files/tests/activitytest.php

298 lines
8.2 KiB
PHP

<?php
/**
* Copyright (c) 2015 Joas Schilling <nickvergessen@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*
*/
namespace OCA\Files\Tests;
use OCA\Files\Activity;
use Test\TestCase;
class ActivityTest extends TestCase {
/** @var \OC\ActivityManager */
private $activityManager;
/** @var \PHPUnit_Framework_MockObject_MockObject */
protected $request;
/** @var \PHPUnit_Framework_MockObject_MockObject */
protected $session;
/** @var \PHPUnit_Framework_MockObject_MockObject */
protected $config;
/** @var \PHPUnit_Framework_MockObject_MockObject */
protected $activityHelper;
/** @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\ActivityManager(
$this->request,
$this->session,
$this->config
);
$this->activityExtension = $activityExtension = new Activity(
new \OC\L10N\Factory(),
$this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(),
$this->activityManager,
$this->activityHelper,
$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', '', '', array(), false, false, 'en'),
'Asserting that no translations are set for files_sharing'
);
}
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 (`type` <> ? OR `type` <> ?) ELSE `app` <> ? END ',
['files', Activity::TYPE_SHARE_CREATED, Activity::TYPE_SHARE_CHANGED, 'files']
],
[
[
'items' => ['file.txt', 'folder'],
'folders' => ['folder'],
],
' CASE WHEN `app` = ? THEN (`type` <> ? OR `type` <> ? OR `file` = ? OR `file` = ? OR `file` LIKE ?) ELSE `app` <> ? END ',
['files', Activity::TYPE_SHARE_CREATED, Activity::TYPE_SHARE_CHANGED, 'file.txt', 'folder', 'folder/%', 'files']
],
];
}
/**
* @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);
}
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);
}
}