diff --git a/tests/MailMimeParser/Header/Consumer/AbstractConsumerServiceTest.php b/tests/MailMimeParser/Header/Consumer/AbstractConsumerServiceTest.php index 99848c1c..5bc5caf4 100644 --- a/tests/MailMimeParser/Header/Consumer/AbstractConsumerServiceTest.php +++ b/tests/MailMimeParser/Header/Consumer/AbstractConsumerServiceTest.php @@ -86,6 +86,43 @@ public function testMultipleTokens() : void $this->assertCount(6, $ret); } + public function testLiteralTokens() : void + { + $value = "Je\ suis\\\nici\\\r\noui"; + $mock = $this->getMockBuilder(Token::class)->disableOriginalConstructor(); + $args = ['Je', ' ', 'suis', "\n", 'ici', "\r\n", 'oui']; + $parts = [ + $mock->getMock(), + $mock->getMock(), + $mock->getMock(), + $mock->getMock(), + $mock->getMock(), + $mock->getMock(), + $mock->getMock() + ]; + + $stub = $this->abstractConsumerStub; + + $stub->expects($this->exactly(7)) + ->method('getPartForToken') + ->withConsecutive( + [$args[0], false], + [$args[1], true], + [$args[2], false], + [$args[3], true], + [$args[4], false], + [$args[5], true], + [$args[6], false] + ) + ->will($this->onConsecutiveCalls($parts[0], $parts[1], $parts[2], $parts[3], $parts[4], $parts[5], $parts[6])); + $stub->method('processParts') + ->willReturn($parts); + + $ret = $stub($value); + $this->assertNotEmpty($ret); + $this->assertCount(7, $ret); + } + public function testInvokeWithEmptyValue() : void { $stub = $this->abstractConsumerStub; diff --git a/tests/MailMimeParser/Header/Consumer/GenericConsumerMimeLiteralPartServiceTest.php b/tests/MailMimeParser/Header/Consumer/GenericConsumerMimeLiteralPartServiceTest.php index 8dc58d6d..b850796f 100644 --- a/tests/MailMimeParser/Header/Consumer/GenericConsumerMimeLiteralPartServiceTest.php +++ b/tests/MailMimeParser/Header/Consumer/GenericConsumerMimeLiteralPartServiceTest.php @@ -47,12 +47,12 @@ protected function setUp() : void public function testConsumeTokens() : void { - $value = "Je\ \t suis\nici"; + $value = "Je\ \t suis\n ici"; $ret = $this->genericConsumer->__invoke($value); $this->assertNotEmpty($ret); $this->assertCount(1, $ret); - $this->assertEquals('Je suis ici', $ret[0]); + $this->assertEquals('Je suis ici', $ret[0]->getValue()); } public function testFilterSpacesBetweenMimeParts() : void @@ -64,4 +64,42 @@ public function testFilterSpacesBetweenMimeParts() : void $this->assertCount(1, $ret); $this->assertEquals('Jesuisici', $ret[0]); } + + protected function assertDecoded($expected, $encodedActual) + { + $ret = $this->genericConsumer->__invoke($encodedActual); + $this->assertNotEmpty($ret); + $this->assertCount(1, $ret); + $this->assertEquals($expected, $ret[0]->getValue()); + } + + public function testDecodingTwoParts() : void + { + $kilgore = '=?US-ASCII?Q?Kilgore_Trout?='; + $snow = '=?US-ASCII?Q?Jon_Snow?='; + + $this->assertDecoded( + 'Kilgore TroutJon Snow', + " $kilgore $snow " + ); + $this->assertDecoded( + 'Kilgore TroutJon Snow', + "{$kilgore}{$snow}" + ); + $this->assertDecoded( + 'Kilgore Trout Jon', + "$kilgore Jon" + ); + $this->assertDecoded( + 'Kilgore Jon Snow', + "Kilgore $snow" + ); + $this->assertDecoded( + 'KilgoreJon SnowTrout', + "Kilgore{$snow}Trout" + ); + $this->assertDecoded('外為オンラインデモ(25)(デモ)決済約定のお知らせ', '=?iso-2022-jp?Q?=1B$B300Y=1B(I5]W2]C^S=1B(B(25?= + =?iso-2022-jp?Q?)(=1B$B%G%b=1B(B)=1B$B7h:QLsDj$N$*CN$i$;=1B(B?='); + } + } diff --git a/tests/MailMimeParser/Header/Consumer/GenericConsumerServiceTest.php b/tests/MailMimeParser/Header/Consumer/GenericConsumerServiceTest.php index 8ad1f604..008d2f31 100644 --- a/tests/MailMimeParser/Header/Consumer/GenericConsumerServiceTest.php +++ b/tests/MailMimeParser/Header/Consumer/GenericConsumerServiceTest.php @@ -47,11 +47,11 @@ protected function setUp() : void public function testConsumeTokens() : void { - $value = "Je\ \t suis\nici"; + $value = "Je\ \t suis\n ici"; $ret = $this->genericConsumer->__invoke($value); $this->assertNotEmpty($ret); $this->assertCount(1, $ret); - $this->assertEquals('Je suis ici', $ret[0]); + $this->assertEquals('Je suis ici', $ret[0]->getValue()); } } diff --git a/tests/MailMimeParser/Header/Consumer/ParameterConsumerServiceTest.php b/tests/MailMimeParser/Header/Consumer/ParameterConsumerServiceTest.php index 4ab5a59a..9a9a9c27 100644 --- a/tests/MailMimeParser/Header/Consumer/ParameterConsumerServiceTest.php +++ b/tests/MailMimeParser/Header/Consumer/ParameterConsumerServiceTest.php @@ -42,8 +42,12 @@ protected function setUp() : void ->setConstructorArgs([$this->logger, $mpf, $qscs]) ->setMethods() ->getMock(); + $qsmlpcs = $this->getMockBuilder(QuotedStringMimeLiteralPartConsumerService::class) + ->setConstructorArgs([$this->logger, $pf]) + ->setMethods() + ->getMock(); $pvcs = $this->getMockBuilder(ParameterValueConsumerService::class) - ->setConstructorArgs([$this->logger, $mpf, $ccs, $qscs]) + ->setConstructorArgs([$this->logger, $mpf, $ccs, $qsmlpcs]) ->setMethods() ->getMock(); $pnvcs = $this->getMockBuilder(ParameterNameValueConsumerService::class) @@ -247,6 +251,6 @@ public function testSplitHeaderWithMultipleSplitRfc2047() : void . '=?US-ASCII?Q?TS_E?= =?US-ASCII?Q?li"; condiments*1="ot?="'); $this->assertNotEmpty($ret); $this->assertCount(2, $ret); - $this->assertEquals('TS Eliot', $ret[1]->getValue()); + $this->assertEquals('TS E liot', $ret[1]->getValue()); } } diff --git a/tests/MailMimeParser/Header/Consumer/Received/DomainConsumerServiceTest.php b/tests/MailMimeParser/Header/Consumer/Received/DomainConsumerServiceTest.php index faf5961d..aeaf1204 100644 --- a/tests/MailMimeParser/Header/Consumer/Received/DomainConsumerServiceTest.php +++ b/tests/MailMimeParser/Header/Consumer/Received/DomainConsumerServiceTest.php @@ -69,7 +69,7 @@ public function testConsumeParts() : void foreach ($aTests as $test) { $ret = $this->domainConsumer->__invoke($test[0]); $this->assertNotEmpty($ret, $test[0]); - $this->assertCount(1 + \count($test[2]), $ret, $test[0]); + $this->assertCount(1, $ret, $test[0], $test); $pt = $test[1]; $domPart = $ret[0]; @@ -92,9 +92,10 @@ public function testConsumeParts() : void } foreach ($test[2] as $comment) { - $this->assertNotNull($ret[1], $test[0]); - $this->assertInstanceOf('\\' . \ZBateson\MailMimeParser\Header\Part\CommentPart::class, $ret[1], $test[0]); - $this->assertEquals($comment, $ret[1]->getComment(), $test[0]); + $comms = $ret[0]->getComments(); + $this->assertNotEmpty($comms, $test[0]); + $this->assertInstanceOf('\\' . \ZBateson\MailMimeParser\Header\Part\CommentPart::class, $comms[0], $test[0]); + $this->assertEquals($comment, $comms[0]->getComment(), $test[0]); } } } diff --git a/tests/MailMimeParser/Header/Consumer/Received/GenericReceivedConsumerServiceTest.php b/tests/MailMimeParser/Header/Consumer/Received/GenericReceivedConsumerServiceTest.php index 52318348..1b5909f6 100644 --- a/tests/MailMimeParser/Header/Consumer/Received/GenericReceivedConsumerServiceTest.php +++ b/tests/MailMimeParser/Header/Consumer/Received/GenericReceivedConsumerServiceTest.php @@ -48,12 +48,12 @@ protected function setUp() : void public function testConsumeTokens() : void { - $value = "Je \t suis\nici"; + $value = "Je \t suis\n ici"; $ret = $this->genericConsumer->__invoke($value); $this->assertNotEmpty($ret); $this->assertCount(1, $ret); - $this->assertEquals('Je suis ici', $ret[0]); + $this->assertEquals('Je suis ici', $ret[0]->getValue()); } public function testEndsAtViaWithIdAndFor() : void @@ -77,9 +77,9 @@ public function testWithSingleComments() : void $str = 'sweet (via sugar) bee'; $ret = $this->genericConsumer->__invoke($str); $this->assertNotEmpty($ret); - $this->assertCount(2, $ret); - $this->assertEquals('sweet bee', $ret[0]); - $this->assertEquals('via sugar', $ret[1]->getComment()); + $this->assertCount(1, $ret); + $this->assertEquals('sweet bee', $ret[0]->getValue()); + $this->assertEquals('via sugar', $ret[0]->getComments()[0]->getComment()); } public function testWithMultipleComments() : void @@ -87,11 +87,13 @@ public function testWithMultipleComments() : void $str = 'sweet (as can) (surely) bee (innit)'; $ret = $this->genericConsumer->__invoke($str); $this->assertNotEmpty($ret); - $this->assertCount(4, $ret); - $this->assertEquals('sweet bee', $ret[0]); - $this->assertEquals('as can', $ret[1]->getComment()); - $this->assertEquals('surely', $ret[2]->getComment()); - $this->assertEquals('innit', $ret[3]->getComment()); + $this->assertCount(1, $ret); + $this->assertEquals('sweet bee', $ret[0]->getValue()); + $comms = $ret[0]->getComments(); + $this->assertCount(3, $comms); + $this->assertEquals('as can', $comms[0]->getComment()); + $this->assertEquals('surely', $comms[1]->getComment()); + $this->assertEquals('innit', $comms[2]->getComment()); } public function testWithSeparatorInWords() : void diff --git a/tests/MailMimeParser/Header/Consumer/ReceivedConsumerServiceTest.php b/tests/MailMimeParser/Header/Consumer/ReceivedConsumerServiceTest.php index 61da1f82..5d674c5d 100644 --- a/tests/MailMimeParser/Header/Consumer/ReceivedConsumerServiceTest.php +++ b/tests/MailMimeParser/Header/Consumer/ReceivedConsumerServiceTest.php @@ -134,12 +134,14 @@ public function testWithWith() : void $ret = $this->receivedConsumer->__invoke($value); $this->assertNotEmpty($ret); - $this->assertCount(2, $ret); + $this->assertCount(1, $ret); $this->assertInstanceOf('\\' . \ZBateson\MailMimeParser\Header\Part\ReceivedPart::class, $ret[0]); - $this->assertInstanceOf('\\' . \ZBateson\MailMimeParser\Header\Part\CommentPart::class, $ret[1]); + + $comments = $ret[0]->getComments(); + $this->assertCount(1, $comments); $this->assertEquals('with', $ret[0]->getName()); $this->assertEquals('ESMTP', $ret[0]->getValue()); - $this->assertEquals('TLS1.2', $ret[1]->getComment()); + $this->assertEquals('TLS1.2', $comments[0]->getComment()); } public function testWithId() : void @@ -148,12 +150,14 @@ public function testWithId() : void $ret = $this->receivedConsumer->__invoke($value); $this->assertNotEmpty($ret); - $this->assertCount(2, $ret); + $this->assertCount(1, $ret); $this->assertInstanceOf('\\' . \ZBateson\MailMimeParser\Header\Part\ReceivedPart::class, $ret[0]); - $this->assertInstanceOf('\\' . \ZBateson\MailMimeParser\Header\Part\CommentPart::class, $ret[1]); + + $comments = $ret[0]->getComments(); + $this->assertCount(1, $comments); $this->assertEquals('id', $ret[0]->getName()); $this->assertEquals('123', $ret[0]->getValue()); - $this->assertEquals('blah', $ret[1]->getComment()); + $this->assertEquals('blah', $comments[0]->getComment()); } public function testWithVia() : void @@ -204,7 +208,7 @@ public function testExampleFullLines() : void $ret = $this->receivedConsumer->__invoke($value); $this->assertNotEmpty($ret); - $this->assertCount(6, $ret); + $this->assertCount(5, $ret); $this->assertEquals('from', $ret[0]->getName()); $this->assertEquals('LeComputer', $ret[0]->getEhloName()); @@ -217,12 +221,13 @@ public function testExampleFullLines() : void $this->assertEquals('with', $ret[2]->getName()); $this->assertEquals('ESMTP', $ret[2]->getValue()); - $this->assertEquals('TLS BLAH', $ret[3]->getComment()); + $this->assertCount(1, $ret[2]->getComments()); + $this->assertEquals('TLS BLAH', $ret[2]->getComments()[0]->getComment()); - $this->assertEquals('id', $ret[4]->getName()); - $this->assertEquals('123', $ret[4]->getValue()); + $this->assertEquals('id', $ret[3]->getName()); + $this->assertEquals('123', $ret[3]->getValue()); - $dt = $ret[5]->getDateTime(); + $dt = $ret[4]->getDateTime(); $this->assertEquals('2000-05-17T19:08:29-04:00', $dt->format(DateTime::RFC3339)); } @@ -235,7 +240,7 @@ public function testExampleFullLine2() : void $ret = $this->receivedConsumer->__invoke($value); $this->assertNotEmpty($ret); - $this->assertCount(8, $ret); + $this->assertCount(6, $ret); $this->assertEquals('from', $ret[0]->getName()); $this->assertEquals('xcv.gurbuzsrc.com', $ret[0]->getEhloName()); @@ -247,13 +252,13 @@ public function testExampleFullLine2() : void $this->assertEquals('with', $ret[2]->getName()); $this->assertEquals('esmtp', $ret[2]->getValue()); - $this->assertEquals('id', $ret[5]->getName()); - $this->assertEquals('1kfCyx-0002Zp-BY', $ret[5]->getValue()); + $this->assertEquals('id', $ret[3]->getName()); + $this->assertEquals('1kfCyx-0002Zp-BY', $ret[3]->getValue()); - $this->assertEquals('for', $ret[6]->getName()); - $this->assertEquals('vbc@yetiforce.com', $ret[6]->getValue()); + $this->assertEquals('for', $ret[4]->getName()); + $this->assertEquals('vbc@yetiforce.com', $ret[4]->getValue()); - $dt = $ret[7]->getDateTime(); + $dt = $ret[5]->getDateTime(); $this->assertEquals('2020-11-18T03:14:03+01:00', $dt->format(DateTime::RFC3339)); } } diff --git a/tests/MailMimeParser/Header/Consumer/SubjectConsumerServiceTest.php b/tests/MailMimeParser/Header/Consumer/SubjectConsumerServiceTest.php index 5df00f09..18b1ab42 100644 --- a/tests/MailMimeParser/Header/Consumer/SubjectConsumerServiceTest.php +++ b/tests/MailMimeParser/Header/Consumer/SubjectConsumerServiceTest.php @@ -40,7 +40,7 @@ public function testConsumeTokens() : void $ret = $this->subjectConsumer->__invoke($value); $this->assertNotEmpty($ret); $this->assertCount(1, $ret); - $this->assertEquals("Je\ \t suis ici", $ret[0]); + $this->assertEquals("Je\ \t suis ici", $ret[0]->getValue()); } public function testFilterSpacesBetweenMimeParts() : void @@ -50,6 +50,6 @@ public function testFilterSpacesBetweenMimeParts() : void $ret = $this->subjectConsumer->__invoke($value); $this->assertNotEmpty($ret); $this->assertCount(1, $ret); - $this->assertEquals('Jesuisici', $ret[0]); + $this->assertEquals('Jesuisici', $ret[0]->getValue()); } } diff --git a/tests/MailMimeParser/Header/HeaderFactoryTest.php b/tests/MailMimeParser/Header/HeaderFactoryTest.php index 33b49b58..050fc646 100644 --- a/tests/MailMimeParser/Header/HeaderFactoryTest.php +++ b/tests/MailMimeParser/Header/HeaderFactoryTest.php @@ -17,6 +17,7 @@ use ZBateson\MailMimeParser\Header\Consumer\ParameterValueConsumerService; use ZBateson\MailMimeParser\Header\Consumer\ParameterNameValueConsumerService; use ZBateson\MailMimeParser\Header\Consumer\QuotedStringConsumerService; +use ZBateson\MailMimeParser\Header\Consumer\QuotedStringMimeLiteralPartConsumerService; use ZBateson\MailMimeParser\Header\Consumer\ReceivedConsumerService; use ZBateson\MailMimeParser\Header\Consumer\SubjectConsumerService; use ZBateson\MailMimeParser\Header\Consumer\Received\DomainConsumerService; @@ -81,8 +82,12 @@ protected function setUp() : void ->setMethods() ->getMock(); + $qsmlpcs = $this->getMockBuilder(QuotedStringMimeLiteralPartConsumerService::class) + ->setConstructorArgs([$this->logger, $pf]) + ->setMethods() + ->getMock(); $pvcs = $this->getMockBuilder(ParameterValueConsumerService::class) - ->setConstructorArgs([$this->logger, $mpf, $ccs, $qscs]) + ->setConstructorArgs([$this->logger, $mpf, $ccs, $qsmlpcs]) ->setMethods() ->getMock(); $pnvcs = $this->getMockBuilder(ParameterNameValueConsumerService::class) diff --git a/tests/MailMimeParser/Header/ParameterHeaderTest.php b/tests/MailMimeParser/Header/ParameterHeaderTest.php index bea2ca1b..73975abf 100644 --- a/tests/MailMimeParser/Header/ParameterHeaderTest.php +++ b/tests/MailMimeParser/Header/ParameterHeaderTest.php @@ -3,9 +3,9 @@ namespace ZBateson\MailMimeParser\Header; use PHPUnit\Framework\TestCase; -use Psr\Log\NullLogger; use ZBateson\MailMimeParser\Header\Consumer\CommentConsumerService; use ZBateson\MailMimeParser\Header\Consumer\QuotedStringConsumerService; +use ZBateson\MailMimeParser\Header\Consumer\QuotedStringMimeLiteralPartConsumerService; use ZBateson\MailMimeParser\Header\Consumer\ParameterValueConsumerService; use ZBateson\MailMimeParser\Header\Consumer\ParameterNameValueConsumerService; use ZBateson\MailMimeParser\Header\Consumer\ParameterConsumerService; @@ -47,8 +47,13 @@ protected function setUp() : void ->setConstructorArgs([$this->logger, $mpf, $qscs]) ->setMethods() ->getMock(); + + $qsmlpcs = $this->getMockBuilder(QuotedStringMimeLiteralPartConsumerService::class) + ->setConstructorArgs([$this->logger, $pf]) + ->setMethods() + ->getMock(); $pvcs = $this->getMockBuilder(ParameterValueConsumerService::class) - ->setConstructorArgs([$this->logger, $mpf, $ccs, $qscs]) + ->setConstructorArgs([$this->logger, $mpf, $ccs, $qsmlpcs]) ->setMethods() ->getMock(); $pnvcs = $this->getMockBuilder(ParameterNameValueConsumerService::class) diff --git a/tests/MailMimeParser/Header/Part/AddressGroupPartTest.php b/tests/MailMimeParser/Header/Part/AddressGroupPartTest.php index bfb67458..7753cf5a 100644 --- a/tests/MailMimeParser/Header/Part/AddressGroupPartTest.php +++ b/tests/MailMimeParser/Header/Part/AddressGroupPartTest.php @@ -20,23 +20,18 @@ class AddressGroupPartTest extends TestCase { private $mb; - private $hpf; private $logger; protected function setUp() : void { $this->logger = \mmpGetTestLogger(); $this->mb = new MbWrapper(); - $this->hpf = $this->getMockBuilder(HeaderPartFactory::class) - ->setConstructorArgs([$this->logger, $this->mb]) - ->setMethods() - ->getMock(); } private function newAddressGroupPart($nameParts, $addressAndGroupParts) { return new AddressGroupPart( - $this->logger, $this->mb, $this->hpf, $nameParts, $addressAndGroupParts + $this->logger, $this->mb, $nameParts, $addressAndGroupParts ); } diff --git a/tests/MailMimeParser/Header/Part/AddressPartTest.php b/tests/MailMimeParser/Header/Part/AddressPartTest.php index a084fdd3..2844faac 100644 --- a/tests/MailMimeParser/Header/Part/AddressPartTest.php +++ b/tests/MailMimeParser/Header/Part/AddressPartTest.php @@ -4,7 +4,6 @@ use PHPUnit\Framework\TestCase; use Psr\Log\LogLevel; -use Psr\Log\NullLogger; use ZBateson\MbWrapper\MbWrapper; /** @@ -20,22 +19,17 @@ class AddressPartTest extends TestCase { // @phpstan-ignore-next-line private $mb; - private $hpf; private $logger; protected function setUp() : void { $this->logger = \mmpGetTestLogger(); $this->mb = new MbWrapper(); - $this->hpf = $this->getMockBuilder(HeaderPartFactory::class) - ->setConstructorArgs([$this->logger, $this->mb]) - ->setMethods() - ->getMock(); } private function newAddressPart($nameParts, $valueParts) { - return new AddressPart($this->logger, $this->mb, $this->hpf, $nameParts, $valueParts); + return new AddressPart($this->logger, $this->mb, $nameParts, $valueParts); } private function getTokenMock(string $name) : Token @@ -60,7 +54,7 @@ public function testValidation() : void $part = $this->newAddressPart([], []); $errs = $part->getErrors(true, LogLevel::ERROR); $this->assertCount(1, $errs); - $this->assertEquals('AddressPart doesn\'t contain an email address', $errs[0]->getMessage()); + $this->assertEquals('Address doesn\'t contain an email address', $errs[0]->getMessage()); $this->assertEquals(LogLevel::ERROR, $errs[0]->getPsrLevel()); } } diff --git a/tests/MailMimeParser/Header/Part/ContainerPartTest.php b/tests/MailMimeParser/Header/Part/ContainerPartTest.php index c219a202..128e39fa 100644 --- a/tests/MailMimeParser/Header/Part/ContainerPartTest.php +++ b/tests/MailMimeParser/Header/Part/ContainerPartTest.php @@ -3,7 +3,6 @@ namespace ZBateson\MailMimeParser\Header\Part; use PHPUnit\Framework\TestCase; -use Psr\Log\NullLogger; use ZBateson\MbWrapper\MbWrapper; /** @@ -19,17 +18,12 @@ class ContainerPartTest extends TestCase { // @phpstan-ignore-next-line private $mb; - private $hpf; private $logger; protected function setUp() : void { $this->logger = \mmpGetTestLogger(); $this->mb = new MbWrapper(); - $this->hpf = $this->getMockBuilder(HeaderPartFactory::class) - ->setConstructorArgs([$this->logger, $this->mb]) - ->setMethods() - ->getMock(); } private function getTokenArray(string $name) : array @@ -42,7 +36,7 @@ private function getTokenArray(string $name) : array private function newContainerPart($childParts) { - return new ContainerPart($this->logger, $this->mb, $this->hpf, $childParts); + return new ContainerPart($this->logger, $this->mb, $childParts); } public function testInstance() : void @@ -52,6 +46,6 @@ public function testInstance() : void $this->assertEquals('"', $part->getValue()); $part = $this->newContainerPart($this->getTokenArray('=?US-ASCII?Q?Kilgore_Trout?=')); - $this->assertEquals('=?US-ASCII?Q?Kilgore_Trout?=', $part->getValue()); + $this->assertEquals('Kilgore Trout', $part->getValue()); } } diff --git a/tests/MailMimeParser/Header/Part/DatePartTest.php b/tests/MailMimeParser/Header/Part/DatePartTest.php index fe8e6c0f..1611db33 100644 --- a/tests/MailMimeParser/Header/Part/DatePartTest.php +++ b/tests/MailMimeParser/Header/Part/DatePartTest.php @@ -4,7 +4,6 @@ use PHPUnit\Framework\TestCase; use Psr\Log\LogLevel; -use Psr\Log\NullLogger; use ZBateson\MbWrapper\MbWrapper; /** @@ -20,17 +19,12 @@ class DatePartTest extends TestCase { // @phpstan-ignore-next-line private $mb; - private $hpf; private $logger; protected function setUp() : void { $this->logger = \mmpGetTestLogger(); $this->mb = new MbWrapper(); - $this->hpf = $this->getMockBuilder(HeaderPartFactory::class) - ->setConstructorArgs([$this->logger, $this->mb]) - ->setMethods() - ->getMock(); } private function getTokenMock(string $name) : Token @@ -43,7 +37,7 @@ private function getTokenMock(string $name) : Token private function newDatePart($childParts) { - return new DatePart($this->logger, $this->mb, $this->hpf, $childParts); + return new DatePart($this->logger, $this->mb, $childParts); } public function testDateString() : void diff --git a/tests/MailMimeParser/Header/Part/HeaderPartFactoryTest.php b/tests/MailMimeParser/Header/Part/HeaderPartFactoryTest.php index a006d8ca..70bbc5a6 100644 --- a/tests/MailMimeParser/Header/Part/HeaderPartFactoryTest.php +++ b/tests/MailMimeParser/Header/Part/HeaderPartFactoryTest.php @@ -2,7 +2,6 @@ namespace ZBateson\MailMimeParser\Header\Part; -use Psr\Log\NullLogger; use PHPUnit\Framework\TestCase; use ZBateson\MbWrapper\MbWrapper; @@ -53,7 +52,7 @@ public function testNewToken() : void public function testNewSplitParameterToken() : void { $param = [$this->getMockBuilder(ParameterPart::class) - ->setConstructorArgs([$this->logger, $this->mb, $this->headerPartFactory, $this->getTokenArray('Test'), $this->getTokenArray('Value')[0]]) + ->setConstructorArgs([$this->logger, $this->mb, $this->getTokenArray('Test'), $this->headerPartFactory->newContainerPart($this->getTokenArray('Value'))]) ->setMethods([]) ->getMock()]; $token = $this->headerPartFactory->newSplitParameterPart($param); @@ -105,7 +104,7 @@ public function testNewDatePart() : void public function testNewParameterPart() : void { - $part = $this->headerPartFactory->newParameterPart($this->getTokenArray('Test'), $this->getTokenArray('Test')[0]); + $part = $this->headerPartFactory->newParameterPart($this->getTokenArray('Test'), $this->headerPartFactory->newContainerPart($this->getTokenArray('Test'))); $this->assertNotNull($part); $this->assertInstanceOf('\\' . ParameterPart::class, $part); } diff --git a/tests/MailMimeParser/Header/Part/HeaderPartTest.php b/tests/MailMimeParser/Header/Part/HeaderPartTest.php index 885843e7..d4a044be 100644 --- a/tests/MailMimeParser/Header/Part/HeaderPartTest.php +++ b/tests/MailMimeParser/Header/Part/HeaderPartTest.php @@ -3,7 +3,6 @@ namespace ZBateson\MailMimeParser\Header\Part; use PHPUnit\Framework\TestCase; -use Psr\Log\NullLogger; use ZBateson\MailMimeParser\ErrorBag; use ZBateson\MbWrapper\MbWrapper; diff --git a/tests/MailMimeParser/Header/Part/MimeTokenTest.php b/tests/MailMimeParser/Header/Part/MimeTokenTest.php index 6ffedda1..f8b82fd4 100644 --- a/tests/MailMimeParser/Header/Part/MimeTokenTest.php +++ b/tests/MailMimeParser/Header/Part/MimeTokenTest.php @@ -3,7 +3,6 @@ namespace ZBateson\MailMimeParser\Header\Part; use PHPUnit\Framework\TestCase; -use Psr\Log\NullLogger; use ZBateson\MbWrapper\MbWrapper; /** @@ -60,34 +59,7 @@ public function testMimeDecodingNullLanguageAndCharset() : void { $part = $this->assertDecoded('Kilgore Trout', '=?US-ASCII?Q?Kilgore_Trout?='); $this->assertNull($part->getLanguage()); - $this->assertNull($part->getCharset()); - } - - public function testEncodingTwoParts() : void - { - $kilgore = '=?US-ASCII?Q?Kilgore_Trout?='; - $snow = '=?US-ASCII?Q?Jon_Snow?='; - - $this->assertDecoded( - ' Kilgore TroutJon Snow ', - " $kilgore $snow " - ); - $this->assertDecoded( - 'Kilgore TroutJon Snow', - "{$kilgore}{$snow}" - ); - $this->assertDecoded( - 'Kilgore Trout Jon', - "$kilgore Jon" - ); - $this->assertDecoded( - 'Kilgore Jon Snow', - "Kilgore $snow" - ); - $this->assertDecoded( - 'KilgoreJon SnowTrout', - "Kilgore{$snow}Trout" - ); + $this->assertEquals('US-ASCII', $part->getCharset()); } public function testNonAscii() : void @@ -132,8 +104,6 @@ public function testNonAscii() : void '=?shift_jis?B?g1qDfoNJgVuDX4FbirSKb4LFkUmC1IFBg1eDg4NQg2KDZw==?=' ); $this->assertDecoded('el pingüino', 'el pingüino'); - $this->assertDecoded('外為オンラインデモ(25)(デモ)決済約定のお知らせ', '=?iso-2022-jp?Q?=1B$B300Y=1B(I5]W2]C^S=1B(B(25?= - =?iso-2022-jp?Q?)(=1B$B%G%b=1B(B)=1B$B7h:QLsDj$N$*CN$i$;=1B(B?='); } public function testLanguageAndCharset() : void diff --git a/tests/MailMimeParser/Header/Part/ParameterPartTest.php b/tests/MailMimeParser/Header/Part/ParameterPartTest.php index f185be05..b6fab783 100644 --- a/tests/MailMimeParser/Header/Part/ParameterPartTest.php +++ b/tests/MailMimeParser/Header/Part/ParameterPartTest.php @@ -4,7 +4,6 @@ use PHPUnit\Framework\TestCase; use Psr\Log\LogLevel; -use Psr\Log\NullLogger; use ZBateson\MbWrapper\MbWrapper; /** @@ -20,17 +19,12 @@ class ParameterPartTest extends TestCase { // @phpstan-ignore-next-line private $mb; - private $hpf; private $logger; protected function setUp() : void { $this->logger = \mmpGetTestLogger(); $this->mb = new MbWrapper(); - $this->hpf = $this->getMockBuilder(HeaderPartFactory::class) - ->setConstructorArgs([$this->logger, $this->mb]) - ->setMethods() - ->getMock(); } private function getToken(string $value) : Token @@ -41,6 +35,14 @@ private function getToken(string $value) : Token ->getMock(); } + private function getContainerPart(string $value) : ContainerPart + { + return $this->getMockBuilder(ContainerPart::class) + ->setConstructorArgs([$this->logger, $this->mb, [$this->getToken($value)]]) + ->setMethods() + ->getMock(); + } + private function assertNameValue($expectedName, $expectedValue, $actualName = null, $actualValue = null) : ParameterPart { if ($actualName === null) { @@ -52,9 +54,8 @@ private function assertNameValue($expectedName, $expectedValue, $actualName = nu $part = new ParameterPart( $this->logger, $this->mb, - $this->hpf, [$this->getToken($actualName)], - $this->getToken($actualValue) + $this->getContainerPart($actualValue) ); $this->assertEquals($expectedName, $part->getName()); $this->assertEquals($expectedValue, $part->getValue()); diff --git a/tests/MailMimeParser/Header/Part/ReceivedDomainPartTest.php b/tests/MailMimeParser/Header/Part/ReceivedDomainPartTest.php index 46a37b18..6910e90e 100644 --- a/tests/MailMimeParser/Header/Part/ReceivedDomainPartTest.php +++ b/tests/MailMimeParser/Header/Part/ReceivedDomainPartTest.php @@ -3,7 +3,6 @@ namespace ZBateson\MailMimeParser\Header\Part; use PHPUnit\Framework\TestCase; -use Psr\Log\NullLogger; use ZBateson\MbWrapper\MbWrapper; /** @@ -26,10 +25,6 @@ protected function setUp() : void { $this->logger = \mmpGetTestLogger(); $this->mb = new MbWrapper(); - $this->hpf = $this->getMockBuilder(HeaderPartFactory::class) - ->setConstructorArgs([$this->logger, $this->mb]) - ->setMethods() - ->getMock(); } private function getTokenArray(string $name) : array @@ -42,7 +37,7 @@ private function getTokenArray(string $name) : array public function testBasicNameValueAndDomainParts() : void { - $part = new ReceivedDomainPart($this->logger, $this->mb, $this->hpf, 'Name', $this->getTokenArray('Value')); + $part = new ReceivedDomainPart($this->logger, $this->mb, 'Name', $this->getTokenArray('Value')); $this->assertEquals('Name', $part->getName()); $this->assertEquals('Value', $part->getValue()); $this->assertEquals('Value', $part->getEhloName()); diff --git a/tests/MailMimeParser/Header/Part/ReceivedPartTest.php b/tests/MailMimeParser/Header/Part/ReceivedPartTest.php index 1477f513..0a9bb124 100644 --- a/tests/MailMimeParser/Header/Part/ReceivedPartTest.php +++ b/tests/MailMimeParser/Header/Part/ReceivedPartTest.php @@ -26,10 +26,6 @@ protected function setUp() : void { $this->logger = \mmpGetTestLogger(); $this->mb = new MbWrapper(); - $this->hpf = $this->getMockBuilder(HeaderPartFactory::class) - ->setConstructorArgs([$this->logger, $this->mb]) - ->setMethods() - ->getMock(); } private function getTokenArray(string $name) : array @@ -42,7 +38,7 @@ private function getTokenArray(string $name) : array private function newReceivedPart($name, $childParts) { - return new ReceivedPart($this->logger, $this->mb, $this->hpf, $name, $childParts); + return new ReceivedPart($this->logger, $this->mb, $name, $childParts); } public function testBasicNameValuePair() : void diff --git a/tests/MailMimeParser/Header/Part/SplitParameterPartTest.php b/tests/MailMimeParser/Header/Part/SplitParameterPartTest.php index 661cf7c2..0c3f9c9c 100644 --- a/tests/MailMimeParser/Header/Part/SplitParameterPartTest.php +++ b/tests/MailMimeParser/Header/Part/SplitParameterPartTest.php @@ -40,6 +40,14 @@ private function getToken(string $value) : Token ->getMock(); } + private function getContainerPart(string $value) : ContainerPart + { + return $this->getMockBuilder(ContainerPart::class) + ->setConstructorArgs([$this->logger, $this->mb, [$this->getToken($value)]]) + ->setMethods() + ->getMock(); + } + private function assertNameValue(string $expectedName, string $expectedValue, string|array|null $actualNames = null, string|array|null $actualValues = null) : SplitParameterPart { if ($actualNames === null) { @@ -59,7 +67,7 @@ private function assertNameValue(string $expectedName, string $expectedValue, st } $mapped = \array_map( - fn ($arr) => new ParameterPart($this->logger, $this->mb, $this->hpf, [$this->getToken($arr[0])], $this->getToken($arr[1])), + fn ($arr) => new ParameterPart($this->logger, $this->mb, [$this->getToken($arr[0])], $this->getContainerPart($arr[1])), \array_map(null, $actualNames, $actualValues) ); @@ -102,10 +110,10 @@ public function testEncodingOnContinuingParts() : void $part = $this->assertNameValue('header', 'هلا هلا شخبار؟', ['header*0*', 'header*1*', 'header*2*'], ['utf-8\'ar-bh\'%D9%87%D9%84%D8%A7%20', '%D9%87%D9%84%D8%A7%20', '%D8%B4%D8%AE%D8%A8%D8%A7%D8%B1%D8%9F']); $this->assertEquals('utf-8', $part->getCharset()); $this->assertEquals('ar-bh', $part->getLanguage()); - $part = $this->assertNameValue('header', 'دنت كبتن والله', ['header*0*', 'header*1*', 'header*2', 'header*3*'], ['CP1256\'ar-eg\'%CF%E4%CA%20', '%DF%C8%CA%E4', ' ', '%E6%C7%E1%E1%E5']); + $part = $this->assertNameValue('header', 'دنت كبتن والله', ['header*0*', 'header*1*', 'header*2*', 'header*3*'], ['CP1256\'ar-eg\'%CF%E4%CA%20', '%DF%C8%CA%E4', '%20', '%E6%C7%E1%E1%E5']); $this->assertEquals('CP1256', $part->getCharset()); $this->assertEquals('ar-eg', $part->getLanguage()); - $part = $this->assertNameValue('header', 'دنت كبتن والله', ['header*3*', 'header*1*', 'header*2', 'header*0*'], ['%E6%C7%E1%E1%E5', '%DF%C8%CA%E4', ' ', 'CP1256\'ar-eg\'%CF%E4%CA%20']); + $part = $this->assertNameValue('header', 'دنت كبتن والله', ['header*3*', 'header*1*', 'header*2*', 'header*0*'], ['%E6%C7%E1%E1%E5', '%DF%C8%CA%E4', '%20', 'CP1256\'ar-eg\'%CF%E4%CA%20']); $this->assertEquals('CP1256', $part->getCharset()); $this->assertEquals('ar-eg', $part->getLanguage()); } @@ -130,9 +138,10 @@ public function testErrorOnUnsupportedCharset() : void { $part = $this->assertNameValue('header', 'seems good', ['header*0*', 'header*1*'], ['unknown\'\'seems%20', 'good']); $errs = $part->getAllErrors(); - $this->assertCount(1, $errs); + $this->assertCount(2, $errs); $err = $errs[0]; $this->assertSame($part, $err->getObject()); $this->assertInstanceOf(\ZBateson\MbWrapper\UnsupportedCharsetException::class, $err->getException()); + $this->assertInstanceOf(\ZBateson\MbWrapper\UnsupportedCharsetException::class, $errs[1]->getException()); } } diff --git a/tests/MailMimeParser/Header/ReceivedHeaderTest.php b/tests/MailMimeParser/Header/ReceivedHeaderTest.php index d79d969a..3a9759b8 100644 --- a/tests/MailMimeParser/Header/ReceivedHeaderTest.php +++ b/tests/MailMimeParser/Header/ReceivedHeaderTest.php @@ -4,7 +4,6 @@ use DateTime; use PHPUnit\Framework\TestCase; -use Psr\Log\NullLogger; use ZBateson\MailMimeParser\Header\Consumer\CommentConsumerService; use ZBateson\MailMimeParser\Header\Consumer\QuotedStringConsumerService; use ZBateson\MailMimeParser\Header\Consumer\Received\DomainConsumerService; @@ -106,8 +105,8 @@ public function testParsingFromExtended() : void $this->assertEquals('JonSnow', $header->getFromName()); $this->assertEquals('domain.com', $header->getFromHostname()); $this->assertEquals('1.2.3.4', $header->getFromAddress()); - $this->assertCount(1, $header->getComments()); - $this->assertEquals('Crow Crow', $header->getComments()[0]); + $this->assertCount(2, $header->getComments()); + $this->assertEquals('Crow Crow', $header->getComments()[1]); } public function testParsingByExtended() : void diff --git a/tests/setup-test-logger.php b/tests/setup-test-logger.php index 327b29bd..7cfaadc7 100644 --- a/tests/setup-test-logger.php +++ b/tests/setup-test-logger.php @@ -16,9 +16,11 @@ function mmpGetAndClearTestHandler() : TestHandler { function mmpGetTestLogger() : Logger { static $logger = null; + \mmpGetAndClearTestHandler(); if ($logger === null) { $logger = new Logger('testing'); $logger->pushProcessor(new PsrLogMessageProcessor(removeUsedContextFields: true)); + \unlink(__DIR__ . '/' . TEST_LOG_FILE); $logger->pushHandler(new StreamHandler(__DIR__ . '/' . TEST_LOG_FILE, 'debug')); $logger->pushHandler(mmpGetAndClearTestHandler()); }