feat: add logic to sync drafts to server
Signed-off-by: Sebastian <krupinski01@gmail.com>
This commit is contained in:
@@ -6,9 +6,11 @@ namespace KTXT\Mail\Tests\Unit;
|
||||
|
||||
use KTXC\Module\ModuleManager;
|
||||
use KTXC\Module\ModuleObject;
|
||||
use KTXF\Event\EventDispatcherInterface;
|
||||
use KTXF\Documents\Entity\EntityBaseInterface;
|
||||
use KTXF\Documents\Entity\EntityPropertiesBaseInterface;
|
||||
use KTXM\Mail\CompositionManager;
|
||||
use KTXM\Mail\CompositionSavedEvent;
|
||||
use KTXM\Mail\Stores\CompositionStore;
|
||||
use PHPUnit\Framework\MockObject\Stub;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
@@ -74,6 +76,54 @@ final class CompositionManagerTest extends TestCase {
|
||||
], $snapshot['remote']);
|
||||
}
|
||||
|
||||
public function testStageQueuesDraftSynchronizationAfterLocalSave(): void {
|
||||
$events = $this->createMock(EventDispatcherInterface::class);
|
||||
$events->expects($this->once())
|
||||
->method('dispatch')
|
||||
->with($this->callback(static fn(CompositionSavedEvent $event): bool =>
|
||||
$event->tenantIdentifier() === self::TENANT_ID
|
||||
&& $event->userIdentifier() === self::USER_ID
|
||||
&& $event->compositionIdentifier() === 'draft-event'
|
||||
&& $event->revision() === 1));
|
||||
$documentsManager = $this->createStub(\KTXM\DocumentsManager\Manager::class);
|
||||
$manager = $this->makeManager($documentsManager, events: $events);
|
||||
|
||||
$result = $manager->stage(
|
||||
self::TENANT_ID,
|
||||
self::USER_ID,
|
||||
'draft-event',
|
||||
'fresh',
|
||||
['address' => 'sender@example.com'],
|
||||
['subject' => 'Draft'],
|
||||
);
|
||||
|
||||
$this->assertSame('staged', $result['disposition']);
|
||||
}
|
||||
|
||||
public function testStageSurfacesEventQueueingFailureAfterLocalSave(): void {
|
||||
$events = $this->createStub(EventDispatcherInterface::class);
|
||||
$events->method('dispatch')->willThrowException(new \RuntimeException('No active event scope'));
|
||||
$documentsManager = $this->createStub(\KTXM\DocumentsManager\Manager::class);
|
||||
$manager = $this->makeManager($documentsManager, events: $events);
|
||||
|
||||
try {
|
||||
$manager->stage(
|
||||
self::TENANT_ID,
|
||||
self::USER_ID,
|
||||
'draft-event-failure',
|
||||
'fresh',
|
||||
['address' => 'sender@example.com'],
|
||||
['subject' => 'Draft'],
|
||||
);
|
||||
$this->fail('Event dispatch failure should be surfaced');
|
||||
} catch (\RuntimeException $exception) {
|
||||
$this->assertSame('No active event scope', $exception->getMessage());
|
||||
}
|
||||
|
||||
$snapshot = $this->compositionStore->compositionFetch(self::TENANT_ID, self::USER_ID, 'draft-event-failure');
|
||||
$this->assertSame('dirty', $snapshot['remote']['status']);
|
||||
}
|
||||
|
||||
public function testPatchMarksExistingRemoteStateDirty(): void {
|
||||
$compositionId = $this->stageEmptyComposition();
|
||||
$setSynced = static function (?array $snapshot): array {
|
||||
@@ -93,7 +143,13 @@ final class CompositionManagerTest extends TestCase {
|
||||
);
|
||||
|
||||
$documentsManager = $this->createStub(\KTXM\DocumentsManager\Manager::class);
|
||||
$manager = $this->makeManager($documentsManager);
|
||||
$events = $this->createMock(EventDispatcherInterface::class);
|
||||
$events->expects($this->once())
|
||||
->method('dispatch')
|
||||
->with($this->callback(static fn(CompositionSavedEvent $event): bool =>
|
||||
$event->compositionIdentifier() === $compositionId
|
||||
&& $event->revision() === 2));
|
||||
$manager = $this->makeManager($documentsManager, events: $events);
|
||||
$result = $manager->patch(self::TENANT_ID, self::USER_ID, $compositionId, [
|
||||
'revision' => 2,
|
||||
'sender' => ['address' => 'sender@example.com'],
|
||||
@@ -115,7 +171,12 @@ final class CompositionManagerTest extends TestCase {
|
||||
]);
|
||||
$documentsManager->method('entityReadStream')->willReturn($this->makeStream('hello world'));
|
||||
|
||||
$manager = $this->makeManager($documentsManager);
|
||||
$events = $this->createMock(EventDispatcherInterface::class);
|
||||
$events->expects($this->once())
|
||||
->method('dispatch')
|
||||
->with($this->callback(static fn(CompositionSavedEvent $event): bool =>
|
||||
$event->compositionIdentifier() === $compositionId));
|
||||
$manager = $this->makeManager($documentsManager, events: $events);
|
||||
|
||||
$result = $manager->attachmentAdd(self::TENANT_ID, self::USER_ID, $compositionId, [
|
||||
'identifier' => 'attach-1',
|
||||
@@ -224,7 +285,11 @@ final class CompositionManagerTest extends TestCase {
|
||||
$this->assertStringContainsString('not installed or enabled', $result['failed'][0]['message']);
|
||||
}
|
||||
|
||||
private function makeManager(Stub $documentsManager, bool $documentsModuleEnabled = true): CompositionManager {
|
||||
private function makeManager(
|
||||
Stub $documentsManager,
|
||||
bool $documentsModuleEnabled = true,
|
||||
?EventDispatcherInterface $events = null,
|
||||
): CompositionManager {
|
||||
$mailManager = $this->createStub(\KTXM\MailManager\Manager::class);
|
||||
|
||||
$moduleManager = $this->createStub(ModuleManager::class);
|
||||
@@ -245,6 +310,7 @@ final class CompositionManagerTest extends TestCase {
|
||||
moduleManager: $moduleManager,
|
||||
compositionStore: $this->compositionStore,
|
||||
mailManager: $mailManager,
|
||||
events: $events ?? $this->createStub(EventDispatcherInterface::class),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user