itflow/plugins/vendor/webklex/php-imap/tests/live/FolderTest.php

447 lines
14 KiB
PHP

<?php
/*
* File: FolderTest.php
* Category: -
* Author: M.Goldenbaum
* Created: 04.03.23 03:52
* Updated: -
*
* Description:
* -
*/
namespace Tests\live;
use Webklex\PHPIMAP\Client;
use Webklex\PHPIMAP\Exceptions\AuthFailedException;
use Webklex\PHPIMAP\Exceptions\ConnectionFailedException;
use Webklex\PHPIMAP\Exceptions\EventNotFoundException;
use Webklex\PHPIMAP\Exceptions\FolderFetchingException;
use Webklex\PHPIMAP\Exceptions\ImapBadRequestException;
use Webklex\PHPIMAP\Exceptions\ImapServerErrorException;
use Webklex\PHPIMAP\Exceptions\InvalidMessageDateException;
use Webklex\PHPIMAP\Exceptions\MaskNotFoundException;
use Webklex\PHPIMAP\Exceptions\MessageContentFetchingException;
use Webklex\PHPIMAP\Exceptions\MessageFlagException;
use Webklex\PHPIMAP\Exceptions\MessageHeaderFetchingException;
use Webklex\PHPIMAP\Exceptions\MessageNotFoundException;
use Webklex\PHPIMAP\Exceptions\ResponseException;
use Webklex\PHPIMAP\Exceptions\RuntimeException;
use Webklex\PHPIMAP\Folder;
use Webklex\PHPIMAP\Message;
use Webklex\PHPIMAP\Query\WhereQuery;
use Webklex\PHPIMAP\Support\FolderCollection;
/**
* Class FolderTest
*
* @package Tests
*/
class FolderTest extends LiveMailboxTestCase {
/**
* Try to create a new query instance
*
* @return void
* @throws AuthFailedException
* @throws ConnectionFailedException
* @throws FolderFetchingException
* @throws ImapBadRequestException
* @throws ImapServerErrorException
* @throws MaskNotFoundException
* @throws ResponseException
* @throws RuntimeException
*/
public function testQuery(): void {
$folder = $this->getFolder('INBOX');
self::assertInstanceOf(Folder::class, $folder);
self::assertInstanceOf(WhereQuery::class, $folder->query());
self::assertInstanceOf(WhereQuery::class, $folder->search());
self::assertInstanceOf(WhereQuery::class, $folder->messages());
}
/**
* Test Folder::hasChildren()
*
* @return void
* @throws AuthFailedException
* @throws ConnectionFailedException
* @throws FolderFetchingException
* @throws ImapBadRequestException
* @throws ImapServerErrorException
* @throws MaskNotFoundException
* @throws ResponseException
* @throws RuntimeException
* @throws EventNotFoundException
*/
public function testHasChildren(): void {
$folder = $this->getFolder('INBOX');
self::assertInstanceOf(Folder::class, $folder);
$delimiter = $this->getManager()->getConfig()->get("options.delimiter");
$child_path = implode($delimiter, ['INBOX', 'test']);
if ($folder->getClient()->getFolder($child_path) === null) {
$folder->getClient()->createFolder($child_path, false);
$folder = $this->getFolder('INBOX');
}
self::assertTrue($folder->hasChildren());
}
/**
* Test Folder::setChildren()
*
* @return void
* @throws AuthFailedException
* @throws ConnectionFailedException
* @throws EventNotFoundException
* @throws FolderFetchingException
* @throws ImapBadRequestException
* @throws ImapServerErrorException
* @throws MaskNotFoundException
* @throws ResponseException
* @throws RuntimeException
*/
public function testSetChildren(): void {
$folder = $this->getFolder('INBOX');
self::assertInstanceOf(Folder::class, $folder);
$delimiter = $this->getManager()->getConfig()->get("options.delimiter");
$child_path = implode($delimiter, ['INBOX', 'test']);
if ($folder->getClient()->getFolder($child_path) === null) {
$folder->getClient()->createFolder($child_path, false);
$folder = $this->getFolder('INBOX');
}
self::assertTrue($folder->hasChildren());
$folder->setChildren(new FolderCollection());
self::assertTrue($folder->getChildren()->isEmpty());
}
/**
* Test Folder::getChildren()
*
* @return void
* @throws AuthFailedException
* @throws ConnectionFailedException
* @throws EventNotFoundException
* @throws FolderFetchingException
* @throws ImapBadRequestException
* @throws ImapServerErrorException
* @throws MaskNotFoundException
* @throws ResponseException
* @throws RuntimeException
*/
public function testGetChildren(): void {
$folder = $this->getFolder('INBOX');
self::assertInstanceOf(Folder::class, $folder);
$delimiter = $this->getManager()->getConfig()->get("options.delimiter");
$child_path = implode($delimiter, ['INBOX', 'test']);
if ($folder->getClient()->getFolder($child_path) === null) {
$folder->getClient()->createFolder($child_path, false);
}
$folder = $folder->getClient()->getFolders()->where('name', 'INBOX')->first();
self::assertInstanceOf(Folder::class, $folder);
self::assertTrue($folder->hasChildren());
self::assertFalse($folder->getChildren()->isEmpty());
}
/**
* Test Folder::move()
*
* @return void
* @throws AuthFailedException
* @throws ConnectionFailedException
* @throws EventNotFoundException
* @throws FolderFetchingException
* @throws ImapBadRequestException
* @throws ImapServerErrorException
* @throws MaskNotFoundException
* @throws ResponseException
* @throws RuntimeException
*/
public function testMove(): void {
$client = $this->getClient();
$delimiter = $this->getManager()->getConfig()->get("options.delimiter");
$folder_path = implode($delimiter, ['INBOX', 'test']);
$folder = $client->getFolder($folder_path);
if ($folder === null) {
$folder = $client->createFolder($folder_path, false);
}
$new_folder_path = implode($delimiter, ['INBOX', 'other']);
$new_folder = $client->getFolder($new_folder_path);
$new_folder?->delete(false);
$status = $folder->move($new_folder_path, false);
self::assertIsArray($status);
self::assertTrue(str_starts_with($status[0], 'OK'));
$new_folder = $client->getFolder($new_folder_path);
self::assertEquals($new_folder_path, $new_folder->path);
self::assertEquals('other', $new_folder->name);
if ($this->deleteFolder($new_folder) === false) {
$this->fail("Could not delete folder: " . $new_folder->path);
}
}
/**
* Test Folder::delete()
*
* @return void
* @throws AuthFailedException
* @throws ConnectionFailedException
* @throws EventNotFoundException
* @throws FolderFetchingException
* @throws ImapBadRequestException
* @throws ImapServerErrorException
* @throws MaskNotFoundException
* @throws ResponseException
* @throws RuntimeException
*/
public function testDelete(): void {
$client = $this->getClient();
$delimiter = $this->getManager()->getConfig()->get("options.delimiter");
$folder_path = implode($delimiter, ['INBOX', 'test']);
$folder = $client->getFolder($folder_path);
if ($folder === null) {
$folder = $client->createFolder($folder_path, false);
}
self::assertInstanceOf(Folder::class, $folder);
if ($this->deleteFolder($folder) === false) {
$this->fail("Could not delete folder: " . $folder->path);
}
}
/**
* Test Folder::overview()
*
* @return void
* @throws AuthFailedException
* @throws ConnectionFailedException
* @throws EventNotFoundException
* @throws FolderFetchingException
* @throws ImapBadRequestException
* @throws ImapServerErrorException
* @throws MaskNotFoundException
* @throws ResponseException
* @throws RuntimeException
* @throws InvalidMessageDateException
* @throws MessageContentFetchingException
* @throws MessageFlagException
* @throws MessageHeaderFetchingException
* @throws MessageNotFoundException
*/
public function testOverview(): void {
$folder = $this->getFolder('INBOX');
self::assertInstanceOf(Folder::class, $folder);
$folder->select();
// Test empty overview
$overview = $folder->overview();
self::assertIsArray($overview);
self::assertCount(0, $overview);
$message = $this->appendMessageTemplate($folder, "plain.eml");
$overview = $folder->overview();
self::assertIsArray($overview);
self::assertCount(1, $overview);
self::assertEquals($message->from->first()->full, end($overview)["from"]->toString());
self::assertTrue($message->delete());
}
/**
* Test Folder::appendMessage()
*
* @return void
* @throws AuthFailedException
* @throws ConnectionFailedException
* @throws EventNotFoundException
* @throws FolderFetchingException
* @throws ImapBadRequestException
* @throws ImapServerErrorException
* @throws InvalidMessageDateException
* @throws MaskNotFoundException
* @throws MessageContentFetchingException
* @throws MessageFlagException
* @throws MessageHeaderFetchingException
* @throws MessageNotFoundException
* @throws ResponseException
* @throws RuntimeException
*/
public function testAppendMessage(): void {
$folder = $this->getFolder('INBOX');
self::assertInstanceOf(Folder::class, $folder);
$message = $this->appendMessageTemplate($folder, "plain.eml");
self::assertInstanceOf(Message::class, $message);
self::assertEquals("Example", $message->subject);
self::assertEquals("to@someone-else.com", $message->to);
self::assertEquals("from@someone.com", $message->from);
// Clean up
$this->assertTrue($message->delete(true));
}
/**
* Test Folder::subscribe()
*
* @return void
* @throws AuthFailedException
* @throws ConnectionFailedException
* @throws FolderFetchingException
* @throws ImapBadRequestException
* @throws ImapServerErrorException
* @throws MaskNotFoundException
* @throws ResponseException
* @throws RuntimeException
*/
public function testSubscribe(): void {
$folder = $this->getFolder('INBOX');
self::assertInstanceOf(Folder::class, $folder);
$status = $folder->subscribe();
self::assertIsArray($status);
self::assertTrue(str_starts_with($status[0], 'OK'));
// Clean up
$folder->unsubscribe();
}
/**
* Test Folder::unsubscribe()
*
* @return void
* @throws AuthFailedException
* @throws ConnectionFailedException
* @throws FolderFetchingException
* @throws ImapBadRequestException
* @throws ImapServerErrorException
* @throws MaskNotFoundException
* @throws ResponseException
* @throws RuntimeException
*/
public function testUnsubscribe(): void {
$folder = $this->getFolder('INBOX');
self::assertInstanceOf(Folder::class, $folder);
$folder->subscribe();
$status = $folder->subscribe();
self::assertIsArray($status);
self::assertTrue(str_starts_with($status[0], 'OK'));
}
/**
* Test Folder::status()
*
* @return void
* @throws AuthFailedException
* @throws ConnectionFailedException
* @throws FolderFetchingException
* @throws ImapBadRequestException
* @throws ImapServerErrorException
* @throws MaskNotFoundException
* @throws ResponseException
* @throws RuntimeException
*/
public function testStatus(): void {
$folder = $this->getFolder('INBOX');
self::assertInstanceOf(Folder::class, $folder);
$status = $folder->status();
self::assertEquals(0, $status['messages']);
self::assertEquals(0, $status['recent']);
self::assertEquals(0, $status['unseen']);
self::assertGreaterThan(0, $status['uidnext']);
self::assertGreaterThan(0, $status['uidvalidity']);
}
/**
* Test Folder::examine()
*
* @return void
* @throws AuthFailedException
* @throws ConnectionFailedException
* @throws FolderFetchingException
* @throws ImapBadRequestException
* @throws ImapServerErrorException
* @throws MaskNotFoundException
* @throws ResponseException
* @throws RuntimeException
*/
public function testExamine(): void {
$folder = $this->getFolder('INBOX');
self::assertInstanceOf(Folder::class, $folder);
$status = $folder->examine();
self::assertTrue(isset($status["flags"]) && count($status["flags"]) > 0);
self::assertTrue(($status["uidnext"] ?? 0) > 0);
self::assertTrue(($status["uidvalidity"] ?? 0) > 0);
self::assertTrue(($status["recent"] ?? -1) >= 0);
self::assertTrue(($status["exists"] ?? -1) >= 0);
}
/**
* Test Folder::getClient()
*
* @return void
* @throws AuthFailedException
* @throws ConnectionFailedException
* @throws FolderFetchingException
* @throws ImapBadRequestException
* @throws ImapServerErrorException
* @throws MaskNotFoundException
* @throws ResponseException
* @throws RuntimeException
*/
public function testGetClient(): void {
$folder = $this->getFolder('INBOX');
self::assertInstanceOf(Folder::class, $folder);
self::assertInstanceOf(Client::class, $folder->getClient());
}
/**
* Test Folder::setDelimiter()
*
* @return void
* @throws AuthFailedException
* @throws ConnectionFailedException
* @throws FolderFetchingException
* @throws ImapBadRequestException
* @throws ImapServerErrorException
* @throws MaskNotFoundException
* @throws ResponseException
* @throws RuntimeException
*/
public function testSetDelimiter(): void {
$folder = $this->getFolder('INBOX');
self::assertInstanceOf(Folder::class, $folder);
$folder->setDelimiter("/");
self::assertEquals("/", $folder->delimiter);
$folder->setDelimiter(".");
self::assertEquals(".", $folder->delimiter);
$default_delimiter = $this->getManager()->getConfig()->get("options.delimiter", "/");
$folder->setDelimiter(null);
self::assertEquals($default_delimiter, $folder->delimiter);
}
}