|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
declare(strict_types=1); |
|
4
|
|
|
|
|
5
|
|
|
namespace Artack\Dsn\Parser; |
|
6
|
|
|
|
|
7
|
|
|
use Artack\Dsn\Exception\InvalidArgumentException; |
|
8
|
|
|
use Artack\Dsn\Field\ActionField; |
|
9
|
|
|
use Artack\Dsn\Field\AddressTypeField; |
|
10
|
|
|
use Artack\Dsn\Field\DateField; |
|
11
|
|
|
use Artack\Dsn\Field\DiagnosticTypeField; |
|
12
|
|
|
use Artack\Dsn\Field\MtaNameTypeField; |
|
13
|
|
|
use Artack\Dsn\Field\StatusField; |
|
14
|
|
|
use PHPUnit\Framework\TestCase; |
|
15
|
|
|
|
|
16
|
|
|
class DsnParserTest extends TestCase |
|
17
|
|
|
{ |
|
18
|
|
|
public function testDsn001(): void |
|
19
|
|
|
{ |
|
20
|
|
|
$deliveryStatus = (new DsnParser())->parse($this->loadDsn('dsn001.txt')); |
|
21
|
|
|
|
|
22
|
|
|
$this->assertCount(1, $deliveryStatus->getRecipientFields()); |
|
23
|
|
|
$this->assertSame(1, $deliveryStatus->countRecipientFields()); |
|
24
|
|
|
|
|
25
|
|
|
$messageFields = $deliveryStatus->getMessageFields(); |
|
26
|
|
|
$this->assertCount(4, $messageFields->getAll()); |
|
27
|
|
|
|
|
28
|
|
|
/** @var MtaNameTypeField $reportingMtaField */ |
|
29
|
|
|
$reportingMtaField = $messageFields->get('Reporting-MTA'); |
|
30
|
|
|
$this->assertInstanceOf(MtaNameTypeField::class, $reportingMtaField); |
|
31
|
|
|
$this->assertSame('dns', $reportingMtaField->getType()); |
|
32
|
|
|
$this->assertSame('googlemail.com', $reportingMtaField->getValue()); |
|
33
|
|
|
|
|
34
|
|
|
/** @var MtaNameTypeField $receivedFromMtaField */ |
|
35
|
|
|
$receivedFromMtaField = $messageFields->get('Received-From-MTA'); |
|
36
|
|
|
$this->assertInstanceOf(MtaNameTypeField::class, $receivedFromMtaField); |
|
37
|
|
|
$this->assertSame('dns', $receivedFromMtaField->getType()); |
|
38
|
|
|
$this->assertSame('[email protected]', $receivedFromMtaField->getValue()); |
|
39
|
|
|
|
|
40
|
|
|
/** @var DateField $arrivalDateField */ |
|
41
|
|
|
$arrivalDateField = $messageFields->get('Arrival-Date'); |
|
42
|
|
|
$arrivalDateTime = new \DateTimeImmutable('2019-03-24 12:52:25 PDT'); |
|
43
|
|
|
$this->assertInstanceOf(DateField::class, $arrivalDateField); |
|
44
|
|
|
$this->assertEquals($arrivalDateTime, $arrivalDateField->getDateTime()); |
|
45
|
|
|
|
|
46
|
|
|
$recipientFields = $deliveryStatus->getRecipientFields()[0]; |
|
47
|
|
|
|
|
48
|
|
|
/** @var AddressTypeField $finalRecipientField */ |
|
49
|
|
|
$finalRecipientField = $recipientFields->get('Final-Recipient'); |
|
50
|
|
|
$this->assertInstanceOf(AddressTypeField::class, $finalRecipientField); |
|
51
|
|
|
$this->assertSame('rfc822', $finalRecipientField->getType()); |
|
52
|
|
|
$this->assertSame('[email protected]', $finalRecipientField->getValue()); |
|
53
|
|
|
|
|
54
|
|
|
/** @var ActionField $actionField */ |
|
55
|
|
|
$actionField = $recipientFields->get('Action'); |
|
56
|
|
|
$this->assertInstanceOf(ActionField::class, $actionField); |
|
57
|
|
|
$this->assertSame('failed', $actionField->getAction()); |
|
58
|
|
|
|
|
59
|
|
|
/** @var StatusField $statusField */ |
|
60
|
|
|
$statusField = $recipientFields->get('Status'); |
|
61
|
|
|
$this->assertInstanceOf(StatusField::class, $statusField); |
|
62
|
|
|
$this->assertSame(5, $statusField->getCodeClass()); |
|
63
|
|
|
$this->assertSame(1, $statusField->getCodeSubject()); |
|
64
|
|
|
$this->assertSame(1, $statusField->getCodeEnumerated()); |
|
65
|
|
|
$this->assertSame('5.1.1', $statusField->getCode()); |
|
66
|
|
|
|
|
67
|
|
|
/** @var MtaNameTypeField $remoteMtaField */ |
|
68
|
|
|
$remoteMtaField = $recipientFields->get('Remote-MTA'); |
|
69
|
|
|
$this->assertInstanceOf(MtaNameTypeField::class, $remoteMtaField); |
|
70
|
|
|
$this->assertSame('dns', $remoteMtaField->getType()); |
|
71
|
|
|
$this->assertSame('mxbw.lb.bluewin.ch.', $remoteMtaField->getValue()); |
|
72
|
|
|
$this->assertSame('195.186.227.50, the server for the domain bluewin.ch.', $remoteMtaField->getComment()); |
|
73
|
|
|
|
|
74
|
|
|
/** @var DiagnosticTypeField $diagnosticCodeField */ |
|
75
|
|
|
$diagnosticCodeField = $recipientFields->get('Diagnostic-Code'); |
|
76
|
|
|
$this->assertInstanceOf(DiagnosticTypeField::class, $diagnosticCodeField); |
|
77
|
|
|
$this->assertSame('smtp', $diagnosticCodeField->getType()); |
|
78
|
|
|
$this->assertSame('550 5.1.1 <[email protected]> recipient rejected, address unknown', $diagnosticCodeField->getValue()); |
|
79
|
|
|
|
|
80
|
|
|
/** @var DateField $lastAttemptDateField */ |
|
81
|
|
|
$lastAttemptDateField = $recipientFields->get('Last-Attempt-Date'); |
|
82
|
|
|
$lastAttemptDateTime = new \DateTimeImmutable('2019-03-24 12:52:26 PDT'); |
|
83
|
|
|
$this->assertInstanceOf(DateField::class, $lastAttemptDateField); |
|
84
|
|
|
$this->assertEquals($lastAttemptDateTime, $lastAttemptDateField->getDateTime()); |
|
85
|
|
|
} |
|
86
|
|
|
|
|
87
|
|
|
public function testDsn002(): void |
|
88
|
|
|
{ |
|
89
|
|
|
$deliveryStatus = (new DsnParser())->parse($this->loadDsn('dsn002.txt')); |
|
90
|
|
|
|
|
91
|
|
|
$this->assertCount(1, $deliveryStatus->getMessageFields()->getAll()); |
|
92
|
|
|
$this->assertCount(1, $deliveryStatus->getRecipientFields()); |
|
93
|
|
|
$this->assertSame(1, $deliveryStatus->countRecipientFields()); |
|
94
|
|
|
$this->assertCount(6, $deliveryStatus->getRecipientFields()[0]->getAll()); |
|
95
|
|
|
} |
|
96
|
|
|
|
|
97
|
|
|
public function testDsn003(): void |
|
98
|
|
|
{ |
|
99
|
|
|
$deliveryStatus = (new DsnParser())->parse($this->loadDsn('dsn003.txt')); |
|
100
|
|
|
|
|
101
|
|
|
$this->assertCount(1, $deliveryStatus->getMessageFields()->getAll()); |
|
102
|
|
|
$this->assertCount(3, $deliveryStatus->getRecipientFields()); |
|
103
|
|
|
$this->assertSame(3, $deliveryStatus->countRecipientFields()); |
|
104
|
|
|
$this->assertCount(6, $deliveryStatus->getRecipientFields()[0]->getAll()); |
|
105
|
|
|
$this->assertCount(4, $deliveryStatus->getRecipientFields()[1]->getAll()); |
|
106
|
|
|
$this->assertCount(6, $deliveryStatus->getRecipientFields()[2]->getAll()); |
|
107
|
|
|
} |
|
108
|
|
|
|
|
109
|
|
|
public function testDsn004(): void |
|
110
|
|
|
{ |
|
111
|
|
|
$this->expectException(InvalidArgumentException::class); |
|
112
|
|
|
|
|
113
|
|
|
$deliveryStatus = (new DsnParser())->parse($this->loadDsn('dsn004.txt')); |
|
114
|
|
|
|
|
115
|
|
|
$this->assertCount(1, $deliveryStatus->getMessageFields()->getAll()); |
|
116
|
|
|
} |
|
117
|
|
|
|
|
118
|
|
|
public function testDsn005(): void |
|
119
|
|
|
{ |
|
120
|
|
|
$deliveryStatus = (new DsnParser())->parse($this->loadDsn('dsn005.txt')); |
|
121
|
|
|
|
|
122
|
|
|
$this->assertCount(1, $deliveryStatus->getMessageFields()->getAll()); |
|
123
|
|
|
$this->assertCount(1, $deliveryStatus->getRecipientFields()); |
|
124
|
|
|
$this->assertSame(1, $deliveryStatus->countRecipientFields()); |
|
125
|
|
|
$this->assertCount(3, $deliveryStatus->getRecipientFields()[0]->getAll()); |
|
126
|
|
|
} |
|
127
|
|
|
|
|
128
|
|
|
private function loadDsn(string $filename): string |
|
129
|
|
|
{ |
|
130
|
|
|
$filepath = __DIR__.'/../Resources/dsn/'.$filename; |
|
131
|
|
|
$file = new \SplFileInfo($filepath); |
|
132
|
|
|
|
|
133
|
|
|
if (!$file->isReadable()) { |
|
134
|
|
|
throw new \RuntimeException(sprintf('cant read file "%s"', $filepath)); |
|
135
|
|
|
} |
|
136
|
|
|
|
|
137
|
|
|
return file_get_contents($file->getPathname()); |
|
138
|
|
|
} |
|
139
|
|
|
} |
|
140
|
|
|
|