Passed
Pull Request — master (#42)
by
unknown
02:59
created

ComposerTest::testServiceIsEventManagerAware()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 4
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 testComposeTriggersEvents()
74
    {
75
        $renderer = $this->prophesize(RendererInterface::class);
76
        $renderer->render(Argument::type(ModelInterface::class))
77
            ->willReturn('MAIL_BODY');
78
79
        $service = new Composer($renderer->reveal());
80
        $em = $service->getEventManager();
81
        
82
        $listener = function ($event) {
83
            $this->assertInstanceof(
84
                ComposerEvent::class,
85
                $event,
86
                'Failed asserting event instance of ' . get_class($event) . ' is of type ' . ComposerEvent::class
87
            );
88
            $this->composeEventsTriggered[] = $event->getName();
89
        };
90
91
        $em->attach(
92
            ComposerEvent::EVENT_COMPOSE_PRE,
93
            $listener
94
        );
95
        $em->attach(
96
            ComposerEvent::EVENT_HEADERS_PRE,
97
            $listener
98
        );
99
        $em->attach(
100
            ComposerEvent::EVENT_HEADERS_POST,
101
            $listener
102
        );
103
        $em->attach(
104
            ComposerEvent::EVENT_HTML_BODY_PRE,
105
            $listener
106
        );
107
        $em->attach(
108
            ComposerEvent::EVENT_HTML_BODY_POST,
109
            $listener
110
        );
111
        $em->attach(
112
            ComposerEvent::EVENT_COMPOSE_POST,
113
            $listener
114
        );
115
116
117
        $template = new HtmlTemplate();
118
        $service->compose([], $template, new ViewModel());
119
120
        $this->assertEquals(
121
            [
122
                ComposerEvent::EVENT_COMPOSE_PRE,
123
                ComposerEvent::EVENT_HEADERS_PRE,
124
                ComposerEvent::EVENT_HEADERS_POST,
125
                ComposerEvent::EVENT_HTML_BODY_PRE,
126
                ComposerEvent::EVENT_HTML_BODY_POST,
127
                ComposerEvent::EVENT_COMPOSE_POST,
128
            ],
129
            $this->composeEventsTriggered
130
        );
131
    }
132
133
    public function testHtmlBodyPreEventAllowsReplacingViewModel()
134
    {
135
        $replacement = new ViewModel();
136
        $replacement->setTemplate('some_template.phtml');
137
        $renderer = $this->prophesize(RendererInterface::class);
138
        $renderer->render($replacement)
139
            ->willReturn('MAIL_BODY');
140
141
        $service = new Composer($renderer->reveal());
142
        $template = new HtmlTemplate();
143
144
        $service->getEventManager()->attach(ComposerEvent::EVENT_HTML_BODY_PRE, function ($event) use ($replacement) {
145
            $event->setViewModel($replacement);
146
        });
147
148
        $service->compose([], $template, new ViewModel());
149
        $this->assertTrue(true);
150
    }
151
152
    public function testTextTemplateHasCorrectCharset()
153
    {
154
        $viewModel = new ViewModel();
155
        $template = new TextTemplate();
156
        $renderer = $this->prophesize(RendererInterface::class);
157
        $renderer->render(Argument::type('Zend\View\Model\ViewModel'))->willReturn('BODY');
158
        $service = new Composer($renderer->reveal());
159
160
        $message = $service->compose([], $template, $viewModel);
161
162
        $parts = $message->getBody()->getParts();
163
        $textPart = $parts[0];
164
        $this->assertTrue(isset($textPart->charset));
165
        $this->assertSame($message->getHeaders()->getEncoding(), $textPart->charset);
166
    }
167
}
168