mirror of
https://github.com/itflow-org/itflow
synced 2026-02-28 02:44:53 +00:00
Migrated away from PHP Mail Parser to the new WebKlex PHP IMAP Mail Parser this will open the way to support OAUTH2 for Mail servers such as Microsoft 365 and Google Workspaces
This commit is contained in:
447
plugins/php-imap/tests/live/FolderTest.php
Normal file
447
plugins/php-imap/tests/live/FolderTest.php
Normal file
@@ -0,0 +1,447 @@
|
||||
<?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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user