dishplanner/tests/Feature/DashboardTest.php

132 lines
5.2 KiB
PHP
Raw Normal View History

<?php
namespace Tests\Feature;
use App\Models\Dish;
use App\Models\Planner;
use App\Models\Schedule;
use App\Models\ScheduledUserDish;
use App\Models\User;
use App\Models\UserDish;
use DishPlanner\Schedule\Actions\UpdateScheduleAction;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class DashboardTest extends TestCase
{
use RefreshDatabase;
public function test_dashboard_renders_with_zero_stats_for_an_empty_planner(): void
{
$planner = Planner::factory()->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);
}
}