setUpHasPlanner(); $this->action = new RegenerateScheduleForDateForUsersAction(); } public function test_regenerates_schedule_for_single_date(): void { $planner = $this->planner; $user = User::factory()->planner($planner)->create(); $dish = Dish::factory()->planner($planner)->create(); $dish->users()->attach($user); $date = Carbon::parse('2026-01-15'); $this->action->execute($planner, $date, [$user->id]); $this->assertDatabaseCount(Schedule::class, 1); $this->assertDatabaseCount(ScheduledUserDish::class, 1); $this->assertDatabaseHas(Schedule::class, [ 'planner_id' => $planner->id, 'date' => '2026-01-15', ]); } public function test_deletes_and_recreates_existing_schedule(): void { $planner = $this->planner; $user = User::factory()->planner($planner)->create(); $dish1 = Dish::factory()->planner($planner)->create(); $dish2 = Dish::factory()->planner($planner)->create(); $dish1->users()->attach($user); $dish2->users()->attach($user); $date = Carbon::parse('2026-02-10'); $schedule = Schedule::create([ 'planner_id' => $planner->id, 'date' => $date->format('Y-m-d'), 'is_skipped' => false, ]); $originalUserDish = $user->userDishes->first(); ScheduledUserDish::create([ 'schedule_id' => $schedule->id, 'user_id' => $user->id, 'user_dish_id' => $originalUserDish->id, 'is_skipped' => false, ]); $this->action->execute($planner, $date, [$user->id]); $this->assertDatabaseCount(ScheduledUserDish::class, 1); } public function test_regenerates_for_multiple_users(): void { $planner = $this->planner; $users = User::factory()->planner($planner)->count(3)->create(); $dish = Dish::factory()->planner($planner)->create(); $dish->users()->attach($users); $date = Carbon::parse('2026-03-20'); $this->action->execute($planner, $date, $users->pluck('id')->toArray()); $this->assertDatabaseCount(ScheduledUserDish::class, 3); } public function test_creates_schedule_if_not_exists(): void { $planner = $this->planner; $user = User::factory()->planner($planner)->create(); $dish = Dish::factory()->planner($planner)->create(); $dish->users()->attach($user); $date = Carbon::parse('2026-04-25'); $this->assertDatabaseCount(Schedule::class, 0); $this->action->execute($planner, $date, [$user->id]); $this->assertDatabaseCount(Schedule::class, 1); $this->assertDatabaseHas(Schedule::class, [ 'planner_id' => $planner->id, 'date' => '2026-04-25', ]); } public function test_skips_users_without_dishes(): void { $planner = $this->planner; $userWithDish = User::factory()->planner($planner)->create(); $userWithoutDish = User::factory()->planner($planner)->create(); $dish = Dish::factory()->planner($planner)->create(); $dish->users()->attach($userWithDish); $date = Carbon::parse('2026-05-05'); $this->action->execute($planner, $date, [$userWithDish->id, $userWithoutDish->id]); $this->assertDatabaseCount(ScheduledUserDish::class, 1); $this->assertDatabaseMissing(ScheduledUserDish::class, ['user_id' => $userWithoutDish->id]); } }