MailerTest.php 3.58 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?php

declare(strict_types=1);

/*
 * This file is part of the TYPO3 CMS project.
 *
 * It is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License, either version 2
 * of the License, or any later version.
 *
 * For the full copyright and license information, please read the
 * LICENSE.txt file that was distributed with this source code.
 *
 * The TYPO3 project - inspiring people to share!
 */

namespace TYPO3\CMS\Core\Tests\Functional\Mail;

use Psr\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\Mailer\Envelope;
use Symfony\Component\Mailer\Transport\NullTransport;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\RawMessage;
use TYPO3\CMS\Core\EventDispatcher\ListenerProvider;
use TYPO3\CMS\Core\Mail\Event\AfterMailerInitializationEvent;
use TYPO3\CMS\Core\Mail\Event\AfterMailerSentMessageEvent;
use TYPO3\CMS\Core\Mail\Event\BeforeMailerSentMessageEvent;
use TYPO3\CMS\Core\Mail\Mailer;
use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;

class MailerTest extends FunctionalTestCase
{
    /**
     * @test
     */
    public function mailerEventsAreTriggered(): void
    {
        $afterMailerInitializedEvent = null;
        $beforeMailerSentMessageEvent = null;
        $afterMailerSentMessageEvent = null;

        /** @var Container $container */
        $container = $this->getContainer();
        $container->set(
            'after-mailer-initialized-listener',
            static function (AfterMailerInitializationEvent $event) use (&$afterMailerInitializedEvent) {
                $afterMailerInitializedEvent = $event;
            }
        );
        $container->set(
            'before-mailer-sent-message-listener',
            static function (BeforeMailerSentMessageEvent $event) use (&$beforeMailerSentMessageEvent) {
                $beforeMailerSentMessageEvent = $event;
            }
        );
        $container->set(
            'after-mailer-sent-message-listener',
            static function (AfterMailerSentMessageEvent $event) use (&$afterMailerSentMessageEvent) {
                $afterMailerSentMessageEvent = $event;
            }
        );

        $eventListener = $container->get(ListenerProvider::class);
        $eventListener->addListener(AfterMailerInitializationEvent::class, 'after-mailer-initialized-listener');
        $eventListener->addListener(BeforeMailerSentMessageEvent::class, 'before-mailer-sent-message-listener');
        $eventListener->addListener(AfterMailerSentMessageEvent::class, 'after-mailer-sent-message-listener');

        $message = new RawMessage('some message');
        $envelope = new Envelope(new Address('kasperYYYY@typo3.org'), [new Address('acme@example.com')]);
        $mailer = (new Mailer(new NullTransport(), $container->get(EventDispatcherInterface::class)));

        $mailer->send($message, $envelope);

        self::assertInstanceOf(AfterMailerInitializationEvent::class, $afterMailerInitializedEvent);
        self::assertEquals($mailer, $afterMailerInitializedEvent->getMailer());

        self::assertInstanceOf(BeforeMailerSentMessageEvent::class, $beforeMailerSentMessageEvent);
        self::assertEquals($message, $beforeMailerSentMessageEvent->getMessage());
        self::assertEquals($envelope, $beforeMailerSentMessageEvent->getEnvelope());
        self::assertEquals($mailer, $beforeMailerSentMessageEvent->getMailer());

        self::assertInstanceOf(AfterMailerSentMessageEvent::class, $afterMailerSentMessageEvent);
        self::assertEquals($mailer, $afterMailerSentMessageEvent->getMailer());
    }
}