create(['is_null' => true]); }); function fakeRequest(): void { Http::fake(function ($request) { if ($request->url() === singleMemberUrl(10, 135) && 'GET' === $request->method()) { return Http::response('{ "success": true, "data": {"missingkey": "missingvalue", "kontoverbindung": {"a": "b"} } }', 200); } if ($request->url() === singleMemberUrl(10, 135) && 'PUT' === $request->method() && 43 === $request['version']) { return Http::response('{ "success": false, "message": "Update nicht möglich. Der Datensatz wurde zwischenzeitlich verändert." }', 200); } if ($request->url() === singleMemberUrl(10, 135) && 'PUT' === $request->method()) { return Http::response('{ "success": true, "data": { "version": 44 } }', 200); } }); } function factory() { return Member::factory() ->defaults() ->for(Group::factory()->state(['nami_id' => 10])) ->state(['nami_id' => 135]); } it('calls put action', function () { $this->withoutExceptionHandling()->login()->loginNami(); $member = factory()->create(); fakeRequest(); NamiPutMemberAction::allowToRun(); $this->patch("/member/{$member->id}", MemberUpdateRequestFactory::new()->create()); NamiPutMemberAction::spy()->shouldHaveReceived('handle')->withArgs( fn (Member $memberParam, ?Activity $activityParam, ?Subactivity $subactivityParam) => $memberParam->is($member) && null === $activityParam && null === $subactivityParam )->once(); }); it('redirects to member overview', function () { $this->withoutExceptionHandling()->login()->loginNami(); $member = factory()->create(); fakeRequest(); NamiPutMemberAction::allowToRun(); $this->patch("/member/{$member->id}", MemberUpdateRequestFactory::new()->create()) ->assertRedirect('/member'); }); it('testItChecksVersion', function () { $this->login()->loginNami()->withoutExceptionHandling(); $member = tap(factory()->create(), fn ($member) => $member->update(['version' => 43])); fakeRequest(); $this->patch("/member/{$member->id}", array_merge($member->getAttributes(), MemberUpdateRequestFactory::new()->create())) ->assertRedirect("/member/{$member->id}/edit?conflict=1"); }); it('testItUpdatesPhoneNumber', function () { $this->withoutExceptionHandling()->login()->loginNami(); $member = factory()->create(); fakeRequest(); NamiPutMemberAction::allowToRun(); $this->patch("/member/{$member->id}", MemberUpdateRequestFactory::new()->create([ 'main_phone' => '02103 4455129', 'fax' => '02103 4455130', 'children_phone' => '02103 4455130', ])); $this->assertDatabaseHas('members', [ 'main_phone' => '+49 2103 4455129', 'fax' => '+49 2103 4455130', 'children_phone' => '+49 2103 4455130', ]); }); it('testItUpdatesBankAccount', function () { $this->withoutExceptionHandling()->login()->loginNami(); $member = factory()->create(); fakeRequest(); NamiPutMemberAction::allowToRun(); $this->patch("/member/{$member->id}", MemberUpdateRequestFactory::new()->create([ 'bank_account' => [ 'iban' => 'DE1122', 'bic' => 'SOLSDE', 'person' => 'Max' ] ])); $this->assertDatabaseHas('bank_accounts', [ 'iban' => 'DE1122', 'bic' => 'SOLSDE', 'person' => 'Max', 'member_id' => $member->id, ]); }); it('testItUpdatesWiederverwendenFlag', function () { $this->withoutExceptionHandling()->login()->loginNami(); $member = factory()->create(); fakeRequest(); NamiPutMemberAction::allowToRun(); $this->patch("/member/{$member->id}", MemberUpdateRequestFactory::new()->create([ 'keepdata' => true, ])); $this->assertDatabaseHas('members', [ 'keepdata' => true, ]); }); it('testItSetsLocationToNull', function () { $this->withoutExceptionHandling()->login()->loginNami(); $member = factory()->notInNami()->create(['location' => 'Hilden']); fakeRequest(); NamiPutMemberAction::allowToRun(); $this->patch("/member/{$member->id}", MemberUpdateRequestFactory::new()->noNami()->create([ 'location' => null, 'bank_account' => [] ])); $this->assertDatabaseHas('members', [ 'location' => null, ]); }); it('testItUpdatesContact', function () { $this->withoutExceptionHandling()->login()->loginNami(); $member = factory()->notInNami()->create(); fakeRequest(); $this->patch("/member/{$member->id}", MemberUpdateRequestFactory::new()->noNami()->create([ 'other_country' => 'englisch', 'bank_account' => [] ])); $this->assertEquals('englisch', $member->fresh()->other_country); }); it('testItCreatesMemberWithFirstActivityId', function () { $this->login()->loginNami()->withoutExceptionHandling(); $member = factory()->new()->defaults()->create(); app(MemberFake::class)->stores($member->group->nami_id, 103); $activity = Activity::factory()->inNami(89)->create(); $subactivity = Subactivity::factory()->inNami(90)->create(); Confession::factory()->create(['is_null' => true]); PullMemberAction::shouldRun(); PullMembershipsAction::shouldRun(); $this->patch("/member/{$member->id}", MemberUpdateRequestFactory::new()->create([ 'first_activity_id' => $activity->id, 'first_subactivity_id' => $subactivity->id, ]))->assertSessionHasNoErrors(); app(MemberFake::class)->assertStored($member->group->nami_id, [ 'ersteTaetigkeitId' => 89, 'ersteUntergliederungId' => 90, ]); }); it('testItRequiresFirstActivityId', function () { $this->login()->loginNami(); $member = factory()->new()->defaults()->create(); app(MemberFake::class)->stores($member->group->nami_id, 103); Confession::factory()->create(['is_null' => true]); PullMemberAction::shouldRun(); PullMembershipsAction::shouldRun(); $this->patch("/member/{$member->id}", MemberUpdateRequestFactory::new()->create([ 'first_activity_id' => null, 'first_subactivity_id' => null, ]))->assertSessionHasErrors([ 'first_activity_id' => 'Erste Tätigkeit ist erforderlich.', 'first_subactivity_id' => 'Erste Untergliederung ist erforderlich.', ]); }); it('testItUpdatesCriminalRecord', function () { $this->withoutExceptionHandling()->login()->loginNami(); $member = factory()->notInNami()->create(); fakeRequest(); $this ->patch("/member/{$member->id}", MemberUpdateRequestFactory::new()->noNami()->create([ 'ps_at' => '2021-02-01', 'more_ps_at' => '2021-02-02', 'has_svk' => true, 'has_vk' => true, 'efz' => '2021-02-03', 'without_education_at' => '2021-02-04', 'without_efz_at' => '2021-02-05', 'recertified_at' => '2021-02-08', 'has_nami' => false, 'multiply_pv' => true, 'multiply_more_pv' => true, 'salutation' => 'Doktor', 'bank_account' => [] ])); $this->assertEquals('2021-02-01', $member->fresh()->ps_at->format('Y-m-d')); $this->assertEquals('2021-02-02', $member->fresh()->more_ps_at->format('Y-m-d')); $this->assertTrue($member->fresh()->has_svk); $this->assertTrue($member->fresh()->has_vk); $this->assertTrue($member->fresh()->multiply_pv); $this->assertTrue($member->fresh()->multiply_more_pv); $this->assertEquals('2021-02-03', $member->fresh()->efz->format('Y-m-d')); $this->assertEquals('2021-02-04', $member->fresh()->without_education_at->format('Y-m-d')); $this->assertEquals('2021-02-05', $member->fresh()->without_efz_at->format('Y-m-d')); $this->assertEquals('2021-02-08', $member->fresh()->recertified_at->format('Y-m-d')); $this->assertEquals('Doktor', $member->fresh()->salutation); });