Skip to content

Commit a0bb501

Browse files
committed
support psr clock
1 parent 744bed6 commit a0bb501

3 files changed

Lines changed: 60 additions & 7 deletions

File tree

src/DependencyInjection/Configuration.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public function getConfigTreeBuilder(): TreeBuilder
6767
->addDefaultsIfNotSet()
6868
->children()
6969
->scalarNode('freeze')->defaultNull()->end()
70+
->booleanNode('psr')->defaultFalse()->end()
7071
->end()
7172
->end()
7273

src/DependencyInjection/PatchlevelEventSourcingExtension.php

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
use Patchlevel\EventSourcing\WatchServer\WatchServerClient;
9797
use Patchlevel\EventSourcingBundle\DataCollector\EventSourcingCollector;
9898
use Patchlevel\EventSourcingBundle\DataCollector\MessageListener;
99+
use Psr\Clock\ClockInterface;
99100
use Psr\Log\LoggerInterface;
100101
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
101102
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -117,7 +118,7 @@
117118
* events: list<string>,
118119
* snapshot_stores: array<string, array{type: string, service: string}>,
119120
* migration: array{path: string, namespace: string},
120-
* clock: array{freeze: ?string}
121+
* clock: array{freeze: ?string, psr: bool}
121122
* }
122123
*/
123124
final class PatchlevelEventSourcingExtension extends Extension
@@ -352,7 +353,7 @@ private function configureUpcaster(ContainerBuilder $container): void
352353
private function configureMessageDecorator(ContainerBuilder $container): void
353354
{
354355
$container->register(RecordedOnDecorator::class)
355-
->setArguments([new Reference(Clock::class)])
356+
->setArguments([new Reference('event_sourcing.clock')])
356357
->addTag('event_sourcing.message_decorator');
357358

358359
$container->registerForAutoconfiguration(MessageDecorator::class)
@@ -643,17 +644,23 @@ private function configureProfiler(ContainerBuilder $container): void
643644
*/
644645
private function configureClock(array $config, ContainerBuilder $container): void
645646
{
647+
if ($config['clock']['psr']) {
648+
$container->setAlias('event_sourcing.clock', ClockInterface::class);
649+
650+
return;
651+
}
652+
646653
if ($config['clock']['freeze'] === null) {
647654
$container->register(SystemClock::class);
648655
$container->setAlias(Clock::class, SystemClock::class);
656+
} else {
657+
$container->register(FrozenClock::class)
658+
->setArguments([new DateTimeImmutable($config['clock']['freeze'])]);
649659

650-
return;
660+
$container->setAlias(Clock::class, FrozenClock::class);
651661
}
652662

653-
$container->register(FrozenClock::class)
654-
->setArguments([new DateTimeImmutable($config['clock']['freeze'])]);
655-
656-
$container->setAlias(Clock::class, FrozenClock::class);
663+
$container->setAlias('event_sourcing.clock', Clock::class);
657664
}
658665

659666
/**

tests/Unit/PatchlevelEventSourcingBundleTest.php

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
use PHPUnit\Framework\TestCase;
5959
use Prophecy\PhpUnit\ProphecyTrait;
6060
use Psr\Cache\CacheItemPoolInterface;
61+
use Psr\Clock\ClockInterface;
6162
use Psr\SimpleCache\CacheInterface;
6263
use Symfony\Component\DependencyInjection\ContainerBuilder;
6364
use Symfony\Component\DependencyInjection\Definition;
@@ -573,6 +574,25 @@ public function testMigrations()
573574
self::assertInstanceOf(StatusCommand::class, $container->get('event_sourcing.command.migration_status'));
574575
}
575576

577+
public function testDefaultClock()
578+
{
579+
$container = new ContainerBuilder();
580+
581+
$this->compileContainer(
582+
$container,
583+
[
584+
'patchlevel_event_sourcing' => [
585+
'connection' => [
586+
'service' => 'doctrine.dbal.eventstore_connection',
587+
],
588+
],
589+
]
590+
);
591+
592+
self::assertInstanceOf(SystemClock::class, $container->get(Clock::class));
593+
self::assertInstanceOf(SystemClock::class, $container->get('event_sourcing.clock'));
594+
}
595+
576596
public function testFrozenClock()
577597
{
578598
$container = new ContainerBuilder();
@@ -594,9 +614,34 @@ public function testFrozenClock()
594614
$clock = $container->get(Clock::class);
595615

596616
self::assertInstanceOf(FrozenClock::class, $clock);
617+
self::assertInstanceOf(FrozenClock::class, $container->get('event_sourcing.clock'));
597618
self::assertSame('2020-01-01 22:00:00', $clock->now()->format('Y-m-d H:i:s'));
598619
}
599620

621+
public function testPsrClock()
622+
{
623+
$psrClock = $this->prophesize(ClockInterface::class)->reveal();
624+
625+
$container = new ContainerBuilder();
626+
$container->set(ClockInterface::class, $psrClock);
627+
628+
$this->compileContainer(
629+
$container,
630+
[
631+
'patchlevel_event_sourcing' => [
632+
'connection' => [
633+
'service' => 'doctrine.dbal.eventstore_connection',
634+
],
635+
'clock' => [
636+
'psr' => true,
637+
],
638+
],
639+
]
640+
);
641+
642+
self::assertInstanceOf(ClockInterface::class, $container->get('event_sourcing.clock'));
643+
}
644+
600645
public function testProjectionist()
601646
{
602647
$container = new ContainerBuilder();

0 commit comments

Comments
 (0)