aboutsummaryrefslogtreecommitdiffstats
path: root/tests/lib/SystemTag/SystemTagManagerTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lib/SystemTag/SystemTagManagerTest.php')
-rw-r--r--tests/lib/SystemTag/SystemTagManagerTest.php285
1 files changed, 167 insertions, 118 deletions
diff --git a/tests/lib/SystemTag/SystemTagManagerTest.php b/tests/lib/SystemTag/SystemTagManagerTest.php
index e4610ede9bf..b443d7222b2 100644
--- a/tests/lib/SystemTag/SystemTagManagerTest.php
+++ b/tests/lib/SystemTag/SystemTagManagerTest.php
@@ -1,11 +1,9 @@
<?php
/**
- * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- *
+ * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace Test\SystemTag;
@@ -13,11 +11,16 @@ namespace Test\SystemTag;
use OC\SystemTag\SystemTagManager;
use OC\SystemTag\SystemTagObjectMapper;
use OCP\EventDispatcher\IEventDispatcher;
+use OCP\IAppConfig;
use OCP\IDBConnection;
use OCP\IGroupManager;
use OCP\IUser;
+use OCP\IUserSession;
+use OCP\Server;
use OCP\SystemTag\ISystemTag;
use OCP\SystemTag\ISystemTagManager;
+use OCP\SystemTag\TagAlreadyExistsException;
+use OCP\SystemTag\TagNotFoundException;
use Test\TestCase;
/**
@@ -27,44 +30,36 @@ use Test\TestCase;
* @package Test\SystemTag
*/
class SystemTagManagerTest extends TestCase {
- /**
- * @var ISystemTagManager
- **/
- private $tagManager;
-
- /**
- * @var IDBConnection
- */
- private $connection;
-
- /**
- * @var IGroupManager
- */
- private $groupManager;
-
- /**
- * @var IEventDispatcher
- */
- private $dispatcher;
+ private ISystemTagManager $tagManager;
+ private IDBConnection $connection;
+ private IGroupManager $groupManager;
+ private IUserSession $userSession;
+ private IAppConfig $appConfig;
+ private IEventDispatcher $dispatcher;
protected function setUp(): void {
parent::setUp();
- $this->connection = \OC::$server->getDatabaseConnection();
+ $this->connection = Server::get(IDBConnection::class);
$this->dispatcher = $this->createMock(IEventDispatcher::class);
$this->groupManager = $this->createMock(IGroupManager::class);
+ $this->userSession = $this->createMock(IUserSession::class);
+ $this->appConfig = $this->createMock(IAppConfig::class);
$this->tagManager = new SystemTagManager(
$this->connection,
$this->groupManager,
- $this->dispatcher
+ $this->dispatcher,
+ $this->userSession,
+ $this->appConfig,
);
$this->pruneTagsTables();
}
protected function tearDown(): void {
$this->pruneTagsTables();
+ \OC::$CLI = true;
parent::tearDown();
}
@@ -74,7 +69,7 @@ class SystemTagManagerTest extends TestCase {
$query->delete(SystemTagManager::TAG_TABLE)->execute();
}
- public function getAllTagsDataProvider() {
+ public static function getAllTagsDataProvider(): array {
return [
[
// no tags at all
@@ -87,24 +82,11 @@ class SystemTagManagerTest extends TestCase {
['two', false, false],
]
],
- [
- // duplicate names, different flags
- [
- ['one', false, false],
- ['one', true, false],
- ['one', false, true],
- ['one', true, true],
- ['two', false, false],
- ['two', false, true],
- ]
- ]
];
}
- /**
- * @dataProvider getAllTagsDataProvider
- */
- public function testGetAllTags($testTags) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('getAllTagsDataProvider')]
+ public function testGetAllTags($testTags): void {
$testTagsById = [];
foreach ($testTags as $testTag) {
$tag = $this->tagManager->createTag($testTag[0], $testTag[1], $testTag[2]);
@@ -121,7 +103,7 @@ class SystemTagManagerTest extends TestCase {
}
}
- public function getAllTagsFilteredDataProvider() {
+ public static function getAllTagsFilteredDataProvider(): array {
return [
[
[
@@ -170,14 +152,14 @@ class SystemTagManagerTest extends TestCase {
[
[
['one', true, false],
- ['one', false, false],
+ ['one_different', false, false],
['two', true, false],
],
null,
'on',
[
['one', true, false],
- ['one', false, false],
+ ['one_different', false, false],
]
],
// filter by name pattern and visibility
@@ -186,7 +168,7 @@ class SystemTagManagerTest extends TestCase {
[
['one', true, false],
['two', true, false],
- ['one', false, false],
+ ['one_different', false, false],
],
true,
'on',
@@ -210,10 +192,8 @@ class SystemTagManagerTest extends TestCase {
];
}
- /**
- * @dataProvider getAllTagsFilteredDataProvider
- */
- public function testGetAllTagsFiltered($testTags, $visibilityFilter, $nameSearch, $expectedResults) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('getAllTagsFilteredDataProvider')]
+ public function testGetAllTagsFiltered($testTags, $visibilityFilter, $nameSearch, $expectedResults): void {
foreach ($testTags as $testTag) {
$this->tagManager->createTag($testTag[0], $testTag[1], $testTag[2]);
}
@@ -234,7 +214,7 @@ class SystemTagManagerTest extends TestCase {
}
}
- public function oneTagMultipleFlagsProvider() {
+ public static function oneTagMultipleFlagsProvider(): array {
return [
['one', false, false],
['one', true, false],
@@ -243,11 +223,9 @@ class SystemTagManagerTest extends TestCase {
];
}
- /**
- * @dataProvider oneTagMultipleFlagsProvider
- */
- public function testCreateDuplicate($name, $userVisible, $userAssignable) {
- $this->expectException(\OCP\SystemTag\TagAlreadyExistsException::class);
+ #[\PHPUnit\Framework\Attributes\DataProvider('oneTagMultipleFlagsProvider')]
+ public function testCreateDuplicate($name, $userVisible, $userAssignable): void {
+ $this->expectException(TagAlreadyExistsException::class);
try {
$this->tagManager->createTag($name, $userVisible, $userAssignable);
@@ -257,22 +235,29 @@ class SystemTagManagerTest extends TestCase {
$this->tagManager->createTag($name, $userVisible, $userAssignable);
}
- public function testCreateOverlongName() {
+ public function testCreateDuplicateWithDifferentFlags(): void {
+ $this->expectException(TagAlreadyExistsException::class);
+
+ // Create a tag with specific flags
+ $this->tagManager->createTag('duplicate', true, false);
+ // Try to create a tag with the same name but different flags - should fail
+ $this->tagManager->createTag('duplicate', false, true);
+ }
+
+ public function testCreateOverlongName(): void {
$tag = $this->tagManager->createTag('Zona circundante do Palácio Nacional da Ajuda (Jardim das Damas, Salão de Física, Torre Sineira, Paço Velho e Jardim Botânico)', true, true);
$this->assertSame('Zona circundante do Palácio Nacional da Ajuda (Jardim das Damas', $tag->getName()); // 63 characters but 64 bytes due to "á"
}
- /**
- * @dataProvider oneTagMultipleFlagsProvider
- */
- public function testGetExistingTag($name, $userVisible, $userAssignable) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('oneTagMultipleFlagsProvider')]
+ public function testGetExistingTag($name, $userVisible, $userAssignable): void {
$tag1 = $this->tagManager->createTag($name, $userVisible, $userAssignable);
$tag2 = $this->tagManager->getTag($name, $userVisible, $userAssignable);
$this->assertSameTag($tag1, $tag2);
}
- public function testGetExistingTagById() {
+ public function testGetExistingTagById(): void {
$tag1 = $this->tagManager->createTag('one', true, false);
$tag2 = $this->tagManager->createTag('two', false, true);
@@ -285,107 +270,101 @@ class SystemTagManagerTest extends TestCase {
}
- public function testGetNonExistingTag() {
- $this->expectException(\OCP\SystemTag\TagNotFoundException::class);
+ public function testGetNonExistingTag(): void {
+ $this->expectException(TagNotFoundException::class);
$this->tagManager->getTag('nonexist', false, false);
}
- public function testGetNonExistingTagsById() {
- $this->expectException(\OCP\SystemTag\TagNotFoundException::class);
+ public function testGetNonExistingTagsById(): void {
+ $this->expectException(TagNotFoundException::class);
$tag1 = $this->tagManager->createTag('one', true, false);
$this->tagManager->getTagsByIds([$tag1->getId(), 100, 101]);
}
- public function testGetInvalidTagIdFormat() {
+ public function testGetInvalidTagIdFormat(): void {
$this->expectException(\InvalidArgumentException::class);
$tag1 = $this->tagManager->createTag('one', true, false);
$this->tagManager->getTagsByIds([$tag1->getId() . 'suffix']);
}
- public function updateTagProvider() {
+ public static function updateTagProvider(): array {
return [
[
// update name
- ['one', true, true],
- ['two', true, true]
+ ['one', true, true, '0082c9'],
+ ['two', true, true, '0082c9']
],
[
// update one flag
- ['one', false, true],
- ['one', true, true]
+ ['one', false, true, null],
+ ['one', true, true, '0082c9']
],
[
// update all flags
- ['one', false, false],
- ['one', true, true]
+ ['one', false, false, '0082c9'],
+ ['one', true, true, null]
],
[
// update all
- ['one', false, false],
- ['two', true, true]
+ ['one', false, false, '0082c9'],
+ ['two', true, true, '0082c9']
],
];
}
- /**
- * @dataProvider updateTagProvider
- */
- public function testUpdateTag($tagCreate, $tagUpdated) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('updateTagProvider')]
+ public function testUpdateTag($tagCreate, $tagUpdated): void {
$tag1 = $this->tagManager->createTag(
$tagCreate[0],
$tagCreate[1],
- $tagCreate[2]
+ $tagCreate[2],
+ $tagCreate[3],
);
$this->tagManager->updateTag(
$tag1->getId(),
$tagUpdated[0],
$tagUpdated[1],
- $tagUpdated[2]
+ $tagUpdated[2],
+ $tagUpdated[3],
);
$tag2 = $this->tagManager->getTag(
$tagUpdated[0],
$tagUpdated[1],
- $tagUpdated[2]
+ $tagUpdated[2],
+ $tagUpdated[3],
);
$this->assertEquals($tag2->getId(), $tag1->getId());
$this->assertEquals($tag2->getName(), $tagUpdated[0]);
$this->assertEquals($tag2->isUserVisible(), $tagUpdated[1]);
$this->assertEquals($tag2->isUserAssignable(), $tagUpdated[2]);
+ $this->assertEquals($tag2->getColor(), $tagUpdated[3]);
+
}
- /**
- * @dataProvider updateTagProvider
- */
- public function testUpdateTagDuplicate($tagCreate, $tagUpdated) {
- $this->expectException(\OCP\SystemTag\TagAlreadyExistsException::class);
+ public function testUpdateTagToExistingName(): void {
+ $this->expectException(TagAlreadyExistsException::class);
- $this->tagManager->createTag(
- $tagCreate[0],
- $tagCreate[1],
- $tagCreate[2]
- );
- $tag2 = $this->tagManager->createTag(
- $tagUpdated[0],
- $tagUpdated[1],
- $tagUpdated[2]
- );
+ // Create two different tags
+ $tag1 = $this->tagManager->createTag('first', true, true);
+ $tag2 = $this->tagManager->createTag('second', false, false);
- // update to match the first tag
+ // Try to update tag2 to have the same name as tag1 - should fail
$this->tagManager->updateTag(
$tag2->getId(),
- $tagCreate[0],
- $tagCreate[1],
- $tagCreate[2]
+ 'first',
+ false,
+ false,
+ null
);
}
- public function testDeleteTags() {
+ public function testDeleteTags(): void {
$tag1 = $this->tagManager->createTag('one', true, false);
$tag2 = $this->tagManager->createTag('two', false, true);
@@ -395,13 +374,13 @@ class SystemTagManagerTest extends TestCase {
}
- public function testDeleteNonExistingTag() {
- $this->expectException(\OCP\SystemTag\TagNotFoundException::class);
+ public function testDeleteNonExistingTag(): void {
+ $this->expectException(TagNotFoundException::class);
$this->tagManager->deleteTags([100]);
}
- public function testDeleteTagRemovesRelations() {
+ public function testDeleteTagRemovesRelations(): void {
$tag1 = $this->tagManager->createTag('one', true, false);
$tag2 = $this->tagManager->createTag('two', true, true);
@@ -424,7 +403,7 @@ class SystemTagManagerTest extends TestCase {
], $tagIdMapping);
}
- public function visibilityCheckProvider() {
+ public static function visibilityCheckProvider(): array {
return [
[false, false, false, false],
[true, false, false, true],
@@ -433,10 +412,8 @@ class SystemTagManagerTest extends TestCase {
];
}
- /**
- * @dataProvider visibilityCheckProvider
- */
- public function testVisibilityCheck($userVisible, $userAssignable, $isAdmin, $expectedResult) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('visibilityCheckProvider')]
+ public function testVisibilityCheck($userVisible, $userAssignable, $isAdmin, $expectedResult): void {
$user = $this->getMockBuilder(IUser::class)->getMock();
$user->expects($this->any())
->method('getUID')
@@ -451,7 +428,7 @@ class SystemTagManagerTest extends TestCase {
$this->assertEquals($expectedResult, $this->tagManager->canUserSeeTag($tag1, $user));
}
- public function assignabilityCheckProvider() {
+ public static function assignabilityCheckProvider(): array {
return [
// no groups
[false, false, false, false],
@@ -480,10 +457,8 @@ class SystemTagManagerTest extends TestCase {
];
}
- /**
- * @dataProvider assignabilityCheckProvider
- */
- public function testAssignabilityCheck($userVisible, $userAssignable, $isAdmin, $expectedResult, $userGroupIds = [], $tagGroupIds = []) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('assignabilityCheckProvider')]
+ public function testAssignabilityCheck($userVisible, $userAssignable, $isAdmin, $expectedResult, $userGroupIds = [], $tagGroupIds = []): void {
$user = $this->getMockBuilder(IUser::class)->getMock();
$user->expects($this->any())
->method('getUID')
@@ -503,7 +478,7 @@ class SystemTagManagerTest extends TestCase {
$this->assertEquals($expectedResult, $this->tagManager->canUserAssignTag($tag1, $user));
}
- public function testTagGroups() {
+ public function testTagGroups(): void {
$tag1 = $this->tagManager->createTag('tag1', true, false);
$tag2 = $this->tagManager->createTag('tag2', true, false);
$this->tagManager->setTagGroups($tag1, ['group1', 'group2']);
@@ -523,12 +498,86 @@ class SystemTagManagerTest extends TestCase {
/**
* empty groupIds should be ignored
*/
- public function testEmptyTagGroup() {
+ public function testEmptyTagGroup(): void {
$tag1 = $this->tagManager->createTag('tag1', true, false);
$this->tagManager->setTagGroups($tag1, ['']);
$this->assertEquals([], $this->tagManager->getTagGroups($tag1));
}
+ public static function allowedToCreateProvider(): array {
+ return [
+ [true, null, true],
+ [true, null, false],
+ [false, true, true],
+ [false, true, false],
+ [false, false, false],
+ ];
+ }
+
+ #[\PHPUnit\Framework\Attributes\DataProvider('allowedToCreateProvider')]
+ public function testAllowedToCreateTag(bool $isCli, ?bool $isAdmin, bool $isRestricted): void {
+ $oldCli = \OC::$CLI;
+ \OC::$CLI = $isCli;
+
+ $user = $this->getMockBuilder(IUser::class)->getMock();
+ $user->expects($this->any())
+ ->method('getUID')
+ ->willReturn('test');
+ $this->userSession->expects($this->any())
+ ->method('getUser')
+ ->willReturn($isAdmin === null ? null : $user);
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->with('test')
+ ->willReturn($isAdmin);
+ $this->appConfig->expects($this->any())
+ ->method('getValueBool')
+ ->with('systemtags', 'restrict_creation_to_admin')
+ ->willReturn($isRestricted);
+
+ $name = uniqid('tag_', true);
+ $tag = $this->tagManager->createTag($name, true, true);
+ $this->assertEquals($tag->getName(), $name);
+ $this->tagManager->deleteTags($tag->getId());
+
+ \OC::$CLI = $oldCli;
+ }
+
+ public static function disallowedToCreateProvider(): array {
+ return [
+ [false],
+ [null],
+ ];
+ }
+
+ #[\PHPUnit\Framework\Attributes\DataProvider('disallowedToCreateProvider')]
+ public function testDisallowedToCreateTag(?bool $isAdmin): void {
+ $oldCli = \OC::$CLI;
+ \OC::$CLI = false;
+
+ $user = $this->getMockBuilder(IUser::class)->getMock();
+ $user->expects($this->any())
+ ->method('getUID')
+ ->willReturn('test');
+ $this->userSession->expects($this->any())
+ ->method('getUser')
+ ->willReturn($isAdmin === null ? null : $user);
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->with('test')
+ ->willReturn($isAdmin);
+ $this->appConfig->expects($this->any())
+ ->method('getValueBool')
+ ->with('systemtags', 'restrict_creation_to_admin')
+ ->willReturn(true);
+
+ $this->expectException(\Exception::class);
+ $tag = $this->tagManager->createTag(uniqid('tag_', true), true, true);
+
+ \OC::$CLI = $oldCli;
+ }
+
+
/**
* @param ISystemTag $tag1
* @param ISystemTag $tag2