From 4e8ec2ba678d35d6e1aa7e6c8cb92e1051d0a519 Mon Sep 17 00:00:00 2001 From: Marick van Tuil Date: Sun, 9 Apr 2023 20:53:20 +0200 Subject: [PATCH] Add support for new mailables --- composer.json | 10 ++--- src/MailableReader.php | 10 ++++- tests/MailableReaderTest.php | 71 +++++++++++++++++++++++++++++++----- 3 files changed, 75 insertions(+), 16 deletions(-) diff --git a/composer.json b/composer.json index 48ff446..c3f929b 100644 --- a/composer.json +++ b/composer.json @@ -37,23 +37,23 @@ "scripts": { "l10": [ "composer require laravel/framework:10.* orchestra/testbench:8.* --no-interaction --no-update", - "composer update --prefer-stable --prefer-dist --no-interaction --no-suggest" + "composer update --prefer-stable --prefer-dist --no-interaction" ], "l9": [ "composer require laravel/framework:9.* orchestra/testbench:7.* --no-interaction --no-update", - "composer update --prefer-stable --prefer-dist --no-interaction --no-suggest" + "composer update --prefer-stable --prefer-dist --no-interaction" ], "l8": [ "composer require laravel/framework:8.* orchestra/testbench:6.* --no-interaction --no-update", - "composer update --prefer-stable --prefer-dist --no-interaction --no-suggest" + "composer update --prefer-stable --prefer-dist --no-interaction" ], "l7": [ "composer require laravel/framework:8.* orchestra/testbench:6.* --no-interaction --no-update", - "composer update --prefer-stable --prefer-dist --no-interaction --no-suggest" + "composer update --prefer-stable --prefer-dist --no-interaction" ], "l6": [ "composer require laravel/framework:8.* orchestra/testbench:6.* --no-interaction --no-update", - "composer update --prefer-stable --prefer-dist --no-interaction --no-suggest" + "composer update --prefer-stable --prefer-dist --no-interaction" ] } } diff --git a/src/MailableReader.php b/src/MailableReader.php index f1307d6..bbd9b83 100644 --- a/src/MailableReader.php +++ b/src/MailableReader.php @@ -6,6 +6,7 @@ use Exception; use Illuminate\Container\Container; +use ReflectionObject; class MailableReader { @@ -16,7 +17,14 @@ class MailableReader */ public function read(EmailComposer $composer): void { - Container::getInstance()->call([$composer->getData('mailable'), 'build']); + if (method_exists($composer->getData('mailable'), 'prepareMailableForDelivery')) { + $reflected = (new ReflectionObject($composer->getData('mailable'))); + $method = $reflected->getMethod('prepareMailableForDelivery'); + $method->setAccessible(true); + $method->invoke($composer->getData('mailable')); + } else { + Container::getInstance()->call([$composer->getData('mailable'), 'build']); + } $this->readRecipient($composer); diff --git a/tests/MailableReaderTest.php b/tests/MailableReaderTest.php index 173ea81..8cba2b2 100644 --- a/tests/MailableReaderTest.php +++ b/tests/MailableReaderTest.php @@ -3,21 +3,34 @@ namespace Tests; use Illuminate\Mail\Mailable; +use Illuminate\Mail\Mailables\Address; +use Illuminate\Mail\Mailables\Attachment; +use Illuminate\Mail\Mailables\Content; +use Illuminate\Mail\Mailables\Envelope; use Stackkit\LaravelDatabaseEmails\Email; class MailableReaderTest extends TestCase { + private function mailable(): Mailable + { + if (version_compare(app()->version(), '10.0.0', '>=')) { + return new Laravel10TestMailable(); + } + + return new TestMailable(); + } + /** @test */ public function it_extracts_the_recipient() { $composer = Email::compose() - ->mailable(new TestMailable()); + ->mailable($this->mailable()); $this->assertEquals(['john@doe.com'], $composer->getData('recipient')); $composer = Email::compose() ->mailable( - (new TestMailable())->to(['jane@doe.com']) + $this->mailable()->to(['jane@doe.com']) ); $this->assertCount(2, $composer->getData('recipient')); @@ -28,7 +41,7 @@ public function it_extracts_the_recipient() /** @test */ public function it_extracts_cc_addresses() { - $composer = Email::compose()->mailable(new TestMailable()); + $composer = Email::compose()->mailable($this->mailable()); $this->assertEquals(['john+cc@doe.com', 'john+cc2@doe.com'], $composer->getData('cc')); } @@ -36,7 +49,7 @@ public function it_extracts_cc_addresses() /** @test */ public function it_extracts_bcc_addresses() { - $composer = Email::compose()->mailable(new TestMailable()); + $composer = Email::compose()->mailable($this->mailable()); $this->assertEquals(['john+bcc@doe.com', 'john+bcc2@doe.com'], $composer->getData('bcc')); } @@ -44,7 +57,7 @@ public function it_extracts_bcc_addresses() /** @test */ public function it_extracts_the_subject() { - $composer = Email::compose()->mailable(new TestMailable()); + $composer = Email::compose()->mailable($this->mailable()); $this->assertEquals('Your order has shipped!', $composer->getData('subject')); } @@ -52,7 +65,7 @@ public function it_extracts_the_subject() /** @test */ public function it_extracts_the_body() { - $composer = Email::compose()->mailable(new TestMailable()); + $composer = Email::compose()->mailable($this->mailable()); $this->assertEquals("Name: John Doe\n", $composer->getData('body')); } @@ -60,7 +73,7 @@ public function it_extracts_the_body() /** @test */ public function it_extracts_attachments() { - $email = Email::compose()->mailable(new TestMailable())->send(); + $email = Email::compose()->mailable($this->mailable())->send(); $attachments = $email->getAttachments(); @@ -78,7 +91,7 @@ public function it_extracts_attachments() public function it_extracts_the_from_address_and_or_name() { $email = Email::compose()->mailable( - (new TestMailable()) + ($this->mailable()) ->from('marick@dolphiq.nl', 'Marick') )->send(); @@ -87,7 +100,7 @@ public function it_extracts_the_from_address_and_or_name() $this->assertEquals('Marick', $email->getFromName()); $email = Email::compose()->mailable( - (new TestMailable()) + ($this->mailable()) ->from('marick@dolphiq.nl') )->send(); @@ -96,7 +109,7 @@ public function it_extracts_the_from_address_and_or_name() $this->assertEquals(config('mail.from.name'), $email->getFromName()); $email = Email::compose()->mailable( - (new TestMailable()) + ($this->mailable()) ->from(null, 'Marick') )->send(); @@ -132,3 +145,41 @@ public function build() ->view('tests::dummy', ['name' => 'John Doe']); } } + +class Laravel10TestMailable extends Mailable +{ + public function content(): Content + { + $content = new Content( + 'tests::dummy' + ); + + $content->with('name', 'John Doe'); + + return $content; + } + + public function envelope(): Envelope + { + return new Envelope( + null, + [ + new Address('john@doe.com', 'John Doe') + ], + ['john+cc@doe.com', 'john+cc2@doe.com'], + ['john+bcc@doe.com', 'john+bcc2@doe.com'], + [], + 'Your order has shipped!' + ); + } + + public function attachments(): array + { + return [ + Attachment::fromPath(__DIR__ . '/files/pdf-sample.pdf')->withMime('application/pdf'), + Attachment::fromData(function () { + return '

Thanks for your oder

'; + }, 'order.html') + ]; + } +}