Passed
Pull Request — master (#108)
by Eduardo Gulias
03:06 queued 42s
created

RFCValidationTest::getInvalidEmailsWithErrors()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 34
Code Lines 29

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
c 1
b 1
f 0
dl 0
loc 34
rs 8.8571
cc 1
eloc 29
nc 1
nop 0
1
<?php
2
3
namespace Egulias\Tests\EmailValidator\Validation;
4
5
use Egulias\EmailValidator\EmailLexer;
6
use Egulias\EmailValidator\Validation\RFCValidation;
7
use Egulias\EmailValidator\Exception\AtextAfterCFWS;
8
use Egulias\EmailValidator\Exception\ConsecutiveAt;
9
use Egulias\EmailValidator\Exception\ConsecutiveDot;
10
use Egulias\EmailValidator\Exception\CRNoLF;
11
use Egulias\EmailValidator\Exception\DomainHyphened;
12
use Egulias\EmailValidator\Exception\DotAtEnd;
13
use Egulias\EmailValidator\Exception\DotAtStart;
14
use Egulias\EmailValidator\Exception\ExpectingATEXT;
15
use Egulias\EmailValidator\Exception\ExpectingDTEXT;
16
use Egulias\EmailValidator\Exception\NoDomainPart;
17
use Egulias\EmailValidator\Exception\NoLocalPart;
18
use Egulias\EmailValidator\Exception\UnclosedComment;
19
use Egulias\EmailValidator\Exception\UnclosedQuotedString;
20
use Egulias\EmailValidator\Exception\UnopenedComment;
21
use Egulias\EmailValidator\Warning\AddressLiteral;
22
use Egulias\EmailValidator\Warning\CFWSNearAt;
23
use Egulias\EmailValidator\Warning\CFWSWithFWS;
24
use Egulias\EmailValidator\Warning\Comment;
25
use Egulias\EmailValidator\Warning\DomainLiteral;
26
use Egulias\EmailValidator\Warning\DomainTooLong;
27
use Egulias\EmailValidator\Warning\IPV6BadChar;
28
use Egulias\EmailValidator\Warning\IPV6ColonEnd;
29
use Egulias\EmailValidator\Warning\IPV6ColonStart;
30
use Egulias\EmailValidator\Warning\IPV6Deprecated;
31
use Egulias\EmailValidator\Warning\IPV6DoubleColon;
32
use Egulias\EmailValidator\Warning\IPV6GroupCount;
33
use Egulias\EmailValidator\Warning\IPV6MaxGroups;
34
use Egulias\EmailValidator\Warning\LabelTooLong;
35
use Egulias\EmailValidator\Warning\LocalTooLong;
36
use Egulias\EmailValidator\Warning\ObsoleteDTEXT;
37
use Egulias\EmailValidator\Warning\QuotedString;
38
39
class RFCValidationTest extends \PHPUnit_Framework_TestCase
40
{
41
    /**
42
     * @var RFCValidation
43
     */
44
    protected $validator;
45
46
    /**
47
     * @var EmailLexer
48
     */
49
    protected $lexer;
50
    
51
    protected function setUp()
52
    {
53
        $this->validator = new RFCValidation();
54
        $this->lexer = new EmailLexer();
55
    }
56
57
    protected function tearDown()
58
    {
59
        $this->validator = null;
60
    }
61
62
    /**
63
     * @dataProvider getValidEmails
64
     */
65
    public function testValidEmails($email)
66
    {
67
        $this->assertTrue($this->validator->isValid($email, $this->lexer));
68
    }
69
70
    public function getValidEmails()
71
    {
72
        return array(
73
            ['â@iana.org'],
74
            ['[email protected]'],
75
            ['[email protected]'],
76
            ['[email protected]'],
77
            ['example@localhost'],
78
            ['fab\'[email protected]'],
79
            ['fab\ [email protected]'],
80
            ['example((example))@fakedfake.co.uk'],
81
            ['example@faked(fake).co.uk'],
82
            ['[email protected]'],
83
            ['инфо@письмо.рф'],
84
            ['"username"@example.com'],
85
            ['"user,name"@example.com'],
86
            ['"user name"@example.com'],
87
            ['"user@name"@example.com'],
88
            ['"user\"name"@example.com'],
89
            ['"\a"@iana.org'],
90
            ['"test\ test"@iana.org'],
91
            ['""@iana.org'],
92
            ['"\""@iana.org'],
93
            ['müller@möller.de'],
94
            ['test@email*'],
95
            ['test@email!'],
96
            ['test@email&'],
97
            ['test@email^'],
98
            ['test@email%'],
99
            ['test@email$'],
100
        );
101
    }
102
103
    public function testInvalidUTF8Email()
104
    {
105
        $email     = "\x80\x81\x82@\x83\x84\x85.\x86\x87\x88";
106
        $this->assertFalse($this->validator->isValid($email, $this->lexer));
107
    }
108
    
109
    /**
110
     * @dataProvider getInvalidEmails
111
     */
112
    public function testInvalidEmails($email)
113
    {
114
        $this->assertFalse($this->validator->isValid($email, $this->lexer));
115
    }
116
117
    public function getInvalidEmails()
118
    {
119
        return [
120
            ['[email protected] test'],
121
            ['user  [email protected]'],
122
            ['user   [email protected]'],
123
            ['[email protected]'],
124
            ['example@[email protected]'],
125
            ['([email protected]]'],
126
            ['example(example][email protected]'],
127
            ['.example@localhost'],
128
            ['ex\ample@localhost'],
129
            ['example@local\host'],
130
            ['example@localhost\\'],
131
            ['example@localhost.'],
132
            ['user [email protected]'],
133
            ['username@ example . com'],
134
            ['example@(fake].com'],
135
            ['example@(fake.com'],
136
            ['username@example,com'],
137
            ['usern,[email protected]'],
138
            ['user[na][email protected]'],
139
            ['"""@iana.org'],
140
            ['"\"@iana.org'],
141
            ['"test"[email protected]'],
142
            ['"test""test"@iana.org'],
143
            ['"test"."test"@iana.org'],
144
            ['"test"[email protected]'],
145
            ['"test"' . chr(0) . '@iana.org'],
146
            ['"test\"@iana.org'],
147
            [chr(226) . '@iana.org'],
148
            ['test@' . chr(226) . '.org'],
149
            ['\r\[email protected]'],
150
            ['\r\n [email protected]'],
151
            ['\r\n \r\[email protected]'],
152
            ['\r\n \r\[email protected]'],
153
            ['\r\n \r\n [email protected]'],
154
            ['[email protected] \r\n'],
155
            ['[email protected] \r\n '],
156
            ['[email protected] \r\n \r\n'],
157
            ['[email protected] \r\n\r\n'],
158
            ['[email protected]  \r\n\r\n '],
159
            ['test@iana/icann.org'],
160
            ['test@foo;bar.com'],
161
            ['test;[email protected]'],
162
            ['[email protected]'],
163
            ['email.email@email."'],
164
            ['test@email>'],
165
            ['test@email<'],
166
            ['test@email{'],
167
        ];
168
    }
169
170
    /**
171
     * @dataProvider getInvalidEmailsWithErrors
172
     */
173
    public function testInvalidEmailsWithErrorsCheck($error, $email)
174
    {
175
        $this->assertFalse($this->validator->isValid($email, $this->lexer));
176
        $this->assertEquals($error, $this->validator->getError());
177
    }
178
179
    public function getInvalidEmailsWithErrors()
180
    {
181
        return [
182
            [new NoLocalPart(), '@example.co.uk'],
183
            [new NoDomainPart(), 'example@'],
184
            [new DomainHyphened(), '[email protected]'],
185
            [new DomainHyphened(), 'example@example-'],
186
            [new ConsecutiveAt(), 'example@@example.co.uk'],
187
            [new ConsecutiveDot(), '[email protected]'],
188
            [new ConsecutiveDot(), '[email protected]'],
189
            [new ExpectingATEXT(), '<example_example>@example.fr'],
190
            [new DotAtStart(), '.example@localhost'],
191
            [new DotAtStart(), '[email protected]'],
192
            [new DotAtEnd(), 'example@localhost.'],
193
            [new DotAtEnd(), '[email protected]'],
194
            [new UnclosedComment(), '(example@localhost'],
195
            [new UnclosedQuotedString(), '"example@localhost'],
196
            [new ExpectingATEXT(), 'exa"mple@localhost'],
197
            [new UnclosedComment(), '(example@localhost'],
198
            [new UnopenedComment(), 'comment)example@localhost'],
199
            [new UnopenedComment(), 'example(comment))@localhost'],
200
            [new UnopenedComment(), 'example@comment)localhost'],
201
            [new UnopenedComment(), 'example@localhost(comment))'],
202
            [new UnopenedComment(), 'example@(comment))example.com'],
203
            //This was the original. But atext is not allowed after \n
204
            //array(EmailValidator::ERR_EXPECTING_ATEXT, "exampl\[email protected]"),
205
            [new AtextAfterCFWS(), "exampl\[email protected]"],
206
            [new ExpectingDTEXT(), "example@[[]"],
207
            [new AtextAfterCFWS(), "exampl\[email protected]"],
208
            [new CRNoLF(), "example@exa\rmple.co.uk"],
209
            [new CRNoLF(), "example@[\r]"],
210
            [new CRNoLF(), "exam\[email protected]"],
211
        ];
212
    }
213
214
    /**
215
     * @dataProvider getInvalidEmailsWithWarnings
216
     */
217
    public function testInvalidEmailsWithWarningsCheck($expectedWarnings, $email)
218
    {
219
        $this->assertTrue($this->validator->isValid($email, $this->lexer));
220
        $warnings = $this->validator->getWarnings();
221
        $this->assertTrue(
222
            count($warnings) === count($expectedWarnings),
223
            "Expected: " . implode(",", $expectedWarnings) . " and got " . implode(",", $warnings)
224
        );
225
226
        foreach ($warnings as $warning) {
227
            $this->assertTrue(isset($expectedWarnings[$warning->code()]));
228
        }
229
    }
230
    
231
    public function getInvalidEmailsWithWarnings()
232
    {
233
        return [
234
            [[CFWSNearAt::CODE], 'example @invalid.example.com'],
235
            [[CFWSNearAt::CODE], 'example@ invalid.example.com'],
236
            [[Comment::CODE], '[email protected](examplecomment).com'],
237
            [[Comment::CODE,CFWSNearAt::CODE], 'example(examplecomment)@invalid.example.com'],
238
            [[QuotedString::CODE, CFWSWithFWS::CODE,], "\"\t\"@invalid.example.com"],
239
            [[QuotedString::CODE, CFWSWithFWS::CODE,], "\"\r\"@invalid.example.com"],
240
            [[AddressLiteral::CODE,], 'example@[127.0.0.1]'],
241
            [[AddressLiteral::CODE,], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]'],
242
            [[AddressLiteral::CODE, IPV6Deprecated::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370::]'],
243
            [[AddressLiteral::CODE, IPV6MaxGroups::CODE,], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334::]'],
244
            [[AddressLiteral::CODE, IPV6DoubleColon::CODE,], 'example@[IPv6:1::1::1]'],
245
            [[ObsoleteDTEXT::CODE, DomainLiteral::CODE,], "example@[\n]"],
246
            [[DomainLiteral::CODE,], 'example@[::1]'],
247
            [[DomainLiteral::CODE,], 'example@[::123.45.67.178]'],
248
            [
249
                [IPV6ColonStart::CODE, AddressLiteral::CODE, IPV6GroupCount::CODE,],
250
                'example@[IPv6::2001:0db8:85a3:0000:0000:8a2e:0370:7334]'
251
            ],
252
            [
253
                [AddressLiteral::CODE, IPV6BadChar::CODE,],
254
                'example@[IPv6:z001:0db8:85a3:0000:0000:8a2e:0370:7334]'
255
            ],
256
            [
257
                [AddressLiteral::CODE, IPV6ColonEnd::CODE,],
258
                'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:]'
259
            ],
260
            [[QuotedString::CODE,], '"example"@invalid.example.com'],
261
            [
262
                [LocalTooLong::CODE,],
263
                'too_long_localpart_too_long_localpart_too_long_localpart_too_long_localpart@invalid.example.com'
264
            ],
265
            [
266
                [LabelTooLong::CODE,],
267
                'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart.co.uk'
268
            ],
269
            [
270
                [DomainTooLong::CODE, LabelTooLong::CODE,],
271
                'example2@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'.
272
                'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'.
273
                'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'
274
            ],
275
            [
276
                [DomainTooLong::CODE, LabelTooLong::CODE,],
277
                'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'.
278
                'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'.
279
                'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpar'
280
            ],
281
        ];
282
    }
283
}
284