fix: reuse synced remote draft when sending a composition

Signed-off-by: Sebastian <krupinski01@gmail.com>
This commit is contained in:
2026-08-25 22:39:33 -04:00
parent 03862ed0cf
commit a5eb104bd7
2 changed files with 80 additions and 1 deletions
@@ -285,6 +285,77 @@ final class CompositionSynchronizationTest extends TestCase {
));
}
public function testSendReusesSyncedRemoteDraftAsSubmissionSource(): void {
$this->stageComposition('provider:service:drafts:remote-1');
$properties = $this->createStub(MessagePropertiesMutableInterface::class);
$service = $this->createMockForIntersectionOfInterfaces([
ServiceBaseInterface::class,
ServiceEntitySubmitInterface::class,
]);
$entity = $this->createStub(EntityMutableInterface::class);
$entity->method('getProperties')->willReturn($properties);
$service->method('provider')->willReturn('provider');
$service->method('identifier')->willReturn('service');
$service->method('getEnabled')->willReturn(true);
$service->method('entityFresh')->willReturn($entity);
$service->expects($this->once())
->method('entitySubmit')
->with(
$this->anything(),
$this->callback(static fn(?EntityIdentifier $source): bool => $source !== null
&& (string)$source === 'provider:service:drafts:remote-1'),
$properties,
)
->willReturn(new EntitySubmitResult(EntitySubmitResult::DISPOSITION_SENT));
$mailManager = $this->createStub(\KTXM\MailManager\Manager::class);
$mailManager->method('serviceFindByAddress')->willReturn($service);
$result = $this->compositionManager($mailManager)->send(
self::TENANT_ID,
self::USER_ID,
self::COMPOSITION_ID,
['address' => 'sender@example.com'],
['subject' => 'Sent draft'],
[],
);
$this->assertSame('sent', $result['disposition']);
}
public function testSendIgnoresRemoteDraftBelongingToAnotherService(): void {
$this->stageComposition('provider:other-service:drafts:remote-1');
$properties = $this->createStub(MessagePropertiesMutableInterface::class);
$service = $this->createMockForIntersectionOfInterfaces([
ServiceBaseInterface::class,
ServiceEntitySubmitInterface::class,
]);
$entity = $this->createStub(EntityMutableInterface::class);
$entity->method('getProperties')->willReturn($properties);
$service->method('provider')->willReturn('provider');
$service->method('identifier')->willReturn('service');
$service->method('getEnabled')->willReturn(true);
$service->method('entityFresh')->willReturn($entity);
$service->expects($this->once())
->method('entitySubmit')
->with($this->anything(), $this->isNull(), $properties)
->willReturn(new EntitySubmitResult(EntitySubmitResult::DISPOSITION_SENT));
$mailManager = $this->createStub(\KTXM\MailManager\Manager::class);
$mailManager->method('serviceFindByAddress')->willReturn($service);
$result = $this->compositionManager($mailManager)->send(
self::TENANT_ID,
self::USER_ID,
self::COMPOSITION_ID,
['address' => 'sender@example.com'],
['subject' => 'Sent draft'],
[],
);
$this->assertSame('sent', $result['disposition']);
}
public function testSendFailureKeepsLocalComposition(): void {
$this->stageComposition();
$properties = $this->createStub(MessagePropertiesMutableInterface::class);
@@ -357,6 +428,7 @@ final class CompositionSynchronizationTest extends TestCase {
]);
$entity = $this->createStub(EntityMutableInterface::class);
$entity->method('getProperties')->willReturn($properties);
$service->method('provider')->willReturn('provider');
$service->method('identifier')->willReturn('service');
$service->method('getEnabled')->willReturn(true);
$service->method('entityFresh')->willReturn($entity);