19 declare(strict_types=1);
40 $refinery = $this->getMockBuilder(Factory::class)->disableOriginalConstructor()->getMock();
43 $legal_documents = $this->createMock(Conductor::class);
52 $web_dir =
'public/data';
53 define(
'ILIAS_WEB_DIR', $web_dir);
56 $active_users_login_to_id_map = [
65 $expired_users_login_to_id_map = [
68 $inactive_users_login_to_id_map = [
71 $inactive_and_expired_users_login_to_id_map = [
74 $all_users_login_to_id_map = array_merge(
75 $active_users_login_to_id_map,
76 $expired_users_login_to_id_map,
77 $inactive_users_login_to_id_map,
78 $inactive_and_expired_users_login_to_id_map
81 $transformation = $this->createMock(Transformation::class);
82 $transformation->method(
'applyTo')->willReturn(
85 $legal_documents->expects($this->exactly(count($active_users_login_to_id_map)))->method(
86 'userCanReadInternalMail' 87 )->willReturn($transformation);
89 $usr_instances_by_id = [];
90 $mail_options_by_id = [];
93 'Active And Not Expired' => [
94 $active_users_login_to_id_map,
98 'Active But Expired' => [
99 $expired_users_login_to_id_map,
103 'Inactive And Not Expired' => [
104 $inactive_users_login_to_id_map,
108 'Inactive And Expired' => [
109 $inactive_and_expired_users_login_to_id_map,
115 foreach ($user_groups as $user_group) {
116 foreach ($user_group[0] as $usr_id) {
118 ->getMockBuilder(ilObjUser::class)
119 ->disableOriginalConstructor()
120 ->onlyMethods([
'getId',
'checkTimeLimit',
'getActive'])
122 $user->method(
'getId')->willReturn($usr_id);
123 $user->method(
'getActive')->willReturn($user_group[1]);
124 $user->method(
'checkTimeLimit')->willReturn($user_group[2]);
125 $usr_instances_by_id[$usr_id] = $user;
127 $mail_options = $this
128 ->getMockBuilder(ilMailOptions::class)
129 ->disableOriginalConstructor()
130 ->onlyMethods([
'getExternalEmailAddresses',
'getIncomingType'])
132 $mail_options->method(
'getExternalEmailAddresses')->willReturn([
133 'phpunit' . $usr_id .
'@ilias.de',
136 $mail_options_by_id[$usr_id] = $mail_options;
140 $user = $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock();
143 $address_type_factory = $this
144 ->getMockBuilder(ilMailAddressTypeFactory::class)
145 ->disableOriginalConstructor()
146 ->onlyMethods([
'getByPrefix'])
148 $address_type_factory
149 ->method(
'getByPrefix')
150 ->willReturnCallback(
function ($arg) use ($all_users_login_to_id_map):
object {
151 return new class ($arg, $all_users_login_to_id_map) implements
ilMailAddressType {
152 protected array $login_to_id_map = [];
156 $this->login_to_id_map =
array_map(
static function (
int $usr_id): array {
158 }, $login_to_id_map);
161 public function resolve(): array
163 return $this->login_to_id_map[$this->address->getMailbox()] ?? [];
166 public function validate(
int $sender_id):
bool 171 public function getErrors(): array
178 return $this->address;
183 $db = $this->getMockBuilder(ilDBInterface::class)->getMock();
185 $db->method(
'nextId')->willReturnCallback(
function () use (&$next_id):
int {
191 $event_handler = $this->getMockBuilder(ilAppEventHandler::class)->disableOriginalConstructor()->getMock();
192 $logger = $this->getMockBuilder(ilLogger::class)->disableOriginalConstructor()->getMock();
193 $lng = $this->getMockBuilder(ilLanguage::class)->disableOriginalConstructor()->getMock();
194 $settings = $this->getMockBuilder(ilSetting::class)->disableOriginalConstructor()->getMock();
195 $settings->method(
'get')->willReturn(
'');
198 $mail_file_data = $this->getMockBuilder(ilFileDataMail::class)->disableOriginalConstructor()->getMock();
199 $mail_options = $this->getMockBuilder(ilMailOptions::class)->disableOriginalConstructor()->getMock();
200 $mail_box = $this->getMockBuilder(ilMailbox::class)->disableOriginalConstructor()->getMock();
201 $actor = $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock();
202 $mustache_factory = $this->getMockBuilder(ilMustacheFactory::class)->getMock();
204 $mail_service =
new ilMail(
206 $address_type_factory,
216 static fn(
string $login):
int => $all_users_login_to_id_map[$login] ?? 0,
217 $this->createMock(AutoresponderService::class),
226 $mail_transport = $this
227 ->getMockBuilder(ilMailMimeTransport::class)
229 $mail_transport->expects($this->once())->method(
'send')->with($this->callback(
function (
231 ) use ($active_users_login_to_id_map):
bool {
233 foreach ($mailer->
getBcc() as $bcc) {
234 $total_bcc = array_filter(
array_map(
'trim', explode(
',', $bcc))) + $total_bcc;
237 return count($total_bcc) === count($active_users_login_to_id_map);
238 }))->willReturn(
true);
241 $mail_service->setUserInstanceById($usr_instances_by_id);
242 $mail_service->setMailOptionsByUserIdMap($mail_options_by_id);
248 array_slice(array_keys($active_users_login_to_id_map), 0, 3),
249 $expired_users_login_to_id_map,
250 $inactive_users_login_to_id_map,
251 $inactive_and_expired_users_login_to_id_map
254 implode(
',', array_slice(array_keys($active_users_login_to_id_map), 3, 2)),
255 implode(
',', array_slice(array_keys($active_users_login_to_id_map), 5, 2)),
261 $mail_service->sendMail($mail_data);
271 $this->assertSame(
$ref_id, $instance->getMailObjectReferenceId());
276 $instance = $this->
create();
278 $this->mock_language->expects($this->once())->method(
'txt')->with(
'not_available')->willReturn(
'not_available');
280 $this->assertSame(
'not_available', $instance->formatNamesForOutput(
''));
281 $this->assertSame(
'', $instance->formatNamesForOutput(
','));
284 #[DataProvider('provideGetPreviousMail')] 289 $this->mock_database->expects($this->once())->method(
'setLimit')->with(1, 0);
290 $instance->getPreviousMail($mail_id);
302 'tpl_ctx_params' =>
'[]',
303 'use_placeholders' =>
'',
310 'use_placeholders' =>
'',
320 $this->mock_database->expects($this->once())->method(
'setLimit')->with(1, 0);
321 $instance->getNextMail($mail_id);
326 $filter = [
'status' =>
'yes'];
327 $row_data = [
'mail_id' => 8908];
330 'tpl_ctx_params' => [],
337 $expected = [$one, $one];
340 $instance = $this->
create(234, $usr_id);
341 $mock_statement = $this->getMockBuilder(ilDBStatement::class)->getMock();
342 $this->mock_database->expects($this->never())->method(
'setLimit');
343 $this->mock_database->expects($this->exactly(3))->method(
'fetchAssoc')->with($mock_statement)->willReturnOnConsecutiveCalls($row_data, $row_data,
null);
344 $this->mock_database->expects($this->once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mock_statement, [
'integer',
'integer'], [$usr_id, $folder_id]));
346 $this->mock_database->expects($this->once())->method(
'quote')->with($filter[
'status'],
'text')->willReturn($filter[
'status']);
348 $this->assertEquals($expected, $instance->getMailsOfFolder($folder_id, $filter));
356 $instance = $this->
create(345, $usr_id);
357 $mock_statement = $this->getMockBuilder(ilDBStatement::class)->getMock();
358 $this->mock_database->expects($this->once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mock_statement, [
'integer',
'integer'], [$usr_id, $folder_id]));
359 $this->mock_database->expects($this->once())->method(
'numRows')->with($mock_statement)->willReturn($num_rows);
361 $this->assertSame($num_rows, $instance->countMailsOfFolder($folder_id));
368 $instance->getMail($mail_id);
373 $mail_ids = [1, 2, 3, 4, 5, 6];
375 $instance = $this->
create(567, $usr_id);
376 $this->getMockBuilder(ilDBStatement::class)->getMock();
377 $this->mock_database->expects($this->once())->method(
'in')->with(
'mail_id', $mail_ids,
false,
'integer')->willReturn(
'');
378 $this->mock_database->expects($this->once())->method(
'manipulateF')->willReturnCallback($this->
queryCallback(0, [
'text',
'integer'], [
'read', $usr_id]));
380 $instance->markRead($mail_ids);
385 $mail_ids = [1, 2, 3, 4, 5, 6];
387 $instance = $this->
create(567, $usr_id);
388 $this->getMockBuilder(ilDBStatement::class)->getMock();
389 $this->mock_database->expects($this->once())->method(
'in')->with(
'mail_id', $mail_ids,
false,
'integer')->willReturn(
'');
390 $this->mock_database->expects($this->once())->method(
'manipulateF')->willReturnCallback($this->
queryCallback(0, [
'text',
'integer'], [
'unread', $usr_id]));
392 $instance->markUnread($mail_ids);
397 $mail_ids = [1, 2, 3, 4, 5, 6];
400 $instance = $this->
create(567, $usr_id);
401 $this->mock_database->expects($this->once())->method(
'in')->with(
'mail_id', $mail_ids,
false,
'integer')->willReturn(
'');
402 $this->mock_database->expects($this->once())->method(
'manipulateF')->willReturnCallback($this->
queryCallback(1, [
'integer',
'integer',
'integer'], [$folder_id, $usr_id, $usr_id]));
404 $this->assertTrue($instance->moveMailsToFolder($mail_ids, $folder_id));
410 $instance = $this->
create();
411 $this->mock_database->expects($this->never())->method(
'in');
412 $this->mock_database->expects($this->never())->method(
'manipulateF');
414 $this->assertFalse($instance->moveMailsToFolder($mail_ids, 892));
422 $instance = $this->
create(4749, $usr_id);
424 $this->mock_database->expects($this->once())->method(
'nextId')->with(
'mail')->willReturn($next_id);
425 $this->mock_database->expects($this->once())->method(
'insert')->with(
'mail', [
426 'mail_id' => [
'integer', $next_id],
427 'user_id' => [
'integer', $usr_id],
428 'folder_id' => [
'integer', $folder_id],
429 'sender_id' => [
'integer', $usr_id],
432 $this->assertSame($next_id, $instance->getNewDraftId($folder_id));
438 $instance = $this->
create();
444 $use_placeholders =
true;
449 $this->mock_database->expects($this->once())->method(
'update')->with(
'mail', [
450 'folder_id' => [
'integer', $folder_id],
451 'attachments' => [
'clob', serialize([])],
452 'send_time' => [
'timestamp', date(
'Y-m-d H:i:s')],
453 'rcp_to' => [
'clob', $to],
454 'rcp_cc' => [
'clob', $cc],
455 'rcp_bcc' => [
'clob', $bcc],
456 'm_status' => [
'text',
'read'],
457 'm_subject' => [
'text', $subject],
459 'use_placeholders' => [
'integer', (
int) $use_placeholders],
460 'tpl_ctx_id' => [
'text', $context_id],
461 'tpl_ctx_params' => [
'blob', json_encode(
$params, JSON_THROW_ON_ERROR)],
463 'mail_id' => [
'integer', $draft_id],
466 $this->assertSame($draft_id, $instance->updateDraft($folder_id, [], $to, $cc, $bcc, $subject,
$message, $draft_id, $use_placeholders, $context_id,
$params));
478 $use_placeholders =
false;
479 $context_id =
'9080';
482 $instance = $this->
create(789, $usr_id);
484 $this->mock_database->expects($this->once())->method(
'replace')->with(
'mail_saved', [
485 'user_id' => [
'integer', $usr_id],
487 'attachments' => [
'clob', serialize($attachments)],
488 'rcp_to' => [
'clob', $rcp_to],
489 'rcp_cc' => [
'clob', $rcp_cc],
490 'rcp_bcc' => [
'clob', $rcp_bcc],
491 'm_subject' => [
'text', $subject],
493 'use_placeholders' => [
'integer', (
int) $use_placeholders],
494 'tpl_ctx_id' => [
'text', $context_id],
495 'tpl_ctx_params' => [
'blob', json_encode(
$params, JSON_THROW_ON_ERROR)],
498 $mock_statement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
499 $this->mock_database->expects($this->once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mock_statement, [
'integer'], [$usr_id]));
500 $this->mock_database->expects($this->once())->method(
'fetchAssoc')->with($mock_statement)->willReturn([
501 'rcp_to' =>
'phpunit' 504 $instance->persistToStage(
521 $instance = $this->
create(67, $usr_id);
522 $mock_statement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
523 $this->mock_database->expects($this->once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mock_statement, [
'integer'], [$usr_id]));
524 $this->mock_database->expects($this->once())->method(
'fetchAssoc')->with($mock_statement)->willReturn([
525 'rcp_to' =>
'phpunit' 528 $mail_data = $instance->retrieveFromStage();
530 $this->assertIsArray($mail_data);
531 $this->assertEquals(
'phpunit', $mail_data[
'rcp_to']);
540 $instance = $this->
create();
541 $consecutive_debug = [
542 'Started parsing of recipient string: ' . $to,
543 'Parsed addresses: hello',
544 'Started parsing of recipient string: ' . $cc,
545 'Parsed addresses: hello',
546 'Started parsing of recipient string: ' . $bcc,
547 'Parsed addresses: hello' 549 $this->mock_log->expects($this->exactly(6))->method(
'debug')->with(
550 $this->callback(
function ($value) use (&$consecutive_debug) {
551 $this->assertSame(array_shift($consecutive_debug), $value);
556 $mock_address = $this->getMockBuilder(ilMailAddress::class)->disableOriginalConstructor()->getMock();
557 $mock_address->expects($this->exactly(3))->method(
'__toString')->willReturn(
'hello');
558 $mock_parser = $this->getMockBuilder(ilMailRecipientParser::class)->disableOriginalConstructor()->getMock();
559 $mock_parser->expects($this->exactly(3))->method(
'parse')->willReturn([$mock_address]);
560 $consecutive_get = [$to, $cc, $bcc];
561 $this->mock_parser_factory->expects($this->exactly(3))->method(
'getParser')->with(
562 $this->callback(
function ($value) use (&$consecutive_get) {
563 $this->assertSame(array_shift($consecutive_get), $value);
566 )->willReturn($mock_parser);
568 $mock_addressType = $this->getMockBuilder(ilMailAddressType::class)->disableOriginalConstructor()->getMock();
569 $mock_addressType->expects($this->exactly(3))->method(
'validate')->willReturn(empty($errors));
570 $mock_addressType->expects($this->exactly(empty($errors) ? 0 : 3))->method(
'getErrors')->willReturn($errors);
571 $this->mock_address_type_factory->expects($this->exactly(3))->method(
'getByPrefix')->with($mock_address)->willReturn($mock_addressType);
573 $this->assertSame([], $instance->validateRecipients($to, $cc, $bcc));
586 $expected =
'Phasellus lacus';
587 $settings = $this->getMockBuilder(ilSetting::class)->disableOriginalConstructor()->getMock();
588 $settings->method(
'get')->with(
'mail_system_sys_from_name')->willReturn($expected);
598 $attachments = [
'aaa',
'bb',
'cc',
'rrr'];
599 $instance = $this->
create(789, $usr_id);
601 $this->mock_database->expects($this->once())->method(
'update')->with(
604 'attachments' => [
'clob', serialize($attachments)],
607 'user_id' => [
'integer', $usr_id],
611 $instance->saveAttachments($attachments);
616 return function (
string $query, array $types, array $values) use ($expected_types, $expected_values, $return_value) {
617 $this->assertEquals($expected_types, $types);
618 $this->assertEquals($expected_values, $values);
620 return $return_value;
627 $instance = $this->
create(234, $usr_id);
628 $mock_statement = $this->getMockBuilder(ilDBStatement::class)->getMock();
629 $this->mock_database->expects($this->once())->method(
'fetchAssoc')->with($mock_statement)->willReturn($row_data);
630 $this->mock_database->expects($this->once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mock_statement, [
'integer',
'integer'], [$usr_id, $some_mail_id]));
639 ($this->mock_address_type_factory = $this->getMockBuilder(ilMailAddressTypeFactory::class)->disableOriginalConstructor()->getMock()),
640 ($this->mock_parser_factory = $this->getMockBuilder(ilMailRfc822AddressParserFactory::class)->disableOriginalConstructor()->getMock()),
641 $this->getMockBuilder(ilAppEventHandler::class)->disableOriginalConstructor()->getMock(),
642 ($this->mock_log = $this->getMockBuilder(ilLogger::class)->disableOriginalConstructor()->getMock()),
643 ($this->mock_database = $this->getMockBuilder(ilDBInterface::class)->disableOriginalConstructor()->getMock()),
644 ($this->mock_language = $this->getMockBuilder(ilLanguage::class)->disableOriginalConstructor()->getMock()),
645 $this->getMockBuilder(ilFileDataMail::class)->disableOriginalConstructor()->getMock(),
646 $this->getMockBuilder(ilMailOptions::class)->disableOriginalConstructor()->getMock(),
647 $this->getMockBuilder(ilMailbox::class)->disableOriginalConstructor()->getMock(),
648 $this->getMockBuilder(ilMailMimeSenderFactory::class)->disableOriginalConstructor()->getMock(),
649 static fn(
string $login):
int => 780,
650 $this->createMock(AutoresponderService::class),
653 $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock(),
654 $this->getMockBuilder(ilMailTemplatePlaceholderResolver::class)->disableOriginalConstructor()->getMock(),
657 $this->getMockBuilder(MailSignatureService::class)->disableOriginalConstructor()->getMock(),
createAndExpectDatabaseCall(int $some_mail_id, array $row_data)
testValidateRecipients($errors=[])
static provideGetPreviousMail()
if(! $DIC->user() ->getId()||!ilLTIConsumerAccess::hasCustomProviderCreationAccess()) $params
MockObject &ilDBInterface $mock_database
MockObject &ilMailRfc822AddressParserFactory $mock_parser_factory
static _getIliasMailerName()
final const int INCOMING_EMAIL
queryCallback($return_value, array $expected_types, array $expected_values)
MockObject &ilLanguage $mock_language
static setDefaultTransport(?ilMailMimeTransport $transport)
static addUserToCache(int $usr_id, ilObjUser $user)
MockObject &ilLogger $mock_log
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
static getDefaultTransport()
setGlobalVariable(string $name, $value)
testExternalMailDeliveryWorksAsExpected()
create(int $ref_id=234, int $usr_id=123)
testMoveMailsToFolderFalse()
A result encapsulates a value or an error and simplifies the handling of those.
testGetPreviousMail(array $row_data)
testGetMailObjectReferenceId()
provideValidateRecipients()
testFormatNamesForOutput()
__construct(Container $dic, ilPlugin $plugin)
MockObject &ilMailAddressTypeFactory $mock_address_type_factory