setUpHasPlanner(); } public function test_dish_update_succeeds(): void { $planner = $this->planner; $userOne = User::factory()->planner($planner)->create(); $userTwo = User::factory()->planner($planner)->create(); $users = collect([$userOne, $userTwo]); $this->generateDishes($planner); $this->generateScheduledDishes($planner); $dishOne = Dish::factory()->planner($planner)->create(); $dishOne->users()->sync($users); $dishTwo = Dish::factory()->planner($planner)->create(); $dishTwo->users()->sync($users); $targetUser = $users->pop(); $oldUserDish = $targetUser->userDishes()->inRandomOrder()->first(); $newUserDish = $dishTwo->userDishes()->inRandomOrder()->first(); $schedule = Schedule::factory()->planner($planner)->create(); $randomScheduledUserDish = ScheduledUserDish::factory() ->schedule($schedule) ->user($oldUserDish->user) ->userDish($oldUserDish) ->create(); $this ->actingAs($planner) ->put(route('api.scheduled-user-dishes.update', $randomScheduledUserDish), [ 'user_dish_id' => $newUserDish->id, ]) ->assertStatus(200) ->assertJson(fn (AssertableJson $json) => $json ->where('success', true) ->has('payload', fn ($json) => $json ->has('scheduled_user_dish', fn (AssertableJson $json) => $json ->where('id', $randomScheduledUserDish->id) ->where('is_skipped', false) ->has('schedule', fn (AssertableJson $json) => $json ->has('id') ->where('date', $randomScheduledUserDish->schedule->date->format('Y-m-d')) ) ->has('userDish', fn (AssertableJson $json) => $json ->where('id', $newUserDish->id) ->has('user', fn (AssertableJson $json) => $json ->where('id', $newUserDish->user->id) ->where('name', $newUserDish->user->name) ) ->has('dish', fn (AssertableJson $json) => $json ->where('id', $newUserDish->dish->id) ->where('planner_id', $planner->id) ->where('name', $newUserDish->dish->name) ->has('users', 2) ) ->has('recurrences') ) ) ) ->where('errors', null) ); } public function test_planner_cannot_update_dish_of_other_planner(): void { $planner = $this->planner; $otherPlanner = Planner::factory()->create(); $userOne = User::factory()->planner($otherPlanner)->create(); $userTwo = User::factory()->planner($otherPlanner)->create(); $users = collect([$userOne, $userTwo]); $this->generateDishes($otherPlanner); $this->generateScheduledDishes($otherPlanner); $dishOne = Dish::factory()->planner($otherPlanner)->create(); $dishOne->users()->sync($users); $dishTwo = Dish::factory()->planner($otherPlanner)->create(); $dishTwo->users()->sync($users); $targetUser = $users->pop(); $oldUserDish = $targetUser->userDishes()->inRandomOrder()->first(); $newUserDish = $dishTwo->userDishes()->inRandomOrder()->first(); $schedule = Schedule::factory()->planner($otherPlanner)->create(); $randomScheduledUserDish = ScheduledUserDish::factory() ->schedule($schedule) ->user($oldUserDish->user) ->userDish($oldUserDish) ->create(); $this ->actingAs($planner) ->put(route('api.scheduled-user-dishes.update', $randomScheduledUserDish), [ 'user_dish_id' => $newUserDish->id, ]) ->assertStatus(403) ->assertJson(fn (AssertableJson $json) => $json ->where('success', false) ->where('payload', null) ->where('errors', [ "This action is unauthorized." ]) ); } public function test_is_skipped_update_succeeds(): void { $planner = $this->planner; $userOne = User::factory()->planner($planner)->create(); $userTwo = User::factory()->planner($planner)->create(); $users = collect([$userOne, $userTwo]); $this->generateDishes($planner); $this->generateScheduledDishes($planner); $dishOne = Dish::factory()->planner($planner)->create(); $dishOne->users()->sync($users); $dishTwo = Dish::factory()->planner($planner)->create(); $dishTwo->users()->sync($users); $schedule = Schedule::factory()->planner($planner)->create(); $randomUser = $users->random(); $randomScheduledUserDish = ScheduledUserDish::factory() ->schedule($schedule) ->user($randomUser) ->userDish($randomUser->userDishes->random()) ->create(); $this ->actingAs($planner) ->put(route('api.scheduled-user-dishes.update', $randomScheduledUserDish), [ 'is_skipped' => true, ]) ->assertStatus(200) ->assertJson(fn (AssertableJson $json) => $json ->where('success', true) ->has('payload', fn ($json) => $json ->has('scheduled_user_dish', fn (AssertableJson $json) => $json ->where('id', $randomScheduledUserDish->id) ->where('userDish', null) ->where('is_skipped', true) ->has('schedule', fn (AssertableJson $json) => $json ->has('id') ->where('date', $randomScheduledUserDish->schedule->date->format('Y-m-d')) ) ) ) ->where('errors', null) ); } }