Initial commit
This commit is contained in:
298
tests/Feature/EmailTest.php
Normal file
298
tests/Feature/EmailTest.php
Normal file
@@ -0,0 +1,298 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Mail\MemberRegistrationWelcomeMail;
|
||||
use App\Mail\MembershipActivatedMail;
|
||||
use App\Mail\PaymentApprovedByAccountantMail;
|
||||
use App\Mail\PaymentApprovedByCashierMail;
|
||||
use App\Mail\PaymentFullyApprovedMail;
|
||||
use App\Mail\PaymentRejectedMail;
|
||||
use App\Mail\PaymentSubmittedMail;
|
||||
use App\Models\Member;
|
||||
use App\Models\MembershipPayment;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Tests\TestCase;
|
||||
|
||||
class EmailTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
$this->artisan('db:seed', ['--class' => 'RoleSeeder']);
|
||||
}
|
||||
|
||||
public function test_member_registration_welcome_mail_content(): void
|
||||
{
|
||||
$member = Member::factory()->create([
|
||||
'full_name' => 'John Doe',
|
||||
'email' => 'john@example.com',
|
||||
]);
|
||||
|
||||
$mailable = new MemberRegistrationWelcomeMail($member);
|
||||
|
||||
$mailable->assertSeeInHtml('John Doe');
|
||||
$mailable->assertSeeInHtml('Welcome');
|
||||
}
|
||||
|
||||
public function test_payment_submitted_mail_member_variant(): void
|
||||
{
|
||||
$member = Member::factory()->create(['email' => 'member@example.com']);
|
||||
$payment = MembershipPayment::factory()->create([
|
||||
'member_id' => $member->id,
|
||||
'amount' => 1000,
|
||||
]);
|
||||
|
||||
$mailable = new PaymentSubmittedMail($payment, 'member');
|
||||
|
||||
$mailable->assertSeeInHtml('1,000');
|
||||
$mailable->assertSeeInHtml('submitted');
|
||||
}
|
||||
|
||||
public function test_payment_submitted_mail_cashier_variant(): void
|
||||
{
|
||||
$member = Member::factory()->create();
|
||||
$payment = MembershipPayment::factory()->create([
|
||||
'member_id' => $member->id,
|
||||
'amount' => 1000,
|
||||
]);
|
||||
|
||||
$mailable = new PaymentSubmittedMail($payment, 'cashier');
|
||||
|
||||
$mailable->assertSeeInHtml('review');
|
||||
$mailable->assertSeeInHtml('1,000');
|
||||
}
|
||||
|
||||
public function test_payment_approved_by_cashier_mail(): void
|
||||
{
|
||||
$member = Member::factory()->create();
|
||||
$payment = MembershipPayment::factory()->create([
|
||||
'member_id' => $member->id,
|
||||
'status' => MembershipPayment::STATUS_APPROVED_CASHIER,
|
||||
'amount' => 1000,
|
||||
]);
|
||||
|
||||
$mailable = new PaymentApprovedByCashierMail($payment);
|
||||
|
||||
$mailable->assertSeeInHtml('Cashier');
|
||||
$mailable->assertSeeInHtml('approved');
|
||||
}
|
||||
|
||||
public function test_payment_approved_by_accountant_mail(): void
|
||||
{
|
||||
$member = Member::factory()->create();
|
||||
$payment = MembershipPayment::factory()->create([
|
||||
'member_id' => $member->id,
|
||||
'status' => MembershipPayment::STATUS_APPROVED_ACCOUNTANT,
|
||||
'amount' => 1000,
|
||||
]);
|
||||
|
||||
$mailable = new PaymentApprovedByAccountantMail($payment);
|
||||
|
||||
$mailable->assertSeeInHtml('Accountant');
|
||||
$mailable->assertSeeInHtml('approved');
|
||||
}
|
||||
|
||||
public function test_payment_fully_approved_mail(): void
|
||||
{
|
||||
$member = Member::factory()->create();
|
||||
$payment = MembershipPayment::factory()->create([
|
||||
'member_id' => $member->id,
|
||||
'status' => MembershipPayment::STATUS_APPROVED_CHAIR,
|
||||
'amount' => 1000,
|
||||
]);
|
||||
|
||||
$mailable = new PaymentFullyApprovedMail($payment);
|
||||
|
||||
$mailable->assertSeeInHtml('approved');
|
||||
$mailable->assertSeeInHtml('1,000');
|
||||
}
|
||||
|
||||
public function test_payment_rejected_mail(): void
|
||||
{
|
||||
$member = Member::factory()->create();
|
||||
$payment = MembershipPayment::factory()->create([
|
||||
'member_id' => $member->id,
|
||||
'status' => MembershipPayment::STATUS_REJECTED,
|
||||
'rejection_reason' => 'Invalid receipt format',
|
||||
'amount' => 1000,
|
||||
]);
|
||||
|
||||
$mailable = new PaymentRejectedMail($payment);
|
||||
|
||||
$mailable->assertSeeInHtml('Invalid receipt format');
|
||||
$mailable->assertSeeInHtml('rejected');
|
||||
}
|
||||
|
||||
public function test_membership_activated_mail(): void
|
||||
{
|
||||
$member = Member::factory()->create([
|
||||
'full_name' => 'John Doe',
|
||||
'membership_status' => Member::STATUS_ACTIVE,
|
||||
'membership_started_at' => now(),
|
||||
'membership_expires_at' => now()->addYear(),
|
||||
]);
|
||||
|
||||
$mailable = new MembershipActivatedMail($member);
|
||||
|
||||
$mailable->assertSeeInHtml('activated');
|
||||
$mailable->assertSeeInHtml('John Doe');
|
||||
}
|
||||
|
||||
public function test_all_emails_implement_should_queue(): void
|
||||
{
|
||||
$member = Member::factory()->create();
|
||||
$payment = MembershipPayment::factory()->create(['member_id' => $member->id]);
|
||||
|
||||
$mailables = [
|
||||
new MemberRegistrationWelcomeMail($member),
|
||||
new PaymentSubmittedMail($payment, 'member'),
|
||||
new PaymentApprovedByCashierMail($payment),
|
||||
new PaymentApprovedByAccountantMail($payment),
|
||||
new PaymentFullyApprovedMail($payment),
|
||||
new PaymentRejectedMail($payment),
|
||||
new MembershipActivatedMail($member),
|
||||
];
|
||||
|
||||
foreach ($mailables as $mailable) {
|
||||
$this->assertInstanceOf(\Illuminate\Contracts\Queue\ShouldQueue::class, $mailable);
|
||||
}
|
||||
}
|
||||
|
||||
public function test_emails_queued_correctly(): void
|
||||
{
|
||||
Mail::fake();
|
||||
|
||||
$member = Member::factory()->create();
|
||||
$payment = MembershipPayment::factory()->create(['member_id' => $member->id]);
|
||||
|
||||
Mail::to($member->email)->queue(new PaymentSubmittedMail($payment, 'member'));
|
||||
|
||||
Mail::assertQueued(PaymentSubmittedMail::class);
|
||||
}
|
||||
|
||||
public function test_email_recipients_correct(): void
|
||||
{
|
||||
Mail::fake();
|
||||
|
||||
$member = Member::factory()->create(['email' => 'member@example.com']);
|
||||
$payment = MembershipPayment::factory()->create(['member_id' => $member->id]);
|
||||
|
||||
Mail::to($member->email)->queue(new PaymentSubmittedMail($payment, 'member'));
|
||||
|
||||
Mail::assertQueued(PaymentSubmittedMail::class, function ($mail) {
|
||||
return $mail->hasTo('member@example.com');
|
||||
});
|
||||
}
|
||||
|
||||
public function test_payment_submitted_mail_has_correct_subject(): void
|
||||
{
|
||||
$member = Member::factory()->create();
|
||||
$payment = MembershipPayment::factory()->create(['member_id' => $member->id]);
|
||||
|
||||
$mailable = new PaymentSubmittedMail($payment, 'member');
|
||||
|
||||
$this->assertStringContainsString('Payment', $mailable->subject ?? '');
|
||||
}
|
||||
|
||||
public function test_rejection_mail_includes_next_steps(): void
|
||||
{
|
||||
$member = Member::factory()->create();
|
||||
$payment = MembershipPayment::factory()->create([
|
||||
'member_id' => $member->id,
|
||||
'status' => MembershipPayment::STATUS_REJECTED,
|
||||
'rejection_reason' => 'Test reason',
|
||||
]);
|
||||
|
||||
$mailable = new PaymentRejectedMail($payment);
|
||||
|
||||
$mailable->assertSeeInHtml('Submit New Payment');
|
||||
}
|
||||
|
||||
public function test_activation_mail_includes_expiry_date(): void
|
||||
{
|
||||
$member = Member::factory()->create([
|
||||
'membership_status' => Member::STATUS_ACTIVE,
|
||||
'membership_expires_at' => now()->addYear(),
|
||||
]);
|
||||
|
||||
$mailable = new MembershipActivatedMail($member);
|
||||
|
||||
$expiryDate = $member->membership_expires_at->format('Y-m-d');
|
||||
$mailable->assertSeeInHtml($expiryDate);
|
||||
}
|
||||
|
||||
public function test_welcome_mail_includes_dashboard_link(): void
|
||||
{
|
||||
$member = Member::factory()->create();
|
||||
|
||||
$mailable = new MemberRegistrationWelcomeMail($member);
|
||||
|
||||
$mailable->assertSeeInHtml(route('member.dashboard'));
|
||||
}
|
||||
|
||||
public function test_payment_fully_approved_mail_mentions_activation(): void
|
||||
{
|
||||
$member = Member::factory()->create();
|
||||
$payment = MembershipPayment::factory()->create([
|
||||
'member_id' => $member->id,
|
||||
'status' => MembershipPayment::STATUS_APPROVED_CHAIR,
|
||||
]);
|
||||
|
||||
$mailable = new PaymentFullyApprovedMail($payment);
|
||||
|
||||
$mailable->assertSeeInHtml('activated');
|
||||
}
|
||||
|
||||
public function test_mail_facades_work_correctly(): void
|
||||
{
|
||||
Mail::fake();
|
||||
|
||||
$member = Member::factory()->create();
|
||||
$payment = MembershipPayment::factory()->create(['member_id' => $member->id]);
|
||||
|
||||
// Send various emails
|
||||
Mail::to($member->email)->queue(new MemberRegistrationWelcomeMail($member));
|
||||
Mail::to($member->email)->queue(new PaymentSubmittedMail($payment, 'member'));
|
||||
Mail::to($member->email)->queue(new MembershipActivatedMail($member));
|
||||
|
||||
Mail::assertQueued(MemberRegistrationWelcomeMail::class);
|
||||
Mail::assertQueued(PaymentSubmittedMail::class);
|
||||
Mail::assertQueued(MembershipActivatedMail::class);
|
||||
}
|
||||
|
||||
public function test_emails_not_sent_when_not_queued(): void
|
||||
{
|
||||
Mail::fake();
|
||||
|
||||
// Don't queue any emails
|
||||
|
||||
Mail::assertNothingQueued();
|
||||
Mail::assertNothingSent();
|
||||
}
|
||||
|
||||
public function test_multiple_recipients_can_receive_same_email(): void
|
||||
{
|
||||
Mail::fake();
|
||||
|
||||
$member = Member::factory()->create();
|
||||
$payment = MembershipPayment::factory()->create(['member_id' => $member->id]);
|
||||
|
||||
// Send to multiple recipients
|
||||
Mail::to(['admin1@example.com', 'admin2@example.com'])->queue(new PaymentSubmittedMail($payment, 'cashier'));
|
||||
|
||||
Mail::assertQueued(PaymentSubmittedMail::class, 1);
|
||||
}
|
||||
|
||||
public function test_email_content_is_html_formatted(): void
|
||||
{
|
||||
$member = Member::factory()->create();
|
||||
$mailable = new MemberRegistrationWelcomeMail($member);
|
||||
|
||||
$mailable->assertSeeInHtml('<');
|
||||
$mailable->assertSeeInHtml('>');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user