Passed
Push — v3_compat ( 23df76...881577 )
by Mateusz
04:16
created

ComposerTest::testComposeTriggersEvents()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 58
Code Lines 41

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
c 3
b 0
f 0
dl 0
loc 58
rs 9.639
cc 1
eloc 41
nc 1
nop 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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