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.