MailableQueuedTest.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. namespace Illuminate\Tests\Mail;
  3. use Illuminate\Bus\Queueable;
  4. use Illuminate\Container\Container;
  5. use Illuminate\Contracts\Queue\ShouldQueue;
  6. use Illuminate\Contracts\View\Factory;
  7. use Illuminate\Filesystem\Filesystem;
  8. use Illuminate\Filesystem\FilesystemManager;
  9. use Illuminate\Foundation\Application;
  10. use Illuminate\Mail\Mailable;
  11. use Illuminate\Mail\Mailer;
  12. use Illuminate\Mail\SendQueuedMailable;
  13. use Illuminate\Support\Testing\Fakes\QueueFake;
  14. use Mockery as m;
  15. use PHPUnit\Framework\TestCase;
  16. use Swift_Mailer;
  17. class MailableQueuedTest extends TestCase
  18. {
  19. protected function tearDown(): void
  20. {
  21. m::close();
  22. }
  23. public function testQueuedMailableSent()
  24. {
  25. $queueFake = new QueueFake(new Application);
  26. $mailer = $this->getMockBuilder(Mailer::class)
  27. ->setConstructorArgs($this->getMocks())
  28. ->onlyMethods(['createMessage', 'to'])
  29. ->getMock();
  30. $mailer->setQueue($queueFake);
  31. $mailable = new MailableQueueableStub;
  32. $queueFake->assertNothingPushed();
  33. $mailer->send($mailable);
  34. $queueFake->assertPushedOn(null, SendQueuedMailable::class);
  35. }
  36. public function testQueuedMailableWithAttachmentSent()
  37. {
  38. $queueFake = new QueueFake(new Application);
  39. $mailer = $this->getMockBuilder(Mailer::class)
  40. ->setConstructorArgs($this->getMocks())
  41. ->onlyMethods(['createMessage'])
  42. ->getMock();
  43. $mailer->setQueue($queueFake);
  44. $mailable = new MailableQueueableStub;
  45. $attachmentOption = ['mime' => 'image/jpeg', 'as' => 'bar.jpg'];
  46. $mailable->attach('foo.jpg', $attachmentOption);
  47. $this->assertIsArray($mailable->attachments);
  48. $this->assertCount(1, $mailable->attachments);
  49. $this->assertEquals($mailable->attachments[0]['options'], $attachmentOption);
  50. $queueFake->assertNothingPushed();
  51. $mailer->send($mailable);
  52. $queueFake->assertPushedOn(null, SendQueuedMailable::class);
  53. }
  54. public function testQueuedMailableWithAttachmentFromDiskSent()
  55. {
  56. $app = new Application;
  57. $container = Container::getInstance();
  58. $this->getMockBuilder(Filesystem::class)
  59. ->getMock();
  60. $filesystemFactory = $this->getMockBuilder(FilesystemManager::class)
  61. ->setConstructorArgs([$app])
  62. ->getMock();
  63. $container->singleton('filesystem', function () use ($filesystemFactory) {
  64. return $filesystemFactory;
  65. });
  66. $queueFake = new QueueFake($app);
  67. $mailer = $this->getMockBuilder(Mailer::class)
  68. ->setConstructorArgs($this->getMocks())
  69. ->onlyMethods(['createMessage'])
  70. ->getMock();
  71. $mailer->setQueue($queueFake);
  72. $mailable = new MailableQueueableStub;
  73. $attachmentOption = ['mime' => 'image/jpeg', 'as' => 'bar.jpg'];
  74. $mailable->attachFromStorage('/', 'foo.jpg', $attachmentOption);
  75. $this->assertIsArray($mailable->diskAttachments);
  76. $this->assertCount(1, $mailable->diskAttachments);
  77. $this->assertEquals($mailable->diskAttachments[0]['options'], $attachmentOption);
  78. $queueFake->assertNothingPushed();
  79. $mailer->send($mailable);
  80. $queueFake->assertPushedOn(null, SendQueuedMailable::class);
  81. }
  82. protected function getMocks()
  83. {
  84. return ['smtp', m::mock(Factory::class), m::mock(Swift_Mailer::class)];
  85. }
  86. }
  87. class MailableQueueableStub extends Mailable implements ShouldQueue
  88. {
  89. use Queueable;
  90. public function build(): self
  91. {
  92. $this
  93. ->subject('lorem ipsum')
  94. ->html('foo bar baz')
  95. ->to('foo@example.tld');
  96. return $this;
  97. }
  98. }