|
@@ -0,0 +1,592 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+declare(strict_types=1);
|
|
|
+
|
|
|
+/**
|
|
|
+ * @copyright Copyright (c) 2020, Georg Ehrke
|
|
|
+ *
|
|
|
+ * @author Georg Ehrke <oc.list@georgehrke.com>
|
|
|
+ *
|
|
|
+ * @license AGPL-3.0
|
|
|
+ *
|
|
|
+ * This code is free software: you can redistribute it and/or modify
|
|
|
+ * it under the terms of the GNU Affero General Public License, version 3,
|
|
|
+ * as published by the Free Software Foundation.
|
|
|
+ *
|
|
|
+ * This program is distributed in the hope that it will be useful,
|
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
+ * GNU Affero General Public License for more details.
|
|
|
+ *
|
|
|
+ * You should have received a copy of the GNU Affero General Public License, version 3,
|
|
|
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
|
+ *
|
|
|
+ */
|
|
|
+
|
|
|
+namespace OCA\UserStatus\Tests\Service;
|
|
|
+
|
|
|
+use OCA\UserStatus\Db\UserStatus;
|
|
|
+use OCA\UserStatus\Db\UserStatusMapper;
|
|
|
+use OCA\UserStatus\Exception\InvalidClearAtException;
|
|
|
+use OCA\UserStatus\Exception\InvalidMessageIdException;
|
|
|
+use OCA\UserStatus\Exception\InvalidStatusIconException;
|
|
|
+use OCA\UserStatus\Exception\InvalidStatusTypeException;
|
|
|
+use OCA\UserStatus\Exception\StatusMessageTooLongException;
|
|
|
+use OCA\UserStatus\Service\EmojiService;
|
|
|
+use OCA\UserStatus\Service\PredefinedStatusService;
|
|
|
+use OCA\UserStatus\Service\StatusService;
|
|
|
+use OCP\AppFramework\Db\DoesNotExistException;
|
|
|
+use OCP\AppFramework\Utility\ITimeFactory;
|
|
|
+use Test\TestCase;
|
|
|
+
|
|
|
+class StatusServiceTest extends TestCase {
|
|
|
+
|
|
|
+ /** @var UserStatusMapper|\PHPUnit\Framework\MockObject\MockObject */
|
|
|
+ private $mapper;
|
|
|
+
|
|
|
+ /** @var ITimeFactory|\PHPUnit\Framework\MockObject\MockObject */
|
|
|
+ private $timeFactory;
|
|
|
+
|
|
|
+ /** @var PredefinedStatusService|\PHPUnit\Framework\MockObject\MockObject */
|
|
|
+ private $predefinedStatusService;
|
|
|
+
|
|
|
+ /** @var EmojiService|\PHPUnit\Framework\MockObject\MockObject */
|
|
|
+ private $emojiService;
|
|
|
+
|
|
|
+ /** @var StatusService */
|
|
|
+ private $service;
|
|
|
+
|
|
|
+ protected function setUp(): void {
|
|
|
+ parent::setUp();
|
|
|
+
|
|
|
+ $this->mapper = $this->createMock(UserStatusMapper::class);
|
|
|
+ $this->timeFactory = $this->createMock(ITimeFactory::class);
|
|
|
+ $this->predefinedStatusService = $this->createMock(PredefinedStatusService::class);
|
|
|
+ $this->emojiService = $this->createMock(EmojiService::class);
|
|
|
+ $this->service = new StatusService($this->mapper,
|
|
|
+ $this->timeFactory,
|
|
|
+ $this->predefinedStatusService,
|
|
|
+ $this->emojiService);
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testFindAll(): void {
|
|
|
+ $status1 = $this->createMock(UserStatus::class);
|
|
|
+ $status2 = $this->createMock(UserStatus::class);
|
|
|
+
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findAll')
|
|
|
+ ->with(20, 50)
|
|
|
+ ->willReturn([$status1, $status2]);
|
|
|
+
|
|
|
+ $this->assertEquals([
|
|
|
+ $status1,
|
|
|
+ $status2,
|
|
|
+ ], $this->service->findAll(20, 50));
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testFindByUserId(): void {
|
|
|
+ $status = $this->createMock(UserStatus::class);
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with('john.doe')
|
|
|
+ ->willReturn($status);
|
|
|
+
|
|
|
+ $this->assertEquals($status, $this->service->findByUserId('john.doe'));
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testFindByUserIdDoesNotExist(): void {
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with('john.doe')
|
|
|
+ ->willThrowException(new DoesNotExistException(''));
|
|
|
+
|
|
|
+ $this->expectException(DoesNotExistException::class);
|
|
|
+ $this->service->findByUserId('john.doe');
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testFindAllAddDefaultMessage(): void {
|
|
|
+ $status = new UserStatus();
|
|
|
+ $status->setMessageId('commuting');
|
|
|
+
|
|
|
+ $this->predefinedStatusService->expects($this->once())
|
|
|
+ ->method('getDefaultStatusById')
|
|
|
+ ->with('commuting')
|
|
|
+ ->willReturn([
|
|
|
+ 'id' => 'commuting',
|
|
|
+ 'icon' => '🚌',
|
|
|
+ 'message' => 'Commuting',
|
|
|
+ 'clearAt' => [
|
|
|
+ 'type' => 'period',
|
|
|
+ 'time' => 1800,
|
|
|
+ ],
|
|
|
+ ]);
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with('john.doe')
|
|
|
+ ->willReturn($status);
|
|
|
+
|
|
|
+ $this->assertEquals($status, $this->service->findByUserId('john.doe'));
|
|
|
+ $this->assertEquals('🚌', $status->getCustomIcon());
|
|
|
+ $this->assertEquals('Commuting', $status->getCustomMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testFindAllClearStatus(): void {
|
|
|
+ $status = new UserStatus();
|
|
|
+ $status->setClearAt(50);
|
|
|
+ $status->setMessageId('commuting');
|
|
|
+
|
|
|
+ $this->timeFactory->expects($this->once())
|
|
|
+ ->method('getTime')
|
|
|
+ ->willReturn(60);
|
|
|
+ $this->predefinedStatusService->expects($this->never())
|
|
|
+ ->method('getDefaultStatusById');
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with('john.doe')
|
|
|
+ ->willReturn($status);
|
|
|
+ $this->assertEquals($status, $this->service->findByUserId('john.doe'));
|
|
|
+ $this->assertNull($status->getClearAt());
|
|
|
+ $this->assertNull($status->getMessageId());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param string $userId
|
|
|
+ * @param string $status
|
|
|
+ * @param int|null $statusTimestamp
|
|
|
+ * @param bool $isUserDefined
|
|
|
+ * @param bool $expectExisting
|
|
|
+ * @param bool $expectSuccess
|
|
|
+ * @param bool $expectTimeFactory
|
|
|
+ * @param bool $expectException
|
|
|
+ * @param string|null $expectedExceptionClass
|
|
|
+ * @param string|null $expectedExceptionMessage
|
|
|
+ *
|
|
|
+ * @dataProvider setStatusDataProvider
|
|
|
+ */
|
|
|
+ public function testSetStatus(string $userId,
|
|
|
+ string $status,
|
|
|
+ ?int $statusTimestamp,
|
|
|
+ bool $isUserDefined,
|
|
|
+ bool $expectExisting,
|
|
|
+ bool $expectSuccess,
|
|
|
+ bool $expectTimeFactory,
|
|
|
+ bool $expectException,
|
|
|
+ ?string $expectedExceptionClass,
|
|
|
+ ?string $expectedExceptionMessage): void {
|
|
|
+ $userStatus = new UserStatus();
|
|
|
+
|
|
|
+ if ($expectExisting) {
|
|
|
+ $userStatus->setId(42);
|
|
|
+ $userStatus->setUserId($userId);
|
|
|
+
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with($userId)
|
|
|
+ ->willReturn($userStatus);
|
|
|
+ } else {
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with($userId)
|
|
|
+ ->willThrowException(new DoesNotExistException(''));
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($expectTimeFactory) {
|
|
|
+ $this->timeFactory
|
|
|
+ ->method('getTime')
|
|
|
+ ->willReturn(40);
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($expectException) {
|
|
|
+ $this->expectException($expectedExceptionClass);
|
|
|
+ $this->expectExceptionMessage($expectedExceptionMessage);
|
|
|
+
|
|
|
+ $this->service->setStatus($userId, $status, $statusTimestamp, $isUserDefined);
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($expectSuccess) {
|
|
|
+ if ($expectExisting) {
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('update')
|
|
|
+ ->willReturnArgument(0);
|
|
|
+ } else {
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('insert')
|
|
|
+ ->willReturnArgument(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ $actual = $this->service->setStatus($userId, $status, $statusTimestamp, $isUserDefined);
|
|
|
+
|
|
|
+ $this->assertEquals('john.doe', $actual->getUserId());
|
|
|
+ $this->assertEquals($status, $actual->getStatus());
|
|
|
+ $this->assertEquals($statusTimestamp ?? 40, $actual->getStatusTimestamp());
|
|
|
+ $this->assertEquals($isUserDefined, $actual->getIsUserDefined());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public function setStatusDataProvider(): array {
|
|
|
+ return [
|
|
|
+ ['john.doe', 'online', 50, true, true, true, false, false, null, null],
|
|
|
+ ['john.doe', 'online', 50, true, false, true, false, false, null, null],
|
|
|
+ ['john.doe', 'online', 50, false, true, true, false, false, null, null],
|
|
|
+ ['john.doe', 'online', 50, false, false, true, false, false, null, null],
|
|
|
+ ['john.doe', 'online', null, true, true, true, true, false, null, null],
|
|
|
+ ['john.doe', 'online', null, true, false, true, true, false, null, null],
|
|
|
+ ['john.doe', 'online', null, false, true, true, true, false, null, null],
|
|
|
+ ['john.doe', 'online', null, false, false, true, true, false, null, null],
|
|
|
+
|
|
|
+ ['john.doe', 'away', 50, true, true, true, false, false, null, null],
|
|
|
+ ['john.doe', 'away', 50, true, false, true, false, false, null, null],
|
|
|
+ ['john.doe', 'away', 50, false, true, true, false, false, null, null],
|
|
|
+ ['john.doe', 'away', 50, false, false, true, false, false, null, null],
|
|
|
+ ['john.doe', 'away', null, true, true, true, true, false, null, null],
|
|
|
+ ['john.doe', 'away', null, true, false, true, true, false, null, null],
|
|
|
+ ['john.doe', 'away', null, false, true, true, true, false, null, null],
|
|
|
+ ['john.doe', 'away', null, false, false, true, true, false, null, null],
|
|
|
+
|
|
|
+ ['john.doe', 'dnd', 50, true, true, true, false, false, null, null],
|
|
|
+ ['john.doe', 'dnd', 50, true, false, true, false, false, null, null],
|
|
|
+ ['john.doe', 'dnd', 50, false, true, true, false, false, null, null],
|
|
|
+ ['john.doe', 'dnd', 50, false, false, true, false, false, null, null],
|
|
|
+ ['john.doe', 'dnd', null, true, true, true, true, false, null, null],
|
|
|
+ ['john.doe', 'dnd', null, true, false, true, true, false, null, null],
|
|
|
+ ['john.doe', 'dnd', null, false, true, true, true, false, null, null],
|
|
|
+ ['john.doe', 'dnd', null, false, false, true, true, false, null, null],
|
|
|
+
|
|
|
+ ['john.doe', 'invisible', 50, true, true, true, false, false, null, null],
|
|
|
+ ['john.doe', 'invisible', 50, true, false, true, false, false, null, null],
|
|
|
+ ['john.doe', 'invisible', 50, false, true, true, false, false, null, null],
|
|
|
+ ['john.doe', 'invisible', 50, false, false, true, false, false, null, null],
|
|
|
+ ['john.doe', 'invisible', null, true, true, true, true, false, null, null],
|
|
|
+ ['john.doe', 'invisible', null, true, false, true, true, false, null, null],
|
|
|
+ ['john.doe', 'invisible', null, false, true, true, true, false, null, null],
|
|
|
+ ['john.doe', 'invisible', null, false, false, true, true, false, null, null],
|
|
|
+
|
|
|
+ ['john.doe', 'offline', 50, true, true, true, false, false, null, null],
|
|
|
+ ['john.doe', 'offline', 50, true, false, true, false, false, null, null],
|
|
|
+ ['john.doe', 'offline', 50, false, true, true, false, false, null, null],
|
|
|
+ ['john.doe', 'offline', 50, false, false, true, false, false, null, null],
|
|
|
+ ['john.doe', 'offline', null, true, true, true, true, false, null, null],
|
|
|
+ ['john.doe', 'offline', null, true, false, true, true, false, null, null],
|
|
|
+ ['john.doe', 'offline', null, false, true, true, true, false, null, null],
|
|
|
+ ['john.doe', 'offline', null, false, false, true, true, false, null, null],
|
|
|
+
|
|
|
+ ['john.doe', 'illegal-status', 50, true, true, false, false, true, InvalidStatusTypeException::class, 'Status-type "illegal-status" is not supported'],
|
|
|
+ ['john.doe', 'illegal-status', 50, true, false, false, false, true, InvalidStatusTypeException::class, 'Status-type "illegal-status" is not supported'],
|
|
|
+ ['john.doe', 'illegal-status', 50, false, true, false, false, true, InvalidStatusTypeException::class, 'Status-type "illegal-status" is not supported'],
|
|
|
+ ['john.doe', 'illegal-status', 50, false, false, false, false, true, InvalidStatusTypeException::class, 'Status-type "illegal-status" is not supported'],
|
|
|
+ ['john.doe', 'illegal-status', null, true, true, false, true, true, InvalidStatusTypeException::class, 'Status-type "illegal-status" is not supported'],
|
|
|
+ ['john.doe', 'illegal-status', null, true, false, false, true, true, InvalidStatusTypeException::class, 'Status-type "illegal-status" is not supported'],
|
|
|
+ ['john.doe', 'illegal-status', null, false, true, false, true, true, InvalidStatusTypeException::class, 'Status-type "illegal-status" is not supported'],
|
|
|
+ ['john.doe', 'illegal-status', null, false, false, false, true, true, InvalidStatusTypeException::class, 'Status-type "illegal-status" is not supported'],
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param string $userId
|
|
|
+ * @param string $messageId
|
|
|
+ * @param bool $isValidMessageId
|
|
|
+ * @param int|null $clearAt
|
|
|
+ * @param bool $expectExisting
|
|
|
+ * @param bool $expectSuccess
|
|
|
+ * @param bool $expectException
|
|
|
+ * @param string|null $expectedExceptionClass
|
|
|
+ * @param string|null $expectedExceptionMessage
|
|
|
+ *
|
|
|
+ * @dataProvider setPredefinedMessageDataProvider
|
|
|
+ */
|
|
|
+ public function testSetPredefinedMessage(string $userId,
|
|
|
+ string $messageId,
|
|
|
+ bool $isValidMessageId,
|
|
|
+ ?int $clearAt,
|
|
|
+ bool $expectExisting,
|
|
|
+ bool $expectSuccess,
|
|
|
+ bool $expectException,
|
|
|
+ ?string $expectedExceptionClass,
|
|
|
+ ?string $expectedExceptionMessage): void {
|
|
|
+ $userStatus = new UserStatus();
|
|
|
+
|
|
|
+ if ($expectExisting) {
|
|
|
+ $userStatus->setId(42);
|
|
|
+ $userStatus->setUserId($userId);
|
|
|
+ $userStatus->setStatus('offline');
|
|
|
+ $userStatus->setStatusTimestamp(0);
|
|
|
+ $userStatus->setIsUserDefined(false);
|
|
|
+ $userStatus->setCustomIcon('😀');
|
|
|
+ $userStatus->setCustomMessage('Foo');
|
|
|
+
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with($userId)
|
|
|
+ ->willReturn($userStatus);
|
|
|
+ } else {
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with($userId)
|
|
|
+ ->willThrowException(new DoesNotExistException(''));
|
|
|
+ }
|
|
|
+
|
|
|
+ $this->predefinedStatusService->expects($this->once())
|
|
|
+ ->method('isValidId')
|
|
|
+ ->with($messageId)
|
|
|
+ ->willReturn($isValidMessageId);
|
|
|
+
|
|
|
+ $this->timeFactory
|
|
|
+ ->method('getTime')
|
|
|
+ ->willReturn(40);
|
|
|
+
|
|
|
+ if ($expectException) {
|
|
|
+ $this->expectException($expectedExceptionClass);
|
|
|
+ $this->expectExceptionMessage($expectedExceptionMessage);
|
|
|
+
|
|
|
+ $this->service->setPredefinedMessage($userId, $messageId, $clearAt);
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($expectSuccess) {
|
|
|
+ if ($expectExisting) {
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('update')
|
|
|
+ ->willReturnArgument(0);
|
|
|
+ } else {
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('insert')
|
|
|
+ ->willReturnArgument(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ $actual = $this->service->setPredefinedMessage($userId, $messageId, $clearAt);
|
|
|
+
|
|
|
+ $this->assertEquals('john.doe', $actual->getUserId());
|
|
|
+ $this->assertEquals('offline', $actual->getStatus());
|
|
|
+ $this->assertEquals(0, $actual->getStatusTimestamp());
|
|
|
+ $this->assertEquals(false, $actual->getIsUserDefined());
|
|
|
+ $this->assertEquals($messageId, $actual->getMessageId());
|
|
|
+ $this->assertNull($actual->getCustomIcon());
|
|
|
+ $this->assertNull($actual->getCustomMessage());
|
|
|
+ $this->assertEquals($clearAt, $actual->getClearAt());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public function setPredefinedMessageDataProvider(): array {
|
|
|
+ return [
|
|
|
+ ['john.doe', 'sick-leave', true, null, true, true, false, null, null],
|
|
|
+ ['john.doe', 'sick-leave', true, null, false, true, false, null, null],
|
|
|
+ ['john.doe', 'sick-leave', true, 20, true, false, true, InvalidClearAtException::class, 'ClearAt is in the past'],
|
|
|
+ ['john.doe', 'sick-leave', true, 20, false, false, true, InvalidClearAtException::class, 'ClearAt is in the past'],
|
|
|
+ ['john.doe', 'sick-leave', true, 60, true, true, false, null, null],
|
|
|
+ ['john.doe', 'sick-leave', true, 60, false, true, false, null, null],
|
|
|
+ ['john.doe', 'illegal-message-id', false, null, true, false, true, InvalidMessageIdException::class, 'Message-Id "illegal-message-id" is not supported'],
|
|
|
+ ['john.doe', 'illegal-message-id', false, null, false, false, true, InvalidMessageIdException::class, 'Message-Id "illegal-message-id" is not supported'],
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param string $userId
|
|
|
+ * @param string|null $statusIcon
|
|
|
+ * @param bool $supportsEmoji
|
|
|
+ * @param string $message
|
|
|
+ * @param int|null $clearAt
|
|
|
+ * @param bool $expectExisting
|
|
|
+ * @param bool $expectSuccess
|
|
|
+ * @param bool $expectException
|
|
|
+ * @param string|null $expectedExceptionClass
|
|
|
+ * @param string|null $expectedExceptionMessage
|
|
|
+ *
|
|
|
+ * @dataProvider setCustomMessageDataProvider
|
|
|
+ */
|
|
|
+ public function testSetCustomMessage(string $userId,
|
|
|
+ ?string $statusIcon,
|
|
|
+ bool $supportsEmoji,
|
|
|
+ string $message,
|
|
|
+ ?int $clearAt,
|
|
|
+ bool $expectExisting,
|
|
|
+ bool $expectSuccess,
|
|
|
+ bool $expectException,
|
|
|
+ ?string $expectedExceptionClass,
|
|
|
+ ?string $expectedExceptionMessage): void {
|
|
|
+ $userStatus = new UserStatus();
|
|
|
+
|
|
|
+ if ($expectExisting) {
|
|
|
+ $userStatus->setId(42);
|
|
|
+ $userStatus->setUserId($userId);
|
|
|
+ $userStatus->setStatus('offline');
|
|
|
+ $userStatus->setStatusTimestamp(0);
|
|
|
+ $userStatus->setIsUserDefined(false);
|
|
|
+ $userStatus->setMessageId('messageId-42');
|
|
|
+
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with($userId)
|
|
|
+ ->willReturn($userStatus);
|
|
|
+ } else {
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with($userId)
|
|
|
+ ->willThrowException(new DoesNotExistException(''));
|
|
|
+ }
|
|
|
+
|
|
|
+ $this->emojiService->method('isValidEmoji')
|
|
|
+ ->with($statusIcon)
|
|
|
+ ->willReturn($supportsEmoji);
|
|
|
+
|
|
|
+ $this->timeFactory
|
|
|
+ ->method('getTime')
|
|
|
+ ->willReturn(40);
|
|
|
+
|
|
|
+ if ($expectException) {
|
|
|
+ $this->expectException($expectedExceptionClass);
|
|
|
+ $this->expectExceptionMessage($expectedExceptionMessage);
|
|
|
+
|
|
|
+ $this->service->setCustomMessage($userId, $statusIcon, $message, $clearAt);
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($expectSuccess) {
|
|
|
+ if ($expectExisting) {
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('update')
|
|
|
+ ->willReturnArgument(0);
|
|
|
+ } else {
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('insert')
|
|
|
+ ->willReturnArgument(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ $actual = $this->service->setCustomMessage($userId, $statusIcon, $message, $clearAt);
|
|
|
+
|
|
|
+ $this->assertEquals('john.doe', $actual->getUserId());
|
|
|
+ $this->assertEquals('offline', $actual->getStatus());
|
|
|
+ $this->assertEquals(0, $actual->getStatusTimestamp());
|
|
|
+ $this->assertEquals(false, $actual->getIsUserDefined());
|
|
|
+ $this->assertNull($actual->getMessageId());
|
|
|
+ $this->assertEquals($statusIcon, $actual->getCustomIcon());
|
|
|
+ $this->assertEquals($message, $actual->getCustomMessage());
|
|
|
+ $this->assertEquals($clearAt, $actual->getClearAt());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public function setCustomMessageDataProvider(): array {
|
|
|
+ return [
|
|
|
+ ['john.doe', '😁', true, 'Custom message', null, true, true, false, null, null],
|
|
|
+ ['john.doe', '😁', true, 'Custom message', null, false, true, false, null, null],
|
|
|
+ ['john.doe', null, false, 'Custom message', null, true, true, false, null, null],
|
|
|
+ ['john.doe', null, false, 'Custom message', null, false, true, false, null, null],
|
|
|
+ ['john.doe', '😁', false, 'Custom message', null, true, false, true, InvalidStatusIconException::class, 'Status-Icon is longer than one character'],
|
|
|
+ ['john.doe', '😁', false, 'Custom message', null, false, false, true, InvalidStatusIconException::class, 'Status-Icon is longer than one character'],
|
|
|
+ ['john.doe', null, false, 'Custom message that is way too long and violates the maximum length and hence should be rejected', null, true, false, true, StatusMessageTooLongException::class, 'Message is longer than supported length of 80 characters'],
|
|
|
+ ['john.doe', null, false, 'Custom message that is way too long and violates the maximum length and hence should be rejected', null, false, false, true, StatusMessageTooLongException::class, 'Message is longer than supported length of 80 characters'],
|
|
|
+ ['john.doe', '😁', true, 'Custom message', 80, true, true, false, null, null],
|
|
|
+ ['john.doe', '😁', true, 'Custom message', 80, false, true, false, null, null],
|
|
|
+ ['john.doe', '😁', true, 'Custom message', 20, true, false, true, InvalidClearAtException::class, 'ClearAt is in the past'],
|
|
|
+ ['john.doe', '😁', true, 'Custom message', 20, false, false, true, InvalidClearAtException::class, 'ClearAt is in the past'],
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testClearStatus(): void {
|
|
|
+ $status = new UserStatus();
|
|
|
+ $status->setId(1);
|
|
|
+ $status->setUserId('john.doe');
|
|
|
+ $status->setStatus('dnd');
|
|
|
+ $status->setStatusTimestamp(1337);
|
|
|
+ $status->setIsUserDefined(true);
|
|
|
+ $status->setMessageId('messageId-42');
|
|
|
+ $status->setCustomIcon('🙊');
|
|
|
+ $status->setCustomMessage('My custom status message');
|
|
|
+ $status->setClearAt(42);
|
|
|
+
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with('john.doe')
|
|
|
+ ->willReturn($status);
|
|
|
+
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('update')
|
|
|
+ ->with($status);
|
|
|
+
|
|
|
+ $actual = $this->service->clearStatus('john.doe');
|
|
|
+ $this->assertTrue($actual);
|
|
|
+ $this->assertEquals('offline', $status->getStatus());
|
|
|
+ $this->assertEquals(0, $status->getStatusTimestamp());
|
|
|
+ $this->assertFalse($status->getIsUserDefined());
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testClearStatusDoesNotExist(): void {
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with('john.doe')
|
|
|
+ ->willThrowException(new DoesNotExistException(''));
|
|
|
+
|
|
|
+ $this->mapper->expects($this->never())
|
|
|
+ ->method('update');
|
|
|
+
|
|
|
+ $actual = $this->service->clearStatus('john.doe');
|
|
|
+ $this->assertFalse($actual);
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testClearMessage(): void {
|
|
|
+ $status = new UserStatus();
|
|
|
+ $status->setId(1);
|
|
|
+ $status->setUserId('john.doe');
|
|
|
+ $status->setStatus('dnd');
|
|
|
+ $status->setStatusTimestamp(1337);
|
|
|
+ $status->setIsUserDefined(true);
|
|
|
+ $status->setMessageId('messageId-42');
|
|
|
+ $status->setCustomIcon('🙊');
|
|
|
+ $status->setCustomMessage('My custom status message');
|
|
|
+ $status->setClearAt(42);
|
|
|
+
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with('john.doe')
|
|
|
+ ->willReturn($status);
|
|
|
+
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('update')
|
|
|
+ ->with($status);
|
|
|
+
|
|
|
+ $actual = $this->service->clearMessage('john.doe');
|
|
|
+ $this->assertTrue($actual);
|
|
|
+ $this->assertNull($status->getMessageId());
|
|
|
+ $this->assertNull($status->getCustomMessage());
|
|
|
+ $this->assertNull($status->getCustomIcon());
|
|
|
+ $this->assertNull($status->getClearAt());
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testClearMessageDoesNotExist(): void {
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with('john.doe')
|
|
|
+ ->willThrowException(new DoesNotExistException(''));
|
|
|
+
|
|
|
+ $this->mapper->expects($this->never())
|
|
|
+ ->method('update');
|
|
|
+
|
|
|
+ $actual = $this->service->clearMessage('john.doe');
|
|
|
+ $this->assertFalse($actual);
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testRemoveUserStatus(): void {
|
|
|
+ $status = $this->createMock(UserStatus::class);
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with('john.doe')
|
|
|
+ ->willReturn($status);
|
|
|
+
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('delete')
|
|
|
+ ->with($status);
|
|
|
+
|
|
|
+ $actual = $this->service->removeUserStatus('john.doe');
|
|
|
+ $this->assertTrue($actual);
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testRemoveUserStatusDoesNotExist(): void {
|
|
|
+ $this->mapper->expects($this->once())
|
|
|
+ ->method('findByUserId')
|
|
|
+ ->with('john.doe')
|
|
|
+ ->willThrowException(new DoesNotExistException(''));
|
|
|
+
|
|
|
+ $this->mapper->expects($this->never())
|
|
|
+ ->method('delete');
|
|
|
+
|
|
|
+ $actual = $this->service->removeUserStatus('john.doe');
|
|
|
+ $this->assertFalse($actual);
|
|
|
+ }
|
|
|
+}
|