diff options
Diffstat (limited to 'tests/lib/SystemTag/SystemTagManagerTest.php')
-rw-r--r-- | tests/lib/SystemTag/SystemTagManagerTest.php | 219 |
1 files changed, 131 insertions, 88 deletions
diff --git a/tests/lib/SystemTag/SystemTagManagerTest.php b/tests/lib/SystemTag/SystemTagManagerTest.php index 99f033cfd95..b443d7222b2 100644 --- a/tests/lib/SystemTag/SystemTagManagerTest.php +++ b/tests/lib/SystemTag/SystemTagManagerTest.php @@ -11,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; /** @@ -25,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(); } @@ -72,7 +69,7 @@ class SystemTagManagerTest extends TestCase { $query->delete(SystemTagManager::TAG_TABLE)->execute(); } - public static function getAllTagsDataProvider() { + public static function getAllTagsDataProvider(): array { return [ [ // no tags at all @@ -85,23 +82,10 @@ 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 - */ + #[\PHPUnit\Framework\Attributes\DataProvider('getAllTagsDataProvider')] public function testGetAllTags($testTags): void { $testTagsById = []; foreach ($testTags as $testTag) { @@ -119,7 +103,7 @@ class SystemTagManagerTest extends TestCase { } } - public static function getAllTagsFilteredDataProvider() { + public static function getAllTagsFilteredDataProvider(): array { return [ [ [ @@ -168,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 @@ -184,7 +168,7 @@ class SystemTagManagerTest extends TestCase { [ ['one', true, false], ['two', true, false], - ['one', false, false], + ['one_different', false, false], ], true, 'on', @@ -208,9 +192,7 @@ class SystemTagManagerTest extends TestCase { ]; } - /** - * @dataProvider getAllTagsFilteredDataProvider - */ + #[\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]); @@ -232,7 +214,7 @@ class SystemTagManagerTest extends TestCase { } } - public static function oneTagMultipleFlagsProvider() { + public static function oneTagMultipleFlagsProvider(): array { return [ ['one', false, false], ['one', true, false], @@ -241,11 +223,9 @@ class SystemTagManagerTest extends TestCase { ]; } - /** - * @dataProvider oneTagMultipleFlagsProvider - */ + #[\PHPUnit\Framework\Attributes\DataProvider('oneTagMultipleFlagsProvider')] public function testCreateDuplicate($name, $userVisible, $userAssignable): void { - $this->expectException(\OCP\SystemTag\TagAlreadyExistsException::class); + $this->expectException(TagAlreadyExistsException::class); try { $this->tagManager->createTag($name, $userVisible, $userAssignable); @@ -255,14 +235,21 @@ class SystemTagManagerTest extends TestCase { $this->tagManager->createTag($name, $userVisible, $userAssignable); } + 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 - */ + #[\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); @@ -284,14 +271,14 @@ class SystemTagManagerTest extends TestCase { public function testGetNonExistingTag(): void { - $this->expectException(\OCP\SystemTag\TagNotFoundException::class); + $this->expectException(TagNotFoundException::class); $this->tagManager->getTag('nonexist', false, false); } public function testGetNonExistingTagsById(): void { - $this->expectException(\OCP\SystemTag\TagNotFoundException::class); + $this->expectException(TagNotFoundException::class); $tag1 = $this->tagManager->createTag('one', true, false); $this->tagManager->getTagsByIds([$tag1->getId(), 100, 101]); @@ -305,7 +292,7 @@ class SystemTagManagerTest extends TestCase { $this->tagManager->getTagsByIds([$tag1->getId() . 'suffix']); } - public static function updateTagProvider() { + public static function updateTagProvider(): array { return [ [ // update name @@ -330,9 +317,7 @@ class SystemTagManagerTest extends TestCase { ]; } - /** - * @dataProvider updateTagProvider - */ + #[\PHPUnit\Framework\Attributes\DataProvider('updateTagProvider')] public function testUpdateTag($tagCreate, $tagUpdated): void { $tag1 = $this->tagManager->createTag( $tagCreate[0], @@ -362,32 +347,20 @@ class SystemTagManagerTest extends TestCase { } - /** - * @dataProvider updateTagProvider - */ - public function testUpdateTagDuplicate($tagCreate, $tagUpdated): void { - $this->expectException(\OCP\SystemTag\TagAlreadyExistsException::class); + public function testUpdateTagToExistingName(): void { + $this->expectException(TagAlreadyExistsException::class); - $this->tagManager->createTag( - $tagCreate[0], - $tagCreate[1], - $tagCreate[2], - $tagCreate[3], - ); - $tag2 = $this->tagManager->createTag( - $tagUpdated[0], - $tagUpdated[1], - $tagUpdated[2], - $tagUpdated[3], - ); + // 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], - $tagCreate[3], + 'first', + false, + false, + null ); } @@ -402,7 +375,7 @@ class SystemTagManagerTest extends TestCase { public function testDeleteNonExistingTag(): void { - $this->expectException(\OCP\SystemTag\TagNotFoundException::class); + $this->expectException(TagNotFoundException::class); $this->tagManager->deleteTags([100]); } @@ -430,7 +403,7 @@ class SystemTagManagerTest extends TestCase { ], $tagIdMapping); } - public static function visibilityCheckProvider() { + public static function visibilityCheckProvider(): array { return [ [false, false, false, false], [true, false, false, true], @@ -439,9 +412,7 @@ class SystemTagManagerTest extends TestCase { ]; } - /** - * @dataProvider visibilityCheckProvider - */ + #[\PHPUnit\Framework\Attributes\DataProvider('visibilityCheckProvider')] public function testVisibilityCheck($userVisible, $userAssignable, $isAdmin, $expectedResult): void { $user = $this->getMockBuilder(IUser::class)->getMock(); $user->expects($this->any()) @@ -457,7 +428,7 @@ class SystemTagManagerTest extends TestCase { $this->assertEquals($expectedResult, $this->tagManager->canUserSeeTag($tag1, $user)); } - public static function assignabilityCheckProvider() { + public static function assignabilityCheckProvider(): array { return [ // no groups [false, false, false, false], @@ -486,9 +457,7 @@ class SystemTagManagerTest extends TestCase { ]; } - /** - * @dataProvider assignabilityCheckProvider - */ + #[\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()) @@ -535,6 +504,80 @@ class SystemTagManagerTest extends TestCase { $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 |