19declare(strict_types=1);
22use PHPUnit\Framework\MockObject\MockObject;
28use PHPUnit\Framework\Attributes\DataProvider;
42 $refinery = $this->getMockBuilder(Factory::class)->disableOriginalConstructor()->getMock();
45 $legal_documents = $this->createMock(Conductor::class);
54 $web_dir =
'public/data';
55 define(
'ILIAS_WEB_DIR', $web_dir);
58 $active_users_login_to_id_map = [
67 $expired_users_login_to_id_map = [
70 $inactive_users_login_to_id_map = [
73 $inactive_and_expired_users_login_to_id_map = [
76 $all_users_login_to_id_map = array_merge(
77 $active_users_login_to_id_map,
78 $expired_users_login_to_id_map,
79 $inactive_users_login_to_id_map,
80 $inactive_and_expired_users_login_to_id_map
83 $transformation = $this->createMock(Transformation::class);
84 $transformation->method(
'applyTo')->willReturn(
87 $legal_documents->expects($this->exactly(count($active_users_login_to_id_map)))->method(
88 'userCanReadInternalMail'
89 )->willReturn($transformation);
91 $usr_instances_by_id = [];
92 $mail_options_by_id = [];
95 'Active And Not Expired' => [
96 $active_users_login_to_id_map,
100 'Active But Expired' => [
101 $expired_users_login_to_id_map,
105 'Inactive And Not Expired' => [
106 $inactive_users_login_to_id_map,
110 'Inactive And Expired' => [
111 $inactive_and_expired_users_login_to_id_map,
117 foreach ($user_groups as $user_group) {
118 foreach ($user_group[0] as $usr_id) {
120 ->getMockBuilder(ilObjUser::class)
121 ->disableOriginalConstructor()
122 ->onlyMethods([
'getId',
'checkTimeLimit',
'getActive'])
124 $user->method(
'getId')->willReturn($usr_id);
125 $user->method(
'getActive')->willReturn($user_group[1]);
126 $user->method(
'checkTimeLimit')->willReturn($user_group[2]);
127 $usr_instances_by_id[$usr_id] = $user;
129 $mail_options = $this
130 ->getMockBuilder(ilMailOptions::class)
131 ->disableOriginalConstructor()
132 ->onlyMethods([
'getExternalEmailAddresses',
'getIncomingType'])
134 $mail_options->method(
'getExternalEmailAddresses')->willReturn([
135 'phpunit' . $usr_id .
'@ilias.de',
138 $mail_options_by_id[$usr_id] = $mail_options;
142 $user = $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock();
145 $address_type_factory = $this
146 ->getMockBuilder(ilMailAddressTypeFactory::class)
147 ->disableOriginalConstructor()
148 ->onlyMethods([
'getByPrefix'])
150 $address_type_factory
151 ->method(
'getByPrefix')
152 ->willReturnCallback(
function ($arg) use ($all_users_login_to_id_map):
object {
153 return new class ($arg, $all_users_login_to_id_map) implements
ilMailAddressType {
154 protected array $login_to_id_map = [];
158 $this->login_to_id_map = array_map(
static function (
int $usr_id): array {
160 }, $login_to_id_map);
163 public function resolve(): array
165 return $this->login_to_id_map[$this->address->getMailbox()] ?? [];
168 public function validate(
int $sender_id):
bool
173 public function getErrors(): array
180 return $this->address;
185 $db = $this->createMock(ilDBInterface::class);
187 $db->method(
'nextId')->willReturnCallback(
function () use (&$next_id):
int {
193 $event_handler = $this->getMockBuilder(ilAppEventHandler::class)->disableOriginalConstructor()->getMock();
194 $logger = $this->getMockBuilder(ilLogger::class)->disableOriginalConstructor()->getMock();
195 $lng = $this->getMockBuilder(ilLanguage::class)->disableOriginalConstructor()->getMock();
196 $settings = $this->getMockBuilder(ilSetting::class)->disableOriginalConstructor()->getMock();
197 $settings->method(
'get')->willReturn(
'');
200 $mail_file_data = $this->getMockBuilder(ilFileDataMail::class)->disableOriginalConstructor()->getMock();
201 $mail_options = $this->getMockBuilder(ilMailOptions::class)->disableOriginalConstructor()->getMock();
202 $mail_box = $this->getMockBuilder(ilMailbox::class)->disableOriginalConstructor()->getMock();
203 $actor = $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock();
204 $template_engine_factory = $this->createMock(TemplateEngineFactoryInterface::class);
206 $mail_service =
new ilMail(
208 $address_type_factory,
218 static fn(
string $login):
int => $all_users_login_to_id_map[$login] ?? 0,
219 $this->createMock(AutoresponderService::class),
224 new class () implements \
ILIAS\
Mail\TemplateEngine\TemplateEngineInterface {
225 public function render(
string $template,
object|array $context):
string
235 $mail_transport = $this
236 ->getMockBuilder(ilMailMimeTransport::class)
238 $mail_transport->expects($this->once())->method(
'send')->with($this->callback(
function (
240 ) use ($active_users_login_to_id_map):
bool {
242 foreach ($mailer->
getBcc() as $bcc) {
243 $total_bcc = array_filter(array_map(
'trim', explode(
',', $bcc))) + $total_bcc;
246 return count($total_bcc) === count($active_users_login_to_id_map);
247 }))->willReturn(
true);
250 $mail_service->setUserInstanceById($usr_instances_by_id);
251 $mail_service->setMailOptionsByUserIdMap($mail_options_by_id);
257 array_slice(array_keys($active_users_login_to_id_map), 0, 3),
258 $expired_users_login_to_id_map,
259 $inactive_users_login_to_id_map,
260 $inactive_and_expired_users_login_to_id_map
263 implode(
',', array_slice(array_keys($active_users_login_to_id_map), 3, 2)),
264 implode(
',', array_slice(array_keys($active_users_login_to_id_map), 5, 2)),
270 $mail_service->sendMail($mail_data);
280 $this->assertSame(
$ref_id, $instance->getMailObjectReferenceId());
285 $instance = $this->
create();
287 $this->mock_language->expects($this->once())->method(
'txt')->with(
'not_available')->willReturn(
'not_available');
289 $this->assertSame(
'not_available', $instance->formatNamesForOutput(
''));
290 $this->assertSame(
'', $instance->formatNamesForOutput(
','));
293 #[DataProvider('provideGetPreviousMail')]
298 $this->mock_database->expects($this->once())->method(
'setLimit')->with(1, 0);
299 $instance->getPreviousMail($mail_id);
311 'tpl_ctx_params' =>
'[]',
312 'use_placeholders' =>
'',
319 'use_placeholders' =>
'',
329 $this->mock_database->expects($this->once())->method(
'setLimit')->with(1, 0);
330 $instance->getNextMail($mail_id);
335 $filter = [
'status' =>
'yes'];
336 $row_data = [
'mail_id' => 8908];
338 'attachments' =>
null,
339 'tpl_ctx_params' => [],
346 $expected = [$one, $one];
349 $instance = $this->
create(234, $usr_id);
350 $mock_statement = $this->getMockBuilder(ilDBStatement::class)->getMock();
351 $this->mock_database->expects($this->never())->method(
'setLimit');
352 $this->mock_database->expects($this->exactly(3))->method(
'fetchAssoc')->with($mock_statement)->willReturnOnConsecutiveCalls($row_data, $row_data,
null);
353 $this->mock_database->expects($this->once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mock_statement, [
'integer',
'integer'], [$usr_id, $folder_id]));
355 $this->mock_database->expects($this->once())->method(
'quote')->with($filter[
'status'],
'text')->willReturn($filter[
'status']);
357 $this->assertEquals($expected, $instance->getMailsOfFolder($folder_id, $filter));
365 $instance = $this->
create(345, $usr_id);
366 $mock_statement = $this->getMockBuilder(ilDBStatement::class)->getMock();
367 $this->mock_database->expects($this->once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mock_statement, [
'integer',
'integer'], [$usr_id, $folder_id]));
368 $this->mock_database->expects($this->once())->method(
'numRows')->with($mock_statement)->willReturn($num_rows);
370 $this->assertSame($num_rows, $instance->countMailsOfFolder($folder_id));
377 $instance->getMail($mail_id);
382 $mail_ids = [1, 2, 3, 4, 5, 6];
384 $instance = $this->
create(567, $usr_id);
385 $this->getMockBuilder(ilDBStatement::class)->getMock();
386 $this->mock_database->expects($this->once())->method(
'in')->with(
'mail_id', $mail_ids,
false,
'integer')->willReturn(
'');
387 $this->mock_database->expects($this->once())->method(
'manipulateF')->willReturnCallback($this->
queryCallback(0, [
'text',
'integer'], [
'read', $usr_id]));
389 $instance->markRead($mail_ids);
394 $mail_ids = [1, 2, 3, 4, 5, 6];
396 $instance = $this->
create(567, $usr_id);
397 $this->getMockBuilder(ilDBStatement::class)->getMock();
398 $this->mock_database->expects($this->once())->method(
'in')->with(
'mail_id', $mail_ids,
false,
'integer')->willReturn(
'');
399 $this->mock_database->expects($this->once())->method(
'manipulateF')->willReturnCallback($this->
queryCallback(0, [
'text',
'integer'], [
'unread', $usr_id]));
401 $instance->markUnread($mail_ids);
406 $mail_ids = [1, 2, 3, 4, 5, 6];
409 $instance = $this->
create(567, $usr_id);
410 $this->mock_database->expects($this->once())->method(
'in')->with(
'mail_id', $mail_ids,
false,
'integer')->willReturn(
'');
411 $this->mock_database->expects($this->once())->method(
'manipulateF')->willReturnCallback($this->
queryCallback(1, [
'integer',
'integer',
'integer'], [$folder_id, $usr_id, $usr_id]));
413 $this->assertTrue($instance->moveMailsToFolder($mail_ids, $folder_id));
419 $instance = $this->
create();
420 $this->mock_database->expects($this->never())->method(
'in');
421 $this->mock_database->expects($this->never())->method(
'manipulateF');
423 $this->assertFalse($instance->moveMailsToFolder($mail_ids, 892));
431 $instance = $this->
create(4749, $usr_id);
433 $this->mock_database->expects($this->once())->method(
'nextId')->with(
'mail')->willReturn($next_id);
434 $this->mock_database->expects($this->once())->method(
'insert')->with(
'mail', [
435 'mail_id' => [
'integer', $next_id],
436 'user_id' => [
'integer', $usr_id],
437 'folder_id' => [
'integer', $folder_id],
438 'sender_id' => [
'integer', $usr_id],
441 $this->assertSame($next_id, $instance->getNewDraftId($folder_id));
446 $send_time =
'2022-01-01 00:00:00';
447 $tz =
new DateTimeZone(
'Europe/Berlin');
448 $date_time =
new DateTimeImmutable($send_time, $tz);
451 $instance = $this->
create();
456 $message =
'some message';
457 $use_placeholders =
true;
462 $this->mock_database->expects($this->once())->method(
'update')->with(
'mail', [
463 'folder_id' => [
'integer', $folder_id],
464 'attachments' => [
'clob', serialize([])],
465 'send_time' => [
'timestamp', date(
'Y-m-d H:i:s')],
466 'rcp_to' => [
'clob', $to],
467 'rcp_cc' => [
'clob', $cc],
468 'rcp_bcc' => [
'clob', $bcc],
469 'm_status' => [
'text',
'read'],
470 'm_subject' => [
'text', $subject],
471 'm_message' => [
'clob', $message],
472 'use_placeholders' => [
'integer', (
int) $use_placeholders],
473 'tpl_ctx_id' => [
'text', $context_id],
474 'tpl_ctx_params' => [
'blob', json_encode(
$params, JSON_THROW_ON_ERROR)],
475 'schedule_datetime' => [
'timestamp', $date_time->format(
'Y-m-d H:i:s')],
476 'schedule_timezone' => [
'text', $tz->getName()],
478 'mail_id' => [
'integer', $draft_id],
483 $instance->updateDraft(
508 $message =
'message';
509 $use_placeholders =
false;
510 $context_id =
'9080';
513 $instance = $this->
create(789, $usr_id);
515 $this->mock_database->expects($this->once())->method(
'replace')->with(
'mail_saved', [
516 'user_id' => [
'integer', $usr_id],
518 'attachments' => [
'text', $attachments],
519 'rcp_to' => [
'clob', $rcp_to],
520 'rcp_cc' => [
'clob', $rcp_cc],
521 'rcp_bcc' => [
'clob', $rcp_bcc],
522 'm_subject' => [
'text', $subject],
523 'm_message' => [
'clob', $message],
524 'use_placeholders' => [
'integer', (
int) $use_placeholders],
525 'tpl_ctx_id' => [
'text', $context_id],
526 'tpl_ctx_params' => [
'blob', json_encode(
$params, JSON_THROW_ON_ERROR)],
529 $mock_statement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
530 $this->mock_database->expects($this->once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mock_statement, [
'integer'], [$usr_id]));
531 $this->mock_database->expects($this->once())->method(
'fetchAssoc')->with($mock_statement)->willReturn([
532 'rcp_to' =>
'phpunit'
535 $instance->persistToStage(
552 $instance = $this->
create(67, $usr_id);
553 $mock_statement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
554 $this->mock_database->expects($this->once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mock_statement, [
'integer'], [$usr_id]));
555 $this->mock_database->expects($this->once())->method(
'fetchAssoc')->with($mock_statement)->willReturn([
556 'rcp_to' =>
'phpunit'
559 $mail_data = $instance->retrieveFromStage();
561 $this->assertIsArray($mail_data);
562 $this->assertEquals(
'phpunit', $mail_data[
'rcp_to']);
571 $instance = $this->
create();
572 $consecutive_debug = [
573 'Started parsing of recipient string: ' . $to,
574 'Parsed addresses: hello',
575 'Started parsing of recipient string: ' . $cc,
576 'Parsed addresses: hello',
577 'Started parsing of recipient string: ' . $bcc,
578 'Parsed addresses: hello'
580 $this->mock_log->expects($this->exactly(6))->method(
'debug')->with(
581 $this->callback(
function ($value) use (&$consecutive_debug) {
582 $this->assertSame(array_shift($consecutive_debug), $value);
587 $mock_address = $this->getMockBuilder(ilMailAddress::class)->disableOriginalConstructor()->getMock();
588 $mock_address->expects($this->exactly(3))->method(
'__toString')->willReturn(
'hello');
589 $mock_parser = $this->getMockBuilder(ilMailRecipientParser::class)->disableOriginalConstructor()->getMock();
590 $mock_parser->expects($this->exactly(3))->method(
'parse')->willReturn([$mock_address]);
591 $consecutive_get = [$to, $cc, $bcc];
592 $this->mock_parser_factory->expects($this->exactly(3))->method(
'getParser')->with(
593 $this->callback(
function ($value) use (&$consecutive_get) {
594 $this->assertSame(array_shift($consecutive_get), $value);
597 )->willReturn($mock_parser);
599 $mock_addressType = $this->getMockBuilder(ilMailAddressType::class)->disableOriginalConstructor()->getMock();
600 $mock_addressType->expects($this->exactly(3))->method(
'validate')->willReturn(empty($errors));
601 $mock_addressType->expects($this->exactly(empty($errors) ? 0 : 3))->method(
'getErrors')->willReturn($errors);
602 $this->mock_address_type_factory->expects($this->exactly(3))->method(
'getByPrefix')->with($mock_address)->willReturn($mock_addressType);
604 $this->assertSame([], $instance->validateRecipients($to, $cc, $bcc));
617 $expected =
'Phasellus lacus';
618 $settings = $this->getMockBuilder(ilSetting::class)->disableOriginalConstructor()->getMock();
619 $settings->method(
'get')->with(
'mail_system_sys_from_name')->willReturn($expected);
629 $attachments = new \ILIAS\ResourceStorage\Identification\ResourceCollectionIdentification(
'657497dc-5079-4f95-b19d-aecdaf81ff1a');
630 $instance = $this->
create(789, $usr_id);
632 $this->mock_database->expects($this->once())->method(
'update')->with(
635 'attachments' => [
'text', $attachments->serialize()],
638 'user_id' => [
'integer', $usr_id],
642 $instance->saveAttachments($attachments);
645 private function queryCallback($return_value, array $expected_types, array $expected_values): Closure
647 return function (
string $query, array $types, array $values) use ($expected_types, $expected_values, $return_value) {
648 $this->assertEquals($expected_types, $types);
649 $this->assertEquals($expected_values, $values);
651 return $return_value;
658 $instance = $this->
create(234, $usr_id);
659 $mock_statement = $this->getMockBuilder(ilDBStatement::class)->getMock();
660 $this->mock_database->expects($this->once())->method(
'fetchAssoc')->with($mock_statement)->willReturn($row_data);
661 $this->mock_database->expects($this->once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mock_statement, [
'integer',
'integer'], [$usr_id, $some_mail_id]));
668 $refinery = $this->getMockBuilder(Factory::class)->disableOriginalConstructor()->getMock();
673 ($this->mock_address_type_factory = $this->getMockBuilder(ilMailAddressTypeFactory::class)->disableOriginalConstructor()->getMock()),
674 ($this->mock_parser_factory = $this->getMockBuilder(ilMailRfc822AddressParserFactory::class)->disableOriginalConstructor()->getMock()),
675 $this->getMockBuilder(ilAppEventHandler::class)->disableOriginalConstructor()->getMock(),
676 ($this->mock_log = $this->getMockBuilder(ilLogger::class)->disableOriginalConstructor()->getMock()),
677 ($this->mock_database = $this->createMock(ilDBInterface::class)),
678 ($this->mock_language = $this->getMockBuilder(ilLanguage::class)->disableOriginalConstructor()->getMock()),
679 $this->getMockBuilder(ilFileDataMail::class)->disableOriginalConstructor()->getMock(),
680 $this->getMockBuilder(ilMailOptions::class)->disableOriginalConstructor()->getMock(),
681 $this->getMockBuilder(ilMailbox::class)->disableOriginalConstructor()->getMock(),
682 $this->getMockBuilder(ilMailMimeSenderFactory::class)->disableOriginalConstructor()->getMock(),
683 static fn(
string $login):
int => 780,
684 $this->createMock(AutoresponderService::class),
687 $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock(),
688 $this->getMockBuilder(ilMailTemplatePlaceholderResolver::class)->disableOriginalConstructor()->getMock(),
691 $this->getMockBuilder(MailSignatureService::class)->disableOriginalConstructor()->getMock(),
A result encapsulates a value or an error and simplifies the handling of those.
Component logger with individual log levels by component id.
setGlobalVariable(string $name, $value)
static addUserToCache(int $usr_id, ilObjUser $user)
final const int INCOMING_EMAIL
MockObject &ilMailAddressTypeFactory $mock_address_type_factory
queryCallback($return_value, array $expected_types, array $expected_values)
create(int $ref_id=234, int $usr_id=123)
testValidateRecipients($errors=[])
MockObject &ilMailRfc822AddressParserFactory $mock_parser_factory
testExternalMailDeliveryWorksAsExpected()
static provideGetPreviousMail()
testGetPreviousMail(array $row_data)
MockObject &ilDBInterface $mock_database
provideValidateRecipients()
testGetMailObjectReferenceId()
MockObject &ilLanguage $mock_language
testFormatNamesForOutput()
createAndExpectDatabaseCall(int $some_mail_id, array $row_data)
MockObject &ilLogger $mock_log
testMoveMailsToFolderFalse()
static _getIliasMailerName()
static getDefaultTransport()
static setDefaultTransport(?ilMailMimeTransport $transport)
Factory interface for creating template engine instances.
if(! $DIC->user() ->getId()||!ilLTIConsumerAccess::hasCustomProviderCreationAccess()) $params
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.
RFC 822 Email address list validation Utility.