diff --git a/app/Membership/Actions/MassStoreAction.php b/app/Membership/Actions/MassStoreAction.php index b5824bc8..a943e5b6 100644 --- a/app/Membership/Actions/MassStoreAction.php +++ b/app/Membership/Actions/MassStoreAction.php @@ -10,6 +10,7 @@ use App\Maildispatcher\Actions\ResyncAction; use App\Member\Member; use App\Member\Membership; use App\Subactivity; +use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\DB; use Lorisleiva\Actions\ActionRequest; use Lorisleiva\Actions\Concerns\AsAction; @@ -26,7 +27,12 @@ class MassStoreAction { return [ 'group_id' => 'required|numeric|exists:groups,id', - 'activity_id' => 'required|numeric|exists:activities,id', + 'activity_id' => ['required', 'numeric', 'exists:activities,id', function($key, $value, $fail) { + $activity = Activity::findOrFail($value); + if ($activity->subactivities->pluck('id')->doesntContain(request()->subactivity_id)) { + return $fail(':attribute ist nicht vorhanden.'); + } + }], 'subactivity_id' => 'required|numeric|exists:subactivities,id', 'members' => 'array', 'members.*' => 'numeric|exists:members,id', @@ -64,7 +70,7 @@ class MassStoreAction }); } - public function asController(ActionRequest $request): void + public function asController(ActionRequest $request): JsonResponse { /** * @var array{members: array, group_id: int, activity_id: int, subactivity_id: int} @@ -77,6 +83,16 @@ class MassStoreAction Subactivity::findOrFail($input['subactivity_id']), $input['members'], ); + + return response()->json([], 200); + } + + public function getValidationAttributes(): array { + return [ + 'activity_id' => 'Tätigkeit', + 'subactivity_id' => 'Untertätigkeit', + 'group_id' => 'Gruppe', + ]; } /** diff --git a/tests/EndToEnd/MassstoreActionTest.php b/tests/EndToEnd/MassstoreActionTest.php index 37f08caa..aac486f3 100644 --- a/tests/EndToEnd/MassstoreActionTest.php +++ b/tests/EndToEnd/MassstoreActionTest.php @@ -16,68 +16,79 @@ use Tests\EndToEndTestCase; use Throwable; use Zoomyboy\LaravelNami\Fakes\MembershipFake; -class MassstoreActionTest extends EndToEndTestCase -{ +uses(EndToEndTestCase::class); - public function testItFiresActionJobWhenUsingController(): void - { - Queue::fake(); - $this->login()->loginNami()->withoutExceptionHandling(); - $member = Member::factory()->defaults()->create(); - $activity = Activity::factory()->create(); - $subactivity = Subactivity::factory()->create(); - $group = Group::factory()->create(); +it('testItFiresActionJobWhenUsingController', function() { + Queue::fake(); + $this->login()->loginNami()->withoutExceptionHandling(); + $member = Member::factory()->defaults()->create(); + $activity = Activity::factory() + ->hasAttached(Subactivity::factory()) + ->create(); + $group = Group::factory()->create(); - $this->postJson(route('membership.masslist.store'), [ - 'members' => [$member->id], - 'activity_id' => $activity->id, - 'subactivity_id' => $subactivity->id, - 'group_id' => $group->id, - ]); - MassStoreAction::assertPushed(fn ($action, $params) => $params[0]->is($group) && $params[1]->is($activity) && $params[2]->is($subactivity) && $params[3][0] === $member->id); - } + $subactivity = $activity->subactivities()->first(); + $this->postJson(route('membership.masslist.store'), [ + 'members' => [$member->id], + 'activity_id' => $activity->id, + 'subactivity_id' => $subactivity->id, + 'group_id' => $group->id, + ]); + MassStoreAction::assertPushed(fn ($action, $params) => $params[0]->is($group) && $params[1]->is($activity) && $params[2]->is($subactivity) && $params[3][0] === $member->id); +}); - public function testItCreatesAMembership(): void - { - MembershipDestroyAction::partialMock()->shouldReceive('handle')->never(); - MembershipStoreAction::partialMock()->shouldReceive('handle')->once(); - $member = Member::factory()->defaults()->create(); - $activity = Activity::factory()->create(); - $subactivity = Subactivity::factory()->create(); - $group = Group::factory()->create(); +it('testItCreatesAMembership', function() { + MembershipDestroyAction::partialMock()->shouldReceive('handle')->never(); + MembershipStoreAction::partialMock()->shouldReceive('handle')->once(); + $member = Member::factory()->defaults()->create(); + $activity = Activity::factory()->create(); + $subactivity = Subactivity::factory()->create(); + $group = Group::factory()->create(); - MassStoreAction::run($group, $activity, $subactivity, [$member->id]); - } + MassStoreAction::run($group, $activity, $subactivity, [$member->id]); +}); - public function testItDeletesAMembership(): void - { - MembershipDestroyAction::partialMock()->shouldReceive('handle')->once(); - MembershipStoreAction::partialMock()->shouldReceive('handle')->never(); - ResyncAction::partialMock()->shouldReceive('handle')->once(); +it('cannot create membership when activity and subactivity doesnt belong together', function() { + $this->login()->loginNami(); + $member = Member::factory()->defaults()->create(); + $activity = Activity::factory()->create(); + $subactivity = Subactivity::factory()->create(); + $group = Group::factory()->create(); - $member = Member::factory()->defaults()->has(Membership::factory()->inLocal('Leiter*in', 'Rover'))->create(); + $this->postJson(route('membership.masslist.store'), [ + 'members' => [$member->id], + 'activity_id' => $activity->id, + 'subactivity_id' => $subactivity->id, + 'group_id' => $group->id, + ])->assertJsonValidationErrors(['activity_id' => 'Tätigkeit ist nicht vorhanden.']); +}); +it('testItDeletesAMembership', function() { + MembershipDestroyAction::partialMock()->shouldReceive('handle')->once(); + MembershipStoreAction::partialMock()->shouldReceive('handle')->never(); + ResyncAction::partialMock()->shouldReceive('handle')->once(); + + $member = Member::factory()->defaults()->has(Membership::factory()->inLocal('Leiter*in', 'Rover'))->create(); + + MassStoreAction::run($member->memberships->first()->group, $member->memberships->first()->activity, $member->memberships->first()->subactivity, []); +}); + +it('testItRollsbackWhenDeletionFails', function() { + app(MembershipFake::class) + ->shows(3, ['id' => 55]) + ->shows(3, ['id' => 56]) + ->destroysSuccessfully(3, 55) + ->failsDeleting(3, 56); + $this->login()->loginNami(); + + $member = Member::factory()->defaults()->inNami(3) + ->has(Membership::factory()->in('Leiter*in', 10, 'Rover', 11)->inNami(55)) + ->has(Membership::factory()->in('Leiter*in', 10, 'Jungpfadfinder', 12)->inNami(56)) + ->create(); + + try { MassStoreAction::run($member->memberships->first()->group, $member->memberships->first()->activity, $member->memberships->first()->subactivity, []); + } catch (Throwable $e) { } - - public function testItRollsbackWhenDeletionFails(): void - { - app(MembershipFake::class) - ->shows(3, ['id' => 55]) - ->shows(3, ['id' => 56]) - ->destroysSuccessfully(3, 55) - ->failsDeleting(3, 56); - $this->login()->loginNami(); - - $member = Member::factory()->defaults()->inNami(3) - ->has(Membership::factory()->in('Leiter*in', 10, 'Rover', 11)->inNami(55)) - ->has(Membership::factory()->in('Leiter*in', 10, 'Jungpfadfinder', 12)->inNami(56)) - ->create(); - - try { - MassStoreAction::run($member->memberships->first()->group, $member->memberships->first()->activity, $member->memberships->first()->subactivity, []); - } catch (Throwable $e) { - } - $this->assertDatabaseCount('memberships', 2); - } -} + $this->assertDatabaseCount('memberships', 2); +});