/
githubmirror
/
framework
Обзор
Документация
Войти
/
githubmirror
/
framework
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
13.x
tests/Mail/MailableQueuedTest.php
394 строки
14 KB
Jason McCreary
[13.x] Mockery cleanup (#61117)
10 авг 2026, 20:23
Не верифицирован
10 авг 2026, 20:23
2ee40ee
Код
Авторство
О чём код?
<?php namespace Illuminate\Tests\Mail; use Illuminate\Bus\Queueable; use Illuminate\Container\Container; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\View\Factory; use Illuminate\Filesystem\FilesystemManager; use Illuminate\Foundation\Application; use Illuminate\Mail\Mailable; use Illuminate\Mail\Mailer; use Illuminate\Mail\SendQueuedMailable; use Illuminate\Queue\Attributes\Connection; use Illuminate\Queue\Attributes\Delay; use Illuminate\Queue\Attributes\Queue as QueueAttribute; use Illuminate\Support\Testing\Fakes\QueueFake; use Laravel\SerializableClosure\SerializableClosure; use Mockery; use PHPUnit\Framework\TestCase; use Symfony\Component\Mailer\Transport\TransportInterface; class MailableQueuedTest extends TestCase { public function testQueuedMailableSent(): void { $queueFake = new QueueFake(new Application); $mailer = $this->getMockBuilder(Mailer::class) ->setConstructorArgs($this->getMocks()) ->onlyMethods(['createMessage', 'to']) ->getMock(); $mailer->setQueue($queueFake); $mailable = new MailableQueueableStub; $queueFake->assertNothingPushed(); $mailer->send($mailable); $queueFake->assertPushedOn(null, SendQueuedMailable::class); } public function testQueuedMailableWithAttachmentSent(): void { $queueFake = new QueueFake(new Application); $mailer = $this->getMockBuilder(Mailer::class) ->setConstructorArgs($this->getMocks()) ->onlyMethods(['createMessage']) ->getMock(); $mailer->setQueue($queueFake); $mailable = new MailableQueueableStub; $attachmentOption = ['mime' => 'image/jpeg', 'as' => 'bar.jpg']; $mailable->attach('foo.jpg', $attachmentOption); $this->assertIsArray($mailable->attachments); $this->assertCount(1, $mailable->attachments); $this->assertEquals($mailable->attachments[0]['options'], $attachmentOption); $queueFake->assertNothingPushed(); $mailer->send($mailable); $queueFake->assertPushedOn(null, SendQueuedMailable::class); } public function testQueuedMailableWithAttachmentFromDiskSent(): void { $app = new Application; $container = Container::getInstance(); $filesystemFactory = $this->getMockBuilder(FilesystemManager::class) ->setConstructorArgs([$app]) ->getMock(); $container->instance('filesystem', $filesystemFactory); $queueFake = new QueueFake($app); $mailer = $this->getMockBuilder(Mailer::class) ->setConstructorArgs($this->getMocks()) ->onlyMethods(['createMessage']) ->getMock(); $mailer->setQueue($queueFake); $mailable = new MailableQueueableStub; $attachmentOption = ['mime' => 'image/jpeg', 'as' => 'bar.jpg']; $mailable->attachFromStorage('/', 'foo.jpg', $attachmentOption); $this->assertIsArray($mailable->diskAttachments); $this->assertCount(1, $mailable->diskAttachments); $this->assertEquals($mailable->diskAttachments[0]['options'], $attachmentOption); $queueFake->assertNothingPushed(); $mailer->send($mailable); $queueFake->assertPushedOn(null, SendQueuedMailable::class); } public function testQueuedMailableForwardsMessageGroupFromMethodToQueueJob(): void { $mockedMessageGroupId = 'group-1'; $mailable = $this->getMockBuilder(MailableQueueableStubWithMessageGroup::class)->onlyMethods(['messageGroup'])->getMock(); $mailable->expects($this->once())->method('messageGroup')->willReturn($mockedMessageGroupId); $queueFake = new QueueFake(new Application); $mailer = $this->getMockBuilder(Mailer::class) ->setConstructorArgs($this->getMocks()) ->onlyMethods(['createMessage', 'to']) ->getMock(); $mailer->setQueue($queueFake); $queueFake->assertNothingPushed(); $mailer->send($mailable); $queueFake->assertPushedOn(null, SendQueuedMailable::class); $pushedJob = $queueFake->pushed(SendQueuedMailable::class)->first(); $this->assertEquals($mockedMessageGroupId, $pushedJob->messageGroup); } public function testQueuedMailableForwardsMessageGroupFromPropertyOverridingMethodToQueueJob(): void { $mockedMessageGroupId = 'group-1'; // Ensure the messageGroup method is not called when a messageGroup property is provided. $mailable = $this->getMockBuilder(MailableQueueableStubWithMessageGroup::class)->onlyMethods(['messageGroup'])->getMock(); $mailable->expects($this->never())->method('messageGroup')->willReturn('this-should-not-be-used'); $mailable->onGroup($mockedMessageGroupId); $queueFake = new QueueFake(new Application); $mailer = $this->getMockBuilder(Mailer::class) ->setConstructorArgs($this->getMocks()) ->onlyMethods(['createMessage', 'to']) ->getMock(); $mailer->setQueue($queueFake); $queueFake->assertNothingPushed(); $mailer->send($mailable); $queueFake->assertPushedOn(null, SendQueuedMailable::class); $pushedJob = $queueFake->pushed(SendQueuedMailable::class)->first(); $this->assertEquals($mockedMessageGroupId, $pushedJob->messageGroup); } public function testQueuedMailableForwardsDeduplicatorToQueueJob(): void { $mockedDeduplicator = fn ($payload, $queue) => 'deduplication-id-1'; $queueFake = new QueueFake(new Application); $mailer = $this->getMockBuilder(Mailer::class) ->setConstructorArgs($this->getMocks()) ->onlyMethods(['createMessage', 'to']) ->getMock(); $mailer->setQueue($queueFake); $mailable = (new MailableQueueableStub)->withDeduplicator($mockedDeduplicator); $queueFake->assertNothingPushed(); $mailer->send($mailable); $queueFake->assertPushedOn(null, SendQueuedMailable::class); $pushedJob = $queueFake->pushed(SendQueuedMailable::class)->first(); $this->assertInstanceOf(SerializableClosure::class, $pushedJob->deduplicator); $this->assertEquals($mockedDeduplicator, $pushedJob->deduplicator->getClosure()); } public function testQueuedMailableRespectsDelayAttribute(): void { $queueFake = new QueueFake(new Application); $mailer = $this->getMockBuilder(Mailer::class) ->setConstructorArgs($this->getMocks()) ->onlyMethods(['createMessage', 'to']) ->getMock(); $mailer->setQueue($queueFake); $mailable = new MailableQueueableStubWithDelayAttribute; $queueFake->assertNothingPushed(); $mailer->send($mailable); $queueFake->assertPushedOn(null, SendQueuedMailable::class); $pushedJob = $queueFake->pushed(SendQueuedMailable::class)->first(); $this->assertEquals(30, $pushedJob->delay); } public function testQueuedMailableDelayPropertyOverridesAttribute(): void { $queueFake = new QueueFake(new Application); $mailer = $this->getMockBuilder(Mailer::class) ->setConstructorArgs($this->getMocks()) ->onlyMethods(['createMessage', 'to']) ->getMock(); $mailer->setQueue($queueFake); $mailable = new MailableQueueableStubWithDelayAttribute; $mailable->delay = 60; $queueFake->assertNothingPushed(); $mailer->send($mailable); $queueFake->assertPushedOn(null, SendQueuedMailable::class); $pushedJob = $queueFake->pushed(SendQueuedMailable::class)->first(); $this->assertEquals(60, $pushedJob->delay); } public function testQueuedMailableRespectsQueueAndConnectionAttributes(): void { $queueFake = new MailableQueueFake(new Application); $mailer = $this->getMockBuilder(Mailer::class) ->setConstructorArgs($this->getMocks()) ->onlyMethods(['createMessage', 'to']) ->getMock(); $mailer->setQueue($queueFake); $mailable = new MailableQueueableStubWithQueueAndConnectionAttributes; $queueFake->assertNothingPushed(); $mailer->send($mailable); $queueFake->assertPushedOn('mail-queue', SendQueuedMailable::class); $pushedJob = $queueFake->pushed(SendQueuedMailable::class)->first(); $this->assertSame('redis', $queueFake->connectionName); $this->assertSame('mail-queue', $pushedJob->queue); $this->assertSame('redis', $pushedJob->connection); } public function testDelayedQueuedMailableRespectsQueueAndConnectionAttributes(): void { $queueFake = new MailableQueueFake(new Application); $mailer = $this->getMockBuilder(Mailer::class) ->setConstructorArgs($this->getMocks()) ->onlyMethods(['createMessage', 'to']) ->getMock(); $mailer->setQueue($queueFake); $mailable = new MailableQueueableStubWithDelayQueueAndConnectionAttributes; $queueFake->assertNothingPushed(); $mailer->send($mailable); $queueFake->assertPushedOn('delayed-mail-queue', SendQueuedMailable::class); $pushedJob = $queueFake->pushed(SendQueuedMailable::class)->first(); $this->assertSame('sqs', $queueFake->connectionName); $this->assertSame('delayed-mail-queue', $pushedJob->queue); $this->assertSame('sqs', $pushedJob->connection); $this->assertEquals(30, $pushedJob->delay); } public function testQueuedMailableForwardsDeduplicationIdMethodToQueueJob(): void { $queueFake = new QueueFake(new Application); $mailer = $this->getMockBuilder(Mailer::class) ->setConstructorArgs($this->getMocks()) ->onlyMethods(['createMessage', 'to']) ->getMock(); $mailer->setQueue($queueFake); $mailable = new MailableQueueableStubWithDeduplication; $queueFake->assertNothingPushed(); $mailer->send($mailable); $queueFake->assertPushedOn(null, SendQueuedMailable::class); $pushedJob = $queueFake->pushed(SendQueuedMailable::class)->first(); $this->assertInstanceOf(SerializableClosure::class, $pushedJob->deduplicator); $this->assertEquals($mailable->deduplicationId(...), $pushedJob->deduplicator->getClosure()); } public function testQueueSetsBackedEnumQueueOnMailable(): void { $queueFake = new QueueFake(new Application); $mailer = new Mailer(...$this->getMocks()); $mailer->setQueue($queueFake); $mailer->queue(new MailableQueueableStub, MailableQueue::Emails); $queueFake->assertPushedOn('emails', SendQueuedMailable::class); } public function testLaterSetsQueueOnMailable(): void { $queueFake = new QueueFake(new Application); $mailer = $this->getMockBuilder(Mailer::class) ->setConstructorArgs($this->getMocks()) ->onlyMethods(['createMessage', 'to']) ->getMock(); $mailer->setQueue($queueFake); $mailable = new MailableQueueableStub; $mailer->later(60, $mailable, 'emails'); $queueFake->assertPushed(SendQueuedMailable::class, function ($job) { return $job->queue === 'emails'; }); } public function testLaterWithoutQueueUsesDefault(): void { $queueFake = new QueueFake(new Application); $mailer = $this->getMockBuilder(Mailer::class) ->setConstructorArgs($this->getMocks()) ->onlyMethods(['createMessage', 'to']) ->getMock(); $mailer->setQueue($queueFake); $mailable = new MailableQueueableStub; $mailer->later(60, $mailable); $queueFake->assertPushed(SendQueuedMailable::class, function ($job) { return $job->queue === null; }); } protected function getMocks() { return ['smtp', Mockery::mock(Factory::class), Mockery::mock(TransportInterface::class)]; } } class MailableQueueableStub extends Mailable implements ShouldQueue { use Queueable; public function build(): self { $this ->subject('lorem ipsum') ->html('foo bar baz') ->to('foo@example.tld'); return $this; } } enum MailableQueue: string { case Emails = 'emails'; } class MailableQueueableStubWithMessageGroup extends Mailable implements ShouldQueue { use Queueable; public function build(): self { $this ->subject('lorem ipsum') ->html('foo bar baz') ->to('foo@example.tld'); return $this; } public function messageGroup(): string { return 'group-1'; } } #[Delay(30)] class MailableQueueableStubWithDelayAttribute extends Mailable implements ShouldQueue { use Queueable; public function build(): self { $this ->subject('lorem ipsum') ->html('foo bar baz') ->to('foo@example.tld'); return $this; } } class MailableQueueableStubWithDeduplication extends Mailable implements ShouldQueue { use Queueable; public function build(): self { $this ->subject('lorem ipsum') ->html('foo bar baz') ->to('foo@example.tld'); return $this; } public function deduplicationId($payload, $queue) { return hash('sha256', $payload); } } #[Connection('redis')] #[QueueAttribute('mail-queue')] class MailableQueueableStubWithQueueAndConnectionAttributes extends MailableQueueableStub { // } #[Connection('sqs')] #[Delay(30)] #[QueueAttribute('delayed-mail-queue')] class MailableQueueableStubWithDelayQueueAndConnectionAttributes extends MailableQueueableStub { // } class MailableQueueFake extends QueueFake { public $connectionName; public function connection($value = null) { $this->connectionName = $value; return parent::connection($value); } }