createStub(MessageFileStore::class); $fileStore->method('write')->willReturnCallback( function (string $tid, string $sid, string $mailbox, int $uidValidity, int $uid, array $content) use (&$calls): void { $calls[] = ['file', $tid, $sid, $mailbox, $uidValidity, $uid, $content['schemaVersion']]; }, ); $messageStore = $this->createStub(MessageStore::class); $messageStore->method('upsert')->willReturnCallback( function (string $tid, string $sid, int $uidValidity, EntityResource $entity) use (&$calls): void { $calls[] = ['meta', $tid, $sid, $entity->collection(), $uidValidity, $entity->identifier()]; }, ); $ingested = (new MessageIngestor($fileStore, $messageStore)) ->ingest('tenant', 'svc', 7, $this->entity(41), $this->entity(42)); $this->assertSame([41, 42], $ingested); $this->assertSame([ ['file', 'tenant', 'svc', 'INBOX', 7, 41, EntityResource::CACHE_SCHEMA_VERSION], ['meta', 'tenant', 'svc', 'INBOX', 7, 41], ['file', 'tenant', 'svc', 'INBOX', 7, 42, EntityResource::CACHE_SCHEMA_VERSION], ['meta', 'tenant', 'svc', 'INBOX', 7, 42], ], $calls); } public function testMetaIsNotWrittenWhenContentFails(): void { $fileStore = $this->createStub(MessageFileStore::class); $fileStore->method('write')->willThrowException(new RuntimeException('disk full')); $messageStore = $this->createMock(MessageStore::class); $messageStore->expects($this->never())->method('upsert'); $this->expectException(RuntimeException::class); (new MessageIngestor($fileStore, $messageStore))->ingest('tenant', 'svc', 7, $this->entity(41)); } private function entity(int $uid): EntityResource { $properties = new MessageProperties([]); $properties->setSubject('Message ' . $uid); return (new EntityResource('imap', 'svc'))->fromMutation('INBOX', $uid, $properties); } }