422 строки
13 KiB
PHP
422 строки
13 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
*/
|
|
|
|
namespace OCA\Mail\Tests\Service;
|
|
|
|
use ChristophWurst\Nextcloud\Testing\TestCase;
|
|
use OCA\Mail\Account;
|
|
use OCA\Mail\Address;
|
|
use OCA\Mail\AddressList;
|
|
use OCA\Mail\Db\MailAccount;
|
|
use OCA\Mail\Db\Mailbox;
|
|
use OCA\Mail\Db\MailboxMapper;
|
|
use OCA\Mail\Db\Message;
|
|
use OCA\Mail\Db\MessageMapper;
|
|
use OCA\Mail\Exception\ServiceException;
|
|
use OCA\Mail\Model\IMAPMessage;
|
|
use OCA\Mail\Service\AccountService;
|
|
use OCA\Mail\Service\IMipService;
|
|
use OCA\Mail\Service\MailManager;
|
|
use OCP\Calendar\IManager;
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
|
use Psr\Log\LoggerInterface;
|
|
|
|
class IMipServiceTest extends TestCase {
|
|
/** @var MailboxMapper|MockObject */
|
|
private $mailboxMapper;
|
|
|
|
/** @var MessageMapper|MockObject */
|
|
private $messageMapper;
|
|
|
|
/** @var AccountService|MockObject */
|
|
private $accountService;
|
|
private IManager $calendarManager;
|
|
|
|
/** @var MailManager|MockObject */
|
|
private $mailManager;
|
|
|
|
/** @var MockObject|LoggerInterface */
|
|
private $logger;
|
|
|
|
private IMipService $service;
|
|
|
|
protected function setUp(): void {
|
|
parent::setUp();
|
|
|
|
// iMIP is NC25+
|
|
if (!method_exists(IManager::class, 'handleImipReply')) {
|
|
self::markTestIncomplete();
|
|
}
|
|
|
|
|
|
$this->accountService = $this->createMock(AccountService::class);
|
|
$this->calendarManager = $this->createMock(IManager::class);
|
|
$this->mailboxMapper = $this->createMock(MailboxMapper::class);
|
|
$this->logger = $this->createMock(LoggerInterface::class);
|
|
$this->mailManager = $this->createMock(MailManager::class);
|
|
$this->messageMapper = $this->createMock(MessageMapper::class);
|
|
|
|
$this->service = new IMipService(
|
|
$this->accountService,
|
|
$this->calendarManager,
|
|
$this->logger,
|
|
$this->mailboxMapper,
|
|
$this->mailManager,
|
|
$this->messageMapper
|
|
);
|
|
}
|
|
|
|
public function testNoSchedulingInformation(): void {
|
|
$this->messageMapper->expects(self::once())
|
|
->method('findIMipMessagesAscending')
|
|
->willReturn([]);
|
|
$this->logger->expects(self::once())
|
|
->method('info');
|
|
$this->mailboxMapper->expects(self::never())
|
|
->method('findById');
|
|
$this->accountService->expects(self::never())
|
|
->method('findById');
|
|
$this->calendarManager->expects(self::never())
|
|
->method('handleIMipReply');
|
|
$this->calendarManager->expects(self::never())
|
|
->method('handleIMipCancel');
|
|
$this->messageMapper->expects(self::never())
|
|
->method('updateImipData');
|
|
|
|
$this->service->process();
|
|
}
|
|
|
|
public function testIsSpecialUse(): void {
|
|
$message = new Message();
|
|
$message->setImipMessage(true);
|
|
$message->setUid(1);
|
|
$message->setMailboxId(100);
|
|
$mailbox = new Mailbox();
|
|
$mailbox->setId(100);
|
|
$mailbox->setAccountId(200);
|
|
$mailbox->setSpecialUse('["sent"]');
|
|
$mailAccount = new MailAccount();
|
|
$mailAccount->setDraftsMailboxId(100);
|
|
$account = new Account($mailAccount);
|
|
|
|
$this->messageMapper->expects(self::once())
|
|
->method('findIMipMessagesAscending')
|
|
->willReturn([$message]);
|
|
$this->mailboxMapper->expects(self::once())
|
|
->method('findById')
|
|
->with($message->getMailboxId())
|
|
->willReturn($mailbox);
|
|
$this->accountService->expects(self::once())
|
|
->method('findById')
|
|
->with($mailbox->getAccountId())
|
|
->willReturn($account);
|
|
$this->messageMapper->expects(self::once())
|
|
->method('updateImipData');
|
|
$this->calendarManager->expects(self::never())
|
|
->method('handleIMipReply');
|
|
$this->calendarManager->expects(self::never())
|
|
->method('handleIMipCancel');
|
|
|
|
$this->service->process();
|
|
}
|
|
|
|
public function testIsArchive(): void {
|
|
$message = new Message();
|
|
$message->setImipMessage(true);
|
|
$message->setUid(1);
|
|
$message->setMailboxId(100);
|
|
$mailbox = new Mailbox();
|
|
$mailbox->setId(100);
|
|
$mailbox->setAccountId(200);
|
|
$mailbox->setSpecialUse('["archive"]');
|
|
$mailAccount = new MailAccount();
|
|
$account = new Account($mailAccount);
|
|
|
|
$this->messageMapper->expects(self::once())
|
|
->method('findIMipMessagesAscending')
|
|
->willReturn([$message]);
|
|
$this->mailboxMapper->expects(self::once())
|
|
->method('findById')
|
|
->with($message->getMailboxId())
|
|
->willReturn($mailbox);
|
|
$this->accountService->expects(self::once())
|
|
->method('findById')
|
|
->with($mailbox->getAccountId())
|
|
->willReturn($account);
|
|
$this->messageMapper->expects(self::once())
|
|
->method('updateImipData');
|
|
$this->calendarManager->expects(self::never())
|
|
->method('handleIMipReply');
|
|
$this->calendarManager->expects(self::never())
|
|
->method('handleIMipCancel');
|
|
|
|
$this->service->process();
|
|
}
|
|
|
|
public function testNoSchedulingInfo(): void {
|
|
$message = new Message();
|
|
$message->setImipMessage(true);
|
|
$message->setUid(1);
|
|
$message->setMailboxId(100);
|
|
$mailbox = new Mailbox();
|
|
$mailbox->setId(100);
|
|
$mailbox->setAccountId(200);
|
|
$account = $this->createConfiguredMock(Account::class, [
|
|
'getId' => 200,
|
|
'getEmail' => 'dimitrius@stardew-science.com'
|
|
]);
|
|
$imapMessage = $this->createConfiguredMock(IMAPMessage::class, [
|
|
'getUid' => 1
|
|
]);
|
|
$imapMessage->scheduling = [];
|
|
|
|
$this->messageMapper->expects(self::once())
|
|
->method('findIMipMessagesAscending')
|
|
->willReturn([$message]);
|
|
$this->mailboxMapper->expects(self::once())
|
|
->method('findById')
|
|
->willReturn($mailbox);
|
|
$this->accountService->expects(self::once())
|
|
->method('findById')
|
|
->willReturn($account);
|
|
$this->mailManager->expects(self::once())
|
|
->method('getImapMessagesForScheduleProcessing')
|
|
->with($account, $mailbox, [$message->getUid()])
|
|
->willReturn([$imapMessage]);
|
|
$this->calendarManager->expects(self::never())
|
|
->method('handleIMipReply');
|
|
$this->calendarManager->expects(self::never())
|
|
->method('handleIMipCancel');
|
|
$this->messageMapper->expects(self::once())
|
|
->method('updateImipData')
|
|
->with($message);
|
|
|
|
$this->service->process();
|
|
}
|
|
|
|
public function testImapConnectionServiceException(): void {
|
|
$message = new Message();
|
|
$message->setImipMessage(true);
|
|
$message->setUid(1);
|
|
$message->setMailboxId(100);
|
|
$mailbox = new Mailbox();
|
|
$mailbox->setId(100);
|
|
$mailbox->setAccountId(200);
|
|
$account = $this->createConfiguredMock(Account::class, [
|
|
'getId' => 200,
|
|
'getEmail' => 'dimitrius@stardew-science.com'
|
|
]);
|
|
$imapMessage = $this->createConfiguredMock(IMAPMessage::class, [
|
|
'getUid' => 1
|
|
]);
|
|
$imapMessage->scheduling = [];
|
|
|
|
$this->messageMapper->expects(self::once())
|
|
->method('findIMipMessagesAscending')
|
|
->willReturn([$message]);
|
|
$this->mailboxMapper->expects(self::once())
|
|
->method('findById')
|
|
->willReturn($mailbox);
|
|
$this->accountService->expects(self::once())
|
|
->method('findById')
|
|
->willReturn($account);
|
|
$this->mailManager->expects(self::once())
|
|
->method('getImapMessagesForScheduleProcessing')
|
|
->willThrowException(new ServiceException());
|
|
$this->logger->expects(self::once())
|
|
->method('error');
|
|
$this->calendarManager->expects(self::never())
|
|
->method('handleIMipReply');
|
|
$this->calendarManager->expects(self::never())
|
|
->method('handleIMipCancel');
|
|
$this->messageMapper->expects(self::never())
|
|
->method('updateImipData');
|
|
|
|
$this->service->process();
|
|
}
|
|
|
|
public function testIsRequest(): void {
|
|
$message = new Message();
|
|
$message->setImipMessage(true);
|
|
$message->setUid(1);
|
|
$message->setMailboxId(100);
|
|
$mailbox = new Mailbox();
|
|
$mailbox->setId(100);
|
|
$mailbox->setAccountId(200);
|
|
$mailAccount = new MailAccount();
|
|
$mailAccount->setId(200);
|
|
$mailAccount->setEmail('vincent@stardew-valley.edu');
|
|
$account = new Account($mailAccount);
|
|
$imapMessage = $this->createMock(IMAPMessage::class);
|
|
$imapMessage->scheduling[] = ['method' => 'REQUEST'];
|
|
$addressList = $this->createMock(AddressList::class);
|
|
$address = $this->createMock(Address::class);
|
|
|
|
$this->messageMapper->expects(self::once())
|
|
->method('findIMipMessagesAscending')
|
|
->willReturn([$message]);
|
|
$this->mailboxMapper->expects(self::once())
|
|
->method('findById')
|
|
->willReturn($mailbox);
|
|
$this->accountService->expects(self::once())
|
|
->method('findById')
|
|
->willReturn($account);
|
|
$this->mailManager->expects(self::once())
|
|
->method('getImapMessagesForScheduleProcessing')
|
|
->with($account, $mailbox, [$message->getUid()])
|
|
->willReturn([$imapMessage]);
|
|
$imapMessage->expects(self::once())
|
|
->method('getUid')
|
|
->willReturn(1);
|
|
$imapMessage->expects(self::once())
|
|
->method('getFrom')
|
|
->willReturn($addressList);
|
|
$addressList->expects(self::once())
|
|
->method('first')
|
|
->willReturn($address);
|
|
$address->expects(self::once())
|
|
->method('getEmail')
|
|
->willReturn('pam@stardew-bus-company.com');
|
|
$this->logger->expects(self::never())
|
|
->method('info');
|
|
$this->calendarManager->expects(self::never())
|
|
->method('handleIMipReply');
|
|
$this->calendarManager->expects(self::never())
|
|
->method('handleIMipCancel');
|
|
$this->messageMapper->expects(self::never())
|
|
->method('updateBulk');
|
|
|
|
$this->service->process();
|
|
}
|
|
|
|
public function testIsReply(): void {
|
|
$message = new Message();
|
|
$message->setImipMessage(true);
|
|
$message->setUid(1);
|
|
$message->setMailboxId(100);
|
|
$mailbox = new Mailbox();
|
|
$mailbox->setId(100);
|
|
$mailbox->setAccountId(200);
|
|
$mailAccount = new MailAccount();
|
|
$mailAccount->setId(200);
|
|
$mailAccount->setEmail('vincent@stardew-valley.edu');
|
|
$mailAccount->setUserId('vincent');
|
|
$account = new Account($mailAccount);
|
|
$imapMessage = $this->createMock(IMAPMessage::class);
|
|
$imapMessage->scheduling[] = ['method' => 'REPLY', 'contents' => 'VCARD'];
|
|
$addressList = $this->createMock(AddressList::class);
|
|
$address = $this->createMock(Address::class);
|
|
|
|
$this->messageMapper->expects(self::once())
|
|
->method('findIMipMessagesAscending')
|
|
->willReturn([$message]);
|
|
$this->mailboxMapper->expects(self::once())
|
|
->method('findById')
|
|
->willReturn($mailbox);
|
|
$this->accountService->expects(self::once())
|
|
->method('findById')
|
|
->willReturn($account);
|
|
$this->mailManager->expects(self::once())
|
|
->method('getImapMessagesForScheduleProcessing')
|
|
->with($account, $mailbox, [$message->getUid()])
|
|
->willReturn([$imapMessage]);
|
|
$imapMessage->expects(self::once())
|
|
->method('getUid')
|
|
->willReturn(1);
|
|
$this->logger->expects(self::never())
|
|
->method('info');
|
|
$imapMessage->expects(self::once())
|
|
->method('getFrom')
|
|
->willReturn($addressList);
|
|
$addressList->expects(self::once())
|
|
->method('first')
|
|
->willReturn($address);
|
|
$address->expects(self::once())
|
|
->method('getEmail')
|
|
->willReturn('pam@stardew-bus-service.com');
|
|
$imapMessage->expects(self::never())
|
|
->method('getInReplyTo')
|
|
->willReturn($addressList);
|
|
$this->calendarManager->expects(self::once())
|
|
->method('handleIMipReply')
|
|
->with('principals/users/vincent',
|
|
'pam@stardew-bus-service.com',
|
|
$account->getEmail(),
|
|
$imapMessage->scheduling[0]['contents']);
|
|
$this->calendarManager->expects(self::never())
|
|
->method('handleIMipCancel');
|
|
$this->messageMapper->expects(self::once())
|
|
->method('updateImipData');
|
|
|
|
$this->service->process();
|
|
}
|
|
|
|
public function testIsCancel(): void {
|
|
$message = new Message();
|
|
$message->setImipMessage(true);
|
|
$message->setUid(1);
|
|
$message->setMailboxId(100);
|
|
$mailbox = new Mailbox();
|
|
$mailbox->setId(100);
|
|
$mailbox->setAccountId(200);
|
|
$mailAccount = new MailAccount();
|
|
$mailAccount->setId(200);
|
|
$mailAccount->setEmail('vincent@stardew-valley.edu');
|
|
$mailAccount->setUserId('vincent');
|
|
$account = new Account($mailAccount);
|
|
$imapMessage = $this->createMock(IMAPMessage::class);
|
|
$imapMessage->scheduling[] = ['method' => 'CANCEL', 'contents' => 'VCARD'];
|
|
$addressList = $this->createMock(AddressList::class);
|
|
$address = $this->createMock(Address::class);
|
|
|
|
$this->messageMapper->expects(self::once())
|
|
->method('findIMipMessagesAscending')
|
|
->willReturn([$message]);
|
|
$this->mailboxMapper->expects(self::once())
|
|
->method('findById')
|
|
->willReturn($mailbox);
|
|
$this->accountService->expects(self::once())
|
|
->method('findById')
|
|
->willReturn($account);
|
|
$this->mailManager->expects(self::once())
|
|
->method('getImapMessagesForScheduleProcessing')
|
|
->with($account, $mailbox, [$message->getUid()])
|
|
->willReturn([$imapMessage]);
|
|
$imapMessage->expects(self::once())
|
|
->method('getUid')
|
|
->willReturn(1);
|
|
$this->logger->expects(self::never())
|
|
->method('info');
|
|
$imapMessage->expects(self::once())
|
|
->method('getFrom')
|
|
->willReturn($addressList);
|
|
$addressList->expects(self::once())
|
|
->method('first')
|
|
->willReturn($address);
|
|
$address->expects(self::once())
|
|
->method('getEmail')
|
|
->willReturn('pam@stardew-bus-service.com');
|
|
$imapMessage->expects(self::once())
|
|
->method('getReplyTo')
|
|
->willReturn(new AddressList([]));
|
|
$this->calendarManager->expects(self::once())
|
|
->method('handleIMipCancel')
|
|
->with('principals/users/vincent',
|
|
'pam@stardew-bus-service.com',
|
|
null,
|
|
$account->getEmail(),
|
|
$imapMessage->scheduling[0]['contents']
|
|
);
|
|
$this->messageMapper->expects(self::once())
|
|
->method('updateImipData');
|
|
|
|
$this->service->process();
|
|
}
|
|
}
|