diff --git a/src/Mailer/FakeMailer.php b/src/Mailer/FakeMailer.php index e8d488d..73e0a78 100644 --- a/src/Mailer/FakeMailer.php +++ b/src/Mailer/FakeMailer.php @@ -89,4 +89,9 @@ public function send(MessageInterface ...$message): void $this->messages[] = $msg; } } + + public function clear(): void + { + $this->messages = []; + } } diff --git a/src/Queue/FakeQueue.php b/src/Queue/FakeQueue.php index 86692c1..b95018f 100644 --- a/src/Queue/FakeQueue.php +++ b/src/Queue/FakeQueue.php @@ -114,4 +114,9 @@ public function push(string $name, array $payload = [], OptionsInterface $option return 'job-id'; } + + public function clear(): void + { + $this->jobs = []; + } } diff --git a/src/Queue/FakeQueueManager.php b/src/Queue/FakeQueueManager.php index 4990809..5196c98 100644 --- a/src/Queue/FakeQueueManager.php +++ b/src/Queue/FakeQueueManager.php @@ -40,4 +40,11 @@ private function getDefaultDriver(): string { return $this->config->getDefaultDriver(); } + + public function clearAll(): void + { + foreach ($this->connections as $connection) { + $connection->clear(); + } + } } diff --git a/src/Traits/InteractsWithMailer.php b/src/Traits/InteractsWithMailer.php index e9c800b..62dc5f3 100644 --- a/src/Traits/InteractsWithMailer.php +++ b/src/Traits/InteractsWithMailer.php @@ -11,7 +11,15 @@ trait InteractsWithMailer { public function fakeMailer(): FakeMailer { - $this->getContainer()->bindSingleton( + $container = $this->getContainer(); + if ($container->has(MailerInterface::class)) { + $mailer = $container->get(MailerInterface::class); + if ($mailer instanceof FakeMailer) { + return $mailer; + } + } + + $container->bindSingleton( MailerInterface::class, $mailer = new FakeMailer() ); diff --git a/src/Traits/InteractsWithQueue.php b/src/Traits/InteractsWithQueue.php index 6cd7df7..6a15452 100644 --- a/src/Traits/InteractsWithQueue.php +++ b/src/Traits/InteractsWithQueue.php @@ -11,9 +11,17 @@ trait InteractsWithQueue { public function fakeQueue(): FakeQueueManager { - $this->getContainer()->bindSingleton( + $container = $this->getContainer(); + if ($container->has(QueueConnectionProviderInterface::class)) { + $manager = $container->get(QueueConnectionProviderInterface::class); + if ($manager instanceof FakeQueueManager) { + return $manager; + } + } + + $container->bindSingleton( QueueConnectionProviderInterface::class, - $manager = $this->getContainer()->get(FakeQueueManager::class) + $manager = $container->get(FakeQueueManager::class) ); return $manager; diff --git a/tests/src/Traits/InteractsWithMailerTest.php b/tests/src/Traits/InteractsWithMailerTest.php new file mode 100644 index 0000000..0d15d64 --- /dev/null +++ b/tests/src/Traits/InteractsWithMailerTest.php @@ -0,0 +1,47 @@ +has(MailerInterface::class)); + + $object = $this->getSomeService($container); + $mailer = $object->fakeMailer(); + self::assertInstanceOf(FakeMailer::class, $mailer); + self::assertTrue($container->has(MailerInterface::class)); + $mailer2 = $object->fakeMailer(); + self::assertSame($mailer, $mailer2); + } + + private function getSomeService(Container $container):object + { + return new class ($container) { + use InteractsWithMailer; + + public function __construct( + private readonly Container $container + ) { + } + + public function getContainer(): Container + { + return $this->container; + } + }; + } +} diff --git a/tests/src/Traits/InteractsWithQueueTest.php b/tests/src/Traits/InteractsWithQueueTest.php new file mode 100644 index 0000000..60b4a12 --- /dev/null +++ b/tests/src/Traits/InteractsWithQueueTest.php @@ -0,0 +1,50 @@ +bind(FakeQueueManager::class, $manager); + self::assertFalse($container->has(QueueConnectionProviderInterface::class)); + + $object = $this->getSomeService($container); + $queue = $object->fakeQueue(); + self::assertInstanceOf(FakeQueueManager::class, $queue); + self::assertTrue($container->has(QueueConnectionProviderInterface::class)); + $queue2 = $object->fakeQueue(); + self::assertSame($queue, $queue2); + } + + private function getSomeService(Container $container):object + { + return new class ($container) { + use InteractsWithQueue; + + public function __construct( + private readonly Container $container + ) { + } + + public function getContainer(): Container + { + return $this->container; + } + }; + } +}