feat(Membership): add notification for user and admin during registration
All checks were successful
Deploy Roxane to Preprod / deploy (push) Successful in 1m30s

This commit is contained in:
2026-07-15 13:58:48 +02:00
parent a886bdd947
commit b4845511a6
15 changed files with 371 additions and 18 deletions

View File

@@ -0,0 +1,96 @@
<?php
namespace Tests\Feature;
use App\Models\Member;
use App\Models\NotificationTemplate;
use App\Models\Package;
use App\Notifications\MemberNewRequestAdminNotification;
use App\Notifications\MemberNewRequestMemberNotification;
use App\Services\MemberService;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Notification;
use Tests\TestCase;
class MemberNewRequestMemberNotificationTest extends TestCase
{
use RefreshDatabase;
private function createPackage(): Package
{
return Package::create([
'identifier' => 'one-year',
'name' => 'Adhésion annuelle',
'price' => 12.00,
'is_active' => true,
]);
}
private function memberData(Package $package): array
{
return [
'firstname' => 'Jean',
'lastname' => 'Dupont',
'email' => 'jean.dupont@example.com',
'phone1' => '0600000000',
'address' => '1 rue de la Paix',
'zipcode' => '44000',
'city' => 'Nantes',
'package' => $package->identifier,
'amount' => 12.00,
];
}
public function test_member_receives_confirmation_notification_on_registration(): void
{
Notification::fake();
NotificationTemplate::factory()->create(['identifier' => 'member_new_request_admin', 'is_active' => true]);
NotificationTemplate::factory()->create(['identifier' => 'member_new_request_member', 'is_active' => true]);
$package = $this->createPackage();
(new MemberService)->registerNewMember($this->memberData($package));
$member = Member::where('email', 'jean.dupont@example.com')->firstOrFail();
Notification::assertSentTo($member, MemberNewRequestMemberNotification::class);
}
public function test_confirmation_notification_contains_correct_member_and_package(): void
{
Notification::fake();
NotificationTemplate::factory()->create(['identifier' => 'member_new_request_admin', 'is_active' => true]);
NotificationTemplate::factory()->create(['identifier' => 'member_new_request_member', 'is_active' => true]);
$package = $this->createPackage();
(new MemberService)->registerNewMember($this->memberData($package));
$member = Member::where('email', 'jean.dupont@example.com')->firstOrFail();
Notification::assertSentTo(
$member,
MemberNewRequestMemberNotification::class,
function (MemberNewRequestMemberNotification $notification) use ($member, $package): bool {
return $notification->member->id === $member->id
&& $notification->package->id === $package->id;
}
);
}
public function test_admin_notification_is_also_sent_on_registration(): void
{
Notification::fake();
NotificationTemplate::factory()->create(['identifier' => 'member_new_request_admin', 'is_active' => true]);
NotificationTemplate::factory()->create(['identifier' => 'member_new_request_member', 'is_active' => true]);
$package = $this->createPackage();
(new MemberService)->registerNewMember($this->memberData($package));
Notification::assertSentOnDemand(MemberNewRequestAdminNotification::class);
}
}

View File

@@ -0,0 +1,86 @@
<?php
namespace Tests\Feature;
use App\Models\Member;
use App\Models\Membership;
use App\Models\NotificationTemplate;
use App\Models\Package;
use App\Notifications\MembershipValidatedNotification;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Notification;
use Tests\TestCase;
class MembershipValidatedNotificationTest extends TestCase
{
use RefreshDatabase;
private function createPendingMembership(): Membership
{
$package = Package::create([
'identifier' => 'one-year',
'name' => 'Adhésion annuelle',
'price' => 12.00,
'is_active' => true,
]);
$member = Member::factory()->create([
'status' => 'pending',
'nature' => 'physical',
]);
return Membership::create([
'member_id' => $member->id,
'package_id' => $package->id,
'status' => 'pending',
'amount' => 12.00,
'payment_status' => 'unpaid',
]);
}
public function test_member_receives_notification_when_membership_is_validated(): void
{
Notification::fake();
NotificationTemplate::factory()->create(['identifier' => 'membership_validated', 'is_active' => true]);
$membership = $this->createPendingMembership();
$membership->update(['status' => 'active']);
$membership->member->notify(new MembershipValidatedNotification($membership->fresh(['member', 'package'])));
Notification::assertSentTo($membership->member, MembershipValidatedNotification::class);
}
public function test_validated_notification_contains_correct_membership(): void
{
Notification::fake();
NotificationTemplate::factory()->create(['identifier' => 'membership_validated', 'is_active' => true]);
$membership = $this->createPendingMembership();
$membership->update(['status' => 'active']);
$freshMembership = $membership->fresh(['member', 'package']);
$freshMembership->member->notify(new MembershipValidatedNotification($freshMembership));
Notification::assertSentTo(
$membership->member,
MembershipValidatedNotification::class,
function (MembershipValidatedNotification $notification) use ($membership): bool {
return $notification->membership->id === $membership->id;
}
);
}
public function test_notification_is_not_sent_when_status_is_not_active(): void
{
Notification::fake();
NotificationTemplate::factory()->create(['identifier' => 'membership_validated', 'is_active' => true]);
$membership = $this->createPendingMembership();
Notification::assertNotSentTo($membership->member, MembershipValidatedNotification::class);
}
}