19 declare(strict_types=1);
46 $refineryMock = $this->getMockBuilder(Factory::class)->disableOriginalConstructor()->getMock();
49 $legal_documents = $this->createMock(Conductor::class);
58 $webDir =
'public/data';
59 define(
"ILIAS_WEB_DIR", $webDir);
72 $transformation = $this->createMock(Transformation::class);
73 $transformation->expects(self::exactly(count($loginToIdMap)))->method(
'applyTo')->willReturn(
new Ok(
null));
74 $legal_documents->expects(self::exactly(count($loginToIdMap)))->method(
'userCanReadInternalMail')->willReturn($transformation);
76 $userInstanceById = [];
77 $mailOptionsById = [];
78 foreach ($loginToIdMap as $usrId) {
80 ->getMockBuilder(ilObjUser::class)
81 ->disableOriginalConstructor()
82 ->onlyMethods([
'getId',
'checkTimeLimit',
'getActive'])
84 $user->method(
'getId')->willReturn($usrId);
85 $user->method(
'getActive')->willReturn(
true);
86 $user->method(
'checkTimeLimit')->willReturn(
true);
87 $userInstanceById[$usrId] = $user;
90 ->getMockBuilder(ilMailOptions::class)
91 ->disableOriginalConstructor()
92 ->onlyMethods([
'getExternalEmailAddresses',
'getIncomingType'])
94 $mailOptions->method(
'getExternalEmailAddresses')->willReturn([
95 'phpunit' . $usrId .
'@ilias.de',
98 $mailOptionsById[$usrId] = $mailOptions;
101 $user = $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock();
104 $addressTypeFactory = $this
105 ->getMockBuilder(ilMailAddressTypeFactory::class)
106 ->disableOriginalConstructor()
107 ->onlyMethods([
'getByPrefix'])
110 ->method(
'getByPrefix')
111 ->willReturnCallback(
function ($arg) use ($loginToIdMap):
object {
113 protected array $loginToIdMap = [];
117 $this->loginToIdMap =
array_map(
static function (
int $usrId): array {
122 public function resolve(): array
124 return $this->loginToIdMap[$this->address->getMailbox()] ?? [];
127 public function validate(
int $senderId):
bool 132 public function getErrors(): array
139 return $this->address;
144 $db = $this->getMockBuilder(ilDBInterface::class)->getMock();
146 $db->method(
'nextId')->willReturnCallback(
function () use (&$nextId):
int {
152 $eventHandler = $this->getMockBuilder(ilAppEventHandler::class)->disableOriginalConstructor()->getMock();
153 $logger = $this->getMockBuilder(ilLogger::class)->disableOriginalConstructor()->getMock();
154 $lng = $this->getMockBuilder(ilLanguage::class)->disableOriginalConstructor()->getMock();
155 $settings = $this->getMockBuilder(ilSetting::class)->disableOriginalConstructor()->getMock();
156 $settings->method(
'get')->willReturn(
'');
159 $mailFileData = $this->getMockBuilder(ilFileDataMail::class)->disableOriginalConstructor()->getMock();
160 $mailOptions = $this->getMockBuilder(ilMailOptions::class)->disableOriginalConstructor()->getMock();
161 $mailBox = $this->getMockBuilder(ilMailbox::class)->disableOriginalConstructor()->getMock();
162 $actor = $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock();
163 $mustache_factory = $this->getMockBuilder(ilMustacheFactory::class)->getMock();
165 $mailService =
new ilMail(
177 static function (
string $login) use ($loginToIdMap):
int {
178 return $loginToIdMap[$login] ?? 0;
180 $this->createMock(AutoresponderService::class),
189 $mailTransport = $this
190 ->getMockBuilder(ilMailMimeTransport::class)
192 $mailTransport->expects($this->once())->method(
'send')->with($this->callback(
function (
194 ) use ($loginToIdMap):
bool {
196 foreach ($mailer->
getBcc() as $bcc) {
197 $totalBcc = array_filter(
array_map(
'trim', explode(
',', $bcc))) + $totalBcc;
200 return count($totalBcc) === count($loginToIdMap);
201 }))->willReturn(
true);
204 $mailService->setUserInstanceById($userInstanceById);
205 $mailService->setMailOptionsByUserIdMap($mailOptionsById);
208 implode(
',', array_slice(array_keys($loginToIdMap), 0, 3)),
209 implode(
',', array_slice(array_keys($loginToIdMap), 3, 2)),
210 implode(
',', array_slice(array_keys($loginToIdMap), 5, 2)),
216 $mailService->sendMail($mail_data);
226 $this->assertSame(
$refId, $instance->getMailObjectReferenceId());
231 $instance = $this->
create();
233 $this->mock_language->expects(self::once())->method(
'txt')->with(
'not_available')->willReturn(
'not_available');
235 $this->assertSame(
'not_available', $instance->formatNamesForOutput(
''));
236 $this->assertSame(
'', $instance->formatNamesForOutput(
','));
246 $this->mock_database->expects(self::once())->method(
'setLimit')->with(1, 0);
247 $instance->getPreviousMail($mailId);
259 'tpl_ctx_params' =>
'[]',
260 'use_placeholders' =>
'',
267 'use_placeholders' =>
'',
277 $this->mock_database->expects(self::once())->method(
'setLimit')->with(1, 0);
278 $instance->getNextMail($mailId);
283 $filter = [
'status' =>
'yes'];
284 $rowData = [
'mail_id' => 8908];
287 'tpl_ctx_params' => [],
294 $expected = [$one, $one];
297 $instance = $this->
create(234, $userId);
298 $mockStatement = $this->getMockBuilder(ilDBStatement::class)->getMock();
299 $this->mock_database->expects(self::never())->method(
'setLimit');
300 $this->mock_database->expects(self::exactly(3))->method(
'fetchAssoc')->with($mockStatement)->willReturnOnConsecutiveCalls($rowData, $rowData,
null);
301 $this->mock_database->expects(self::once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mockStatement, [
'integer',
'integer'], [$userId, $folderId]));
303 $this->mock_database->expects(self::once())->method(
'quote')->with($filter[
'status'],
'text')->willReturn($filter[
'status']);
305 $this->assertEquals($expected, $instance->getMailsOfFolder($folderId, $filter));
313 $instance = $this->
create(345, $userId);
314 $mockStatement = $this->getMockBuilder(ilDBStatement::class)->getMock();
315 $this->mock_database->expects(self::once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mockStatement, [
'integer',
'integer'], [$userId, $folderId]));
316 $this->mock_database->expects(self::once())->method(
'numRows')->with($mockStatement)->willReturn($numRows);
318 $this->assertSame($numRows, $instance->countMailsOfFolder($folderId));
325 $instance->getMail($mailId);
330 $mailIds = [1, 2, 3, 4, 5, 6];
332 $instance = $this->
create(567, $userId);
333 $this->getMockBuilder(ilDBStatement::class)->getMock();
334 $this->mock_database->expects(self::once())->method(
'in')->with(
'mail_id', $mailIds,
false,
'integer')->willReturn(
'');
335 $this->mock_database->expects(self::once())->method(
'manipulateF')->willReturnCallback($this->
queryCallback(0, [
'text',
'integer'], [
'read', $userId]));
337 $instance->markRead($mailIds);
342 $mailIds = [1, 2, 3, 4, 5, 6];
344 $instance = $this->
create(567, $userId);
345 $this->getMockBuilder(ilDBStatement::class)->getMock();
346 $this->mock_database->expects(self::once())->method(
'in')->with(
'mail_id', $mailIds,
false,
'integer')->willReturn(
'');
347 $this->mock_database->expects(self::once())->method(
'manipulateF')->willReturnCallback($this->
queryCallback(0, [
'text',
'integer'], [
'unread', $userId]));
349 $instance->markUnread($mailIds);
354 $mailIds = [1, 2, 3, 4, 5, 6];
357 $instance = $this->
create(567, $userId);
358 $this->mock_database->expects(self::once())->method(
'in')->with(
'mail_id', $mailIds,
false,
'integer')->willReturn(
'');
359 $this->mock_database->expects(self::once())->method(
'manipulateF')->willReturnCallback($this->
queryCallback(1, [
'integer',
'integer',
'integer'], [$folderId, $userId, $userId]));
361 $this->assertTrue($instance->moveMailsToFolder($mailIds, $folderId));
367 $instance = $this->
create();
368 $this->mock_database->expects(self::never())->method(
'in');
369 $this->mock_database->expects(self::never())->method(
'manipulateF');
371 $this->assertFalse($instance->moveMailsToFolder($mailIds, 892));
379 $instance = $this->
create(4749, $userId);
381 $this->mock_database->expects(self::once())->method(
'nextId')->with(
'mail')->willReturn($nextId);
382 $this->mock_database->expects(self::once())->method(
'insert')->with(
'mail', [
383 'mail_id' => [
'integer', $nextId],
384 'user_id' => [
'integer', $userId],
385 'folder_id' => [
'integer', $folderId],
386 'sender_id' => [
'integer', $userId],
389 $this->assertSame($nextId, $instance->getNewDraftId($folderId));
395 $instance = $this->
create();
401 $usePlaceholders =
true;
406 $this->mock_database->expects(self::once())->method(
'update')->with(
'mail', [
407 'folder_id' => [
'integer', $folderId],
408 'attachments' => [
'clob', serialize([])],
409 'send_time' => [
'timestamp', date(
'Y-m-d H:i:s')],
410 'rcp_to' => [
'clob', $to],
411 'rcp_cc' => [
'clob', $cc],
412 'rcp_bcc' => [
'clob', $bcc],
413 'm_status' => [
'text',
'read'],
414 'm_subject' => [
'text', $subject],
416 'use_placeholders' => [
'integer', (
int) $usePlaceholders],
417 'tpl_ctx_id' => [
'text', $contextId],
418 'tpl_ctx_params' => [
'blob', json_encode(
$params, JSON_THROW_ON_ERROR)],
420 'mail_id' => [
'integer', $draftId],
423 $this->assertSame($draftId, $instance->updateDraft($folderId, [], $to, $cc, $bcc, $subject,
$message, $draftId, $usePlaceholders, $contextId,
$params));
435 $usePlaceholders =
false;
439 $instance = $this->
create(789, $userId);
441 $this->mock_database->expects(self::once())->method(
'replace')->with(
'mail_saved', [
442 'user_id' => [
'integer', $userId],
444 'attachments' => [
'clob', serialize($attachments)],
445 'rcp_to' => [
'clob', $rcpTo],
446 'rcp_cc' => [
'clob', $rcpCc],
447 'rcp_bcc' => [
'clob', $rcpBcc],
448 'm_subject' => [
'text', $subject],
450 'use_placeholders' => [
'integer', (
int) $usePlaceholders],
451 'tpl_ctx_id' => [
'text', $contextId],
452 'tpl_ctx_params' => [
'blob', json_encode(
$params, JSON_THROW_ON_ERROR)],
455 $mockStatement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
456 $this->mock_database->expects(self::once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mockStatement, [
'integer'], [$userId]));
457 $this->mock_database->expects(self::once())->method(
'fetchAssoc')->with($mockStatement)->willReturn([
458 'rcp_to' =>
'phpunit' 461 $instance->persistToStage(
478 $instance = $this->
create(67, $userId);
479 $mockStatement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
480 $this->mock_database->expects(self::once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mockStatement, [
'integer'], [$userId]));
481 $this->mock_database->expects(self::once())->method(
'fetchAssoc')->with($mockStatement)->willReturn([
482 'rcp_to' =>
'phpunit' 485 $mail_data = $instance->retrieveFromStage();
487 $this->assertIsArray($mail_data);
488 $this->assertEquals(
'phpunit', $mail_data[
'rcp_to']);
497 $instance = $this->
create();
498 $consecutive_debug = [
499 'Started parsing of recipient string: ' . $to,
500 'Parsed addresses: hello',
501 'Started parsing of recipient string: ' . $cc,
502 'Parsed addresses: hello',
503 'Started parsing of recipient string: ' . $bcc,
504 'Parsed addresses: hello' 506 $this->mock_log->expects(self::exactly(6))->method(
'debug')->with(
507 $this->callback(
function ($value) use (&$consecutive_debug) {
508 $this->assertSame(array_shift($consecutive_debug), $value);
513 $mockAddress = $this->getMockBuilder(ilMailAddress::class)->disableOriginalConstructor()->getMock();
514 $mockAddress->expects(self::exactly(3))->method(
'__toString')->willReturn(
'hello');
515 $mockParser = $this->getMockBuilder(ilMailRecipientParser::class)->disableOriginalConstructor()->getMock();
516 $mockParser->expects(self::exactly(3))->method(
'parse')->willReturn([$mockAddress]);
517 $consecutive_get = [$to, $cc, $bcc];
518 $this->mock_parser_factory->expects(self::exactly(3))->method(
'getParser')->with(
519 $this->callback(
function ($value) use (&$consecutive_get) {
520 $this->assertSame(array_shift($consecutive_get), $value);
523 )->willReturn($mockParser);
525 $mockAddressType = $this->getMockBuilder(ilMailAddressType::class)->disableOriginalConstructor()->getMock();
526 $mockAddressType->expects(self::exactly(3))->method(
'validate')->willReturn(empty($errors));
527 $mockAddressType->expects(self::exactly(empty($errors) ? 0 : 3))->method(
'getErrors')->willReturn($errors);
528 $this->mock_address_type_factory->expects(self::exactly(3))->method(
'getByPrefix')->with($mockAddress)->willReturn($mockAddressType);
530 $this->assertSame([], $instance->validateRecipients($to, $cc, $bcc));
543 $expected =
'Phasellus lacus';
544 $settings = $this->getMockBuilder(ilSetting::class)->disableOriginalConstructor()->getMock();
545 $settings->method(
'get')->with(
'mail_system_sys_from_name')->willReturn($expected);
555 $attachments = [
'aaa',
'bb',
'cc',
'rrr'];
556 $instance = $this->
create(789, $userId);
558 $this->mock_database->expects(self::once())->method(
'update')->with(
561 'attachments' => [
'clob', serialize($attachments)],
564 'user_id' => [
'integer', $userId],
568 $instance->saveAttachments($attachments);
573 return function (
string $query, array $types, array $values) use ($expectedTypes, $expectedValues, $returnValue) {
574 $this->assertEquals($expectedTypes, $types);
575 $this->assertEquals($expectedValues, $values);
584 $instance = $this->
create(234, $userId);
585 $mockStatement = $this->getMockBuilder(ilDBStatement::class)->getMock();
586 $this->mock_database->expects(self::once())->method(
'fetchAssoc')->with($mockStatement)->willReturn($rowData);
587 $this->mock_database->expects(self::once())->method(
'queryF')->willReturnCallback($this->
queryCallback($mockStatement, [
'integer',
'integer'], [$userId, $someMailId]));
596 ($this->mock_address_type_factory = $this->getMockBuilder(ilMailAddressTypeFactory::class)->disableOriginalConstructor()->getMock()),
597 ($this->mock_parser_factory = $this->getMockBuilder(ilMailRfc822AddressParserFactory::class)->disableOriginalConstructor()->getMock()),
598 $this->getMockBuilder(ilAppEventHandler::class)->disableOriginalConstructor()->getMock(),
599 ($this->mock_log = $this->getMockBuilder(ilLogger::class)->disableOriginalConstructor()->getMock()),
600 ($this->mock_database = $this->getMockBuilder(ilDBInterface::class)->disableOriginalConstructor()->getMock()),
601 ($this->mock_language = $this->getMockBuilder(ilLanguage::class)->disableOriginalConstructor()->getMock()),
602 $this->getMockBuilder(ilFileDataMail::class)->disableOriginalConstructor()->getMock(),
603 $this->getMockBuilder(ilMailOptions::class)->disableOriginalConstructor()->getMock(),
604 $this->getMockBuilder(ilMailbox::class)->disableOriginalConstructor()->getMock(),
605 $this->getMockBuilder(ilMailMimeSenderFactory::class)->disableOriginalConstructor()->getMock(),
606 static function (
string $login):
int {
609 $this->createMock(AutoresponderService::class),
612 $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock(),
613 $this->getMockBuilder(ilMailTemplatePlaceholderResolver::class)->disableOriginalConstructor()->getMock(),
616 $this->getMockBuilder(MailSignatureService::class)->disableOriginalConstructor()->getMock(),
static addUserToCache(int $usrId, ilObjUser $user)
testValidateRecipients($errors=[])
static provideGetPreviousMail()
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
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
static getDefaultTransport()
setGlobalVariable(string $name, $value)
Interface ilMailAddressType.
Class ilMailRfc822AddressParserFactory.
final const INCOMING_EMAIL
testGetPreviousMail(array $rowData)
provideGetPreviousMail
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()
__construct(Container $dic, ilPlugin $plugin)
MockObject &ilMailAddressTypeFactory $mock_address_type_factory
Class ilMailAddressTypeFactory.