Completed
Push — core-test-reorganisation ( 880d88 )
by Kamil
44:19 queued 07:25
created

EmailChecker   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 125
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 0
Metric Value
wmc 16
lcom 1
cbo 3
dl 0
loc 125
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A hasRecipient() 0 13 3
A hasMessageTo() 0 15 4
A countMessagesTo() 0 15 3
A getSpoolDirectory() 0 4 1
A isMessageTo() 0 4 1
A assertRecipientIsValid() 0 10 1
A getMessages() 0 14 2
1
<?php
2
3
/*
4
 * This file is part of the Sylius package.
5
 *
6
 * (c) Paweł Jędrzejewski
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Sylius\Behat\Service;
13
14
use Symfony\Component\Finder\Finder;
15
use Symfony\Component\Finder\SplFileInfo;
16
use Webmozart\Assert\Assert;
17
18
/**
19
 * @author Arkadiusz Krakowiak <[email protected]>
20
 * @author Jan Góralski <[email protected]>
21
 */
22
final class EmailChecker implements EmailCheckerInterface
23
{
24
    /**
25
     * @var string
26
     */
27
    private $spoolDirectory;
28
29
    /**
30
     * @param string $spoolDirectory
31
     */
32
    public function __construct($spoolDirectory)
33
    {
34
        $this->spoolDirectory = $spoolDirectory;
35
    }
36
37
    /**
38
     * {@inheritdoc}
39
     */
40
    public function hasRecipient($recipient)
41
    {
42
        $this->assertRecipientIsValid($recipient);
43
44
        $messages = $this->getMessages($this->spoolDirectory);
45
        foreach ($messages as $message) {
46
            if ($this->isMessageTo($message, $recipient)) {
47
                return true;
48
            }
49
        }
50
51
        return false;
52
    }
53
54
    /**
55
     * {@inheritdoc}
56
     */
57
    public function hasMessageTo($message, $recipient)
58
    {
59
        $this->assertRecipientIsValid($recipient);
60
61
        $messages = $this->getMessages($this->spoolDirectory);
62
        foreach ($messages as $sentMessage) {
63
            if ($this->isMessageTo($sentMessage, $recipient)) {
64
                if (false !== strpos($sentMessage->getBody(), $message)) {
65
                    return true;
66
                }
67
            }
68
        }
69
70
        return false;
71
    }
72
73
    /**
74
     * {@inheritdoc}
75
     */
76
    public function countMessagesTo($recipient)
77
    {
78
        $this->assertRecipientIsValid($recipient);
79
80
        $messagesCount = 0;
81
82
        $messages = $this->getMessages($this->spoolDirectory);
83
        foreach ($messages as $message) {
84
            if ($this->isMessageTo($message, $recipient)) {
85
                ++$messagesCount;
86
            }
87
        }
88
89
        return $messagesCount;
90
    }
91
92
    /**
93
     * {@inheritdoc}
94
     */
95
    public function getSpoolDirectory()
96
    {
97
        return $this->spoolDirectory;
98
    }
99
100
    /**
101
     * @param \Swift_Message $message
102
     * @param string $recipient
103
     *
104
     * @return bool
105
     */
106
    private function isMessageTo($message, $recipient)
107
    {
108
        return array_key_exists($recipient, $message->getTo());
109
    }
110
111
    /**
112
     * @param string $recipient
113
     *
114
     * @throws /InvalidArgumentException
115
     */
116
    private function assertRecipientIsValid($recipient)
117
    {
118
        Assert::notEmpty($recipient, 'The recipient cannot be empty.');
119
        Assert::string($recipient, sprintf('The recipient must be a string, %s given.', gettype($recipient)));
120
        Assert::notEq(
121
            false,
122
            filter_var($recipient, FILTER_VALIDATE_EMAIL),
123
            'Given recipient is not a valid email address.'
124
        );
125
    }
126
127
    /**
128
     * @param string $directory
129
     *
130
     * @return \Swift_Message[]
131
     */
132
    private function getMessages($directory)
133
    {
134
        $finder = new Finder();
135
        $finder->files()->name('*.message')->in($directory);
136
        Assert::notEq($finder->count(), 0, sprintf('No message files found in %s.', $directory));
137
        $messages = [];
138
139
        /** @var SplFileInfo $file */
140
        foreach ($finder as $file) {
141
            $messages[] = unserialize($file->getContents());
142
        }
143
144
        return $messages;
145
    }
146
}
147