login()->loginNami(); $member = Member::factory()->defaults()->inNami(123)->create(); $response = $this->from('/member')->delete("/member/{$member->id}"); $response->assertRedirect('/member'); MemberDeleteAction::assertPushed(fn ($action, $parameters) => $parameters[0] === $member->id); } public function testItDeletesMemberFromNami(): void { $this->login()->loginNami(); NamiDeleteMemberAction::partialMock()->shouldReceive('handle')->with(123)->once(); $member = Member::factory()->defaults()->inNami(123)->create(); MemberDeleteAction::run($member->id); $this->assertDatabaseMissing('members', [ 'id' => $member->id, ]); } public function testItDoesntRunActionWhenMemberIsNotInNami(): void { $this->login()->loginNami(); NamiDeleteMemberAction::partialMock()->shouldReceive('handle')->never(); $member = Member::factory()->defaults()->create(); MemberDeleteAction::run($member->id); } public function testItDeletesMembersWithCourses(): void { $this->withoutExceptionHandling()->login()->loginNami(); $member = Member::factory()->defaults()->has(CourseMember::factory()->for(Course::factory()), 'courses')->create(); MemberDeleteAction::run($member->id); $this->assertDatabaseCount('members', 0); } public function testItFiresEventWhenFinished(): void { Event::fake([JobStarted::class, JobFinished::class]); $this->withoutExceptionHandling()->login()->loginNami(); $member = Member::factory()->defaults()->create(['firstname' => 'Max', 'lastname' => 'Muster']); MemberDeleteAction::dispatch($member->id); Event::assertDispatched(JobStarted::class, fn ($event) => $event->broadcastOn()->name === 'member' && $event->message === 'Lösche Mitglied Max Muster' && $event->reload === false); Event::assertDispatched(JobFinished::class, fn ($event) => $event->message === 'Mitglied Max Muster gelöscht' && $event->reload === true); } public function testItFiresEventWhenDeletingFailed(): void { Event::fake([JobStarted::class, JobFinished::class, JobFailed::class]); $this->login()->loginNami(); $member = Member::factory()->defaults()->create(['firstname' => 'Max', 'lastname' => 'Muster']); MemberDeleteAction::partialMock()->shouldReceive('handle')->andThrow(new Exception('sorry')); try { MemberDeleteAction::dispatch($member->id); } catch (Throwable) { } Event::assertDispatched(JobStarted::class, fn ($event) => $event->broadcastOn()->name === 'member' && $event->message === 'Lösche Mitglied Max Muster' && $event->reload === false); Event::assertDispatched(JobFailed::class, fn ($event) => $event->message === 'Löschen von Max Muster fehlgeschlagen.' && $event->reload === true); Event::assertNotDispatched(JobFinished::class); } }