131 lines
5.2 KiB
PHP
131 lines
5.2 KiB
PHP
<?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);
|
|
}
|
|
}
|