diff options
Diffstat (limited to 'tests/lib/Comments/CommentTest.php')
-rw-r--r-- | tests/lib/Comments/CommentTest.php | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/tests/lib/Comments/CommentTest.php b/tests/lib/Comments/CommentTest.php new file mode 100644 index 00000000000..4a320666c83 --- /dev/null +++ b/tests/lib/Comments/CommentTest.php @@ -0,0 +1,223 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only + */ +namespace Test\Comments; + +use OC\Comments\Comment; +use OCP\Comments\IComment; +use OCP\Comments\IllegalIDChangeException; +use OCP\Comments\MessageTooLongException; +use Test\TestCase; + +class CommentTest extends TestCase { + /** + * @throws IllegalIDChangeException + */ + public function testSettersValidInput(): void { + $comment = new Comment(); + + $id = 'comment23'; + $parentId = 'comment11.5'; + $topMostParentId = 'comment11.0'; + $childrenCount = 6; + $message = 'I like to comment comment'; + $verb = 'comment'; + $actor = ['type' => 'users', 'id' => 'alice']; + $creationDT = new \DateTime(); + $latestChildDT = new \DateTime('yesterday'); + $object = ['type' => 'files', 'id' => 'file64']; + $referenceId = sha1('referenceId'); + $metaData = ['last_edit_actor_id' => 'admin']; + + $comment + ->setId($id) + ->setParentId($parentId) + ->setTopmostParentId($topMostParentId) + ->setChildrenCount($childrenCount) + ->setMessage($message) + ->setVerb($verb) + ->setActor($actor['type'], $actor['id']) + ->setCreationDateTime($creationDT) + ->setLatestChildDateTime($latestChildDT) + ->setObject($object['type'], $object['id']) + ->setReferenceId($referenceId) + ->setMetaData($metaData); + + $this->assertSame($id, $comment->getId()); + $this->assertSame($parentId, $comment->getParentId()); + $this->assertSame($topMostParentId, $comment->getTopmostParentId()); + $this->assertSame($childrenCount, $comment->getChildrenCount()); + $this->assertSame($message, $comment->getMessage()); + $this->assertSame($verb, $comment->getVerb()); + $this->assertSame($actor['type'], $comment->getActorType()); + $this->assertSame($actor['id'], $comment->getActorId()); + $this->assertSame($creationDT, $comment->getCreationDateTime()); + $this->assertSame($latestChildDT, $comment->getLatestChildDateTime()); + $this->assertSame($object['type'], $comment->getObjectType()); + $this->assertSame($object['id'], $comment->getObjectId()); + $this->assertSame($referenceId, $comment->getReferenceId()); + $this->assertSame($metaData, $comment->getMetaData()); + } + + + public function testSetIdIllegalInput(): void { + $this->expectException(IllegalIDChangeException::class); + + $comment = new Comment(); + + $comment->setId('c23'); + $comment->setId('c17'); + } + + /** + * @throws IllegalIDChangeException + */ + public function testResetId(): void { + $comment = new Comment(); + $comment->setId('c23'); + $comment->setId(''); + + $this->assertSame('', $comment->getId()); + } + + public static function simpleSetterProvider(): array { + return [ + ['Id', true], + ['TopmostParentId', true], + ['ParentId', true], + ['Message', true], + ['Verb', true], + ['Verb', ''], + ['ChildrenCount', true], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('simpleSetterProvider')] + public function testSimpleSetterInvalidInput($field, $input): void { + $this->expectException(\InvalidArgumentException::class); + + $comment = new Comment(); + $setter = 'set' . $field; + + $comment->$setter($input); + } + + public static function roleSetterProvider(): array { + return [ + ['Actor', true, true], + ['Actor', 'users', true], + ['Actor', true, 'alice'], + ['Actor', ' ', ' '], + ['Object', true, true], + ['Object', 'files', true], + ['Object', true, 'file64'], + ['Object', ' ', ' '], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('roleSetterProvider')] + public function testSetRoleInvalidInput($role, $type, $id): void { + $this->expectException(\InvalidArgumentException::class); + + $comment = new Comment(); + $setter = 'set' . $role; + $comment->$setter($type, $id); + } + + + public function testSetUberlongMessage(): void { + $this->expectException(MessageTooLongException::class); + + $comment = new Comment(); + $msg = str_pad('', IComment::MAX_MESSAGE_LENGTH + 1, 'x'); + $comment->setMessage($msg); + } + + public static function mentionsProvider(): array { + return [ + [ + '@alice @bob look look, a cook!', + [['type' => 'user', 'id' => 'alice'], ['type' => 'user', 'id' => 'bob']], + ], + [ + 'no mentions in this message', + [] + ], + [ + '@alice @bob look look, a duplication @alice test @bob!', + [['type' => 'user', 'id' => 'alice'], ['type' => 'user', 'id' => 'bob']], + ], + [ + '@alice is the author, notify @bob, nevertheless mention her!', + [['type' => 'user', 'id' => 'alice'], ['type' => 'user', 'id' => 'bob']], + /* author: */ 'alice' + ], + [ + '@foobar and @barfoo you should know, @foo@bar.com is valid' + . ' and so is @bar@foo.org@foobar.io I hope that clarifies everything.' + . ' cc @23452-4333-54353-2342 @yolo!' + . ' however the most important thing to know is that www.croissant.com/@oil is not valid' + . ' and won\'t match anything at all', + [ + ['type' => 'user', 'id' => 'bar@foo.org@foobar.io'], + ['type' => 'user', 'id' => '23452-4333-54353-2342'], + ['type' => 'user', 'id' => 'foo@bar.com'], + ['type' => 'user', 'id' => 'foobar'], + ['type' => 'user', 'id' => 'barfoo'], + ['type' => 'user', 'id' => 'yolo'], + ], + ], + [ + '@@chef is also a valid mention, no matter how strange it looks', + [['type' => 'user', 'id' => '@chef']], + ], + [ + 'Also @"user with spaces" are now supported', + [['type' => 'user', 'id' => 'user with spaces']], + ], + [ + 'Also @"guest/0123456789abcdef" are now supported', + [['type' => 'guest', 'id' => 'guest/0123456789abcdef']], + ], + [ + 'Also @"group/My Group ID 321" are now supported', + [['type' => 'group', 'id' => 'My Group ID 321']], + ], + [ + 'Welcome federation @"federated_group/My Group ID 321" @"federated_team/Former Cirle" @"federated_user/cloudId@http://example.tld:8080/nextcloud"! Now freshly supported', + [ + ['type' => 'federated_user', 'id' => 'cloudId@http://example.tld:8080/nextcloud'], + ['type' => 'federated_group', 'id' => 'My Group ID 321'], + ['type' => 'federated_team', 'id' => 'Former Cirle'], + ], + ], + [ + 'Emails are supported since 30.0.2 right? @"email/aa23d315de327cfc330f0401ea061005b2b0cdd45ec8346f12664dd1f34cb886"', + [ + ['type' => 'email', 'id' => 'aa23d315de327cfc330f0401ea061005b2b0cdd45ec8346f12664dd1f34cb886'], + ], + ], + ]; + } + + /** + * + * @param string $message + * @param array $expectedMentions + * @param ?string $author + */ + #[\PHPUnit\Framework\Attributes\DataProvider('mentionsProvider')] + public function testMentions(string $message, array $expectedMentions, ?string $author = null): void { + $comment = new Comment(); + $comment->setMessage($message); + if (!is_null($author)) { + $comment->setActor('user', $author); + } + $mentions = $comment->getMentions(); + $this->assertSame($expectedMentions, $mentions); + } +} |