ComposerTest::setUp()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 0
1
<?php
2
/**
3
 * MtMail - e-mail module for Zend Framework
4
 *
5
 * @link      http://github.com/mtymek/MtMail
6
 * @copyright Copyright (c) 2013-2017 Mateusz Tymek
7
 * @license   BSD 2-Clause
8
 */
9
10
namespace MtMailTest\Service;
11
12
use MtMail\Event\ComposerEvent;
13
use MtMail\Renderer\RendererInterface;
14
use MtMail\Service\Composer;
15
use MtMailTest\Test\HtmlTemplate;
16
use MtMailTest\Test\TextTemplate;
17
use Prophecy\Argument;
18
use Zend\EventManager\EventManager;
19
use Zend\View\Model\ModelInterface;
20
use Zend\View\Model\ViewModel;
21
22
class ComposerTest extends \PHPUnit\Framework\TestCase
23
{
24
    /**
25
     * @var Composer
26
     */
27
    protected $service;
28
29
    /**
30
     * @var array
31
     */
32
    protected $composeEventsTriggered = [];
33
34
    public function setUp()
35
    {
36
        $renderer = $this->prophesize(RendererInterface::class);
37
        $this->service = new Composer($renderer->reveal());
38
    }
39
40
    public function testRendererIsMutable()
41
    {
42
        $renderer = $this->prophesize(RendererInterface::class);
43
        $this->assertEquals($renderer->reveal(), $this->service->setRenderer($renderer->reveal())->getRenderer());
44
    }
45
46
    public function testComposeRendersViewModelAndAssignsResultToMailBody()
47
    {
48
        $template = new TextTemplate();
49
50
        $renderer = $this->prophesize(RendererInterface::class);
51
        $renderer->render(Argument::type(ModelInterface::class))
52
            ->willReturn('MAIL_BODY');
53
54
        $service = new Composer($renderer->reveal());
55
        $message = $service->compose([], $template, new ViewModel());
56
        $this->assertEquals('MAIL_BODY', $message->getBody()->getPartContent(0));
57
    }
58
59
    public function testComposeRendersViewModelAndAssignsSubjectIfProvidedByViewModel()
60
    {
61
        $template = new HtmlTemplate();
62
63
        $renderer = $this->prophesize(RendererInterface::class);
64
        $renderer->render(Argument::type(ModelInterface::class))
65
            ->willReturn('MAIL_BODY');
66
67
        $service = new Composer($renderer->reveal());
68
        $message = $service->compose(['subject' => 'MAIL_SUBJECT'], $template, new ViewModel());
69
        $this->assertEquals('MAIL_BODY', $message->getBody()->getPartContent(0));
70
        $this->assertEquals('MAIL_SUBJECT', $message->getSubject());
71
    }
72
73
    public function testServiceIsEventManagerAware()
74
    {
75
        $em = new EventManager();
76
        $this->service->setEventManager($em);
77
        $this->assertEquals($em, $this->service->getEventManager());
78
    }
79
80
    public function testComposeTriggersEvents()
81
    {
82
        $renderer = $this->prophesize(RendererInterface::class);
83
        $renderer->render(Argument::type(ModelInterface::class))
84
            ->willReturn('MAIL_BODY');
85
86
        $em = new EventManager();
87
        $listener = function ($event) {
88
            $this->assertInstanceof(
89
                ComposerEvent::class,
90
                $event,
91
                'Failed asserting event instance of ' . get_class($event) . ' is of type ' . ComposerEvent::class
92
            );
93
            $this->composeEventsTriggered[] = $event->getName();
94
        };
95
96
        $em->attach(
97
            ComposerEvent::EVENT_COMPOSE_PRE,
98
            $listener
99
        );
100
        $em->attach(
101
            ComposerEvent::EVENT_HEADERS_PRE,
102
            $listener
103
        );
104
        $em->attach(
105
            ComposerEvent::EVENT_HEADERS_POST,
106
            $listener
107
        );
108
        $em->attach(
109
            ComposerEvent::EVENT_HTML_BODY_PRE,
110
            $listener
111
        );
112
        $em->attach(
113
            ComposerEvent::EVENT_HTML_BODY_POST,
114
            $listener
115
        );
116
        $em->attach(
117
            ComposerEvent::EVENT_COMPOSE_POST,
118
            $listener
119
        );
120
121
        $service = new Composer($renderer->reveal());
122
        $service->setEventManager($em);
123
        $template = new HtmlTemplate();
124
        $service->compose([], $template, new ViewModel());
125
126
        $this->assertEquals(
127
            [
128
                ComposerEvent::EVENT_COMPOSE_PRE,
129
                ComposerEvent::EVENT_HEADERS_PRE,
130
                ComposerEvent::EVENT_HEADERS_POST,
131
                ComposerEvent::EVENT_HTML_BODY_PRE,
132
                ComposerEvent::EVENT_HTML_BODY_POST,
133
                ComposerEvent::EVENT_COMPOSE_POST,
134
            ],
135
            $this->composeEventsTriggered
136
        );
137
    }
138
139
    public function testHtmlBodyPreEventAllowsReplacingViewModel()
140
    {
141
        $replacement = new ViewModel();
142
        $replacement->setTemplate('some_template.phtml');
143
        $renderer = $this->prophesize(RendererInterface::class);
144
        $renderer->render($replacement)
145
            ->willReturn('MAIL_BODY');
146
147
        $service = new Composer($renderer->reveal());
148
        $template = new HtmlTemplate();
149
150
        $service->getEventManager()->attach(ComposerEvent::EVENT_HTML_BODY_PRE, function ($event) use ($replacement) {
151
            $event->setViewModel($replacement);
152
        });
153
154
        $service->compose([], $template, new ViewModel());
155
        $this->assertTrue(true);
156
    }
157
158
    public function testTextTemplateHasCorrectCharset()
159
    {
160
        $viewModel = new ViewModel();
161
        $template = new TextTemplate();
162
        $renderer = $this->prophesize(RendererInterface::class);
163
        $renderer->render(Argument::type('Zend\View\Model\ViewModel'))->willReturn('BODY');
164
        $service = new Composer($renderer->reveal());
165
166
        $message = $service->compose([], $template, $viewModel);
167
168
        $parts = $message->getBody()->getParts();
169
        $textPart = $parts[0];
170
        $this->assertTrue(isset($textPart->charset));
171
        $this->assertSame($message->getHeaders()->getEncoding(), $textPart->charset);
172
    }
173
}
174