setUpHasPlanner(); } public function test_planner_can_schedule_user_dishes(): void { $planner = $this->planner; $userOne = User::factory()->planner($planner)->create(); $userTwo = User::factory()->planner($planner)->create(); $users = collect([$userOne, $userTwo]); $dish = Dish::factory()->planner($planner)->create(); $dish->users()->attach($users); $scheduleDate = now()->addDays(7)->format('Y-m-d'); $targetUserDish = $dish->userDishes->random(); $this->assertDatabaseEmpty(Schedule::class); $this->assertDatabaseEmpty(ScheduledUserDish::class); $this ->actingAs($planner) ->post(route('api.scheduled-user-dishes.store'), [ 'user_dish_id' => $targetUserDish->id, 'date' => $scheduleDate, ]) ->assertStatus(200) ->assertJson(fn (AssertableJson $json) => $json ->where('success', true) ->has('payload', fn ($json) => $json ->has('scheduled_user_dish', fn ($json) => $json ->has('id') ->where('is_skipped', null) ->has('schedule', fn (AssertableJson $json) => $json ->has('id') ->where('date', $scheduleDate) ) ->has('userDish', fn (AssertableJson $json) => $json ->where('id', $targetUserDish->id) ->has('user', fn (AssertableJson $json) => $json ->where('id', $targetUserDish->user->id) ->where('name', $targetUserDish->user->name) ) ->has('dish', fn (AssertableJson $json) => $json ->where('id', $targetUserDish->dish->id) ->where('planner_id', $targetUserDish->dish->planner_id) ->where('name', $targetUserDish->dish->name) ->has('users', 2) ) ->has('recurrences') ) ) ) ->where('errors', null) ); $this->assertDatabaseCount(Schedule::class, 1); $this->assertDatabaseHas(Schedule::class, [ 'date' => $scheduleDate, ]); $this->assertDatabaseCount(ScheduledUserDish::class, 1); $this->assertDatabaseHas(ScheduledUserDish::class, [ 'user_dish_id' => $targetUserDish->id, 'schedule_id' => Schedule::all()->first()->id, ]); } public function test_planner_cannot_schedule_user_dishes_from_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]); $dish = Dish::factory()->planner($otherPlanner)->create(); $dish->users()->attach($users); $scheduleDate = now()->addDays(7)->format('Y-m-d'); $targetUserDish = $dish->userDishes->random(); $this->assertDatabaseEmpty(Schedule::class); $this->assertDatabaseEmpty(ScheduledUserDish::class); $this ->actingAs($planner) ->post(route('api.scheduled-user-dishes.store'), [ 'user_dish_id' => $targetUserDish->id, 'date' => $scheduleDate, ]) ->assertStatus(403) ->assertJson(fn (AssertableJson $json) => $json ->where('success', false) ->whereNull('payload') ->where('errors', [ "This action is unauthorized." ]) ); $this->assertDatabaseEmpty(Schedule::class); $this->assertDatabaseEmpty(ScheduledUserDish::class); } }