create(); $this->actingAs($planner) ->get('/dashboard') ->assertOk() ->assertViewIs('dashboard') ->assertSee('DASHBOARD') ->assertSee('Dishes') ->assertSee('Users') ->assertSee('Meals this month') ->assertSee('No users yet.') ->assertViewHas('stats', fn (array $stats) => $stats['dish_count'] === 0 && $stats['user_count'] === 0 && $stats['meals_this_month'] === 0 && $stats['favorite_dishes']->isEmpty()); } public function test_dashboard_shows_dish_and_user_counts(): void { $planner = Planner::factory()->create(); Dish::factory()->planner($planner)->count(3)->create(); User::factory()->planner($planner)->count(2)->create(); $this->actingAs($planner) ->get('/dashboard') ->assertOk() ->assertSee('Favorite dishes') ->assertSee('No meals yet') ->assertViewHas('stats', fn (array $stats) => $stats['dish_count'] === 3 && $stats['user_count'] === 2 && $stats['favorite_dishes']->count() === 2 && $stats['favorite_dishes']->every(fn (array $favorite) => $favorite['dish'] === null && $favorite['count'] === 0)); } public function test_dashboard_counts_only_non_skipped_meals_this_month(): void { $planner = Planner::factory()->create(); $user = User::factory()->planner($planner)->create(); $dish = Dish::factory()->planner($planner)->create(); $userDish = UserDish::factory()->user($user)->dish($dish)->create(); $date = now()->startOfMonth()->addDays(5); $scheduled = Schedule::factory()->planner($planner)->date($date)->create(); $skipped = Schedule::factory()->planner($planner)->date($date->copy()->addDay())->create(); ScheduledUserDish::factory()->schedule($scheduled)->user($user)->userDish($userDish)->create(); ScheduledUserDish::factory()->schedule($skipped)->user($user)->userDish($userDish)->skipped()->create(); $this->actingAs($planner) ->get('/dashboard') ->assertOk() ->assertViewHas('stats', fn (array $stats) => $stats['meals_this_month'] === 1); } public function test_dashboard_shows_the_most_scheduled_dish_per_user(): void { $planner = Planner::factory()->create(); $user = User::factory()->planner($planner)->create(['name' => 'Ada']); $pizza = Dish::factory()->planner($planner)->create(['name' => 'Pizza']); $tacos = Dish::factory()->planner($planner)->create(['name' => 'Tacos']); $pizzaDish = UserDish::factory()->user($user)->dish($pizza)->create(); $tacosDish = UserDish::factory()->user($user)->dish($tacos)->create(); ScheduledUserDish::factory() ->schedule(Schedule::factory()->planner($planner)->date(now())->create()) ->user($user) ->userDish($pizzaDish) ->create(); ScheduledUserDish::factory() ->schedule(Schedule::factory()->planner($planner)->date(now()->addDay())->create()) ->user($user) ->userDish($pizzaDish) ->create(); ScheduledUserDish::factory() ->schedule(Schedule::factory()->planner($planner)->date(now()->addDays(2))->create()) ->user($user) ->userDish($tacosDish) ->create(); $this->actingAs($planner) ->get('/dashboard') ->assertOk() ->assertSee('Pizza') ->assertViewHas('stats', function (array $stats) { $favorite = $stats['favorite_dishes']->first(); return $favorite['user']->name === 'Ada' && $favorite['dish']->name === 'Pizza' && $favorite['count'] === 2; }); } public function test_dashboard_excludes_meals_from_a_skipped_schedule(): void { $planner = Planner::factory()->create(); $user = User::factory()->planner($planner)->create(); $dish = Dish::factory()->planner($planner)->create(); $userDish = UserDish::factory()->user($user)->dish($dish)->create(); $date = now()->startOfMonth()->addDays(5); $schedule = Schedule::factory()->planner($planner)->date($date)->create(); ScheduledUserDish::factory()->schedule($schedule)->user($user)->userDish($userDish)->create(); (new UpdateScheduleAction)->execute($schedule, true); $this->actingAs($planner) ->get('/dashboard') ->assertOk() ->assertViewHas('stats', fn (array $stats) => $stats['meals_this_month'] === 0); } }