Completed
Push — master ( e6ae53...3ea501 )
by Sam
10:01 queued 45s
created

TestMailer::sendHTML()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 28
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 21
c 1
b 0
f 0
nc 1
nop 8
dl 0
loc 28
rs 8.8571

2 Methods

Rating   Name   Duplication   Size   Complexity  
A TestMailer::saveEmail() 0 4 1
A TestMailer::clearEmails() 0 4 1

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
namespace SilverStripe\Dev;
4
5
use SilverStripe\Control\Email\Mailer;
6
use Swift_Attachment;
7
8
class TestMailer implements Mailer
9
{
10
    /**
11
     * @var array
12
     */
13
    protected $emailsSent = [];
14
15
    public function send($email)
16
    {
17
        // Detect body type
18
        $htmlContent = null;
19
        $plainContent = null;
20
        if ($email->getSwiftMessage()->getContentType() === 'text/plain') {
21
            $type = 'plain';
22
            $plainContent = $email->getBody();
23
        } else {
24
            $type = 'html';
25
            $htmlContent = $email->getBody();
26
            $plainPart = $email->findPlainPart();
27
            if ($plainPart) {
28
                $plainContent = $plainPart->getBody();
29
            }
30
        }
31
32
        // Get attachments
33
        $attachedFiles = [];
34
        foreach ($email->getSwiftMessage()->getChildren() as $child) {
35
            if ($child instanceof Swift_Attachment) {
36
                $attachedFiles[] = [
37
                    'contents' => $child->getBody(),
38
                    'filename' => $child->getFilename(),
39
                    'mimetype' => $child->getContentType(),
40
                ];
41
            }
42
        }
43
44
        // Serialise email
45
        $serialised = [
46
            'Type' => $type,
47
            'To' => implode(';', array_keys($email->getTo() ?: [])),
48
            'From' => implode(';', array_keys($email->getFrom() ?: [])),
49
            'Subject' => $email->getSubject(),
50
            'Content' => $email->getBody(),
51
            'AttachedFiles' => $attachedFiles
52
        ];
53
        if ($plainContent) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $plainContent of type string|null is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
54
            $serialised['PlainContent'] = $plainContent;
55
        }
56
        if ($htmlContent) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $htmlContent of type null|string is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
57
            $serialised['HtmlContent'] = $htmlContent;
58
        }
59
60
        $this->saveEmail($serialised);
61
62
        return true;
63
    }
64
65
    /**
66
     * Save a single email to the log
67
     *
68
     * @param array $data A map of information about the email
69
     */
70
    protected function saveEmail($data)
71
    {
72
        $this->emailsSent[] = $data;
73
    }
74
75
    /**
76
     * Clear the log of emails sent
77
     */
78
    public function clearEmails()
79
    {
80
        $this->emailsSent = array();
81
    }
82
83
    /**
84
     * Search for an email that was sent.
85
     * All of the parameters can either be a string, or, if they start with "/", a PREG-compatible regular expression.
86
     *
87
     * @param string $to
88
     * @param string $from
89
     * @param string $subject
90
     * @param string $content
91
     * @return array Contains the keys: 'type', 'to', 'from', 'subject', 'content', 'plainContent', 'attachedFiles',
92
     *               'customHeaders', 'htmlContent', 'inlineImages'
93
     */
94
    public function findEmail($to, $from = null, $subject = null, $content = null)
95
    {
96
        $compare = [
97
            'To' => $to,
98
            'From' => $from,
99
            'Subject' => $subject,
100
            'Content' => $content,
101
        ];
102
103
        foreach ($this->emailsSent as $email) {
104
            $matched = true;
105
106
            foreach (array('To','From','Subject','Content') as $field) {
107
                if ($value = $compare[$field]) {
108
                    if ($value[0] == '/') {
109
                        $matched = preg_match($value, $email[$field]);
110
                    } else {
111
                        $matched = ($value == $email[$field]);
112
                    }
113
                    if (!$matched) {
114
                        break;
115
                    }
116
                }
117
            }
118
119
            if ($matched) {
120
                return $email;
121
            }
122
        }
123
        return null;
124
    }
125
}
126