You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
840 lines
25 KiB
840 lines
25 KiB
<?php
|
|
|
|
declare(strict_types=1);
|
|
/**
|
|
* SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
*/
|
|
|
|
namespace OCA\Talk\Tests\php\Chat;
|
|
|
|
use OCA\Talk\Chat\ChatManager;
|
|
use OCA\Talk\Chat\CommentsManager;
|
|
use OCA\Talk\Chat\Notifier;
|
|
use OCA\Talk\Model\Attendee;
|
|
use OCA\Talk\Model\AttendeeMapper;
|
|
use OCA\Talk\Model\Invitation;
|
|
use OCA\Talk\Participant;
|
|
use OCA\Talk\Room;
|
|
use OCA\Talk\Service\AttachmentService;
|
|
use OCA\Talk\Service\ParticipantService;
|
|
use OCA\Talk\Service\PollService;
|
|
use OCA\Talk\Service\RoomService;
|
|
use OCA\Talk\Share\RoomShareProvider;
|
|
use OCP\AppFramework\Utility\ITimeFactory;
|
|
use OCP\Collaboration\Reference\IReferenceManager;
|
|
use OCP\Comments\IComment;
|
|
use OCP\Comments\ICommentsManager;
|
|
use OCP\EventDispatcher\IEventDispatcher;
|
|
use OCP\ICacheFactory;
|
|
use OCP\IDBConnection;
|
|
use OCP\IL10N;
|
|
use OCP\IRequest;
|
|
use OCP\IUser;
|
|
use OCP\Notification\IManager as INotificationManager;
|
|
use OCP\Security\RateLimiting\ILimiter;
|
|
use OCP\Share\Exceptions\ShareNotFound;
|
|
use OCP\Share\IManager;
|
|
use OCP\Share\IShare;
|
|
use PHPUnit\Framework\Attributes\DataProvider;
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
|
use Psr\Log\LoggerInterface;
|
|
use Test\TestCase;
|
|
|
|
/**
|
|
* @group DB
|
|
*/
|
|
class ChatManagerTest extends TestCase {
|
|
protected CommentsManager|ICommentsManager|MockObject $commentsManager;
|
|
protected IEventDispatcher&MockObject $dispatcher;
|
|
protected INotificationManager&MockObject $notificationManager;
|
|
protected IManager&MockObject $shareManager;
|
|
protected RoomShareProvider&MockObject $shareProvider;
|
|
protected ParticipantService&MockObject $participantService;
|
|
protected RoomService&MockObject $roomService;
|
|
protected PollService&MockObject $pollService;
|
|
protected Notifier&MockObject $notifier;
|
|
protected ITimeFactory&MockObject $timeFactory;
|
|
protected AttachmentService&MockObject $attachmentService;
|
|
protected IReferenceManager&MockObject $referenceManager;
|
|
protected ILimiter&MockObject $rateLimiter;
|
|
protected IRequest&MockObject $request;
|
|
protected LoggerInterface&MockObject $logger;
|
|
protected IL10N&MockObject $l;
|
|
protected ?ChatManager $chatManager = null;
|
|
|
|
public function setUp(): void {
|
|
parent::setUp();
|
|
|
|
$this->commentsManager = $this->createMock(CommentsManager::class);
|
|
$this->dispatcher = $this->createMock(IEventDispatcher::class);
|
|
$this->notificationManager = $this->createMock(INotificationManager::class);
|
|
$this->shareManager = $this->createMock(IManager::class);
|
|
$this->shareProvider = $this->createMock(RoomShareProvider::class);
|
|
$this->participantService = $this->createMock(ParticipantService::class);
|
|
$this->roomService = $this->createMock(RoomService::class);
|
|
$this->pollService = $this->createMock(PollService::class);
|
|
$this->notifier = $this->createMock(Notifier::class);
|
|
$this->timeFactory = $this->createMock(ITimeFactory::class);
|
|
$this->attachmentService = $this->createMock(AttachmentService::class);
|
|
$this->referenceManager = $this->createMock(IReferenceManager::class);
|
|
$this->rateLimiter = $this->createMock(ILimiter::class);
|
|
$this->request = $this->createMock(IRequest::class);
|
|
$this->l = $this->createMock(IL10N::class);
|
|
$this->logger = $this->createMock(LoggerInterface::class);
|
|
|
|
$this->l->method('n')
|
|
->willReturnCallback(function (string $singular, string $plural, int $count, array $parameters = []) {
|
|
$text = $count === 1 ? $singular : $plural;
|
|
return vsprintf(str_replace('%n', (string)$count, $text), $parameters);
|
|
});
|
|
|
|
$this->chatManager = $this->getManager();
|
|
}
|
|
|
|
/**
|
|
* @param string[] $methods
|
|
* @return ChatManager|MockObject
|
|
*/
|
|
protected function getManager(array $methods = []): ChatManager {
|
|
$cacheFactory = $this->createMock(ICacheFactory::class);
|
|
|
|
if (!empty($methods)) {
|
|
return $this->getMockBuilder(ChatManager::class)
|
|
->setConstructorArgs([
|
|
$this->commentsManager,
|
|
$this->dispatcher,
|
|
\OCP\Server::get(IDBConnection::class),
|
|
$this->notificationManager,
|
|
$this->shareManager,
|
|
$this->shareProvider,
|
|
$this->participantService,
|
|
$this->roomService,
|
|
$this->pollService,
|
|
$this->notifier,
|
|
$cacheFactory,
|
|
$this->timeFactory,
|
|
$this->attachmentService,
|
|
$this->referenceManager,
|
|
$this->rateLimiter,
|
|
$this->request,
|
|
$this->l,
|
|
$this->logger,
|
|
])
|
|
->onlyMethods($methods)
|
|
->getMock();
|
|
}
|
|
|
|
return new ChatManager(
|
|
$this->commentsManager,
|
|
$this->dispatcher,
|
|
\OCP\Server::get(IDBConnection::class),
|
|
$this->notificationManager,
|
|
$this->shareManager,
|
|
$this->shareProvider,
|
|
$this->participantService,
|
|
$this->roomService,
|
|
$this->pollService,
|
|
$this->notifier,
|
|
$cacheFactory,
|
|
$this->timeFactory,
|
|
$this->attachmentService,
|
|
$this->referenceManager,
|
|
$this->rateLimiter,
|
|
$this->request,
|
|
$this->l,
|
|
$this->logger,
|
|
);
|
|
}
|
|
|
|
private function newComment($id, string $actorType, string $actorId, \DateTime $creationDateTime, string $message): IComment {
|
|
$comment = $this->createMock(IComment::class);
|
|
|
|
$id = (string)$id;
|
|
|
|
$comment->method('getId')->willReturn($id);
|
|
$comment->method('getActorType')->willReturn($actorType);
|
|
$comment->method('getActorId')->willReturn($actorId);
|
|
$comment->method('getCreationDateTime')->willReturn($creationDateTime);
|
|
$comment->method('getMessage')->willReturn($message);
|
|
|
|
return $comment;
|
|
}
|
|
|
|
/**
|
|
* @param array $data
|
|
* @return IComment|MockObject
|
|
*/
|
|
private function newCommentFromArray(array $data): IComment {
|
|
$comment = $this->createMock(IComment::class);
|
|
|
|
foreach ($data as $key => $value) {
|
|
if ($key === 'id') {
|
|
$value = (string)$value;
|
|
}
|
|
$comment->method('get' . ucfirst($key))->willReturn($value);
|
|
}
|
|
|
|
return $comment;
|
|
}
|
|
|
|
protected function assertCommentEquals(array $data, IComment $comment): void {
|
|
if (isset($data['id'])) {
|
|
$id = $data['id'];
|
|
unset($data['id']);
|
|
$this->assertEquals($id, $comment->getId());
|
|
}
|
|
|
|
$this->assertEquals($data, [
|
|
'actorType' => $comment->getActorType(),
|
|
'actorId' => $comment->getActorId(),
|
|
'creationDateTime' => $comment->getCreationDateTime(),
|
|
'message' => $comment->getMessage(),
|
|
'referenceId' => $comment->getReferenceId(),
|
|
'parentId' => $comment->getParentId(),
|
|
]);
|
|
}
|
|
|
|
public static function dataSendMessage(): array {
|
|
return [
|
|
'simple message' => ['testUser1', 'testMessage1', '', '0'],
|
|
'reference id' => ['testUser2', 'testMessage2', 'referenceId2', '0'],
|
|
'as a reply' => ['testUser3', 'testMessage3', '', '23'],
|
|
'reply w/ ref' => ['testUser4', 'testMessage4', 'referenceId4', '23'],
|
|
];
|
|
}
|
|
|
|
#[DataProvider('dataSendMessage')]
|
|
public function testSendMessage(string $userId, string $message, string $referenceId, string $parentId): void {
|
|
$creationDateTime = new \DateTime();
|
|
|
|
$commentExpected = [
|
|
'actorType' => 'users',
|
|
'actorId' => $userId,
|
|
'creationDateTime' => $creationDateTime,
|
|
'message' => $message,
|
|
'referenceId' => $referenceId,
|
|
'parentId' => $parentId,
|
|
];
|
|
|
|
$comment = $this->newCommentFromArray($commentExpected);
|
|
|
|
if ($parentId !== '0') {
|
|
$replyTo = $this->newCommentFromArray([
|
|
'id' => $parentId,
|
|
]);
|
|
|
|
$comment->expects($this->once())
|
|
->method('setParentId')
|
|
->with($parentId);
|
|
} else {
|
|
$replyTo = null;
|
|
}
|
|
|
|
$this->commentsManager->expects($this->once())
|
|
->method('create')
|
|
->with('users', $userId, 'chat', 1234)
|
|
->willReturn($comment);
|
|
|
|
$comment->expects($this->once())
|
|
->method('setMessage')
|
|
->with($message);
|
|
|
|
$comment->expects($this->once())
|
|
->method('setCreationDateTime')
|
|
->with($creationDateTime);
|
|
|
|
$comment->expects($referenceId === '' ? $this->never() : $this->once())
|
|
->method('setReferenceId')
|
|
->with($referenceId);
|
|
|
|
$comment->expects($this->once())
|
|
->method('setVerb')
|
|
->with('comment');
|
|
|
|
$this->commentsManager->expects($this->once())
|
|
->method('save')
|
|
->with($comment);
|
|
|
|
$chat = $this->createMock(Room::class);
|
|
$chat->expects($this->any())
|
|
->method('getId')
|
|
->willReturn(1234);
|
|
|
|
$this->notifier->expects($this->once())
|
|
->method('notifyMentionedUsers')
|
|
->with($chat, $comment);
|
|
|
|
$participant = $this->createMock(Participant::class);
|
|
|
|
$return = $this->chatManager->sendMessage($chat, $participant, 'users', $userId, $message, $creationDateTime, $replyTo, $referenceId, false);
|
|
|
|
$this->assertCommentEquals($commentExpected, $return);
|
|
}
|
|
|
|
public function testGetHistory(): void {
|
|
$offset = 1;
|
|
$limit = 42;
|
|
$expected = [
|
|
$this->newComment(110, 'users', 'testUnknownUser', new \DateTime('@' . 1000000042), 'testMessage3'),
|
|
$this->newComment(109, 'guests', 'testSpreedSession', new \DateTime('@' . 1000000023), 'testMessage2'),
|
|
$this->newComment(108, 'users', 'testUser', new \DateTime('@' . 1000000016), 'testMessage1')
|
|
];
|
|
|
|
$chat = $this->createMock(Room::class);
|
|
$chat->expects($this->any())
|
|
->method('getId')
|
|
->willReturn(1234);
|
|
|
|
$this->commentsManager->expects($this->once())
|
|
->method('getForObjectSince')
|
|
->with('chat', 1234, $offset, 'desc', $limit)
|
|
->willReturn($expected);
|
|
|
|
$comments = $this->chatManager->getHistory($chat, $offset, $limit, false);
|
|
|
|
$this->assertEquals($expected, $comments);
|
|
}
|
|
|
|
public function testWaitForNewMessages(): void {
|
|
$offset = 1;
|
|
$limit = 42;
|
|
$timeout = 23;
|
|
$expected = [
|
|
$this->newComment(108, 'users', 'testUser', new \DateTime('@' . 1000000016), 'testMessage1'),
|
|
$this->newComment(109, 'guests', 'testSpreedSession', new \DateTime('@' . 1000000023), 'testMessage2'),
|
|
$this->newComment(110, 'users', 'testUnknownUser', new \DateTime('@' . 1000000042), 'testMessage3'),
|
|
];
|
|
|
|
$chat = $this->createMock(Room::class);
|
|
$chat->expects($this->any())
|
|
->method('getId')
|
|
->willReturn(1234);
|
|
|
|
$this->commentsManager->expects($this->once())
|
|
->method('getForObjectSince')
|
|
->with('chat', 1234, $offset, 'asc', $limit)
|
|
->willReturn($expected);
|
|
|
|
$this->notifier->expects($this->once())
|
|
->method('markMentionNotificationsRead')
|
|
->with($chat, 'userId');
|
|
|
|
/** @var IUser&MockObject $user */
|
|
$user = $this->createMock(IUser::class);
|
|
$user->expects($this->any())
|
|
->method('getUID')
|
|
->willReturn('userId');
|
|
|
|
$comments = $this->chatManager->waitForNewMessages($chat, $offset, $limit, $timeout, $user, false, true);
|
|
|
|
$this->assertEquals($expected, $comments);
|
|
}
|
|
|
|
public function testWaitForNewMessagesWithWaiting(): void {
|
|
$offset = 1;
|
|
$limit = 42;
|
|
$timeout = 23;
|
|
$expected = [
|
|
$this->newComment(108, 'users', 'testUser', new \DateTime('@' . 1000000016), 'testMessage1'),
|
|
$this->newComment(109, 'guests', 'testSpreedSession', new \DateTime('@' . 1000000023), 'testMessage2'),
|
|
$this->newComment(110, 'users', 'testUnknownUser', new \DateTime('@' . 1000000042), 'testMessage3'),
|
|
];
|
|
|
|
$chat = $this->createMock(Room::class);
|
|
$chat->expects($this->any())
|
|
->method('getId')
|
|
->willReturn(1234);
|
|
|
|
$this->commentsManager->expects($this->exactly(2))
|
|
->method('getForObjectSince')
|
|
->with('chat', 1234, $offset, 'asc', $limit)
|
|
->willReturnOnConsecutiveCalls(
|
|
[],
|
|
$expected
|
|
);
|
|
|
|
$this->notifier->expects($this->once())
|
|
->method('markMentionNotificationsRead')
|
|
->with($chat, 'userId');
|
|
|
|
/** @var IUser&MockObject $user */
|
|
$user = $this->createMock(IUser::class);
|
|
$user->expects($this->any())
|
|
->method('getUID')
|
|
->willReturn('userId');
|
|
|
|
$comments = $this->chatManager->waitForNewMessages($chat, $offset, $limit, $timeout, $user, false, true);
|
|
|
|
$this->assertEquals($expected, $comments);
|
|
}
|
|
|
|
public function testGetUnreadCount(): void {
|
|
/** @var Room&MockObject $chat */
|
|
$chat = $this->createMock(Room::class);
|
|
$chat->expects($this->atLeastOnce())
|
|
->method('getId')
|
|
->willReturn(23);
|
|
|
|
$this->commentsManager->expects($this->once())
|
|
->method('getNumberOfCommentsWithVerbsForObjectSinceComment')
|
|
->with('chat', 23, 42, ['comment', 'object_shared']);
|
|
|
|
$this->chatManager->getUnreadCount($chat, 42);
|
|
}
|
|
|
|
public function testDeleteMessages(): void {
|
|
$chat = $this->createMock(Room::class);
|
|
$chat->expects($this->any())
|
|
->method('getId')
|
|
->willReturn(1234);
|
|
|
|
$this->commentsManager->expects($this->once())
|
|
->method('deleteCommentsAtObject')
|
|
->with('chat', 1234);
|
|
|
|
$this->notifier->expects($this->once())
|
|
->method('removePendingNotificationsForRoom')
|
|
->with($chat);
|
|
|
|
$this->chatManager->deleteMessages($chat);
|
|
}
|
|
|
|
public function testDeleteMessage(): void {
|
|
$mapper = new AttendeeMapper(\OCP\Server::get(IDBConnection::class));
|
|
$attendee = $mapper->createAttendeeFromRow([
|
|
'a_id' => 1,
|
|
'room_id' => 123,
|
|
'actor_type' => Attendee::ACTOR_USERS,
|
|
'actor_id' => 'user',
|
|
'display_name' => 'user-display',
|
|
'pin' => '',
|
|
'participant_type' => Participant::USER,
|
|
'favorite' => true,
|
|
'notification_level' => Participant::NOTIFY_MENTION,
|
|
'notification_calls' => Participant::NOTIFY_CALLS_ON,
|
|
'last_joined_call' => 0,
|
|
'last_read_message' => 0,
|
|
'last_mention_message' => 0,
|
|
'last_mention_direct' => 0,
|
|
'read_privacy' => Participant::PRIVACY_PUBLIC,
|
|
'permissions' => Attendee::PERMISSIONS_DEFAULT,
|
|
'access_token' => '',
|
|
'remote_id' => '',
|
|
'phone_number' => '',
|
|
'call_id' => '',
|
|
'invited_cloud_id' => '',
|
|
'state' => Invitation::STATE_ACCEPTED,
|
|
'unread_messages' => 0,
|
|
'last_attendee_activity' => 0,
|
|
'archived' => 0,
|
|
'important' => 0,
|
|
'sensitive' => 0,
|
|
]);
|
|
$chat = $this->createMock(Room::class);
|
|
$chat->expects($this->any())
|
|
->method('getId')
|
|
->willReturn(1234);
|
|
$participant = new Participant($chat, $attendee, null);
|
|
|
|
$date = new \DateTime();
|
|
|
|
$comment = $this->createMock(IComment::class);
|
|
$comment->method('getId')
|
|
->willReturn('123456');
|
|
$comment->method('getVerb')
|
|
->willReturn('comment');
|
|
$comment->expects($this->once())
|
|
->method('setMessage');
|
|
$comment->expects($this->once())
|
|
->method('setVerb')
|
|
->with('comment_deleted');
|
|
|
|
$this->commentsManager->expects($this->once())
|
|
->method('save')
|
|
->with($comment);
|
|
|
|
$systemMessage = $this->createMock(IComment::class);
|
|
|
|
$chatManager = $this->getManager(['addSystemMessage']);
|
|
$chatManager->expects($this->once())
|
|
->method('addSystemMessage')
|
|
->with($chat, Attendee::ACTOR_USERS, 'user', $this->anything(), $this->anything(), false, null, $comment)
|
|
->willReturn($systemMessage);
|
|
|
|
$this->assertSame($systemMessage, $chatManager->deleteMessage($chat, $comment, $participant, $date));
|
|
}
|
|
|
|
public function testDeleteMessageFileShare(): void {
|
|
$mapper = new AttendeeMapper(\OCP\Server::get(IDBConnection::class));
|
|
$attendee = $mapper->createAttendeeFromRow([
|
|
'a_id' => 1,
|
|
'room_id' => 123,
|
|
'actor_type' => Attendee::ACTOR_USERS,
|
|
'actor_id' => 'user',
|
|
'display_name' => 'user-display',
|
|
'pin' => '',
|
|
'participant_type' => Participant::USER,
|
|
'favorite' => true,
|
|
'notification_level' => Participant::NOTIFY_MENTION,
|
|
'notification_calls' => Participant::NOTIFY_CALLS_ON,
|
|
'last_joined_call' => 0,
|
|
'last_read_message' => 0,
|
|
'last_mention_message' => 0,
|
|
'last_mention_direct' => 0,
|
|
'read_privacy' => Participant::PRIVACY_PUBLIC,
|
|
'permissions' => Attendee::PERMISSIONS_DEFAULT,
|
|
'access_token' => '',
|
|
'remote_id' => '',
|
|
'phone_number' => '',
|
|
'call_id' => '',
|
|
'invited_cloud_id' => '',
|
|
'state' => Invitation::STATE_ACCEPTED,
|
|
'unread_messages' => 0,
|
|
'last_attendee_activity' => 0,
|
|
'archived' => 0,
|
|
'important' => 0,
|
|
'sensitive' => 0,
|
|
]);
|
|
$chat = $this->createMock(Room::class);
|
|
$chat->expects($this->any())
|
|
->method('getId')
|
|
->willReturn(1234);
|
|
$chat->expects($this->any())
|
|
->method('getToken')
|
|
->willReturn('T0k3N');
|
|
$participant = new Participant($chat, $attendee, null);
|
|
|
|
$date = new \DateTime();
|
|
|
|
$comment = $this->createMock(IComment::class);
|
|
$comment->method('getId')
|
|
->willReturn('123456');
|
|
$comment->method('getVerb')
|
|
->willReturn('object_shared');
|
|
$comment->expects($this->once())
|
|
->method('getMessage')
|
|
->willReturn(json_encode(['message' => 'file_shared', 'parameters' => ['share' => '42']]));
|
|
$comment->expects($this->once())
|
|
->method('setMessage');
|
|
$comment->expects($this->once())
|
|
->method('setVerb')
|
|
->with('comment_deleted');
|
|
|
|
$share = $this->createMock(IShare::class);
|
|
$share->method('getShareType')
|
|
->willReturn(IShare::TYPE_ROOM);
|
|
$share->method('getSharedWith')
|
|
->willReturn('T0k3N');
|
|
$share->method('getShareOwner')
|
|
->willReturn('user');
|
|
|
|
$this->shareManager->method('getShareById')
|
|
->with('ocRoomShare:42')
|
|
->willReturn($share);
|
|
|
|
$this->shareManager->expects($this->once())
|
|
->method('deleteShare')
|
|
->willReturn($share);
|
|
|
|
$this->commentsManager->expects($this->once())
|
|
->method('save')
|
|
->with($comment);
|
|
|
|
$systemMessage = $this->createMock(IComment::class);
|
|
|
|
$chatManager = $this->getManager(['addSystemMessage']);
|
|
$chatManager->expects($this->once())
|
|
->method('addSystemMessage')
|
|
->with($chat, Attendee::ACTOR_USERS, 'user', $this->anything(), $this->anything(), false, null, $comment)
|
|
->willReturn($systemMessage);
|
|
|
|
$this->assertSame($systemMessage, $chatManager->deleteMessage($chat, $comment, $participant, $date));
|
|
}
|
|
|
|
public function testDeleteMessageFileShareNotFound(): void {
|
|
$mapper = new AttendeeMapper(\OCP\Server::get(IDBConnection::class));
|
|
$attendee = $mapper->createAttendeeFromRow([
|
|
'a_id' => 1,
|
|
'room_id' => 123,
|
|
'actor_type' => Attendee::ACTOR_USERS,
|
|
'actor_id' => 'user',
|
|
'display_name' => 'user-display',
|
|
'pin' => '',
|
|
'participant_type' => Participant::USER,
|
|
'favorite' => true,
|
|
'notification_level' => Participant::NOTIFY_MENTION,
|
|
'notification_calls' => Participant::NOTIFY_CALLS_ON,
|
|
'last_joined_call' => 0,
|
|
'last_read_message' => 0,
|
|
'last_mention_message' => 0,
|
|
'last_mention_direct' => 0,
|
|
'read_privacy' => Participant::PRIVACY_PUBLIC,
|
|
'permissions' => Attendee::PERMISSIONS_DEFAULT,
|
|
'access_token' => '',
|
|
'remote_id' => '',
|
|
'phone_number' => '',
|
|
'call_id' => '',
|
|
'invited_cloud_id' => '',
|
|
'state' => Invitation::STATE_ACCEPTED,
|
|
'unread_messages' => 0,
|
|
'last_attendee_activity' => 0,
|
|
'archived' => 0,
|
|
'important' => 0,
|
|
'sensitive' => 0,
|
|
]);
|
|
$chat = $this->createMock(Room::class);
|
|
$chat->expects($this->any())
|
|
->method('getId')
|
|
->willReturn(1234);
|
|
$participant = new Participant($chat, $attendee, null);
|
|
|
|
$date = new \DateTime();
|
|
|
|
$comment = $this->createMock(IComment::class);
|
|
$comment->method('getId')
|
|
->willReturn('123456');
|
|
$comment->method('getVerb')
|
|
->willReturn('object_shared');
|
|
$comment->expects($this->once())
|
|
->method('getMessage')
|
|
->willReturn(json_encode(['message' => 'file_shared', 'parameters' => ['share' => '42']]));
|
|
|
|
$this->shareManager->method('getShareById')
|
|
->with('ocRoomShare:42')
|
|
->willThrowException(new ShareNotFound());
|
|
|
|
$this->commentsManager->expects($this->never())
|
|
->method('save');
|
|
|
|
$systemMessage = $this->createMock(IComment::class);
|
|
|
|
$chatManager = $this->getManager(['addSystemMessage']);
|
|
$chatManager->expects($this->never())
|
|
->method('addSystemMessage');
|
|
|
|
$this->expectException(ShareNotFound::class);
|
|
$this->assertSame($systemMessage, $chatManager->deleteMessage($chat, $comment, $participant, $date));
|
|
}
|
|
|
|
public function testClearHistory(): void {
|
|
$chat = $this->createMock(Room::class);
|
|
$chat->expects($this->any())
|
|
->method('getId')
|
|
->willReturn(1234);
|
|
$chat->expects($this->any())
|
|
->method('getToken')
|
|
->willReturn('t0k3n');
|
|
|
|
$this->commentsManager->expects($this->once())
|
|
->method('deleteCommentsAtObject')
|
|
->with('chat', 1234);
|
|
|
|
$this->shareProvider->expects($this->once())
|
|
->method('deleteInRoom')
|
|
->with('t0k3n');
|
|
|
|
$this->notifier->expects($this->once())
|
|
->method('removePendingNotificationsForRoom')
|
|
->with($chat, true);
|
|
|
|
$this->participantService->expects($this->once())
|
|
->method('resetChatDetails')
|
|
->with($chat);
|
|
|
|
$date = new \DateTime();
|
|
$this->timeFactory->method('getDateTime')
|
|
->willReturn($date);
|
|
|
|
$manager = $this->getManager(['addSystemMessage']);
|
|
$manager->expects($this->once())
|
|
->method('addSystemMessage')
|
|
->with(
|
|
$chat,
|
|
'users',
|
|
'admin',
|
|
json_encode(['message' => 'history_cleared', 'parameters' => []]),
|
|
$date,
|
|
false
|
|
);
|
|
$manager->clearHistory($chat, 'users', 'admin');
|
|
}
|
|
|
|
public static function dataSearchIsPartOfConversationNameOrAtAll(): array {
|
|
return [
|
|
'found a in all' => [
|
|
'a', 'room', true
|
|
],
|
|
'found h in here' => [
|
|
'h', 'room', true
|
|
],
|
|
'case sensitive, not found A in all' => [
|
|
'A', 'room', false
|
|
],
|
|
'case sensitive, not found H in here' => [
|
|
'H', 'room', false
|
|
],
|
|
'non case sensitive, found r in room' => [
|
|
'R', 'room', true
|
|
],
|
|
'found r in begin of room' => [
|
|
'r', 'room', true
|
|
],
|
|
'found o in middle of room' => [
|
|
'o', 'room', true
|
|
],
|
|
'not found all in middle of text' => [
|
|
'notbeginingall', 'room', false
|
|
],
|
|
'not found here in middle of text' => [
|
|
'notbegininghere', 'room', false
|
|
],
|
|
'not found room in middle of text' => [
|
|
'notbeginingroom', 'room', false
|
|
],
|
|
];
|
|
}
|
|
|
|
#[DataProvider('dataSearchIsPartOfConversationNameOrAtAll')]
|
|
public function testSearchIsPartOfConversationNameOrAtAll(string $search, string $roomDisplayName, bool $expected): void {
|
|
$actual = self::invokePrivate($this->chatManager, 'searchIsPartOfConversationNameOrAtAll', [$search, $roomDisplayName]);
|
|
$this->assertEquals($expected, $actual);
|
|
}
|
|
|
|
public static function dataAddConversationNotify(): array {
|
|
return [
|
|
[
|
|
'',
|
|
['getType' => Room::TYPE_ONE_TO_ONE],
|
|
[],
|
|
null,
|
|
[],
|
|
],
|
|
[
|
|
'',
|
|
['getDisplayName' => 'test', 'getMentionPermissions' => 0],
|
|
['getAttendee' => Attendee::fromRow([
|
|
'actor_type' => Attendee::ACTOR_USERS,
|
|
'actor_id' => 'user',
|
|
])],
|
|
324,
|
|
[['id' => 'all', 'label' => 'test', 'source' => 'calls', 'mentionId' => 'all', 'details' => 'All 324 participants']]
|
|
],
|
|
[
|
|
'',
|
|
['getMentionPermissions' => 1],
|
|
['hasModeratorPermissions' => false],
|
|
null,
|
|
[],
|
|
],
|
|
[
|
|
'all',
|
|
['getDisplayName' => 'test', 'getMentionPermissions' => 0],
|
|
['getAttendee' => Attendee::fromRow([
|
|
'actor_type' => Attendee::ACTOR_USERS,
|
|
'actor_id' => 'user',
|
|
])],
|
|
1,
|
|
[['id' => 'all', 'label' => 'test', 'source' => 'calls', 'mentionId' => 'all']],
|
|
],
|
|
[
|
|
'all',
|
|
['getDisplayName' => 'test', 'getMentionPermissions' => 1],
|
|
[
|
|
'getAttendee' => Attendee::fromRow([
|
|
'actor_type' => Attendee::ACTOR_USERS,
|
|
'actor_id' => 'user',
|
|
]),
|
|
'hasModeratorPermissions' => true,
|
|
],
|
|
8,
|
|
[['id' => 'all', 'label' => 'test', 'source' => 'calls', 'mentionId' => 'all', 'details' => 'All 8 participants']],
|
|
],
|
|
[
|
|
'here',
|
|
['getDisplayName' => 'test', 'getMentionPermissions' => 0],
|
|
['getAttendee' => Attendee::fromRow([
|
|
'actor_type' => Attendee::ACTOR_GUESTS,
|
|
'actor_id' => 'guest',
|
|
])],
|
|
12,
|
|
[['id' => 'all', 'label' => 'test', 'source' => 'calls', 'mentionId' => 'all', 'details' => 'All 12 participants']],
|
|
],
|
|
];
|
|
}
|
|
|
|
#[DataProvider('dataAddConversationNotify')]
|
|
public function testAddConversationNotify(string $search, array $roomMocks, array $participantMocks, ?int $totalCount, array $expected): void {
|
|
$room = $this->createMock(Room::class);
|
|
foreach ($roomMocks as $method => $return) {
|
|
$room->expects($this->once())
|
|
->method($method)
|
|
->willReturn($return);
|
|
}
|
|
|
|
$participant = $this->createMock(Participant::class);
|
|
foreach ($participantMocks as $method => $return) {
|
|
$participant->expects($this->once())
|
|
->method($method)
|
|
->willReturn($return);
|
|
}
|
|
|
|
if ($totalCount !== null) {
|
|
$this->participantService->method('getNumberOfUsers')
|
|
->willReturn($totalCount);
|
|
}
|
|
|
|
$actual = $this->chatManager->addConversationNotify([], $search, $room, $participant);
|
|
$this->assertEquals($expected, $actual);
|
|
}
|
|
|
|
#[DataProvider('dataIsSharedFile')]
|
|
public function testIsSharedFile(string $message, bool $expected): void {
|
|
$actual = $this->chatManager->isSharedFile($message);
|
|
$this->assertEquals($expected, $actual);
|
|
}
|
|
|
|
public static function dataIsSharedFile(): array {
|
|
return [
|
|
['', false],
|
|
[json_encode([]), false],
|
|
[json_encode(['parameters' => '']), false],
|
|
[json_encode(['parameters' => []]), false],
|
|
[json_encode(['parameters' => ['share' => null]]), false],
|
|
[json_encode(['parameters' => ['share' => '']]), false],
|
|
[json_encode(['parameters' => ['share' => []]]), false],
|
|
[json_encode(['parameters' => ['share' => 0]]), false],
|
|
[json_encode(['parameters' => ['share' => 1]]), true],
|
|
];
|
|
}
|
|
|
|
#[DataProvider('dataFilterCommentsWithNonExistingFiles')]
|
|
public function testFilterCommentsWithNonExistingFiles(array $list, int $expectedCount): void {
|
|
// Transform text messages in instance of comment and mock with the message
|
|
foreach ($list as $key => $message) {
|
|
$list[$key] = $this->createMock(IComment::class);
|
|
$list[$key]->method('getMessage')
|
|
->willReturn($message);
|
|
$messageDecoded = json_decode($message, true);
|
|
if (isset($messageDecoded['parameters']['share']) && $messageDecoded['parameters']['share'] === 'notExists') {
|
|
$this->shareProvider->expects($this->once())
|
|
->method('getShareById')
|
|
->with('notExists')
|
|
->willThrowException(new ShareNotFound());
|
|
}
|
|
}
|
|
if (count($list) !== $expectedCount) {
|
|
}
|
|
$result = $this->chatManager->filterCommentsWithNonExistingFiles($list);
|
|
$this->assertCount($expectedCount, $result);
|
|
}
|
|
|
|
public static function dataFilterCommentsWithNonExistingFiles(): array {
|
|
return [
|
|
[[], 0],
|
|
[[json_encode(['parameters' => ['not a shared file']])], 1],
|
|
[[json_encode(['parameters' => ['share' => 'notExists']])], 0],
|
|
[[json_encode(['parameters' => ['share' => 1]])], 1],
|
|
];
|
|
}
|
|
}
|