assertStringContainsString('BODY.PEEK[TEXT]<0.1024>', FetchOptions::message()->withBodyText(1024)->toCommand()); $this->assertStringContainsString('BODY.PEEK[TEXT]', FetchOptions::message()->withBodyText()->toCommand()); $this->assertStringNotContainsString('<0.', FetchOptions::message()->withBodyText()->toCommand()); } public function testCompleteMultipartKeepsTextSectionsOnly(): void { $body = self::ALTERNATIVE_PREFIX . "
Hello
\r\n--alt--\r\n" . "--mix\r\nContent-Type: application/pdf\r\nContent-Transfer-Encoding: base64\r\n\r\nJVBERi0=\r\n--mix--\r\n"; $message = FetchMessageParser::parse($this->fetchResponse(self::MIXED_STRUCTURE, 'BODY[TEXT]', $body)); $this->assertSame(['1.1' => 'Hello', '1.2' => 'Hello
'], $message->bodySections()); } public function testPartialResponseWithOriginIsParsed(): void { $body = self::ALTERNATIVE_PREFIX . "Hello
\r\n--alt--\r\n--mix--\r\n"; $message = FetchMessageParser::parse($this->fetchResponse(self::MIXED_STRUCTURE, 'BODY[TEXT]<0>', $body)); $this->assertSame(7, $message->uid()); $this->assertSame(['1.1' => 'Hello', '1.2' => 'Hello
'], $message->bodySections()); } public function testBodyCutInsideNestedTextPartKeepsPrecedingAndPartialText(): void { $body = self::ALTERNATIVE_PREFIX . 'Hello wor'; $message = FetchMessageParser::parse($this->fetchResponse(self::MIXED_STRUCTURE, 'BODY[TEXT]<0>', $body)); $this->assertSame(['1.1' => 'Hello', '1.2' => '
Hello wor'], $message->bodySections()); } public function testBodyCutInsideAttachmentHeadersDropsAttachment(): void { $body = self::ALTERNATIVE_PREFIX . "
Hello
\r\n--alt--\r\n--mix\r\nContent-Type: applic"; $message = FetchMessageParser::parse($this->fetchResponse(self::MIXED_STRUCTURE, 'BODY[TEXT]<0>', $body)); $this->assertSame(['1.1' => 'Hello', '1.2' => 'Hello
'], $message->bodySections()); } public function testBodyCutInsideBase64TextPartDecodesCompleteQuanta(): void { $structure = '(("TEXT" "PLAIN" ("CHARSET" "UTF-8") NIL NIL "BASE64" 20 1)' . '("APPLICATION" "PDF" NIL NIL NIL "BASE64" 100 NIL NIL NIL) "MIXED" ("BOUNDARY" "mix") NIL NIL)'; // "Hello world" = SGVsbG8gd29ybGQ= ; cut after "SGVsbG8gd29y" + 2 stray chars $body = "--mix\r\nContent-Type: text/plain\r\nContent-Transfer-Encoding: base64\r\n\r\nSGVsbG8gd29yYm"; $message = FetchMessageParser::parse($this->fetchResponse($structure, 'BODY[TEXT]<0>', $body)); $this->assertSame(['1' => 'Hello wor'], $message->bodySections()); } private function fetchResponse(string $bodyStructure, string $section, string $body): string { return sprintf( "* 1 FETCH (UID 7 FLAGS () BODYSTRUCTURE %s %s {%d}\r\n%s)", $bodyStructure, $section, strlen($body), $body, ); } }