mirror of https://github.com/itflow-org/itflow
220 lines
6.8 KiB
PHP
220 lines
6.8 KiB
PHP
<?php
|
||
/*
|
||
* File: LiveMailboxTestCase.php
|
||
* Category: -
|
||
* Author: M.Goldenbaum
|
||
* Created: 04.03.23 03:43
|
||
* Updated: -
|
||
*
|
||
* Description:
|
||
* -
|
||
*/
|
||
|
||
namespace Tests\live;
|
||
|
||
use PHPUnit\Framework\TestCase;
|
||
use Webklex\PHPIMAP\Client;
|
||
use Webklex\PHPIMAP\ClientManager;
|
||
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\ResponseException;
|
||
use Webklex\PHPIMAP\Exceptions\RuntimeException;
|
||
use Webklex\PHPIMAP\Folder;
|
||
use Webklex\PHPIMAP\Message;
|
||
|
||
/**
|
||
* Class LiveMailboxTestCase
|
||
*
|
||
* @package Tests
|
||
*/
|
||
abstract class LiveMailboxTestCase extends TestCase {
|
||
|
||
/**
|
||
* Special chars
|
||
*/
|
||
const SPECIAL_CHARS = 'A_\\|!"£$%&()=?àèìòùÀÈÌÒÙ<>-@#[]_ß_б_π_€_✔_你_يد_Z_';
|
||
|
||
/**
|
||
* Client manager
|
||
* @var ClientManager $manager
|
||
*/
|
||
protected static ClientManager $manager;
|
||
|
||
/**
|
||
* Get the client manager
|
||
*
|
||
* @return ClientManager
|
||
*/
|
||
final protected function getManager(): ClientManager {
|
||
if (!isset(self::$manager)) {
|
||
self::$manager = new ClientManager([
|
||
'options' => [
|
||
"debug" => $_ENV["LIVE_MAILBOX_DEBUG"] ?? false,
|
||
],
|
||
'accounts' => [
|
||
'default' => [
|
||
'host' => getenv("LIVE_MAILBOX_HOST"),
|
||
'port' => getenv("LIVE_MAILBOX_PORT"),
|
||
'encryption' => getenv("LIVE_MAILBOX_ENCRYPTION"),
|
||
'validate_cert' => getenv("LIVE_MAILBOX_VALIDATE_CERT"),
|
||
'username' => getenv("LIVE_MAILBOX_USERNAME"),
|
||
'password' => getenv("LIVE_MAILBOX_PASSWORD"),
|
||
'protocol' => 'imap', //might also use imap, [pop3 or nntp (untested)]
|
||
],
|
||
],
|
||
]);
|
||
}
|
||
return self::$manager;
|
||
}
|
||
|
||
/**
|
||
* Get the client
|
||
*
|
||
* @return Client
|
||
* @throws MaskNotFoundException
|
||
*/
|
||
final protected function getClient(): Client {
|
||
if (!getenv("LIVE_MAILBOX") ?? false) {
|
||
$this->markTestSkipped("This test requires a live mailbox. Please set the LIVE_MAILBOX environment variable to run this test.");
|
||
}
|
||
return $this->getManager()->account('default');
|
||
}
|
||
|
||
/**
|
||
* Get special chars
|
||
*
|
||
* @return string
|
||
*/
|
||
final protected function getSpecialChars(): string {
|
||
return self::SPECIAL_CHARS;
|
||
}
|
||
|
||
/**
|
||
* Get a folder
|
||
* @param string $folder_path
|
||
*
|
||
* @return Folder
|
||
* @throws AuthFailedException
|
||
* @throws ConnectionFailedException
|
||
* @throws ImapBadRequestException
|
||
* @throws ImapServerErrorException
|
||
* @throws MaskNotFoundException
|
||
* @throws ResponseException
|
||
* @throws RuntimeException
|
||
* @throws FolderFetchingException
|
||
*/
|
||
final protected function getFolder(string $folder_path = "INDEX"): Folder {
|
||
$client = $this->getClient();
|
||
self::assertInstanceOf(Client::class, $client->connect());
|
||
|
||
$folder = $client->getFolderByPath($folder_path);
|
||
self::assertInstanceOf(Folder::class, $folder);
|
||
|
||
return $folder;
|
||
}
|
||
|
||
/**
|
||
* Append a message to a folder
|
||
* @param Folder $folder
|
||
* @param string $message
|
||
*
|
||
* @return Message
|
||
* @throws AuthFailedException
|
||
* @throws ConnectionFailedException
|
||
* @throws EventNotFoundException
|
||
* @throws ImapBadRequestException
|
||
* @throws ImapServerErrorException
|
||
* @throws InvalidMessageDateException
|
||
* @throws MessageContentFetchingException
|
||
* @throws MessageFlagException
|
||
* @throws MessageHeaderFetchingException
|
||
* @throws ResponseException
|
||
* @throws RuntimeException
|
||
*/
|
||
final protected function appendMessage(Folder $folder, string $message): Message {
|
||
$status = $folder->select();
|
||
if (!isset($status['uidnext'])) {
|
||
$this->fail("No UIDNEXT returned");
|
||
}
|
||
|
||
$response = $folder->appendMessage($message);
|
||
$valid_response = false;
|
||
foreach ($response as $line) {
|
||
if (str_starts_with($line, 'OK')) {
|
||
$valid_response = true;
|
||
break;
|
||
}
|
||
}
|
||
if (!$valid_response) {
|
||
$this->fail("Failed to append message: ".implode("\n", $response));
|
||
}
|
||
|
||
$message = $folder->messages()->getMessageByUid($status['uidnext']);
|
||
self::assertInstanceOf(Message::class, $message);
|
||
|
||
return $message;
|
||
}
|
||
|
||
/**
|
||
* Append a message template to a folder
|
||
* @param Folder $folder
|
||
* @param string $template
|
||
*
|
||
* @return Message
|
||
* @throws AuthFailedException
|
||
* @throws ConnectionFailedException
|
||
* @throws EventNotFoundException
|
||
* @throws ImapBadRequestException
|
||
* @throws ImapServerErrorException
|
||
* @throws InvalidMessageDateException
|
||
* @throws MessageContentFetchingException
|
||
* @throws MessageFlagException
|
||
* @throws MessageHeaderFetchingException
|
||
* @throws ResponseException
|
||
* @throws RuntimeException
|
||
*/
|
||
final protected function appendMessageTemplate(Folder $folder, string $template): Message {
|
||
$content = file_get_contents(implode(DIRECTORY_SEPARATOR, [__DIR__, "..", "messages", $template]));
|
||
return $this->appendMessage($folder, $content);
|
||
}
|
||
|
||
/**
|
||
* Delete a folder if it is given
|
||
* @param Folder|null $folder
|
||
*
|
||
* @return bool
|
||
* @throws AuthFailedException
|
||
* @throws ConnectionFailedException
|
||
* @throws EventNotFoundException
|
||
* @throws ImapBadRequestException
|
||
* @throws ImapServerErrorException
|
||
* @throws ResponseException
|
||
* @throws RuntimeException
|
||
*/
|
||
final protected function deleteFolder(?Folder $folder = null): bool {
|
||
$response = $folder?->delete(false);
|
||
if (is_array($response)) {
|
||
$valid_response = false;
|
||
foreach ($response as $line) {
|
||
if (str_starts_with($line, 'OK')) {
|
||
$valid_response = true;
|
||
break;
|
||
}
|
||
}
|
||
if (!$valid_response) {
|
||
$this->fail("Failed to delete mailbox: ".implode("\n", $response));
|
||
}
|
||
return $valid_response;
|
||
}
|
||
return false;
|
||
}
|
||
} |