createForm(); $participant = $this->createParticipant($form); PreventionRememberAction::run(); $this->assertEquals(now()->format('Y-m-d'), $participant->fresh()->last_remembered_at->format('Y-m-d')); } public function testItRemembersWhenRememberIsDue(): void { Mail::fake(); $form = $this->createForm(); $participant = tap($this->createParticipant($form), fn ($p) => $p->update(['last_remembered_at' => now()->subWeeks(3)])); PreventionRememberAction::run(); $this->assertEquals(now()->format('Y-m-d'), $participant->fresh()->last_remembered_at->format('Y-m-d')); } public function testItDoesntRememberWhenRememberingIsNotDue(): void { Mail::fake(); $form = $this->createForm(); $participant = tap($this->createParticipant($form), fn ($p) => $p->update(['last_remembered_at' => now()->subWeeks(1)])); PreventionRememberAction::run(); $this->assertEquals(now()->subWeeks(1)->format('Y-m-d'), $participant->fresh()->last_remembered_at->format('Y-m-d')); } public function testItDoesntRememberWhenFormDoesntNeedPrevention(): void { Mail::fake(); $form = tap($this->createForm(), fn ($form) => $form->update(['needs_prevention' => false])); $participant = $this->createParticipant($form); PreventionRememberAction::run(); $this->assertNull($participant->fresh()->last_remembered_at); } public function testItDoesntRememberWhenParticipantDoesntHaveMember(): void { Mail::fake(); $form = $this->createForm(); $participant = $this->createParticipant($form); $participant->member->delete(); PreventionRememberAction::run(); $this->assertNull($participant->fresh()->last_remembered_at); } public function testItDoesntRememberWhenMemberIsNotALeader(): void { Mail::fake(); $form = $this->createForm(); $participant = $this->createParticipant($form); $participant->member->memberships->each->delete(); PreventionRememberAction::run(); $this->assertNull($participant->fresh()->last_remembered_at); } protected function attributes(): Generator { yield [ 'attrs' => ['efz' => null, 'ps_at' => now()], 'preventions' => [Prevention::EFZ] ]; yield [ 'attrs' => ['efz' => now(), 'ps_at' => null], 'preventions' => [Prevention::PS] ]; yield [ 'attrs' => ['efz' => now()->subDay(), 'ps_at' => now()], 'preventions' => [] ]; yield [ 'attrs' => ['efz' => now(), 'ps_at' => now()->subDay()], 'preventions' => [] ]; yield [ 'attrs' => ['efz' => now()->subYears(5)->subDay(), 'ps_at' => now()], 'preventions' => [Prevention::EFZ] ]; yield [ 'attrs' => ['efz' => now(), 'ps_at' => now()->subYears(5)->subDay()], 'preventions' => [Prevention::PS] ]; yield [ 'attrs' => ['efz' => now(), 'ps_at' => now()->subYears(5)->subDay(), 'more_ps_at' => now()], 'preventions' => [] ]; yield [ 'attrs' => ['efz' => now(), 'ps_at' => now()->subYears(15), 'more_ps_at' => now()->subYears(5)->subDay()], 'preventions' => [Prevention::MOREPS], ]; } /** * @param array $preventions * @param array $memberAttributes * @dataProvider attributes */ public function testItRemembersMember(array $memberAttributes, array $preventions): void { Mail::fake(); $form = $this->createForm(); $participant = $this->createParticipant($form); $participant->member->update($memberAttributes); PreventionRememberAction::run(); if (count($preventions)) { Mail::assertSent(PreventionRememberMail::class, fn ($mail) => $mail->preventable->preventions() === $preventions); $this->assertNotNull($participant->fresh()->last_remembered_at); } else { Mail::assertNotSent(PreventionRememberMail::class); $this->assertNull($participant->fresh()->last_remembered_at); } } public function testItDoesntRememberParticipantThatHasNoMail(): void { Mail::fake(); $form = $this->createForm(); $participant = $this->createParticipant($form); $participant->update(['data' => [...$participant->data, 'email' => '']]); PreventionRememberAction::run(); Mail::assertNotSent(PreventionRememberMail::class); } public function testItRendersMail(): void { InvoiceSettings::fake(['from_long' => 'Stamm Beispiel']); $form = $this->createForm(); $participant = $this->createParticipant($form); (new PreventionRememberMail($participant)) ->assertSeeInText($participant->member->firstname) ->assertSeeInText($participant->form->name) ->assertSeeInText('erweitertes Führungszeugnis') ->assertSeeInText('Stamm Beispiel') ->assertSeeInText($participant->member->lastname); } protected function createForm(): Form { return Form::factory()->fields([ $this->textField('vorname')->namiType(NamiType::FIRSTNAME)->specialType(SpecialType::FIRSTNAME), $this->textField('nachname')->namiType(NamiType::FIRSTNAME)->specialType(SpecialType::LASTNAME), $this->textField('email')->namiType(NamiType::FIRSTNAME)->specialType(SpecialType::EMAIL), ])->create(['needs_prevention' => true]); } protected function createParticipant(Form $form): Participant { return Participant::factory()->for($form)->data([ 'vorname' => 'Max', 'nachname' => 'Muster', 'email' => 'mail@a.de', ])->for(Member::factory()->defaults()->has(Membership::factory()->inLocal('€ LeiterIn', 'Wölfling')))->create(); } }