mirror of https://github.com/itflow-org/itflow
283 lines
13 KiB
PHP
283 lines
13 KiB
PHP
<?php
|
|
/*
|
|
* File: QueryTest.php
|
|
* Category: -
|
|
* Author: M.Goldenbaum
|
|
* Created: 04.03.23 03:52
|
|
* Updated: -
|
|
*
|
|
* Description:
|
|
* -
|
|
*/
|
|
|
|
namespace Tests\live;
|
|
|
|
use Carbon\Carbon;
|
|
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\GetMessagesFailedException;
|
|
use Webklex\PHPIMAP\Exceptions\ImapBadRequestException;
|
|
use Webklex\PHPIMAP\Exceptions\ImapServerErrorException;
|
|
use Webklex\PHPIMAP\Exceptions\InvalidMessageDateException;
|
|
use Webklex\PHPIMAP\Exceptions\InvalidWhereQueryCriteriaException;
|
|
use Webklex\PHPIMAP\Exceptions\MaskNotFoundException;
|
|
use Webklex\PHPIMAP\Exceptions\MessageContentFetchingException;
|
|
use Webklex\PHPIMAP\Exceptions\MessageFlagException;
|
|
use Webklex\PHPIMAP\Exceptions\MessageHeaderFetchingException;
|
|
use Webklex\PHPIMAP\Exceptions\MessageSearchValidationException;
|
|
use Webklex\PHPIMAP\Exceptions\ResponseException;
|
|
use Webklex\PHPIMAP\Exceptions\RuntimeException;
|
|
use Webklex\PHPIMAP\Folder;
|
|
use Webklex\PHPIMAP\Query\WhereQuery;
|
|
|
|
/**
|
|
* Class QueryTest
|
|
*
|
|
* @package Tests
|
|
*/
|
|
class QueryTest 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());
|
|
}
|
|
|
|
/**
|
|
* Try to create a new query instance with a where clause
|
|
*
|
|
* @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 ResponseException
|
|
* @throws RuntimeException
|
|
* @throws GetMessagesFailedException
|
|
* @throws InvalidWhereQueryCriteriaException
|
|
* @throws MessageSearchValidationException
|
|
*/
|
|
public function testQueryWhere(): void {
|
|
$client = $this->getClient();
|
|
|
|
$delimiter = $this->getManager()->getConfig()->get("options.delimiter");
|
|
$folder_path = implode($delimiter, ['INBOX', 'search']);
|
|
|
|
$folder = $client->getFolder($folder_path);
|
|
if ($folder !== null) {
|
|
self::assertTrue($this->deleteFolder($folder));
|
|
}
|
|
$folder = $client->createFolder($folder_path, false);
|
|
|
|
$messages = [
|
|
$this->appendMessageTemplate($folder, '1366671050@github.com.eml'),
|
|
$this->appendMessageTemplate($folder, 'attachment_encoded_filename.eml'),
|
|
$this->appendMessageTemplate($folder, 'attachment_long_filename.eml'),
|
|
$this->appendMessageTemplate($folder, 'attachment_no_disposition.eml'),
|
|
$this->appendMessageTemplate($folder, 'bcc.eml'),
|
|
$this->appendMessageTemplate($folder, 'boolean_decoded_content.eml'),
|
|
$this->appendMessageTemplate($folder, 'email_address.eml'),
|
|
$this->appendMessageTemplate($folder, 'embedded_email.eml'),
|
|
$this->appendMessageTemplate($folder, 'embedded_email_without_content_disposition.eml'),
|
|
$this->appendMessageTemplate($folder, 'embedded_email_without_content_disposition-embedded.eml'),
|
|
$this->appendMessageTemplate($folder, 'example_attachment.eml'),
|
|
$this->appendMessageTemplate($folder, 'example_bounce.eml'),
|
|
$this->appendMessageTemplate($folder, 'four_nested_emails.eml'),
|
|
$this->appendMessageTemplate($folder, 'gbk_charset.eml'),
|
|
$this->appendMessageTemplate($folder, 'html_only.eml'),
|
|
$this->appendMessageTemplate($folder, 'imap_mime_header_decode_returns_false.eml'),
|
|
$this->appendMessageTemplate($folder, 'inline_attachment.eml'),
|
|
$this->appendMessageTemplate($folder, 'issue-275.eml'),
|
|
$this->appendMessageTemplate($folder, 'issue-275-2.eml'),
|
|
$this->appendMessageTemplate($folder, 'issue-348.eml'),
|
|
$this->appendMessageTemplate($folder, 'ks_c_5601-1987_headers.eml'),
|
|
$this->appendMessageTemplate($folder, 'mail_that_is_attachment.eml'),
|
|
$this->appendMessageTemplate($folder, 'missing_date.eml'),
|
|
$this->appendMessageTemplate($folder, 'missing_from.eml'),
|
|
$this->appendMessageTemplate($folder, 'mixed_filename.eml'),
|
|
$this->appendMessageTemplate($folder, 'multipart_without_body.eml'),
|
|
$this->appendMessageTemplate($folder, 'multiple_html_parts_and_attachments.eml'),
|
|
$this->appendMessageTemplate($folder, 'multiple_nested_attachments.eml'),
|
|
$this->appendMessageTemplate($folder, 'nestes_embedded_with_attachment.eml'),
|
|
$this->appendMessageTemplate($folder, 'null_content_charset.eml'),
|
|
$this->appendMessageTemplate($folder, 'pec.eml'),
|
|
$this->appendMessageTemplate($folder, 'plain.eml'),
|
|
$this->appendMessageTemplate($folder, 'plain_only.eml'),
|
|
$this->appendMessageTemplate($folder, 'plain_text_attachment.eml'),
|
|
$this->appendMessageTemplate($folder, 'references.eml'),
|
|
$this->appendMessageTemplate($folder, 'simple_multipart.eml'),
|
|
$this->appendMessageTemplate($folder, 'structured_with_attachment.eml'),
|
|
$this->appendMessageTemplate($folder, 'thread_my_topic.eml'),
|
|
$this->appendMessageTemplate($folder, 'thread_re_my_topic.eml'),
|
|
$this->appendMessageTemplate($folder, 'thread_unrelated.eml'),
|
|
$this->appendMessageTemplate($folder, 'undefined_charset_header.eml'),
|
|
$this->appendMessageTemplate($folder, 'undisclosed_recipients_minus.eml'),
|
|
$this->appendMessageTemplate($folder, 'undisclosed_recipients_space.eml'),
|
|
$this->appendMessageTemplate($folder, 'unknown_encoding.eml'),
|
|
$this->appendMessageTemplate($folder, 'without_charset_plain_only.eml'),
|
|
$this->appendMessageTemplate($folder, 'without_charset_simple_multipart.eml'),
|
|
];
|
|
|
|
$folder->getClient()->expunge();
|
|
|
|
$query = $folder->query()->all();
|
|
self::assertEquals(count($messages), $query->count());
|
|
|
|
$query = $folder->query()->whereSubject("test");
|
|
self::assertEquals(11, $query->count());
|
|
|
|
$query = $folder->query()->whereOn(Carbon::now());
|
|
self::assertEquals(count($messages), $query->count());
|
|
|
|
self::assertTrue($this->deleteFolder($folder));
|
|
}
|
|
|
|
/**
|
|
* Test query where criteria
|
|
*
|
|
* @return void
|
|
* @throws AuthFailedException
|
|
* @throws ConnectionFailedException
|
|
* @throws FolderFetchingException
|
|
* @throws ImapBadRequestException
|
|
* @throws ImapServerErrorException
|
|
* @throws InvalidWhereQueryCriteriaException
|
|
* @throws MaskNotFoundException
|
|
* @throws ResponseException
|
|
* @throws RuntimeException
|
|
*/
|
|
public function testQueryWhereCriteria(): void {
|
|
$folder = $this->getFolder('INBOX');
|
|
self::assertInstanceOf(Folder::class, $folder);
|
|
|
|
$this->assertWhereSearchCriteria($folder, 'SUBJECT', 'Test');
|
|
$this->assertWhereSearchCriteria($folder, 'BODY', 'Test');
|
|
$this->assertWhereSearchCriteria($folder, 'TEXT', 'Test');
|
|
$this->assertWhereSearchCriteria($folder, 'KEYWORD', 'Test');
|
|
$this->assertWhereSearchCriteria($folder, 'UNKEYWORD', 'Test');
|
|
$this->assertWhereSearchCriteria($folder, 'FLAGGED', 'Seen');
|
|
$this->assertWhereSearchCriteria($folder, 'UNFLAGGED', 'Seen');
|
|
$this->assertHeaderSearchCriteria($folder, 'Message-ID', 'Seen');
|
|
$this->assertHeaderSearchCriteria($folder, 'In-Reply-To', 'Seen');
|
|
$this->assertWhereSearchCriteria($folder, 'BCC', 'test@example.com');
|
|
$this->assertWhereSearchCriteria($folder, 'CC', 'test@example.com');
|
|
$this->assertWhereSearchCriteria($folder, 'FROM', 'test@example.com');
|
|
$this->assertWhereSearchCriteria($folder, 'TO', 'test@example.com');
|
|
$this->assertWhereSearchCriteria($folder, 'UID', '1');
|
|
$this->assertWhereSearchCriteria($folder, 'UID', '1,2');
|
|
$this->assertWhereSearchCriteria($folder, 'ALL');
|
|
$this->assertWhereSearchCriteria($folder, 'NEW');
|
|
$this->assertWhereSearchCriteria($folder, 'OLD');
|
|
$this->assertWhereSearchCriteria($folder, 'SEEN');
|
|
$this->assertWhereSearchCriteria($folder, 'UNSEEN');
|
|
$this->assertWhereSearchCriteria($folder, 'RECENT');
|
|
$this->assertWhereSearchCriteria($folder, 'ANSWERED');
|
|
$this->assertWhereSearchCriteria($folder, 'UNANSWERED');
|
|
$this->assertWhereSearchCriteria($folder, 'DELETED');
|
|
$this->assertWhereSearchCriteria($folder, 'UNDELETED');
|
|
$this->assertHeaderSearchCriteria($folder, 'Content-Language','en_US');
|
|
$this->assertWhereSearchCriteria($folder, 'CUSTOM X-Spam-Flag NO');
|
|
$this->assertWhereSearchCriteria($folder, 'CUSTOM X-Spam-Flag YES');
|
|
$this->assertWhereSearchCriteria($folder, 'NOT');
|
|
$this->assertWhereSearchCriteria($folder, 'OR');
|
|
$this->assertWhereSearchCriteria($folder, 'AND');
|
|
$this->assertWhereSearchCriteria($folder, 'BEFORE', '01-Jan-2020', true);
|
|
$this->assertWhereSearchCriteria($folder, 'BEFORE', Carbon::now()->subDays(1), true);
|
|
$this->assertWhereSearchCriteria($folder, 'ON', '01-Jan-2020', true);
|
|
$this->assertWhereSearchCriteria($folder, 'ON', Carbon::now()->subDays(1), true);
|
|
$this->assertWhereSearchCriteria($folder, 'SINCE', '01-Jan-2020', true);
|
|
$this->assertWhereSearchCriteria($folder, 'SINCE', Carbon::now()->subDays(1), true);
|
|
}
|
|
|
|
/**
|
|
* Assert where search criteria
|
|
* @param Folder $folder
|
|
* @param string $criteria
|
|
* @param string|Carbon|null $value
|
|
* @param bool $date
|
|
*
|
|
* @return void
|
|
* @throws AuthFailedException
|
|
* @throws ConnectionFailedException
|
|
* @throws ImapBadRequestException
|
|
* @throws ImapServerErrorException
|
|
* @throws InvalidWhereQueryCriteriaException
|
|
* @throws ResponseException
|
|
* @throws RuntimeException
|
|
*/
|
|
protected function assertWhereSearchCriteria(Folder $folder, string $criteria, Carbon|string $value = null, bool $date = false): void {
|
|
$query = $folder->query()->where($criteria, $value);
|
|
self::assertInstanceOf(WhereQuery::class, $query);
|
|
|
|
$item = $query->getQuery()->first();
|
|
$criteria = str_replace("CUSTOM ", "", $criteria);
|
|
$expected = $value === null ? [$criteria] : [$criteria, $value];
|
|
if ($date === true && $value instanceof Carbon) {
|
|
$date_format = $folder->getClient()->getConfig()->get('date_format', 'd M y');
|
|
$expected[1] = $value->format($date_format);
|
|
}
|
|
|
|
self::assertIsArray($item);
|
|
self::assertIsString($item[0]);
|
|
if($value !== null) {
|
|
self::assertCount(2, $item);
|
|
self::assertIsString($item[1]);
|
|
}else{
|
|
self::assertCount(1, $item);
|
|
}
|
|
self::assertSame($expected, $item);
|
|
}
|
|
|
|
/**
|
|
* Assert header search criteria
|
|
* @param Folder $folder
|
|
* @param string $criteria
|
|
* @param mixed|null $value
|
|
*
|
|
* @return void
|
|
* @throws AuthFailedException
|
|
* @throws ConnectionFailedException
|
|
* @throws ImapBadRequestException
|
|
* @throws ImapServerErrorException
|
|
* @throws InvalidWhereQueryCriteriaException
|
|
* @throws ResponseException
|
|
* @throws RuntimeException
|
|
*/
|
|
protected function assertHeaderSearchCriteria(Folder $folder, string $criteria, mixed $value = null): void {
|
|
$query = $folder->query()->whereHeader($criteria, $value);
|
|
self::assertInstanceOf(WhereQuery::class, $query);
|
|
|
|
$item = $query->getQuery()->first();
|
|
|
|
self::assertIsArray($item);
|
|
self::assertIsString($item[0]);
|
|
self::assertCount(1, $item);
|
|
self::assertSame(['HEADER '.$criteria.' '.$value], $item);
|
|
}
|
|
} |