135 - Unit Testing the Job

This commit is contained in:
Adam Wathan
2017-08-22 15:04:13 -04:00
parent 028e8bab41
commit d27fb532d0
4 changed files with 104 additions and 1 deletions

View File

@@ -7,4 +7,14 @@ use Illuminate\Database\Eloquent\Model;
class AttendeeMessage extends Model class AttendeeMessage extends Model
{ {
protected $guarded = []; protected $guarded = [];
public function concert()
{
return $this->belongsTo(Concert::class);
}
public function recipients()
{
return $this->concert->orders()->pluck('email');
}
} }

View File

@@ -3,6 +3,8 @@
namespace App\Jobs; namespace App\Jobs;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use App\Mail\AttendeeMessageEmail;
use Illuminate\Support\Facades\Mail;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
@@ -31,6 +33,8 @@ class SendAttendeeMessage implements ShouldQueue
*/ */
public function handle() public function handle()
{ {
// $this->attendeeMessage->recipients()->each(function ($recipient) {
Mail::to($recipient)->send(new AttendeeMessageEmail($this->attendeeMessage));
});
} }
} }

View File

@@ -0,0 +1,35 @@
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class AttendeeMessageEmail extends Mailable
{
use Queueable, SerializesModels;
public $attendeeMessage;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($attendeeMessage)
{
$this->attendeeMessage = $attendeeMessage;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('view.name');
}
}

View File

@@ -0,0 +1,54 @@
<?php
namespace Tests\Unit\Jobs;
use OrderFactory;
use ConcertFactory;
use Tests\TestCase;
use App\AttendeeMessage;
use App\Jobs\SendAttendeeMessage;
use App\Mail\AttendeeMessageEmail;
use Illuminate\Support\Facades\Mail;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class SendAttendeeMessageTest extends TestCase
{
use DatabaseMigrations;
/** @test */
function it_sends_the_message_to_all_concert_attendees()
{
Mail::fake();
$concert = ConcertFactory::createPublished();
$otherConcert = ConcertFactory::createPublished();
$message = AttendeeMessage::create([
'concert_id' => $concert->id,
'subject' => 'My subject',
'message' => 'My message',
]);
$orderA = OrderFactory::createForConcert($concert, ['email' => 'alex@example.com']);
$otherOrder = OrderFactory::createForConcert($otherConcert, ['email' => 'jane@example.com']);
$orderB = OrderFactory::createForConcert($concert, ['email' => 'sam@example.com']);
$orderC = OrderFactory::createForConcert($concert, ['email' => 'taylor@example.com']);
SendAttendeeMessage::dispatch($message);
Mail::assertSent(AttendeeMessageEmail::class, function ($mail) use ($message) {
return $mail->hasTo('alex@example.com')
&& $mail->attendeeMessage->is($message);
});
Mail::assertSent(AttendeeMessageEmail::class, function ($mail) use ($message) {
return $mail->hasTo('sam@example.com')
&& $mail->attendeeMessage->is($message);
});
Mail::assertSent(AttendeeMessageEmail::class, function ($mail) use ($message) {
return $mail->hasTo('taylor@example.com')
&& $mail->attendeeMessage->is($message);
});
Mail::assertNotSent(AttendeeMessageEmail::class, function ($mail) {
return $mail->hasTo('jane@example.com');
});
}
}