diff --git a/.github/ISSUE_TEMPLATE/BUG.md b/.github/ISSUE_TEMPLATE/BUG.md index 75d4be45..1263fc80 100644 --- a/.github/ISSUE_TEMPLATE/BUG.md +++ b/.github/ISSUE_TEMPLATE/BUG.md @@ -4,11 +4,11 @@ about: Something is broken? labels: bug --- -| Q | A -| --- | --- -| ddeboer/imap version | x.y.z -| PHP version | x.y.z -| IMAP provider | Like imap.gmail.com +| Q | A | +|----------------------|---------------------| +| ddeboer/imap version | x.y.z | +| PHP version | x.y.z | +| IMAP provider | Like imap.gmail.com | #### Summary diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 5a98fdae..53312829 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,8 +1,13 @@ version: 2 + updates: -- package-ecosystem: composer - directory: "/" - schedule: - interval: daily - time: "04:00" - open-pull-requests-limit: 10 + - package-ecosystem: "composer" + directory: "/" + schedule: + interval: "weekly" + versioning-strategy: "widen" + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 00000000..9d5401c4 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,122 @@ +name: "CI" + +on: + pull_request: + push: + branches: + - "master" + +env: + INI_VALUES: zend.assertions=1,error_reporting=-1 + +jobs: + composer-json-lint: + name: "Lint composer.json" + runs-on: "ubuntu-latest" + strategy: + matrix: + php-version: + - "8.1" + + steps: + - uses: "actions/checkout@v3" + - uses: "shivammathur/setup-php@v2" + with: + coverage: "none" + php-version: "${{ matrix.php-version }}" + ini-values: "${{ env.INI_VALUES }}" + tools: composer-normalize,composer-require-checker,composer-unused + - uses: "ramsey/composer-install@v2" + + - run: "composer validate --strict" + - run: "composer-normalize --dry-run" + - run: "composer-require-checker check --config-file=$(realpath composer-require-checker.json)" + - run: "composer-unused" + + tests: + name: "Tests" + runs-on: "ubuntu-latest" + strategy: + matrix: + php-version: + - "8.2" + code-coverage: + - "none" + include: + - php-version: "8.1" + code-coverage: "pcov" + + env: + IMAP_SERVER_NAME: dovecot.travis.dev + IMAP_SERVER_PORT: 993 + IMAP_USERNAME: dovecot_travis_testuser + IMAP_PASSWORD: dovecot_travis_testpwd + IMAP_QUOTAROOT_SUPPORTED: true + + steps: + - uses: "actions/checkout@v3" + - uses: "shivammathur/setup-php@v2" + with: + coverage: "${{ matrix.code-coverage }}" + php-version: "${{ matrix.php-version }}" + ini-values: "${{ env.INI_VALUES }}" + extensions: "imap" + - uses: "ramsey/composer-install@v2" + + - run: "sh .github/dovecot_install.sh" + + - name: "Run tests without coverage" + if: ${{ matrix.code-coverage == 'none' }} + timeout-minutes: 3 + run: "vendor/bin/phpunit --no-coverage --no-logging" + + - name: "Run tests with coverage" + if: ${{ matrix.code-coverage != 'none' }} + timeout-minutes: 3 + run: "vendor/bin/phpunit --no-coverage --no-logging --coverage-clover=coverage.xml" + + - name: "Send code coverage report to Codecov.io" + if: ${{ matrix.code-coverage != 'none' }} + uses: "codecov/codecov-action@v1" + with: + token: ${{ secrets.CODECOV_TOKEN }} + file: ./coverage.xml + fail_ci_if_error: true + + coding-standards: + name: "Coding Standards" + runs-on: "ubuntu-latest" + strategy: + matrix: + php-version: + - "8.1" + + steps: + - uses: "actions/checkout@v3" + - uses: "shivammathur/setup-php@v2" + with: + coverage: "none" + php-version: "${{ matrix.php-version }}" + ini-values: "${{ env.INI_VALUES }}" + - uses: "ramsey/composer-install@v2" + + - run: "vendor/bin/php-cs-fixer fix --verbose --dry-run --diff" + + static-analysis: + name: "Static Analysis" + runs-on: "ubuntu-latest" + strategy: + matrix: + php-version: + - "8.1" + + steps: + - uses: "actions/checkout@v3" + - uses: "shivammathur/setup-php@v2" + with: + coverage: "none" + php-version: "${{ matrix.php-version }}" + ini-values: "${{ env.INI_VALUES }}" + - uses: "ramsey/composer-install@v2" + + - run: "vendor/bin/phpstan analyse --no-progress --error-format=github" diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml deleted file mode 100644 index f52b26cb..00000000 --- a/.github/workflows/integrate.yaml +++ /dev/null @@ -1,197 +0,0 @@ -name: "Integrate" - -on: - pull_request: - push: - branches: - - "master" - -jobs: - composer-json-lint: - name: "Lint composer.json" - - runs-on: "ubuntu-latest" - - strategy: - matrix: - php-version: - - "8.1" - - steps: - - name: "Checkout" - uses: "actions/checkout@v3" - - - name: "Install PHP" - uses: "shivammathur/setup-php@v2" - with: - coverage: "none" - php-version: "${{ matrix.php-version }}" - tools: composer-normalize, composer-require-checker, composer-unused - - - name: "Get composer cache directory" - id: composercache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: "Cache dependencies" - uses: "actions/cache@v3" - with: - path: ${{ steps.composercache.outputs.dir }} - key: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer-${{ hashFiles('**/composer.json') }} - restore-keys: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer- - - - name: "Install dependencies" - run: "composer update --no-interaction --no-progress" - - - name: "Validate composer.json" - run: "composer validate --strict" - - - name: "Normalize composer.json" - run: "composer-normalize --dry-run" - - - name: "Check composer.json explicit dependencies" - run: "composer-require-checker check --config-file=$(realpath composer-require-checker.json)" - - - name: "Check composer.json unused dependencies" - run: "composer-unused" - - tests: - name: "Tests" - - runs-on: "ubuntu-latest" - - strategy: - matrix: - php-version: - - "8.1" - - "8.2" - - env: - IMAP_SERVER_NAME: dovecot.travis.dev - IMAP_SERVER_PORT: 993 - IMAP_USERNAME: dovecot_travis_testuser - IMAP_PASSWORD: dovecot_travis_testpwd - IMAP_QUOTAROOT_SUPPORTED: true - - steps: - - name: "Checkout" - uses: "actions/checkout@v3" - - - name: "Start IMAPd services" - run: "sh .github/dovecot_install.sh" - - - name: "Install PHP" - uses: "shivammathur/setup-php@v2" - with: - coverage: "pcov" - php-version: "${{ matrix.php-version }}" - ini-values: zend.assertions=1 - extensions: imap - env: - fail-fast: true - - - name: "Get composer cache directory" - id: composercache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: "Cache dependencies" - uses: "actions/cache@v3" - with: - path: ${{ steps.composercache.outputs.dir }} - key: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer-${{ hashFiles('**/composer.json') }} - restore-keys: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer- - - - name: "Install dependencies" - run: "composer update --no-interaction --no-progress" - - - name: "Run tests without coverage" - if: ${{ matrix.php-version != '8.1' }} - timeout-minutes: 3 - run: "vendor/bin/phpunit --no-coverage --no-logging" - - - name: "Run tests with coverage" - if: ${{ matrix.php-version == '8.1' }} - timeout-minutes: 3 - run: "vendor/bin/phpunit --no-coverage --coverage-clover=coverage.xml" - - - name: "Send code coverage report to Codecov.io" - if: ${{ matrix.php-version == '8.1' }} - uses: codecov/codecov-action@v1 - with: - token: ${{ secrets.CODECOV_TOKEN }} - file: ./coverage.xml - fail_ci_if_error: true - - coding-standards: - name: "Coding Standards" - - runs-on: "ubuntu-latest" - - strategy: - matrix: - php-version: - - "8.1" - - steps: - - name: "Checkout" - uses: "actions/checkout@v3" - - - name: "Install PHP" - uses: "shivammathur/setup-php@v2" - with: - coverage: "none" - php-version: "${{ matrix.php-version }}" - - - name: "Get composer cache directory" - id: composercache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: "Cache dependencies" - uses: "actions/cache@v3" - with: - path: ${{ steps.composercache.outputs.dir }} - key: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer-${{ hashFiles('**/composer.json') }} - restore-keys: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer- - - - name: "Install dependencies" - run: "composer update --no-interaction --no-progress" - - - name: "Check coding standards" - run: "vendor/bin/php-cs-fixer fix --verbose --dry-run --diff" - - static-analysis: - name: "Static Analysis" - - runs-on: "ubuntu-latest" - - strategy: - matrix: - php-version: - - "8.1" - - steps: - - name: "Checkout" - uses: "actions/checkout@v3" - - - name: "Install PHP" - uses: "shivammathur/setup-php@v2" - with: - coverage: "none" - php-version: "${{ matrix.php-version }}" - tools: cs2pr - - - name: "Get composer cache directory" - id: composercache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: "Cache dependencies" - uses: "actions/cache@v3" - with: - path: ${{ steps.composercache.outputs.dir }} - key: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer-${{ hashFiles('**/composer.json') }} - restore-keys: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer- - - - name: "Install dependencies" - run: "composer update --no-interaction --no-progress" - - - name: "Run static analysis" - run: "vendor/bin/phpstan analyse --no-progress --error-format=checkstyle | cs2pr" diff --git a/.gitignore b/.gitignore index 84781e1b..c5689dfd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,10 @@ -.idea/ -tmp/ -vendor/ -.php-cs-fixer.cache -.phpunit.result.cache -composer.lock -phpunit.xml -wait-for-it -coverage/ - -.DS_Store +/.idea/ +/.phpunit.cache/ +/coverage/ +/tmp/ +/vendor/ +/.php-cs-fixer.cache +/.phpunit.result.cache +/composer.lock +/phpunit.xml +/wait-for-it diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index 22b4ada2..83d51246 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -49,7 +49,7 @@ 'php_unit_set_up_tear_down_visibility' => true, 'php_unit_strict' => true, 'php_unit_test_annotation' => true, - 'php_unit_test_case_static_method_calls' => true, + 'php_unit_test_case_static_method_calls' => false, 'php_unit_test_class_requires_covers' => false, 'phpdoc_add_missing_param_annotation' => true, 'phpdoc_order' => true, diff --git a/README.md b/README.md index 3863f7f8..221a9f10 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Latest Stable Version](https://img.shields.io/packagist/v/ddeboer/imap.svg)](https://packagist.org/packages/ddeboer/imap) [![Downloads](https://img.shields.io/packagist/dt/ddeboer/imap.svg)](https://packagist.org/packages/ddeboer/imap) -[![Integrate](https://github.com/ddeboer/imap/workflows/Integrate/badge.svg?branch=master)](https://github.com/ddeboer/imap/actions) +[![Integrate](https://github.com/ddeboer/imap/workflows/CI/badge.svg)](https://github.com/ddeboer/imap/actions) [![Code Coverage](https://codecov.io/gh/ddeboer/imap/coverage.svg?branch=master)](https://codecov.io/gh/ddeboer/imap?branch=master) A PHP IMAP library to read and process e-mails over IMAP protocol, built with robust Object-Oriented architecture. diff --git a/composer.json b/composer.json index 67643423..68462c1f 100644 --- a/composer.json +++ b/composer.json @@ -35,7 +35,7 @@ "phpstan/phpstan": "^1.9.17", "phpstan/phpstan-phpunit": "^1.3.4", "phpstan/phpstan-strict-rules": "^1.4.5", - "phpunit/phpunit": "^9.6.3" + "phpunit/phpunit": "^10.0.7" }, "autoload": { "psr-4": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index b250544d..eccfb42c 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -2,9 +2,12 @@ @@ -14,7 +17,7 @@ ./src - + diff --git a/src/ImapResource.php b/src/ImapResource.php index fcaa7659..b488f053 100644 --- a/src/ImapResource.php +++ b/src/ImapResource.php @@ -13,7 +13,7 @@ final class ImapResource implements ImapResourceInterface { private Connection $resource; - private ?MailboxInterface $mailbox = null; + private ?MailboxInterface $mailbox; private static ?string $lastMailboxUsedCache = null; /** diff --git a/src/Message.php b/src/Message.php index 4d47231c..c36aaeaf 100644 --- a/src/Message.php +++ b/src/Message.php @@ -206,8 +206,6 @@ public function isSeen(): bool public function maskAsSeen(): bool { - \trigger_error(\sprintf('%s is deprecated and will be removed in 2.0. Use %s::markAsSeen instead.', __METHOD__, __CLASS__), \E_USER_DEPRECATED); - return $this->markAsSeen(); } diff --git a/src/Message/AbstractPart.php b/src/Message/AbstractPart.php index 6fa842a2..e5805361 100644 --- a/src/Message/AbstractPart.php +++ b/src/Message/AbstractPart.php @@ -56,8 +56,7 @@ abstract class AbstractPart implements PartInterface private ?string $encoding = null; private ?string $disposition = null; private ?string $description = null; - /** @var null|int|string */ - private $bytes; + private string|int|null $bytes; private ?string $lines = null; private ?string $content = null; private ?string $decodedContent = null; diff --git a/src/Message/Headers.php b/src/Message/Headers.php index ac8c7fff..6d538107 100644 --- a/src/Message/Headers.php +++ b/src/Message/Headers.php @@ -4,6 +4,8 @@ namespace Ddeboer\Imap\Message; +use Ddeboer\Imap\Exception\UnsupportedCharsetException; + final class Headers extends Parameters { public function __construct(\stdClass $headers) @@ -16,7 +18,7 @@ public function __construct(\stdClass $headers) foreach ($headers as $key => $value) { try { $this[$key] = $this->parseHeader($key, $value); - } catch (\Ddeboer\Imap\Exception\UnsupportedCharsetException $e) { + } catch (UnsupportedCharsetException) { // safely skip header with unsupported charset } } diff --git a/src/MessageIterator.php b/src/MessageIterator.php index 48d87ee3..698c0d0b 100644 --- a/src/MessageIterator.php +++ b/src/MessageIterator.php @@ -40,7 +40,7 @@ public function current(): MessageInterface . ' try to cycle this "%s" with a native php function like foreach or with the method getArrayCopy(),' . ' or check it by calling the methods valid().', \is_object($current) ? \get_class($current) : \gettype($current), - static::class + self::class )); } diff --git a/tests/AbstractTest.php b/tests/AbstractTestCase.php similarity index 95% rename from tests/AbstractTest.php rename to tests/AbstractTestCase.php index 25dd4c21..7f56846e 100644 --- a/tests/AbstractTest.php +++ b/tests/AbstractTestCase.php @@ -11,7 +11,7 @@ use Laminas\Mime; use PHPUnit\Framework\TestCase; -abstract class AbstractTest extends TestCase +abstract class AbstractTestCase extends TestCase { public const IMAP_FLAGS = '/imap/ssl/novalidate-cert'; @@ -81,14 +81,14 @@ final protected function createTestMessage( ); } - static::assertIsString($messageString); + self::assertIsString($messageString); $mailbox->addMessage($messageString); } final protected function getFixture(string $fixture): string { $content = \file_get_contents(\sprintf('%s/fixtures/%s.eml', __DIR__, $fixture)); - static::assertIsString($content); + self::assertIsString($content); return $content; } diff --git a/tests/ConnectionTest.php b/tests/ConnectionTest.php index 70e51611..c2ea09b7 100644 --- a/tests/ConnectionTest.php +++ b/tests/ConnectionTest.php @@ -4,18 +4,19 @@ namespace Ddeboer\Imap\Tests; +use Ddeboer\Imap\Connection; use Ddeboer\Imap\Exception\CreateMailboxException; use Ddeboer\Imap\Exception\DeleteMailboxException; use Ddeboer\Imap\Exception\MailboxDoesNotExistException; +use Ddeboer\Imap\ImapResource; use Ddeboer\Imap\Mailbox; +use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses; -/** - * @covers \Ddeboer\Imap\Connection - * @covers \Ddeboer\Imap\ImapResource - * - * @runTestsInSeparateProcesses - */ -final class ConnectionTest extends AbstractTest +#[CoversClass(Connection::class)] +#[CoversClass(ImapResource::class)] +#[RunTestsInSeparateProcesses] +final class ConnectionTest extends AbstractTestCase { public function testValidResourceStream(): void { @@ -23,19 +24,19 @@ public function testValidResourceStream(): void $check = \imap_check($connection->getResource()->getStream()); - static::assertInstanceOf(\stdClass::class, $check); + self::assertInstanceOf(\stdClass::class, $check); } public function testCount(): void { - static::assertIsInt($this->getConnection()->count()); + self::assertIsInt($this->getConnection()->count()); } public function testPing(): void { $connection = $this->createConnection(); - static::assertTrue($connection->ping()); + self::assertTrue($connection->ping()); $connection->close(); } @@ -43,31 +44,31 @@ public function testPing(): void public function testQuota(): void { if (false === \getenv('IMAP_QUOTAROOT_SUPPORTED')) { - static::markTestSkipped('IMAP quota root support is disabled.'); + self::markTestSkipped('IMAP quota root support is disabled.'); } $quota = $this->getConnection()->getQuota(); - static::assertArrayHasKey('usage', $quota); - static::assertIsInt($quota['usage']); + self::assertArrayHasKey('usage', $quota); + self::assertIsInt($quota['usage']); - static::assertArrayHasKey('limit', $quota); + self::assertArrayHasKey('limit', $quota); // @see quota_rule in .travis/dovecot_install.sh - static::assertSame(1048576, $quota['limit']); + self::assertSame(1048576, $quota['limit']); } public function testGetMailboxes(): void { $mailboxes = $this->getConnection()->getMailboxes(); foreach ($mailboxes as $mailbox) { - static::assertInstanceOf(Mailbox::class, $mailbox); + self::assertInstanceOf(Mailbox::class, $mailbox); } } public function testGetMailbox(): void { $mailbox = $this->getConnection()->getMailbox('INBOX'); - static::assertInstanceOf(Mailbox::class, $mailbox); + self::assertInstanceOf(Mailbox::class, $mailbox); } public function testCreateMailbox(): void @@ -76,8 +77,8 @@ public function testCreateMailbox(): void $name = \uniqid('test_'); $mailbox = $connection->createMailbox($name); - static::assertSame($name, $mailbox->getName()); - static::assertSame($name, $connection->getMailbox($name)->getName()); + self::assertSame($name, $mailbox->getName()); + self::assertSame($name, $connection->getMailbox($name)->getName()); $connection->deleteMailbox($mailbox); @@ -109,7 +110,7 @@ public function testCannotCreateMailboxesOnReadonly(): void public function testEscapesMailboxNames(): void { - static::assertInstanceOf(Mailbox::class, $this->getConnection()->createMailbox(\uniqid(self::SPECIAL_CHARS))); + self::assertInstanceOf(Mailbox::class, $this->getConnection()->createMailbox(\uniqid(self::SPECIAL_CHARS))); } public function testCustomExceptionOnInvalidMailboxName(): void @@ -117,7 +118,7 @@ public function testCustomExceptionOnInvalidMailboxName(): void $this->expectException(CreateMailboxException::class); $this->expectExceptionMessageMatches('/CANNOT/'); - static::assertInstanceOf(Mailbox::class, $this->getConnection()->createMailbox(\uniqid("\t"))); + self::assertInstanceOf(Mailbox::class, $this->getConnection()->createMailbox(\uniqid("\t"))); } public function testGetInvalidMailbox(): void @@ -130,11 +131,11 @@ public function testNumericMailbox(): void { $number = (string) \mt_rand(100, 999); $conn = $this->getConnection(); - $mailbox = $conn->createMailbox($number); + $conn->createMailbox($number); $mailboxes = $conn->getMailboxes(); - static::assertArrayHasKey($number, $mailboxes); + self::assertArrayHasKey($number, $mailboxes); } public function testMailboxSelectionAfterReconnect(): void @@ -150,7 +151,7 @@ public function testMailboxSelectionAfterReconnect(): void $mailbox = $connection->getMailbox($mailboxName); // This fails if we haven't properly reselected the mailbox - static::assertSame('Reconnect test', $mailbox->getMessages()->current()->getSubject()); + self::assertSame('Reconnect test', $mailbox->getMessages()->current()->getSubject()); $connection->close(); } diff --git a/tests/EmbeddedMessageTest.php b/tests/EmbeddedMessageTest.php index aa7fcdcf..22a9e75c 100644 --- a/tests/EmbeddedMessageTest.php +++ b/tests/EmbeddedMessageTest.php @@ -5,15 +5,17 @@ namespace Ddeboer\Imap\Tests; use Ddeboer\Imap\Exception\NotEmbeddedMessageException; +use Ddeboer\Imap\Message\AbstractMessage; +use Ddeboer\Imap\Message\Attachment; use Ddeboer\Imap\Message\EmailAddress; +use Ddeboer\Imap\Message\EmbeddedMessage; use Ddeboer\Imap\Message\PartInterface; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \Ddeboer\Imap\Message\AbstractMessage - * @covers \Ddeboer\Imap\Message\Attachment - * @covers \Ddeboer\Imap\Message\EmbeddedMessage - */ -final class EmbeddedMessageTest extends AbstractTest +#[CoversClass(AbstractMessage::class)] +#[CoversClass(Attachment::class)] +#[CoversClass(EmbeddedMessage::class)] +final class EmbeddedMessageTest extends AbstractTestCase { public function testEmbeddedMessage(): void { @@ -23,27 +25,27 @@ public function testEmbeddedMessage(): void $message = $mailbox->getMessage(1); $attachment = $message->getAttachments()[0]; - static::assertTrue($attachment->isEmbeddedMessage()); + self::assertTrue($attachment->isEmbeddedMessage()); $emailDate = new \DateTimeImmutable('29 Jan 2016 14:22:13 +0100'); $embeddedMessage = $attachment->getEmbeddedMessage(); - static::assertNull($embeddedMessage->getBodyHtml()); - static::assertSame('demo text', $embeddedMessage->getBodyText()); - static::assertSame([], $embeddedMessage->getCc()); + self::assertNull($embeddedMessage->getBodyHtml()); + self::assertSame('demo text', $embeddedMessage->getBodyText()); + self::assertSame([], $embeddedMessage->getCc()); $actualDate = $embeddedMessage->getDate(); - static::assertInstanceOf(\DateTimeImmutable::class, $actualDate); - static::assertSame($emailDate->format(\DATE_ISO8601), $actualDate->format(\DATE_ISO8601)); + self::assertInstanceOf(\DateTimeImmutable::class, $actualDate); + self::assertSame($emailDate->format(\DATE_ISO8601), $actualDate->format(\DATE_ISO8601)); - static::assertSame('demo', $embeddedMessage->getSubject()); + self::assertSame('demo', $embeddedMessage->getSubject()); $actualFrom = $embeddedMessage->getFrom(); - static::assertInstanceOf(EmailAddress::class, $actualFrom); - static::assertSame('demo-from@cerstor.cz', $actualFrom->getFullAddress()); + self::assertInstanceOf(EmailAddress::class, $actualFrom); + self::assertSame('demo-from@cerstor.cz', $actualFrom->getFullAddress()); - static::assertSame('demo-to@cerstor.cz', $embeddedMessage->getTo()[0]->getFullAddress()); + self::assertSame('demo-to@cerstor.cz', $embeddedMessage->getTo()[0]->getFullAddress()); - static::assertFalse($message->isSeen()); + self::assertFalse($message->isSeen()); } public function testEmbeddedAttachment(): void @@ -55,17 +57,17 @@ public function testEmbeddedAttachment(): void $embeddedMessage = $mailbox->getMessage(1)->getAttachments()[0]->getEmbeddedMessage(); $embeddedAttachment = $embeddedMessage->getAttachments()[0]; - static::assertSame('testfile.txt', $embeddedAttachment->getFilename()); - static::assertSame(29, $embeddedAttachment->getSize()); - static::assertSame('attachment', $embeddedAttachment->getDisposition()); - static::assertSame('IHRoaXMgaXMgY29udGVudCBvZiB0ZXN0IGZpbGU=', $embeddedAttachment->getContent()); - static::assertSame('base64', $embeddedAttachment->getEncoding()); - static::assertSame(PartInterface::TYPE_TEXT, $embeddedAttachment->getType()); - static::assertSame(PartInterface::SUBTYPE_PLAIN, $embeddedAttachment->getSubtype()); - static::assertSame(' this is content of test file', $embeddedAttachment->getDecodedContent()); - static::assertSame('testfile.txt', $embeddedAttachment->getFilename()); - - static::assertFalse($embeddedAttachment->isEmbeddedMessage()); + self::assertSame('testfile.txt', $embeddedAttachment->getFilename()); + self::assertSame(29, $embeddedAttachment->getSize()); + self::assertSame('attachment', $embeddedAttachment->getDisposition()); + self::assertSame('IHRoaXMgaXMgY29udGVudCBvZiB0ZXN0IGZpbGU=', $embeddedAttachment->getContent()); + self::assertSame('base64', $embeddedAttachment->getEncoding()); + self::assertSame(PartInterface::TYPE_TEXT, $embeddedAttachment->getType()); + self::assertSame(PartInterface::SUBTYPE_PLAIN, $embeddedAttachment->getSubtype()); + self::assertSame(' this is content of test file', $embeddedAttachment->getDecodedContent()); + self::assertSame('testfile.txt', $embeddedAttachment->getFilename()); + + self::assertFalse($embeddedAttachment->isEmbeddedMessage()); $this->expectException(NotEmbeddedMessageException::class); @@ -79,43 +81,43 @@ public function testRecursiveEmbeddedAttachment(): void $mailbox->addMessage($raw); $message = $mailbox->getMessage(1); - static::assertSame('3-third-subject', $message->getSubject()); - static::assertSame('3-third-content', $message->getBodyText()); + self::assertSame('3-third-subject', $message->getSubject()); + self::assertSame('3-third-content', $message->getBodyText()); $attachments = $message->getAttachments(); - static::assertCount(3, $attachments); + self::assertCount(3, $attachments); $attachment = \current($attachments); - static::assertNotFalse($attachment); - static::assertTrue($attachment->isEmbeddedMessage()); + self::assertNotFalse($attachment); + self::assertTrue($attachment->isEmbeddedMessage()); $embeddedMessage = $attachment->getEmbeddedMessage(); - static::assertSame('2-second-subject', $embeddedMessage->getSubject()); - static::assertSame('2-second-content', $embeddedMessage->getBodyText()); + self::assertSame('2-second-subject', $embeddedMessage->getSubject()); + self::assertSame('2-second-content', $embeddedMessage->getBodyText()); $embeddedAttachments = $embeddedMessage->getAttachments(); - static::assertCount(2, $embeddedAttachments); + self::assertCount(2, $embeddedAttachments); $embeddedAttachment = \current($embeddedAttachments); - static::assertNotFalse($embeddedAttachment); - static::assertTrue($embeddedAttachment->isEmbeddedMessage()); + self::assertNotFalse($embeddedAttachment); + self::assertTrue($embeddedAttachment->isEmbeddedMessage()); $secondEmbeddedMessage = $embeddedAttachment->getEmbeddedMessage(); - static::assertSame('1-first-subject', $secondEmbeddedMessage->getSubject()); - static::assertSame('1-first-content', $secondEmbeddedMessage->getBodyText()); + self::assertSame('1-first-subject', $secondEmbeddedMessage->getSubject()); + self::assertSame('1-first-content', $secondEmbeddedMessage->getBodyText()); $secondEmbeddedAttachments = $secondEmbeddedMessage->getAttachments(); - static::assertCount(1, $secondEmbeddedAttachments); + self::assertCount(1, $secondEmbeddedAttachments); $secondEmbeddedAttachment = \current($secondEmbeddedAttachments); - static::assertNotFalse($secondEmbeddedAttachment); - static::assertTrue($secondEmbeddedAttachment->isEmbeddedMessage()); + self::assertNotFalse($secondEmbeddedAttachment); + self::assertTrue($secondEmbeddedAttachment->isEmbeddedMessage()); $thirdEmbeddedMessage = $secondEmbeddedAttachment->getEmbeddedMessage(); - static::assertSame('0-zero-subject', $thirdEmbeddedMessage->getSubject()); - static::assertSame('0-zero-content', $thirdEmbeddedMessage->getBodyText()); + self::assertSame('0-zero-subject', $thirdEmbeddedMessage->getSubject()); + self::assertSame('0-zero-content', $thirdEmbeddedMessage->getBodyText()); - static::assertCount(0, $thirdEmbeddedMessage->getAttachments()); + self::assertCount(0, $thirdEmbeddedMessage->getAttachments()); } public function testEmbeddedMessageWithoutContentDisposition(): void @@ -126,41 +128,41 @@ public function testEmbeddedMessageWithoutContentDisposition(): void $message = $mailbox->getMessage(1); $attachments = $message->getAttachments(); - static::assertCount(6, $attachments); + self::assertCount(6, $attachments); $attachment = \current($attachments); - static::assertNotFalse($attachment); - static::assertNotEmpty($attachment->getContent()); - static::assertSame('file.jpg', $attachment->getFilename()); + self::assertNotFalse($attachment); + self::assertNotEmpty($attachment->getContent()); + self::assertSame('file.jpg', $attachment->getFilename()); $attachment = \next($attachments); - static::assertNotFalse($attachment); - static::assertTrue($attachment->isEmbeddedMessage()); + self::assertNotFalse($attachment); + self::assertTrue($attachment->isEmbeddedMessage()); $embeddedMessage = $attachment->getEmbeddedMessage(); - static::assertSame('embedded_message_subject', $embeddedMessage->getSubject()); - static::assertNotEmpty($embeddedMessage->getBodyText()); - static::assertNotEmpty($embeddedMessage->getBodyHtml()); + self::assertSame('embedded_message_subject', $embeddedMessage->getSubject()); + self::assertNotEmpty($embeddedMessage->getBodyText()); + self::assertNotEmpty($embeddedMessage->getBodyHtml()); $attachment = \next($attachments); - static::assertNotFalse($attachment); - static::assertNotEmpty($attachment->getContent()); - static::assertSame('file1.xlsx', $attachment->getFilename()); + self::assertNotFalse($attachment); + self::assertNotEmpty($attachment->getContent()); + self::assertSame('file1.xlsx', $attachment->getFilename()); $attachment = \next($attachments); - static::assertNotFalse($attachment); - static::assertNotEmpty($attachment->getContent()); - static::assertSame('file2.xlsx', $attachment->getFilename()); + self::assertNotFalse($attachment); + self::assertNotEmpty($attachment->getContent()); + self::assertSame('file2.xlsx', $attachment->getFilename()); $attachment = \next($attachments); - static::assertNotFalse($attachment); - static::assertNotEmpty($attachment->getContent()); - static::assertSame('file3.xlsx', $attachment->getFilename()); + self::assertNotFalse($attachment); + self::assertNotEmpty($attachment->getContent()); + self::assertSame('file3.xlsx', $attachment->getFilename()); $attachment = \next($attachments); - static::assertNotFalse($attachment); - static::assertNotEmpty($attachment->getContent()); - static::assertSame('file4.zip', $attachment->getFilename()); + self::assertNotFalse($attachment); + self::assertNotEmpty($attachment->getContent()); + self::assertSame('file4.zip', $attachment->getFilename()); } public function testSaveEmbeddedMessage(): void @@ -174,20 +176,20 @@ public function testSaveEmbeddedMessage(): void // skip 1. non-embedded attachment (file.jpg) to embedded one $attachment = \next($attachments); - static::assertNotFalse($attachment); - static::assertTrue($attachment->isEmbeddedMessage()); + self::assertNotFalse($attachment); + self::assertTrue($attachment->isEmbeddedMessage()); $embeddedMessage = $attachment->getEmbeddedMessage(); $file = \fopen('php://temp', 'w+'); if (false === $file) { - static::fail('Unable to create temporary file stream'); + self::fail('Unable to create temporary file stream'); } $embeddedMessage->saveRawMessage($file); \fseek($file, 0); $rawEmbedded = $this->getFixture('embedded_email_without_content_disposition-embedded'); - static::assertSame($rawEmbedded, \stream_get_contents($file)); + self::assertSame($rawEmbedded, \stream_get_contents($file)); } } diff --git a/tests/MailboxSearchTest.php b/tests/MailboxSearchTest.php index 8ef6928b..6ae82f2c 100644 --- a/tests/MailboxSearchTest.php +++ b/tests/MailboxSearchTest.php @@ -5,48 +5,74 @@ namespace Ddeboer\Imap\Tests; use Ddeboer\Imap\Exception\InvalidSearchCriteriaException; +use Ddeboer\Imap\Mailbox; use Ddeboer\Imap\MailboxInterface; use Ddeboer\Imap\Search; +use Ddeboer\Imap\Search\AbstractDate; +use Ddeboer\Imap\Search\AbstractText; +use Ddeboer\Imap\Search\Date\Before; +use Ddeboer\Imap\Search\Date\On; +use Ddeboer\Imap\Search\Date\Since; +use Ddeboer\Imap\Search\Email\Bcc; +use Ddeboer\Imap\Search\Email\Cc; +use Ddeboer\Imap\Search\Email\From; +use Ddeboer\Imap\Search\Email\To; +use Ddeboer\Imap\Search\Flag\Answered; +use Ddeboer\Imap\Search\Flag\Flagged; +use Ddeboer\Imap\Search\Flag\Recent; +use Ddeboer\Imap\Search\Flag\Seen; +use Ddeboer\Imap\Search\Flag\Unanswered; +use Ddeboer\Imap\Search\Flag\Unflagged; +use Ddeboer\Imap\Search\Flag\Unseen; +use Ddeboer\Imap\Search\LogicalOperator\All; +use Ddeboer\Imap\Search\LogicalOperator\OrConditions; +use Ddeboer\Imap\Search\RawExpression; +use Ddeboer\Imap\Search\State\Deleted; +use Ddeboer\Imap\Search\State\NewMessage; +use Ddeboer\Imap\Search\State\Old; +use Ddeboer\Imap\Search\State\Undeleted; +use Ddeboer\Imap\Search\Text\Body; +use Ddeboer\Imap\Search\Text\Keyword; +use Ddeboer\Imap\Search\Text\Subject; +use Ddeboer\Imap\Search\Text\Text; +use Ddeboer\Imap\Search\Text\Unkeyword; use Ddeboer\Imap\SearchExpression; - -/** - * @covers \Ddeboer\Imap\Mailbox::getMessages - * @covers \Ddeboer\Imap\Search\AbstractDate - * @covers \Ddeboer\Imap\Search\AbstractText - * @covers \Ddeboer\Imap\Search\Date\Before - * @covers \Ddeboer\Imap\Search\Date\On - * @covers \Ddeboer\Imap\Search\Date\Since - * @covers \Ddeboer\Imap\Search\Email\Bcc - * @covers \Ddeboer\Imap\Search\Email\Cc - * @covers \Ddeboer\Imap\Search\Email\From - * @covers \Ddeboer\Imap\Search\Email\To - * @covers \Ddeboer\Imap\Search\Flag\Answered - * @covers \Ddeboer\Imap\Search\Flag\Flagged - * @covers \Ddeboer\Imap\Search\Flag\Recent - * @covers \Ddeboer\Imap\Search\Flag\Seen - * @covers \Ddeboer\Imap\Search\Flag\Unanswered - * @covers \Ddeboer\Imap\Search\Flag\Unflagged - * @covers \Ddeboer\Imap\Search\Flag\Unseen - * @covers \Ddeboer\Imap\Search\LogicalOperator\All - * @covers \Ddeboer\Imap\Search\LogicalOperator\OrConditions - * @covers \Ddeboer\Imap\Search\RawExpression - * @covers \Ddeboer\Imap\Search\State\Deleted - * @covers \Ddeboer\Imap\Search\State\NewMessage - * @covers \Ddeboer\Imap\Search\State\Old - * @covers \Ddeboer\Imap\Search\State\Undeleted - * @covers \Ddeboer\Imap\Search\Text\Body - * @covers \Ddeboer\Imap\Search\Text\Keyword - * @covers \Ddeboer\Imap\Search\Text\Subject - * @covers \Ddeboer\Imap\Search\Text\Text - * @covers \Ddeboer\Imap\Search\Text\Unkeyword - * @covers \Ddeboer\Imap\SearchExpression - */ -final class MailboxSearchTest extends AbstractTest +use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Depends; + +#[CoversClass(Mailbox::class)] +#[CoversClass(AbstractDate::class)] +#[CoversClass(AbstractText::class)] +#[CoversClass(Before::class)] +#[CoversClass(On::class)] +#[CoversClass(Since::class)] +#[CoversClass(Bcc::class)] +#[CoversClass(Cc::class)] +#[CoversClass(From::class)] +#[CoversClass(To::class)] +#[CoversClass(Answered::class)] +#[CoversClass(Flagged::class)] +#[CoversClass(Recent::class)] +#[CoversClass(Seen::class)] +#[CoversClass(Unanswered::class)] +#[CoversClass(Unflagged::class)] +#[CoversClass(Unseen::class)] +#[CoversClass(All::class)] +#[CoversClass(OrConditions::class)] +#[CoversClass(RawExpression::class)] +#[CoversClass(Deleted::class)] +#[CoversClass(NewMessage::class)] +#[CoversClass(Old::class)] +#[CoversClass(Undeleted::class)] +#[CoversClass(Body::class)] +#[CoversClass(Keyword::class)] +#[CoversClass(Subject::class)] +#[CoversClass(Text::class)] +#[CoversClass(Unkeyword::class)] +#[CoversClass(SearchExpression::class)] +final class MailboxSearchTest extends AbstractTestCase { - /** - * @var MailboxInterface - */ - protected $mailbox; + private MailboxInterface $mailbox; protected function setUp(): void { @@ -61,12 +87,12 @@ public function testSearchCapabilities(): void $messages = $this->mailbox->getMessages(new Search\Text\Subject($firstSubject)); - static::assertCount(1, $messages); - static::assertSame($firstSubject, $messages->current()->getSubject()); + self::assertCount(1, $messages); + self::assertSame($firstSubject, $messages->current()->getSubject()); $messages = $this->mailbox->getMessages(new Search\Text\Subject(\uniqid('none_'))); - static::assertCount(0, $messages); + self::assertCount(0, $messages); } public function testUnknownCriterion(): void @@ -80,7 +106,7 @@ public function testRawExpressionCondition(): void { $messages = $this->mailbox->getMessages(new Search\RawExpression('ON "1-Oct-2017"')); - static::assertCount(0, $messages); + self::assertCount(0, $messages); } public function testSearchEscapes(): void @@ -124,16 +150,16 @@ public function testSearchEscapes(): void $messages = $this->mailbox->getMessages($searchExpression); - static::assertCount(0, $messages); + self::assertCount(0, $messages); } public function testSpacesAndDoubleQuoteEscape(): void { - static::markTestIncomplete('Unable to get spaces and double quote search together'); + self::markTestIncomplete('Unable to get spaces and double quote search together'); // $spaceAndDoubleQuoteCondition = new Search\Text\Text('A " Z'); // $messages = $this->mailbox->getMessages($spaceAndDoubleQuoteCondition); - // static::assertCount(0, $messages); + // self::assertCount(0, $messages); } public function testOrConditionFunctionality(): Search\LogicalOperator\OrConditions @@ -143,19 +169,17 @@ public function testOrConditionFunctionality(): Search\LogicalOperator\OrConditi new Search\Text\Subject(\uniqid()), ]); - static::assertStringContainsString('(', $orCondition->toString()); + self::assertStringContainsString('(', $orCondition->toString()); return $orCondition; } - /** - * @depends testOrConditionFunctionality - */ + #[Depends('testOrConditionFunctionality')] public function testOrConditionUsage(Search\LogicalOperator\OrConditions $orCondition): void { - static::markTestIncomplete('OR condition isn\'t supported by the current c-client library'); + self::markTestIncomplete('OR condition isn\'t supported by the current c-client library'); // $messages = $this->mailbox->getMessages($orCondition); - // static::assertCount(0, $messages); + // self::assertCount(0, $messages); } } diff --git a/tests/MailboxTest.php b/tests/MailboxTest.php index 04acb6f8..7774d4f3 100644 --- a/tests/MailboxTest.php +++ b/tests/MailboxTest.php @@ -4,25 +4,26 @@ namespace Ddeboer\Imap\Tests; +use Ddeboer\Imap\Exception\AbstractException; use Ddeboer\Imap\Exception\InvalidSearchCriteriaException; use Ddeboer\Imap\Exception\MessageCopyException; use Ddeboer\Imap\Exception\MessageDoesNotExistException; use Ddeboer\Imap\Exception\MessageMoveException; use Ddeboer\Imap\Exception\RenameMailboxException; +use Ddeboer\Imap\ImapResource; +use Ddeboer\Imap\Mailbox; use Ddeboer\Imap\MailboxInterface; use Ddeboer\Imap\MessageIterator; use Ddeboer\Imap\MessageIteratorInterface; use Ddeboer\Imap\Search; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \Ddeboer\Imap\Exception\AbstractException - * @covers \Ddeboer\Imap\ImapResource - * @covers \Ddeboer\Imap\Mailbox - */ -final class MailboxTest extends AbstractTest +#[CoversClass(AbstractException::class)] +#[CoversClass(ImapResource::class)] +#[CoversClass(Mailbox::class)] +final class MailboxTest extends AbstractTestCase { - /** @var MailboxInterface */ - protected $mailbox; + private MailboxInterface $mailbox; protected function setUp(): void { @@ -35,46 +36,46 @@ protected function setUp(): void public function testGetName(): void { - static::assertSame($this->mailboxName, $this->mailbox->getName()); + self::assertSame($this->mailboxName, $this->mailbox->getName()); } public function testRenameTo(): void { - static::assertNotSame($this->mailboxName, $this->altName); + self::assertNotSame($this->mailboxName, $this->altName); /** @var string $altName */ $altName = $this->altName; - static::assertTrue($this->mailbox->renameTo($altName)); - static::assertSame($this->altName, $this->mailbox->getName()); + self::assertTrue($this->mailbox->renameTo($altName)); + self::assertSame($this->altName, $this->mailbox->getName()); /** @var string $mailboxName */ $mailboxName = $this->mailboxName; - static::assertTrue($this->mailbox->renameTo($mailboxName)); - static::assertSame($this->mailboxName, $this->mailbox->getName()); + self::assertTrue($this->mailbox->renameTo($mailboxName)); + self::assertSame($this->mailboxName, $this->mailbox->getName()); - static::expectException(RenameMailboxException::class); + $this->expectException(RenameMailboxException::class); $this->mailbox->renameTo($mailboxName); } public function testGetFullEncodedName(): void { - static::assertIsString($this->mailboxName); + self::assertIsString($this->mailboxName); $fullEncodedName = $this->mailbox->getFullEncodedName(); - static::assertStringContainsString((string) \getenv('IMAP_SERVER_PORT'), $fullEncodedName); - static::assertStringNotContainsString($this->mailboxName, $fullEncodedName); - static::assertStringContainsString(\mb_convert_encoding($this->mailboxName, 'UTF7-IMAP', 'UTF-8'), $fullEncodedName); - static::assertStringNotContainsString(':' . \getenv('IMAP_SERVER_PORT'), $this->mailbox->getEncodedName()); + self::assertStringContainsString((string) \getenv('IMAP_SERVER_PORT'), $fullEncodedName); + self::assertStringNotContainsString($this->mailboxName, $fullEncodedName); + self::assertStringContainsString(\mb_convert_encoding($this->mailboxName, 'UTF7-IMAP', 'UTF-8'), $fullEncodedName); + self::assertStringNotContainsString(':' . \getenv('IMAP_SERVER_PORT'), $this->mailbox->getEncodedName()); } public function testGetAttributes(): void { - static::assertGreaterThan(0, $this->mailbox->getAttributes()); + self::assertGreaterThan(0, $this->mailbox->getAttributes()); } public function testGetDelimiter(): void { - static::assertNotEmpty($this->mailbox->getDelimiter()); + self::assertNotEmpty($this->mailbox->getDelimiter()); } public function testGetMessages(): void @@ -84,14 +85,14 @@ public function testGetMessages(): void ++$directMethodInc; } - static::assertSame(3, $directMethodInc); + self::assertSame(3, $directMethodInc); $aggregateIteratorMethodInc = 0; foreach ($this->mailbox as $message) { ++$aggregateIteratorMethodInc; } - static::assertSame(3, $aggregateIteratorMethodInc); + self::assertSame(3, $aggregateIteratorMethodInc); } public function testGetMessageSequence(): void @@ -100,19 +101,19 @@ public function testGetMessageSequence(): void foreach ($this->mailbox->getMessageSequence('1:*') as $message) { ++$inc; } - static::assertSame(3, $inc); + self::assertSame(3, $inc); $inc = 0; foreach ($this->mailbox->getMessageSequence('1:2') as $message) { ++$inc; } - static::assertSame(2, $inc); + self::assertSame(2, $inc); $inc = 0; foreach ($this->mailbox->getMessageSequence('99998:99999') as $message) { ++$inc; } - static::assertSame(0, $inc); + self::assertSame(0, $inc); } public function testGetMessageSequenceThrowsException(): void @@ -133,25 +134,25 @@ public function testGetMessageThrowsException(): void public function testCount(): void { - static::assertSame(3, $this->mailbox->count()); + self::assertSame(3, $this->mailbox->count()); } public function testDefaultStatus(): void { $status = $this->mailbox->getStatus(); - static::assertSame(\SA_ALL, $status->flags); - static::assertSame(3, $status->messages); - static::assertSame(4, $status->uidnext); + self::assertSame(\SA_ALL, $status->flags); + self::assertSame(3, $status->messages); + self::assertSame(4, $status->uidnext); } public function testCustomStatusFlag(): void { $status = $this->mailbox->getStatus(\SA_MESSAGES); - static::assertSame(\SA_MESSAGES, $status->flags); - static::assertSame(3, $status->messages); - static::assertFalse(isset($status->uidnext), 'uidnext shouldn\'t be set'); + self::assertSame(\SA_MESSAGES, $status->flags); + self::assertSame(3, $status->messages); + self::assertFalse(isset($status->uidnext), 'uidnext shouldn\'t be set'); } public function testBulkSetFlags(): void @@ -167,27 +168,27 @@ public function testBulkSetFlags(): void foreach ($messages as $uid) { $message = $this->mailbox->getMessage($uid); - static::assertFalse($message->isFlagged()); + self::assertFalse($message->isFlagged()); } $this->mailbox->setFlag('\\Flagged', $messages); foreach ($messages as $uid) { $message = $this->mailbox->getMessage($uid); - static::assertTrue($message->isFlagged()); + self::assertTrue($message->isFlagged()); } $this->mailbox->clearFlag('\\Flagged', $messages); foreach ($messages as $uid) { $message = $this->mailbox->getMessage($uid); - static::assertFalse($message->isFlagged()); + self::assertFalse($message->isFlagged()); } // Set flag for messages from another mailbox $anotherMailbox->setFlag('\\Flagged', [1, 2, 3]); - static::assertTrue($anotherMailbox->getMessage(2)->isFlagged()); + self::assertTrue($anotherMailbox->getMessage(2)->isFlagged()); } public function testBulkSetFlagsNumbersParameter(): void @@ -209,7 +210,7 @@ public function testBulkSetFlagsNumbersParameter(): void foreach ($uids as $uid) { $message = $mailbox->getMessage($uid); - static::assertTrue($message->isSeen()); + self::assertTrue($message->isSeen()); } $mailbox->clearFlag('\\Seen', '1,2,3,4:6'); @@ -220,7 +221,7 @@ public function testBulkSetFlagsNumbersParameter(): void foreach ($uids as $uid) { $message = $mailbox->getMessage($uid); - static::assertFalse($message->isSeen()); + self::assertFalse($message->isSeen()); } } @@ -252,11 +253,11 @@ public function testThread(): void '2.branch' => 0, ]; - static::assertSame($expected, $mailboxOne->getThread()); + self::assertSame($expected, $mailboxOne->getThread()); $emptyMailbox = $this->createMailbox(); - static::assertEmpty($emptyMailbox->getThread()); + self::assertEmpty($emptyMailbox->getThread()); } public function testAppendOptionalArguments(): void @@ -267,8 +268,8 @@ public function testAppendOptionalArguments(): void $message = $mailbox->getMessage(1); - static::assertTrue($message->isSeen()); - static::assertSame(' 3-Jan-2012 09:30:03 +0000', $message->getHeaders()->get('maildate')); + self::assertTrue($message->isSeen()); + self::assertSame(' 3-Jan-2012 09:30:03 +0000', $message->getHeaders()->get('maildate')); } public function testBulkMove(): void @@ -278,12 +279,12 @@ public function testBulkMove(): void // Test move by id $messages = [1, 2, 3]; - static::assertSame(0, $anotherMailbox->count()); + self::assertSame(0, $anotherMailbox->count()); $this->mailbox->move($messages, $anotherMailbox); $this->getConnection()->expunge(); - static::assertSame(3, $anotherMailbox->count()); - static::assertSame(0, $this->mailbox->count()); + self::assertSame(3, $anotherMailbox->count()); + self::assertSame(0, $this->mailbox->count()); // move back by iterator /** @var MessageIterator $messages */ @@ -291,8 +292,8 @@ public function testBulkMove(): void $anotherMailbox->move($messages, $this->mailbox); $this->getConnection()->expunge(); - static::assertSame(0, $anotherMailbox->count()); - static::assertSame(3, $this->mailbox->count()); + self::assertSame(0, $anotherMailbox->count()); + self::assertSame(3, $this->mailbox->count()); // Somehow mailbox deleting in Dovecot in Github CI doesn't work :\ if (false !== \getenv('CI')) { @@ -309,12 +310,12 @@ public function testBulkCopy(): void $anotherMailbox = $this->createMailbox(); $messages = [1, 2, 3]; - static::assertSame(0, $anotherMailbox->count()); - static::assertSame(3, $this->mailbox->count()); + self::assertSame(0, $anotherMailbox->count()); + self::assertSame(3, $this->mailbox->count()); $this->mailbox->copy($messages, $anotherMailbox); - static::assertSame(3, $anotherMailbox->count()); - static::assertSame(3, $this->mailbox->count()); + self::assertSame(3, $anotherMailbox->count()); + self::assertSame(3, $this->mailbox->count()); // test failing bulk copy - try to move to a non-existent mailbox $this->getConnection()->deleteMailbox($anotherMailbox); @@ -338,10 +339,10 @@ public function testSort(): void return $subject; }; - static::assertSame('BAC', $concatSubjects($anotherMailbox->getMessages())); - static::assertSame('ABC', $concatSubjects($anotherMailbox->getMessages(null, \SORTSUBJECT))); - static::assertSame('CBA', $concatSubjects($anotherMailbox->getMessages(null, \SORTSUBJECT, true))); - static::assertSame('B', $concatSubjects($anotherMailbox->getMessages(new Search\Text\Subject('B'), \SORTSUBJECT, true))); + self::assertSame('BAC', $concatSubjects($anotherMailbox->getMessages())); + self::assertSame('ABC', $concatSubjects($anotherMailbox->getMessages(null, \SORTSUBJECT))); + self::assertSame('CBA', $concatSubjects($anotherMailbox->getMessages(null, \SORTSUBJECT, true))); + self::assertSame('B', $concatSubjects($anotherMailbox->getMessages(new Search\Text\Subject('B'), \SORTSUBJECT, true))); } public function testGetMessagesWithUtf8Subject(): void @@ -354,21 +355,21 @@ public function testGetMessagesWithUtf8Subject(): void $messagesFound = ''; foreach ($anotherMailbox->getMessages(new Search\Text\Body(\mb_convert_encoding('б', 'Windows-1251', 'UTF-8')), null, false, 'Windows-1251') as $message) { $subject = $message->getSubject(); - static::assertIsString($subject); + self::assertIsString($subject); $messagesFound .= \substr($subject, 0, 1); } - static::assertSame('23', $messagesFound); + self::assertSame('23', $messagesFound); $messagesFound = ''; foreach ($anotherMailbox->getMessages(new Search\Text\Body(\mb_convert_encoding('П', 'Windows-1251', 'UTF-8')), \SORTSUBJECT, true, 'Windows-1251') as $message) { $subject = $message->getSubject(); - static::assertIsString($subject); + self::assertIsString($subject); $messagesFound .= \substr($subject, 0, 1); } - static::assertSame('31', $messagesFound); + self::assertSame('31', $messagesFound); } } diff --git a/tests/MessageTest.php b/tests/MessageTest.php index c00bdd60..4472744e 100644 --- a/tests/MessageTest.php +++ b/tests/MessageTest.php @@ -4,6 +4,7 @@ namespace Ddeboer\Imap\Tests; +use Ddeboer\Imap\Connection; use Ddeboer\Imap\Exception\InvalidDateHeaderException; use Ddeboer\Imap\Exception\MessageDoesNotExistException; use Ddeboer\Imap\Exception\OutOfBoundsException; @@ -11,27 +12,34 @@ use Ddeboer\Imap\Exception\UnsupportedCharsetException; use Ddeboer\Imap\MailboxInterface; use Ddeboer\Imap\Message; +use Ddeboer\Imap\Message\AbstractMessage; +use Ddeboer\Imap\Message\AbstractPart; +use Ddeboer\Imap\Message\Attachment; use Ddeboer\Imap\Message\EmailAddress; +use Ddeboer\Imap\Message\Headers; +use Ddeboer\Imap\Message\Parameters; use Ddeboer\Imap\Message\PartInterface; +use Ddeboer\Imap\Message\SimplePart; use Ddeboer\Imap\Message\Transcoder; use Ddeboer\Imap\MessageInterface; +use Ddeboer\Imap\MessageIterator; use Laminas\Mail; use Laminas\Mime; - -/** - * @covers \Ddeboer\Imap\Connection::expunge - * @covers \Ddeboer\Imap\Message - * @covers \Ddeboer\Imap\Message\AbstractMessage - * @covers \Ddeboer\Imap\Message\AbstractPart - * @covers \Ddeboer\Imap\Message\Attachment - * @covers \Ddeboer\Imap\Message\EmailAddress - * @covers \Ddeboer\Imap\Message\Headers - * @covers \Ddeboer\Imap\Message\Parameters - * @covers \Ddeboer\Imap\Message\SimplePart - * @covers \Ddeboer\Imap\Message\Transcoder - * @covers \Ddeboer\Imap\MessageIterator - */ -final class MessageTest extends AbstractTest +use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\DataProvider; + +#[CoversClass(Connection::class)] +#[CoversClass(Message::class)] +#[CoversClass(AbstractMessage::class)] +#[CoversClass(AbstractPart::class)] +#[CoversClass(Attachment::class)] +#[CoversClass(EmailAddress::class)] +#[CoversClass(Headers::class)] +#[CoversClass(Parameters::class)] +#[CoversClass(SimplePart::class)] +#[CoversClass(Transcoder::class)] +#[CoversClass(MessageIterator::class)] +final class MessageTest extends AbstractTestCase { private const ENCODINGS = [ Mime\Mime::ENCODING_7BIT, @@ -76,14 +84,18 @@ public function testCustomNonExistentMessageFetch(): void $message->hasAttachments(); } - public function testDeprecateMaskAsSeen(): void + public function testDeprecatedMaskAsSeen(): void { $this->createTestMessage($this->mailbox, 'Message A'); + $message = $this->mailbox->getMessage(1); + self::assertFalse($message->isSeen()); - $this->expectDeprecation(); + $message->getBodyText(); + self::assertFalse($message->isSeen()); $message->maskAsSeen(); + self::assertTrue($message->isSeen()); } public function testAlwaysKeepUnseen(): void @@ -91,13 +103,13 @@ public function testAlwaysKeepUnseen(): void $this->createTestMessage($this->mailbox, 'Message A'); $message = $this->mailbox->getMessage(1); - static::assertFalse($message->isSeen()); + self::assertFalse($message->isSeen()); $message->getBodyText(); - static::assertFalse($message->isSeen()); + self::assertFalse($message->isSeen()); $message->markAsSeen(); - static::assertTrue($message->isSeen()); + self::assertTrue($message->isSeen()); } public function testFlags(): void @@ -106,13 +118,13 @@ public function testFlags(): void $message = $this->mailbox->getMessage(1); - static::assertSame('N', $message->isRecent()); - static::assertFalse($message->isUnseen()); - static::assertFalse($message->isFlagged()); - static::assertFalse($message->isAnswered()); - static::assertFalse($message->isDeleted()); - static::assertFalse($message->isDraft()); - static::assertFalse($message->isSeen()); + self::assertSame('N', $message->isRecent()); + self::assertFalse($message->isUnseen()); + self::assertFalse($message->isFlagged()); + self::assertFalse($message->isAnswered()); + self::assertFalse($message->isDeleted()); + self::assertFalse($message->isDraft()); + self::assertFalse($message->isSeen()); } public function testLowercaseCharsetAliases(): void @@ -121,34 +133,32 @@ public function testLowercaseCharsetAliases(): void $properties = $refClass->getConstants(); $aliases = $properties['CHARSET_ALIASES']; - static::assertIsArray($aliases); + self::assertIsArray($aliases); $keys = \array_map('strval', \array_keys($aliases)); $loweredKeys = \array_map(static function (string $charset): string { return \strtolower($charset); }, $keys); - static::assertSame($loweredKeys, $keys, 'Charset aliases key must be lowercase'); + self::assertSame($loweredKeys, $keys, 'Charset aliases key must be lowercase'); $sameAliases = \array_filter($aliases, static function ($value, $key): bool { return \strtolower((string) $value) === \strtolower((string) $key); }, \ARRAY_FILTER_USE_BOTH); - static::assertSame([], $sameAliases, 'There must not be self-referencing aliases'); + self::assertSame([], $sameAliases, 'There must not be self-referencing aliases'); foreach ($aliases as $finalAlias) { - static::assertArrayNotHasKey($finalAlias, $aliases, 'All aliases must refer to final alias'); + self::assertArrayNotHasKey($finalAlias, $aliases, 'All aliases must refer to final alias'); } $sortedKeys = $keys; \sort($sortedKeys, \SORT_STRING); - static::assertSame($sortedKeys, $keys, 'Aliases must be sorted'); + self::assertSame($sortedKeys, $keys, 'Aliases must be sorted'); } - /** - * @dataProvider provideCharsets - */ + #[DataProvider('provideCharsets')] public function testBodyCharsets(?string $charset, string $charList, ?string $encoding): void { $subject = \sprintf('[%s:%s]', $charset, $encoding); @@ -162,14 +172,14 @@ public function testBodyCharsets(?string $charset, string $charList, ?string $en $message = $this->mailbox->getMessage(1); - static::assertSame($subject, $message->getSubject()); - static::assertSame($charList, \rtrim((string) $message->getBodyText())); + self::assertSame($subject, $message->getSubject()); + self::assertSame($charList, \rtrim((string) $message->getBodyText())); } /** * @return array> */ - public function provideCharsets(): array + public static function provideCharsets(): array { $provider = []; @@ -201,7 +211,7 @@ public function testCharsetAlias(): void $message = $this->mailbox->getMessage(1); - static::assertSame($text, \rtrim((string) $message->getBodyText())); + self::assertSame($text, \rtrim((string) $message->getBodyText())); } public function testMicrosoftCharsetAlias(): void @@ -221,7 +231,7 @@ public function testMicrosoftCharsetAlias(): void $message = $this->mailbox->getMessage(1); - static::assertSame($text, \rtrim((string) $message->getBodyText())); + self::assertSame($text, \rtrim((string) $message->getBodyText())); } public function testUnsupportedCharset(): void @@ -249,7 +259,7 @@ public function testUndefinedContentCharset(): void $message = $this->mailbox->getMessage(1); - static::assertSame('Hi!', \rtrim((string) $message->getBodyText())); + self::assertSame('Hi!', \rtrim((string) $message->getBodyText())); } public function testSpecialCharsetOnHeaders(): void @@ -258,22 +268,20 @@ public function testSpecialCharsetOnHeaders(): void $message = $this->mailbox->getMessage(1); - static::assertSame('RE: 회원님께 Ersi님이 메시지를 보냈습니다.', $message->getSubject()); + self::assertSame('RE: 회원님께 Ersi님이 메시지를 보냈습니다.', $message->getSubject()); $from = $message->getFrom(); - static::assertNotNull($from); - static::assertSame('김 현진', $from->getName()); + self::assertNotNull($from); + self::assertSame('김 현진', $from->getName()); } - /** - * @dataProvider provideIconvCharsets - */ + #[DataProvider('provideIconvCharsets')] public function testIconvFallback(string $charset, string $charList, string $encoding): void { $subject = \sprintf('[%s:%s]', $charset, $encoding); $contents = \iconv('UTF-8', $charset, $charList); - static::assertIsString($contents); + self::assertIsString($contents); $this->createTestMessage( $this->mailbox, @@ -285,14 +293,14 @@ public function testIconvFallback(string $charset, string $charList, string $enc $message = $this->mailbox->getMessage(1); - static::assertSame($subject, $message->getSubject()); - static::assertSame($charList, \rtrim((string) $message->getBodyText())); + self::assertSame($subject, $message->getSubject()); + self::assertSame($charList, \rtrim((string) $message->getBodyText())); } /** * @return array */ - public function provideIconvCharsets(): array + public static function provideIconvCharsets(): array { $provider = []; foreach (self::ICONV_ONLY_CHARSETS as $charset => $charList) { @@ -309,34 +317,34 @@ public function testEmailAddress(): void $this->mailbox->addMessage($this->getFixture('email_address')); $message = $this->mailbox->getMessage(1); - static::assertSame('<123@example.com>', $message->getId()); - static::assertGreaterThan(0, $message->getNumber()); - static::assertGreaterThan(0, $message->getSize()); - static::assertGreaterThan(0, $message->getBytes()); - static::assertNotEmpty($message->getParameters()); - static::assertNull($message->getLines()); - static::assertNull($message->getDisposition()); - static::assertNull($message->getDescription()); - static::assertNotEmpty($message->getStructure()); + self::assertSame('<123@example.com>', $message->getId()); + self::assertGreaterThan(0, $message->getNumber()); + self::assertGreaterThan(0, $message->getSize()); + self::assertGreaterThan(0, $message->getBytes()); + self::assertNotEmpty($message->getParameters()); + self::assertNull($message->getLines()); + self::assertNull($message->getDisposition()); + self::assertNull($message->getDescription()); + self::assertNotEmpty($message->getStructure()); $from = $message->getFrom(); - static::assertInstanceOf(EmailAddress::class, $from); - static::assertSame('no_host', $from->getMailbox()); + self::assertInstanceOf(EmailAddress::class, $from); + self::assertSame('no_host', $from->getMailbox()); $cc = $message->getCc(); - static::assertCount(2, $cc); - static::assertInstanceOf(EmailAddress::class, $cc[0]); - static::assertSame('This one: is "right"', $cc[0]->getName()); - static::assertSame('dong.com', $cc[0]->getHostname()); - static::assertSame('ding@dong.com', $cc[0]->getAddress()); - static::assertSame('"This one: is \\"right\\"" ', $cc[0]->getFullAddress()); + self::assertCount(2, $cc); + self::assertInstanceOf(EmailAddress::class, $cc[0]); + self::assertSame('This one: is "right"', $cc[0]->getName()); + self::assertSame('dong.com', $cc[0]->getHostname()); + self::assertSame('ding@dong.com', $cc[0]->getAddress()); + self::assertSame('"This one: is \\"right\\"" ', $cc[0]->getFullAddress()); - static::assertInstanceOf(EmailAddress::class, $cc[1]); - static::assertSame('No-address', $cc[1]->getMailbox()); + self::assertInstanceOf(EmailAddress::class, $cc[1]); + self::assertSame('No-address', $cc[1]->getMailbox()); - static::assertCount(0, $message->getReturnPath()); + self::assertCount(0, $message->getReturnPath()); - static::assertFalse($message->isSeen()); + self::assertFalse($message->isSeen()); } public function testBcc(): void @@ -346,8 +354,8 @@ public function testBcc(): void $message = $this->mailbox->getMessage(1); - static::assertSame('Undisclosed recipients', $message->getSubject()); - static::assertCount(0, $message->getTo()); + self::assertSame('Undisclosed recipients', $message->getSubject()); + self::assertCount(0, $message->getTo()); } public function testDelete(): void @@ -360,9 +368,9 @@ public function testDelete(): void $message->delete(); $this->getConnection()->expunge(); - static::assertCount(2, $this->mailbox); + self::assertCount(2, $this->mailbox); foreach ($this->mailbox->getMessages() as $currentMessage) { - static::assertNotSame('Message C', $currentMessage->getSubject()); + self::assertNotSame('Message C', $currentMessage->getSubject()); } } @@ -375,13 +383,13 @@ public function testUndelete(): void $message = $this->mailbox->getMessage(3); $message->delete(); $message->undelete(); - static::assertFalse($message->isDeleted()); + self::assertFalse($message->isDeleted()); $this->getConnection()->expunge(); - static::assertCount(3, $this->mailbox); - static::assertSame('Message A', $this->mailbox->getMessage(1)->getSubject()); - static::assertSame('Message B', $this->mailbox->getMessage(2)->getSubject()); - static::assertSame('Message C', $this->mailbox->getMessage(3)->getSubject()); + self::assertCount(3, $this->mailbox); + self::assertSame('Message A', $this->mailbox->getMessage(1)->getSubject()); + self::assertSame('Message B', $this->mailbox->getMessage(2)->getSubject()); + self::assertSame('Message C', $this->mailbox->getMessage(3)->getSubject()); } public function testMove(): void @@ -390,15 +398,15 @@ public function testMove(): void $mailboxTwo = $this->createMailbox(); $this->createTestMessage($mailboxOne, 'Message A'); - static::assertCount(1, $mailboxOne); - static::assertCount(0, $mailboxTwo); + self::assertCount(1, $mailboxOne); + self::assertCount(0, $mailboxTwo); $message = $mailboxOne->getMessage(1); $message->move($mailboxTwo); $this->getConnection()->expunge(); - static::assertCount(0, $mailboxOne); - static::assertCount(1, $mailboxTwo); + self::assertCount(0, $mailboxOne); + self::assertCount(1, $mailboxTwo); } public function testResourceMemoryReuse(): void @@ -411,13 +419,13 @@ public function testResourceMemoryReuse(): void // Mailbox::count triggers Mailbox::init // Reinitializing the imap resource to the mailbox 2 - static::assertCount(0, $mailboxTwo); + self::assertCount(0, $mailboxTwo); $message->move($mailboxTwo); $this->getConnection()->expunge(); - static::assertCount(0, $mailboxOne); - static::assertCount(1, $mailboxTwo); + self::assertCount(0, $mailboxOne); + self::assertCount(1, $mailboxTwo); } public function testCopy(): void @@ -426,21 +434,19 @@ public function testCopy(): void $mailboxTwo = $this->createMailbox(); $this->createTestMessage($mailboxOne, 'Message A'); - static::assertCount(1, $mailboxOne); - static::assertCount(0, $mailboxTwo); + self::assertCount(1, $mailboxOne); + self::assertCount(0, $mailboxTwo); $message = $mailboxOne->getMessage(1); $message->copy($mailboxTwo); - static::assertCount(1, $mailboxOne); - static::assertCount(1, $mailboxTwo); + self::assertCount(1, $mailboxOne); + self::assertCount(1, $mailboxTwo); - static::assertFalse($message->isSeen()); + self::assertFalse($message->isSeen()); } - /** - * @dataProvider getAttachmentFixture - */ + #[DataProvider('getAttachmentFixture')] public function testGetAttachments(string $fixture): void { $this->mailbox->addMessage( @@ -448,25 +454,25 @@ public function testGetAttachments(string $fixture): void ); $message = $this->mailbox->getMessage(1); - static::assertTrue($message->hasAttachments()); - static::assertCount(1, $message->getAttachments()); + self::assertTrue($message->hasAttachments()); + self::assertCount(1, $message->getAttachments()); $attachment = $message->getAttachments()[0]; - static::assertSame('application', \strtolower((string) $attachment->getType())); - static::assertSame('vnd.ms-excel', \strtolower((string) $attachment->getSubtype())); - static::assertSame( + self::assertSame('application', \strtolower((string) $attachment->getType())); + self::assertSame('vnd.ms-excel', \strtolower((string) $attachment->getSubtype())); + self::assertSame( 'Prostřeno_2014_poslední volné termíny.xls', $attachment->getFilename() ); - static::assertNull($attachment->getSize()); + self::assertNull($attachment->getSize()); - static::assertFalse($message->isSeen()); + self::assertFalse($message->isSeen()); } /** * @return array> */ - public function getAttachmentFixture(): array + public static function getAttachmentFixture(): array { return [ ['attachment_no_disposition'], @@ -479,8 +485,8 @@ public function testAttachmentLongFilename(): void $this->mailbox->addMessage($this->getFixture('attachment_long_filename')); $message = $this->mailbox->getMessage(1); - static::assertTrue($message->hasAttachments()); - static::assertCount(3, $message->getAttachments()); + self::assertTrue($message->hasAttachments()); + self::assertCount(3, $message->getAttachments()); $actual = []; foreach ($message->getAttachments() as $attachment) { @@ -507,7 +513,7 @@ public function testAttachmentLongFilename(): void ], ]; - static::assertSame($expected, $actual); + self::assertSame($expected, $actual); } public function testPlainTextAttachment(): void @@ -516,35 +522,33 @@ public function testPlainTextAttachment(): void $message = $this->mailbox->getMessage(1); - static::assertSame('Test', $message->getBodyText()); - static::assertNull($message->getBodyHtml()); + self::assertSame('Test', $message->getBodyText()); + self::assertNull($message->getBodyHtml()); - static::assertTrue($message->hasAttachments()); + self::assertTrue($message->hasAttachments()); $attachments = $message->getAttachments(); - static::assertCount(1, $attachments); + self::assertCount(1, $attachments); $attachment = \current($attachments); - static::assertNotFalse($attachment); - static::assertSame('Hi!', $attachment->getDecodedContent()); + self::assertNotFalse($attachment); + self::assertSame('Hi!', $attachment->getDecodedContent()); } - /** - * @dataProvider provideUndisclosedRecipientsCases - */ + #[DataProvider('provideUndisclosedRecipientsCases')] public function testUndiscloredRecipients(string $fixture): void { $this->mailbox->addMessage($this->getFixture($fixture)); $message = $this->mailbox->getMessage(1); - static::assertCount(1, $message->getTo()); + self::assertCount(1, $message->getTo()); } /** * @return array> */ - public function provideUndisclosedRecipientsCases(): array + public static function provideUndisclosedRecipientsCases(): array { return [ ['undisclosed-recipients/minus'], @@ -565,17 +569,15 @@ public function testAdditionalAddresses(): void // 'Return-Path', // Can't get Dovecot return the Return-Path ]; foreach ($emailsByType as $type => $emails) { - static::assertCount(1, $emails, $type); + self::assertCount(1, $emails, $type); $email = \current($emails); - static::assertNotFalse($email); - static::assertSame(\sprintf('%s@here.com', \strtolower($type)), $email->getAddress(), $type); + self::assertNotFalse($email); + self::assertSame(\sprintf('%s@here.com', \strtolower($type)), $email->getAddress(), $type); } } - /** - * @dataProvider provideDateCases - */ + #[DataProvider('provideDateCases')] public function testDates(string $output, string $dateRawHeader): void { $template = $this->getFixture('date-template'); @@ -585,8 +587,8 @@ public function testDates(string $output, string $dateRawHeader): void $message = $this->mailbox->getMessage(1); $date = $message->getDate(); - static::assertInstanceOf(\DateTimeImmutable::class, $date); - static::assertSame($output, $date->format(\DATE_ISO8601), \sprintf('RAW: %s', $dateRawHeader)); + self::assertInstanceOf(\DateTimeImmutable::class, $date); + self::assertSame($output, $date->format(\DATE_ISO8601), \sprintf('RAW: %s', $dateRawHeader)); } /** @@ -594,7 +596,7 @@ public function testDates(string $output, string $dateRawHeader): void * * @return array */ - public function provideDateCases(): array + public static function provideDateCases(): array { return [ ['2017-09-28T09:24:01+0000', 'Thu, 28 Sep 2017 09:24:01 +0000 (UTC)'], @@ -638,12 +640,12 @@ public function testRawHeaders(): void $message = $this->mailbox->getMessage(1); $expectedHeaders = \preg_split('/\R/u', $headers); - static::assertIsArray($expectedHeaders); + self::assertIsArray($expectedHeaders); $expectedHeaders = \implode("\r\n", $expectedHeaders); - static::assertSame($expectedHeaders, $message->getRawHeaders()); + self::assertSame($expectedHeaders, $message->getRawHeaders()); - static::assertFalse($message->isSeen()); + self::assertFalse($message->isSeen()); } /** @@ -656,18 +658,18 @@ public function testGetAllHeaders(): void $message = $this->mailbox->getMessage(1); $headers = $message->getHeaders(); - static::assertGreaterThan(9, \count($headers)); + self::assertGreaterThan(9, \count($headers)); - static::assertArrayHasKey('from', $headers); - static::assertArrayHasKey('date', $headers); - static::assertArrayHasKey('recent', $headers); + self::assertArrayHasKey('from', $headers); + self::assertArrayHasKey('date', $headers); + self::assertArrayHasKey('recent', $headers); - static::assertSame('Wed, 27 Sep 2017 12:48:51 +0200', $headers['date']); + self::assertSame('Wed, 27 Sep 2017 12:48:51 +0200', $headers['date']); $bcc = $headers['bcc']; - static::assertIsArray($bcc); - static::assertSame('A_€@{è_Z', $bcc[0]->personal); + self::assertIsArray($bcc); + self::assertSame('A_€@{è_Z', $bcc[0]->personal); - static::assertFalse($message->isSeen()); + self::assertFalse($message->isSeen()); } public function testSetFlags(): void @@ -676,19 +678,19 @@ public function testSetFlags(): void $message = $this->mailbox->getMessage(1); - static::assertFalse($message->isFlagged()); + self::assertFalse($message->isFlagged()); $message->setFlag('\\Flagged'); - static::assertTrue($message->isFlagged()); + self::assertTrue($message->isFlagged()); $message->clearFlag('\\Flagged'); - static::assertFalse($message->isFlagged()); + self::assertFalse($message->isFlagged()); $message->setFlag('\\Seen'); - static::assertSame('R', $message->isRecent()); - static::assertTrue($message->isSeen()); + self::assertSame('R', $message->isRecent()); + self::assertTrue($message->isSeen()); } /** @@ -696,7 +698,7 @@ public function testSetFlags(): void */ public function testUnstructuredMessage(): void { - static::markTestIncomplete('Missing test case that gets imap_fetchstructure() to return false;'); + self::markTestIncomplete('Missing test case that gets imap_fetchstructure() to return false;'); } public function testPlainOnlyMessage(): void @@ -705,8 +707,8 @@ public function testPlainOnlyMessage(): void $message = $this->mailbox->getMessage(1); - static::assertSame('Hi', \rtrim((string) $message->getBodyText())); - static::assertNull($message->getBodyHtml()); + self::assertSame('Hi', \rtrim((string) $message->getBodyText())); + self::assertNull($message->getBodyHtml()); } public function testHtmlOnlyMessage(): void @@ -715,8 +717,8 @@ public function testHtmlOnlyMessage(): void $message = $this->mailbox->getMessage(1); - static::assertSame('Hi', \rtrim((string) $message->getBodyHtml())); - static::assertNull($message->getBodyText()); + self::assertSame('Hi', \rtrim((string) $message->getBodyHtml())); + self::assertNull($message->getBodyText()); } public function testSimpleMultipart(): void @@ -725,17 +727,17 @@ public function testSimpleMultipart(): void $message = $this->mailbox->getMessage(1); - static::assertSame('MyPlain', $message->getBodyText()); - static::assertSame('MyHtml', $message->getBodyHtml()); + self::assertSame('MyPlain', $message->getBodyText()); + self::assertSame('MyHtml', $message->getBodyHtml()); $parts = []; foreach ($message as $key => $part) { $parts[$key] = $part; } - static::assertCount(2, $parts); + self::assertCount(2, $parts); - static::assertFalse($message->isSeen()); + self::assertFalse($message->isSeen()); } public function testGetRawMessage(): void @@ -745,7 +747,7 @@ public function testGetRawMessage(): void $message = $this->mailbox->getMessage(1); - static::assertSame($fixture, $message->getRawMessage()); + self::assertSame($fixture, $message->getRawMessage()); } public function testSaveFileRawMessage(): void @@ -757,12 +759,12 @@ public function testSaveFileRawMessage(): void $filename = \tempnam(\sys_get_temp_dir(), 'testSaveFileRawMessage'); if (false === $filename) { - static::fail('Unable to create temporary file'); + self::fail('Unable to create temporary file'); } $message->saveRawMessage($filename); - static::assertSame($fixture, \file_get_contents($filename)); + self::assertSame($fixture, \file_get_contents($filename)); \unlink($filename); } @@ -776,13 +778,13 @@ public function testSaveResourceRawMessage(): void $file = \fopen('php://temp', 'w+'); if (false === $file) { - static::fail('Unable to create temporary file stream'); + self::fail('Unable to create temporary file stream'); } $message->saveRawMessage($file); \fseek($file, 0); - static::assertSame($fixture, \stream_get_contents($file)); + self::assertSame($fixture, \stream_get_contents($file)); \fclose($file); } @@ -794,7 +796,7 @@ public function testAttachmentOnlyEmail(): void $message = $this->mailbox->getMessage(1); - static::assertCount(1, $message->getAttachments()); + self::assertCount(1, $message->getAttachments()); } /** @@ -807,7 +809,7 @@ public function testIssue142(): void $message = $this->mailbox->getMessage(1); - static::assertCount(1, $message->getAttachments()); + self::assertCount(1, $message->getAttachments()); } public function testSignedMessage(): void @@ -818,7 +820,7 @@ public function testSignedMessage(): void $message = $this->mailbox->getMessage(1); $attachments = $message->getAttachments(); - static::assertCount(3, $attachments); + self::assertCount(3, $attachments); $expected = [ 'data.xml' => 'PHhtbC8+', @@ -828,7 +830,7 @@ public function testSignedMessage(): void foreach ($attachments as $attachment) { $expectedContains = $expected[$attachment->getFilename()]; - static::assertStringContainsString($expectedContains, $attachment->getContent(), \sprintf('Attachment filename: %s', $attachment->getFilename())); + self::assertStringContainsString($expectedContains, $attachment->getContent(), \sprintf('Attachment filename: %s', $attachment->getFilename())); } } @@ -838,7 +840,7 @@ public function testSimpleMessageWithoutCharset(): void $message = $this->mailbox->getMessage(1); - static::assertSame('Hi', \rtrim((string) $message->getBodyText())); + self::assertSame('Hi', \rtrim((string) $message->getBodyText())); } public function testMultipartMessageWithoutCharset(): void @@ -847,8 +849,8 @@ public function testMultipartMessageWithoutCharset(): void $message = $this->mailbox->getMessage(1); - static::assertSame('MyPlain', $message->getBodyText()); - static::assertSame('MyHtml', $message->getBodyHtml()); + self::assertSame('MyPlain', $message->getBodyText()); + self::assertSame('MyHtml', $message->getBodyHtml()); } public function testGetInReplyTo(): void @@ -858,15 +860,15 @@ public function testGetInReplyTo(): void $message = $this->mailbox->getMessage(1); - static::assertCount(1, $message->getInReplyTo()); - static::assertContains('', $message->getInReplyTo()); + self::assertCount(1, $message->getInReplyTo()); + self::assertContains('', $message->getInReplyTo()); $fixture = $this->getFixture('plain_only'); $this->mailbox->addMessage($fixture); $message = $this->mailbox->getMessage(2); - static::assertCount(0, $message->getInReplyTo()); + self::assertCount(0, $message->getInReplyTo()); } public function testGetReferences(): void @@ -876,15 +878,15 @@ public function testGetReferences(): void $message = $this->mailbox->getMessage(1); - static::assertCount(2, $message->getReferences()); - static::assertContains('<08F04024-A5B3-4FDE-BF2C-6710DE97D8D9@example.com>', $message->getReferences()); + self::assertCount(2, $message->getReferences()); + self::assertContains('<08F04024-A5B3-4FDE-BF2C-6710DE97D8D9@example.com>', $message->getReferences()); $fixture = $this->getFixture('plain_only'); $this->mailbox->addMessage($fixture); $message = $this->mailbox->getMessage(2); - static::assertCount(0, $message->getReferences()); + self::assertCount(0, $message->getReferences()); } public function testInlineAttachment(): void @@ -894,7 +896,7 @@ public function testInlineAttachment(): void $inline = $message->getAttachments()[0]; - static::assertNull($inline->getFilename()); + self::assertNull($inline->getFilename()); } public function testMissingFromHeader(): void @@ -902,7 +904,7 @@ public function testMissingFromHeader(): void $this->mailbox->addMessage($this->getFixture('missing_from')); $message = $this->mailbox->getMessage(1); - static::assertNull($message->getFrom()); + self::assertNull($message->getFrom()); } public function testMissingDateHeader(): void @@ -910,7 +912,7 @@ public function testMissingDateHeader(): void $this->mailbox->addMessage($this->getFixture('missing_date')); $message = $this->mailbox->getMessage(1); - static::assertNull($message->getDate()); + self::assertNull($message->getDate()); } public function testAttachmentMustNotBeCharsetDecoded(): void @@ -938,22 +940,22 @@ public function testAttachmentMustNotBeCharsetDecoded(): void $messageString = $message->toString(); $messageString = \preg_replace('/; charset=.+/', '', $messageString); - static::assertIsString($messageString); + self::assertIsString($messageString); $this->mailbox->addMessage($messageString); $message = $this->mailbox->getMessage(1); $this->resetAttachmentCharset($message); - static::assertTrue($message->hasAttachments()); + self::assertTrue($message->hasAttachments()); $attachments = $message->getAttachments(); - static::assertCount(\count(self::CHARSETS), $attachments); + self::assertCount(\count(self::CHARSETS), $attachments); foreach ($attachments as $attachment) { $filename = $attachment->getFilename(); - static::assertNotNull($filename); + self::assertNotNull($filename); $charset = \str_replace('.xml', '', $filename); - static::assertSame(\mb_convert_encoding(self::CHARSETS[$charset], $charset, 'UTF-8'), $attachment->getDecodedContent()); + self::assertSame(\mb_convert_encoding(self::CHARSETS[$charset], $charset, 'UTF-8'), $attachment->getDecodedContent()); } } @@ -963,7 +965,7 @@ public function testNoMessageId(): void $message = $this->mailbox->getMessage(1); - static::assertNull($message->getId()); + self::assertNull($message->getId()); } public function testUnknownEncodingIsManageable(): void @@ -977,11 +979,11 @@ public function testUnknownEncodingIsManageable(): void $parts[$part->getSubtype()] = $part; } - static::assertArrayHasKey(PartInterface::SUBTYPE_PLAIN, $parts); + self::assertArrayHasKey(PartInterface::SUBTYPE_PLAIN, $parts); $plain = $parts[PartInterface::SUBTYPE_PLAIN]; - static::assertSame(PartInterface::ENCODING_UNKNOWN, $plain->getEncoding()); + self::assertSame(PartInterface::ENCODING_UNKNOWN, $plain->getEncoding()); $this->expectException(UnexpectedEncodingException::class); @@ -994,7 +996,7 @@ public function testMultipleAttachments(): void $message = $this->mailbox->getMessage(1); - static::assertCount(2, $message->getAttachments()); + self::assertCount(2, $message->getAttachments()); } public function testMixedInlineDisposition(): void @@ -1004,11 +1006,11 @@ public function testMixedInlineDisposition(): void $message = $this->mailbox->getMessage(1); $attachments = $message->getAttachments(); - static::assertCount(1, $attachments); + self::assertCount(1, $attachments); $attachment = \current($attachments); - static::assertNotFalse($attachment); - static::assertSame('Price4VladDaKar.xlsx', $attachment->getFilename()); + self::assertNotFalse($attachment); + self::assertSame('Price4VladDaKar.xlsx', $attachment->getFilename()); } public function testNestesEmbeddedWithAttachment(): void @@ -1023,9 +1025,9 @@ public function testNestesEmbeddedWithAttachment(): void 'second.eml' => 'Subject: SECOND', ]; $attachments = $message->getAttachments(); - static::assertCount(3, $attachments); + self::assertCount(3, $attachments); foreach ($attachments as $attachment) { - static::assertStringContainsString($expected[$attachment->getFilename()], $attachment->getContent()); + self::assertStringContainsString($expected[$attachment->getFilename()], $attachment->getContent()); } } @@ -1041,21 +1043,21 @@ public function testMultipleHtmlParts(): void 'attachment2.pdf', ]; $attachments = $message->getAttachments(); - static::assertCount(2, $attachments); + self::assertCount(2, $attachments); foreach ($attachments as $attachment) { - static::assertContains($attachment->getFilename(), $expectedFileNames); + self::assertContains($attachment->getFilename(), $expectedFileNames); } // Test html parts - static::assertCount(3, $message->getBodyHtmlParts()); + self::assertCount(3, $message->getBodyHtmlParts()); // Test html parts $completeBody = $message->getCompleteBodyHtml(); $completeBody = null === $completeBody ? '' : $completeBody; - static::assertStringContainsString('first', $completeBody); - static::assertStringContainsString('second', $completeBody); - static::assertStringContainsString('last', $completeBody); + self::assertStringContainsString('first', $completeBody); + self::assertStringContainsString('second', $completeBody); + self::assertStringContainsString('last', $completeBody); } public function testBodyHtmlEmpty(): void @@ -1064,9 +1066,9 @@ public function testBodyHtmlEmpty(): void $message = $this->mailbox->getMessage(1); - static::assertCount(0, $message->getBodyHtmlParts()); + self::assertCount(0, $message->getBodyHtmlParts()); - static::assertNull($message->getCompleteBodyHtml()); + self::assertNull($message->getCompleteBodyHtml()); } public function testBodyHtmlOnePart(): void @@ -1075,9 +1077,9 @@ public function testBodyHtmlOnePart(): void $message = $this->mailbox->getMessage(1); - static::assertCount(1, $message->getBodyHtmlParts()); + self::assertCount(1, $message->getBodyHtmlParts()); - static::assertNotNull($message->getCompleteBodyHtml()); + self::assertNotNull($message->getCompleteBodyHtml()); } public function testImapMimeHeaderDecodeReturnsFalse(): void @@ -1086,7 +1088,7 @@ public function testImapMimeHeaderDecodeReturnsFalse(): void $message = $this->mailbox->getMessage(1); - static::assertSame('=?UTF-8?B?nnDusSNdG92w6Fuw61fMjAxOF8wMy0xMzMyNTMzMTkzLnBkZg==?=', $message->getSubject()); + self::assertSame('=?UTF-8?B?nnDusSNdG92w6Fuw61fMjAxOF8wMy0xMzMyNTMzMTkzLnBkZg==?=', $message->getSubject()); } /** @@ -1098,23 +1100,18 @@ private function resetAttachmentCharset(MessageInterface $message): void // of attachments that don't have it $refMessage = new \ReflectionClass($message); $refAbstractMessage = $refMessage->getParentClass(); - static::assertInstanceOf(\ReflectionClass::class, $refAbstractMessage); + self::assertInstanceOf(\ReflectionClass::class, $refAbstractMessage); $refAbstractPart = $refAbstractMessage->getParentClass(); - static::assertInstanceOf(\ReflectionClass::class, $refAbstractPart); + self::assertInstanceOf(\ReflectionClass::class, $refAbstractPart); $refLazyLoadStructure = $refMessage->getMethod('lazyLoadStructure'); - $refLazyLoadStructure->setAccessible(true); $refLazyLoadStructure->invoke($message); - $refLazyLoadStructure->setAccessible(false); $refParts = $refAbstractPart->getProperty('parts'); - $refParts->setAccessible(true); $refParts->setValue($message, []); - $refParts->setAccessible(false); $refStructure = $refAbstractPart->getProperty('structure'); - $refStructure->setAccessible(true); - $structure = $refStructure->getValue($message); + $structure = $refStructure->getValue($message); foreach ($structure->parts as $partIndex => $part) { if ($part->ifdisposition && 'attachment' === $part->disposition) { foreach ($part->parameters as $parameterIndex => $parameter) { @@ -1128,12 +1125,9 @@ private function resetAttachmentCharset(MessageInterface $message): void } } $refStructure->setValue($message, $structure); - $refStructure->setAccessible(false); $refParseStructure = $refAbstractPart->getMethod('lazyParseStructure'); - $refParseStructure->setAccessible(true); $refParseStructure->invoke($message); - $refParseStructure->setAccessible(false); } public function testEmptyMessageIterator(): void @@ -1141,7 +1135,7 @@ public function testEmptyMessageIterator(): void $mailbox = $this->createMailbox(); $messages = $mailbox->getMessages(); - static::assertCount(0, $messages); + self::assertCount(0, $messages); $this->expectException(OutOfBoundsException::class); @@ -1154,7 +1148,7 @@ public function testGbkCharsetDecoding(): void $message = $this->mailbox->getMessage(1); - static::assertSame('Hi', \trim($message->getDecodedContent())); + self::assertSame('Hi', \trim($message->getDecodedContent())); } public function testUndefinedCharset(): void @@ -1165,11 +1159,11 @@ public function testUndefinedCharset(): void $headers = $message->getHeaders(); - static::assertCount(1, $message->getTo()); - static::assertSame('<201702270351.BGF77614@bla.bla>', $headers['message_id']); - static::assertArrayNotHasKey('subject', $headers); - static::assertArrayNotHasKey('from', $headers); - static::assertNull($message->getSubject()); - static::assertNull($message->getFrom()); + self::assertCount(1, $message->getTo()); + self::assertSame('<201702270351.BGF77614@bla.bla>', $headers['message_id']); + self::assertArrayNotHasKey('subject', $headers); + self::assertArrayNotHasKey('from', $headers); + self::assertNull($message->getSubject()); + self::assertNull($message->getFrom()); } } diff --git a/tests/MockabilityTest.php b/tests/MockabilityTest.php index a7cf3449..1dcb35e7 100644 --- a/tests/MockabilityTest.php +++ b/tests/MockabilityTest.php @@ -10,11 +10,10 @@ use Ddeboer\Imap\MessageInterface; use Ddeboer\Imap\ServerInterface; use Ddeboer\Imap\Test\RawMessageIterator; +use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; -/** - * @covers \Ddeboer\Imap\Test\RawMessageIterator - */ +#[CoversClass(RawMessageIterator::class)] final class MockabilityTest extends TestCase { public function testFullMockedBehaviour(): void @@ -27,40 +26,40 @@ public function testFullMockedBehaviour(): void $attachmentMock = $this->createMock(AttachmentInterface::class); $attachmentMock - ->expects(static::once()) + ->expects(self::once()) ->method('getFilename') ->willReturn($attachmentFilename) ; $messageMock = $this->createMock(MessageInterface::class); $messageMock - ->expects(static::once()) + ->expects(self::once()) ->method('getAttachments') ->willReturn([$attachmentMock]) ; $mailboxMock = $this->createMock(MailboxInterface::class); $mailboxMock - ->expects(static::once()) + ->expects(self::once()) ->method('getMessages') ->willReturn(new RawMessageIterator([$messageMock])) ; $connectionMock = $this->createMock(ConnectionInterface::class); $connectionMock - ->expects(static::once()) + ->expects(self::once()) ->method('getMailbox') - ->with(static::identicalTo($inboxName)) + ->with(self::identicalTo($inboxName)) ->willReturn($mailboxMock) ; $serverMock = $this->createMock(ServerInterface::class); $serverMock - ->expects(static::once()) + ->expects(self::once()) ->method('authenticate') ->with( - static::identicalTo($username), - static::identicalTo($password) + self::identicalTo($username), + self::identicalTo($password) ) ->willReturn($connectionMock) ; @@ -70,7 +69,7 @@ public function testFullMockedBehaviour(): void $mailbox = $connection->getMailbox($inboxName); $messages = $mailbox->getMessages(); - static::assertCount(1, $messages); + self::assertCount(1, $messages); // This foreach has the solely purpose to trigger code-coverage for // RawMessageIterator::current() and prove RawMessageIterator is @@ -80,15 +79,15 @@ public function testFullMockedBehaviour(): void $loopedMessages[] = $message; } - static::assertCount(1, $loopedMessages); + self::assertCount(1, $loopedMessages); $foundMessage = \current($loopedMessages); - static::assertInstanceOf(MessageInterface::class, $foundMessage); + self::assertInstanceOf(MessageInterface::class, $foundMessage); $attachments = $foundMessage->getAttachments(); - static::assertCount(1, $attachments); + self::assertCount(1, $attachments); $attachment = \current($attachments); - static::assertNotFalse($attachment); - static::assertSame($attachmentFilename, $attachment->getFilename()); + self::assertNotFalse($attachment); + self::assertSame($attachmentFilename, $attachment->getFilename()); } } diff --git a/tests/Search/Date/AbstractDateTest.php b/tests/Search/Date/AbstractDateTest.php index da204f22..38d46058 100644 --- a/tests/Search/Date/AbstractDateTest.php +++ b/tests/Search/Date/AbstractDateTest.php @@ -4,17 +4,14 @@ namespace Ddeboer\Imap\Tests\Search\Date; -use Ddeboer\Imap\Tests\AbstractTest; +use Ddeboer\Imap\Search\AbstractDate; +use Ddeboer\Imap\Tests\AbstractTestCase; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \Ddeboer\Imap\Search\AbstractDate - */ -final class AbstractDateTest extends AbstractTest +#[CoversClass(AbstractDate::class)] +final class AbstractDateTest extends AbstractTestCase { - /** - * @var \DateTimeImmutable - */ - protected $date; + private \DateTimeImmutable $date; protected function setUp(): void { @@ -25,13 +22,13 @@ public function testDefaultFormat(): void { $condition = new TestAsset\FooDate($this->date); - static::assertSame('BAR "2-Mar-2017"', $condition->toString()); + self::assertSame('BAR "2-Mar-2017"', $condition->toString()); } public function testCustomFormat(): void { $condition = new TestAsset\FooDate($this->date, 'j F Y'); - static::assertSame('BAR "2 March 2017"', $condition->toString()); + self::assertSame('BAR "2 March 2017"', $condition->toString()); } } diff --git a/tests/ServerTest.php b/tests/ServerTest.php index 341a7bad..9a404373 100644 --- a/tests/ServerTest.php +++ b/tests/ServerTest.php @@ -7,11 +7,10 @@ use Ddeboer\Imap\Connection; use Ddeboer\Imap\Exception\AuthenticationFailedException; use Ddeboer\Imap\Server; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \Ddeboer\Imap\Server - */ -final class ServerTest extends AbstractTest +#[CoversClass(Server::class)] +final class ServerTest extends AbstractTestCase { public function testValidConnection(): void { @@ -19,7 +18,7 @@ public function testValidConnection(): void $check = \imap_check($connection->getResource()->getStream()); - static::assertInstanceOf(\stdClass::class, $check); + self::assertInstanceOf(\stdClass::class, $check); } public function testFailedAuthenticate(): void @@ -35,12 +34,12 @@ public function testFailedAuthenticate(): void public function testEmptyPort(): void { if ('993' !== (string) \getenv('IMAP_SERVER_PORT')) { - static::markTestSkipped('Active IMAP test server must have 993 port for this test'); + self::markTestSkipped('Active IMAP test server must have 993 port for this test'); } $server = new Server((string) \getenv('IMAP_SERVER_NAME'), '', self::IMAP_FLAGS); - static::assertInstanceOf(Connection::class, $server->authenticate((string) \getenv('IMAP_USERNAME'), (string) \getenv('IMAP_PASSWORD'))); + self::assertInstanceOf(Connection::class, $server->authenticate((string) \getenv('IMAP_USERNAME'), (string) \getenv('IMAP_PASSWORD'))); } public function testCustomOptions(): void @@ -51,12 +50,12 @@ public function testCustomOptions(): void $check = \imap_check($connection->getResource()->getStream()); - static::assertNotFalse($check); + self::assertNotFalse($check); $mailbox = \strtolower($check->Mailbox); - static::assertStringContainsString((string) \getenv('IMAP_USERNAME'), $mailbox); - static::assertStringNotContainsString('inbox', $mailbox); - static::assertStringContainsString('no_mailbox', $mailbox); + self::assertStringContainsString((string) \getenv('IMAP_USERNAME'), $mailbox); + self::assertStringNotContainsString('inbox', $mailbox); + self::assertStringContainsString('no_mailbox', $mailbox); } }