19 declare(strict_types=1);
46 $refineryMock = $this->getMockBuilder(Factory::class)->disableOriginalConstructor()->getMock();
49 $legal_documents = $this->createMock(Conductor::class);
63 $transformation = $this->createMock(Transformation::class);
64 $transformation->expects(self::exactly(count($loginToIdMap)))->method(
'applyTo')->willReturn(
new Ok(null));
65 $legal_documents->expects(self::exactly(count($loginToIdMap)))->method(
'userCanReadInternalMail')->willReturn($transformation);
67 $userInstanceById = [];
68 $mailOptionsById = [];
69 foreach ($loginToIdMap as $usrId) {
71 ->getMockBuilder(ilObjUser::class)
72 ->disableOriginalConstructor()
73 ->onlyMethods([
'getId',
'checkTimeLimit',
'getActive'])
75 $user->method(
'getId')->willReturn($usrId);
76 $user->method(
'getActive')->willReturn(
true);
77 $user->method(
'checkTimeLimit')->willReturn(
true);
78 $userInstanceById[$usrId] = $user;
81 ->getMockBuilder(ilMailOptions::class)
82 ->disableOriginalConstructor()
83 ->onlyMethods([
'getExternalEmailAddresses',
'getIncomingType'])
85 $mailOptions->method(
'getExternalEmailAddresses')->willReturn([
86 'phpunit' . $usrId .
'@ilias.de',
89 $mailOptionsById[$usrId] = $mailOptions;
92 $user = $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock();
95 $addressTypeFactory = $this
96 ->getMockBuilder(ilMailAddressTypeFactory::class)
97 ->disableOriginalConstructor()
98 ->onlyMethods([
'getByPrefix'])
101 ->method(
'getByPrefix')
102 ->willReturnCallback(
function ($arg) use ($loginToIdMap):
object {
104 protected array $loginToIdMap = [];
108 $this->loginToIdMap = array_map(
static function (
int $usrId): array {
113 public function resolve(): array
115 return $this->loginToIdMap[$this->address->getMailbox()] ?? [];
118 public function validate(
int $senderId):
bool 123 public function getErrors(): array
130 return $this->address;
135 $db = $this->getMockBuilder(ilDBInterface::class)->getMock();
137 $db->method(
'nextId')->willReturnCallback(
function () use (&$nextId):
int {
143 $eventHandler = $this->getMockBuilder(ilAppEventHandler::class)->disableOriginalConstructor()->getMock();
144 $logger = $this->getMockBuilder(ilLogger::class)->disableOriginalConstructor()->getMock();
145 $lng = $this->getMockBuilder(ilLanguage::class)->disableOriginalConstructor()->getMock();
146 $settings = $this->getMockBuilder(ilSetting::class)->disableOriginalConstructor()->getMock();
149 $mailFileData = $this->getMockBuilder(ilFileDataMail::class)->disableOriginalConstructor()->getMock();
150 $mailOptions = $this->getMockBuilder(ilMailOptions::class)->disableOriginalConstructor()->getMock();
151 $mailBox = $this->getMockBuilder(ilMailbox::class)->disableOriginalConstructor()->getMock();
152 $actor = $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock();
153 $mustache_factory = $this->getMockBuilder(ilMustacheFactory::class)->getMock();
155 $mailService =
new ilMail(
167 static function (
string $login) use ($loginToIdMap):
int {
168 return $loginToIdMap[$login] ?? 0;
170 $this->createMock(AutoresponderService::class),
179 $mailTransport = $this
180 ->getMockBuilder(ilMailMimeTransport::class)
182 $mailTransport->expects($this->once())->method(
'send')->with($this->callback(
function (
184 ) use ($loginToIdMap):
bool {
186 foreach ($mailer->
getBcc() as $bcc) {
187 $totalBcc = array_filter(array_map(
'trim', explode(
',', $bcc))) + $totalBcc;
190 return count($totalBcc) === count($loginToIdMap);
191 }))->willReturn(
true);
194 $mailService->setUserInstanceById($userInstanceById);
195 $mailService->setMailOptionsByUserIdMap($mailOptionsById);
198 implode(
',', array_slice(array_keys($loginToIdMap), 0, 3)),
199 implode(
',', array_slice(array_keys($loginToIdMap), 3, 2)),
200 implode(
',', array_slice(array_keys($loginToIdMap), 5, 2)),
206 $mailService->sendMail($mail_data);
216 $this->assertSame(
$refId, $instance->getMailObjectReferenceId());
221 $instance = $this->
create();
223 $this->mock_language->expects(self::once())->method(
'txt')->with(
'not_available')->willReturn(
'not_available');
225 $this->assertSame(
'not_available', $instance->formatNamesForOutput(
''));
226 $this->assertSame(
'', $instance->formatNamesForOutput(
','));
236 $this->mock_database->expects(self::once())->method(
'setLimit')->with(1, 0);
237 $instance->getPreviousMail($mailId);
249 'tpl_ctx_params' =>
'[]',
250 'use_placeholders' =>
'',
257 'use_placeholders' =>
'',
267 $this->mock_database->expects(self::once())->method(
'setLimit')->with(1, 0);
268 $instance->getNextMail($mailId);
273 $filter = [
'status' =>
'yes'];
274 $rowData = [
'mail_id' => 8908];
277 'tpl_ctx_params' => [],
284 $expected = [$one, $one];
287 $instance = $this->
create(234, $userId);
288 $mockStatement = $this->getMockBuilder(ilDBStatement::class)->getMock();
289 $this->mock_database->expects(self::never())->method(
'setLimit');
290 $this->mock_database->expects(self::exactly(3))->method(
'fetchAssoc')->with($mockStatement)->willReturnOnConsecutiveCalls($rowData, $rowData, null);
291 $this->mock_database->expects(self::once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mockStatement, [
'integer',
'integer'], [$userId, $folderId]));
293 $this->mock_database->expects(self::once())->method(
'quote')->with($filter[
'status'],
'text')->willReturn($filter[
'status']);
295 $this->assertEquals($expected, $instance->getMailsOfFolder($folderId, $filter));
303 $instance = $this->
create(345, $userId);
304 $mockStatement = $this->getMockBuilder(ilDBStatement::class)->getMock();
305 $this->mock_database->expects(self::once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mockStatement, [
'integer',
'integer'], [$userId, $folderId]));
306 $this->mock_database->expects(self::once())->method(
'numRows')->with($mockStatement)->willReturn($numRows);
308 $this->assertSame($numRows, $instance->countMailsOfFolder($folderId));
315 $instance->getMail($mailId);
320 $mailIds = [1, 2, 3, 4, 5, 6];
322 $instance = $this->
create(567, $userId);
323 $this->getMockBuilder(ilDBStatement::class)->getMock();
324 $this->mock_database->expects(self::once())->method(
'in')->with(
'mail_id', $mailIds,
false,
'integer')->willReturn(
'');
325 $this->mock_database->expects(self::once())->method(
'manipulateF')->willReturnCallback($this->
queryCallback(0, [
'text',
'integer'], [
'read', $userId]));
327 $instance->markRead($mailIds);
332 $mailIds = [1, 2, 3, 4, 5, 6];
334 $instance = $this->
create(567, $userId);
335 $this->getMockBuilder(ilDBStatement::class)->getMock();
336 $this->mock_database->expects(self::once())->method(
'in')->with(
'mail_id', $mailIds,
false,
'integer')->willReturn(
'');
337 $this->mock_database->expects(self::once())->method(
'manipulateF')->willReturnCallback($this->
queryCallback(0, [
'text',
'integer'], [
'unread', $userId]));
339 $instance->markUnread($mailIds);
344 $mailIds = [1, 2, 3, 4, 5, 6];
347 $instance = $this->
create(567, $userId);
348 $this->mock_database->expects(self::once())->method(
'in')->with(
'mail_id', $mailIds,
false,
'integer')->willReturn(
'');
349 $this->mock_database->expects(self::once())->method(
'manipulateF')->willReturnCallback($this->
queryCallback(1, [
'integer',
'integer',
'integer'], [$folderId, $userId, $userId]));
351 $this->assertTrue($instance->moveMailsToFolder($mailIds, $folderId));
357 $instance = $this->
create();
358 $this->mock_database->expects(self::never())->method(
'in');
359 $this->mock_database->expects(self::never())->method(
'manipulateF');
361 $this->assertFalse($instance->moveMailsToFolder($mailIds, 892));
369 $instance = $this->
create(4749, $userId);
371 $this->mock_database->expects(self::once())->method(
'nextId')->with(
'mail')->willReturn($nextId);
372 $this->mock_database->expects(self::once())->method(
'insert')->with(
'mail', [
373 'mail_id' => [
'integer', $nextId],
374 'user_id' => [
'integer', $userId],
375 'folder_id' => [
'integer', $folderId],
376 'sender_id' => [
'integer', $userId],
379 $this->assertSame($nextId, $instance->getNewDraftId($folderId));
385 $instance = $this->
create();
391 $usePlaceholders =
true;
396 $this->mock_database->expects(self::once())->method(
'update')->with(
'mail', [
397 'folder_id' => [
'integer', $folderId],
398 'attachments' => [
'clob', serialize([])],
399 'send_time' => [
'timestamp', date(
'Y-m-d H:i:s')],
400 'rcp_to' => [
'clob', $to],
401 'rcp_cc' => [
'clob', $cc],
402 'rcp_bcc' => [
'clob', $bcc],
403 'm_status' => [
'text',
'read'],
404 'm_subject' => [
'text', $subject],
406 'use_placeholders' => [
'integer', (
int) $usePlaceholders],
407 'tpl_ctx_id' => [
'text', $contextId],
408 'tpl_ctx_params' => [
'blob', json_encode(
$params, JSON_THROW_ON_ERROR)],
410 'mail_id' => [
'integer', $draftId],
413 $this->assertSame($draftId, $instance->updateDraft($folderId, [], $to, $cc, $bcc, $subject,
$message, $draftId, $usePlaceholders, $contextId,
$params));
425 $usePlaceholders =
false;
429 $instance = $this->
create(789, $userId);
431 $this->mock_database->expects(self::once())->method(
'replace')->with(
'mail_saved', [
432 'user_id' => [
'integer', $userId],
434 'attachments' => [
'clob', serialize($attachments)],
435 'rcp_to' => [
'clob', $rcpTo],
436 'rcp_cc' => [
'clob', $rcpCc],
437 'rcp_bcc' => [
'clob', $rcpBcc],
438 'm_subject' => [
'text', $subject],
440 'use_placeholders' => [
'integer', (
int) $usePlaceholders],
441 'tpl_ctx_id' => [
'text', $contextId],
442 'tpl_ctx_params' => [
'blob', json_encode(
$params, JSON_THROW_ON_ERROR)],
445 $mockStatement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
446 $this->mock_database->expects(self::once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mockStatement, [
'integer'], [$userId]));
447 $this->mock_database->expects(self::once())->method(
'fetchAssoc')->with($mockStatement)->willReturn([
448 'rcp_to' =>
'phpunit' 451 $instance->persistToStage(
468 $instance = $this->
create(67, $userId);
469 $mockStatement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
470 $this->mock_database->expects(self::once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mockStatement, [
'integer'], [$userId]));
471 $this->mock_database->expects(self::once())->method(
'fetchAssoc')->with($mockStatement)->willReturn([
472 'rcp_to' =>
'phpunit' 475 $mail_data = $instance->retrieveFromStage();
477 $this->assertIsArray($mail_data);
478 $this->assertEquals(
'phpunit', $mail_data[
'rcp_to']);
487 $instance = $this->
create();
488 $this->mock_log->expects(self::exactly(6))->method(
'debug')->withConsecutive(
489 [
'Started parsing of recipient string: ' . $to],
490 [
'Parsed addresses: hello'],
491 [
'Started parsing of recipient string: ' . $cc],
492 [
'Parsed addresses: hello'],
493 [
'Started parsing of recipient string: ' . $bcc],
494 [
'Parsed addresses: hello']
497 $mockAddress = $this->getMockBuilder(ilMailAddress::class)->disableOriginalConstructor()->getMock();
498 $mockAddress->expects(self::exactly(3))->method(
'__toString')->willReturn(
'hello');
499 $mockParser = $this->getMockBuilder(ilMailRecipientParser::class)->disableOriginalConstructor()->getMock();
500 $mockParser->expects(self::exactly(3))->method(
'parse')->willReturn([$mockAddress]);
501 $this->mock_parser_factory->expects(self::exactly(3))->method(
'getParser')->withConsecutive([$to], [$cc], [$bcc])->willReturn($mockParser);
503 $mockAddressType = $this->getMockBuilder(ilMailAddressType::class)->disableOriginalConstructor()->getMock();
504 $mockAddressType->expects(self::exactly(3))->method(
'validate')->willReturn(empty($errors));
505 $mockAddressType->expects(self::exactly(empty($errors) ? 0 : 3))->method(
'getErrors')->willReturn($errors);
506 $this->mock_address_type_factory->expects(self::exactly(3))->method(
'getByPrefix')->with($mockAddress)->willReturn($mockAddressType);
508 $this->assertSame([], $instance->validateRecipients($to, $cc, $bcc));
521 $expected =
'Phasellus lacus';
522 $settings = $this->getMockBuilder(ilSetting::class)->disableOriginalConstructor()->getMock();
523 $settings->method(
'get')->with(
'mail_system_sys_from_name')->willReturn($expected);
533 $attachments = [
'aaa',
'bb',
'cc',
'rrr'];
534 $instance = $this->
create(789, $userId);
536 $this->mock_database->expects(self::once())->method(
'update')->with(
539 'attachments' => [
'clob', serialize($attachments)],
542 'user_id' => [
'integer', $userId],
546 $instance->saveAttachments($attachments);
551 return function (
string $query, array $types, array $values) use ($expectedTypes, $expectedValues, $returnValue) {
552 $this->assertEquals($expectedTypes, $types);
553 $this->assertEquals($expectedValues, $values);
562 $instance = $this->
create(234, $userId);
563 $mockStatement = $this->getMockBuilder(ilDBStatement::class)->getMock();
564 $this->mock_database->expects(self::once())->method(
'fetchAssoc')->with($mockStatement)->willReturn($rowData);
565 $this->mock_database->expects(self::once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mockStatement, [
'integer',
'integer'], [$userId, $someMailId]));
574 ($this->mock_address_type_factory = $this->getMockBuilder(ilMailAddressTypeFactory::class)->disableOriginalConstructor()->getMock()),
575 ($this->mock_parser_factory = $this->getMockBuilder(ilMailRfc822AddressParserFactory::class)->disableOriginalConstructor()->getMock()),
576 $this->getMockBuilder(ilAppEventHandler::class)->disableOriginalConstructor()->getMock(),
577 ($this->mock_log = $this->getMockBuilder(ilLogger::class)->disableOriginalConstructor()->getMock()),
578 ($this->mock_database = $this->getMockBuilder(ilDBInterface::class)->disableOriginalConstructor()->getMock()),
579 ($this->mock_language = $this->getMockBuilder(ilLanguage::class)->disableOriginalConstructor()->getMock()),
580 $this->getMockBuilder(ilFileDataMail::class)->disableOriginalConstructor()->getMock(),
581 $this->getMockBuilder(ilMailOptions::class)->disableOriginalConstructor()->getMock(),
582 $this->getMockBuilder(ilMailbox::class)->disableOriginalConstructor()->getMock(),
583 $this->getMockBuilder(ilMailMimeSenderFactory::class)->disableOriginalConstructor()->getMock(),
584 static function (
string $login):
int {
587 $this->createMock(AutoresponderService::class),
590 $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock(),
591 $this->getMockBuilder(ilMailTemplatePlaceholderResolver::class)->disableOriginalConstructor()->getMock()
static addUserToCache(int $usrId, ilObjUser $user)
testValidateRecipients($errors=[])
if(! $DIC->user() ->getId()||!ilLTIConsumerAccess::hasCustomProviderCreationAccess()) $params
MockObject &ilDBInterface $mock_database
MockObject &ilMailRfc822AddressParserFactory $mock_parser_factory
testExternalMailDeliveryToLocalRecipientsWorksAsExpected()
static _getIliasMailerName()
MockObject &ilLanguage $mock_language
static setDefaultTransport(?ilMailMimeTransport $transport)
MockObject &ilLogger $mock_log
static getDefaultTransport()
Interface ilMailAddressType.
Class ilMailRfc822AddressParserFactory.
final const INCOMING_EMAIL
testGetPreviousMail(array $rowData)
provideGetPreviousMail
setGlobalVariable(string $name, $value)
create(int $refId=234, int $userId=123)
testMoveMailsToFolderFalse()
createAndExpectDatabaseCall(int $someMailId, array $rowData)
A result encapsulates a value or an error and simplifies the handling of those.
queryCallback($returnValue, array $expectedTypes, array $expectedValues)
Class ilMailTemplatePlaceholderResolver.
testGetMailObjectReferenceId()
provideValidateRecipients()
testFormatNamesForOutput()
MockObject &ilMailAddressTypeFactory $mock_address_type_factory
Class ilMailAddressTypeFactory.