app/tests/Unit/Actions/RegenerateScheduleDayForUserActionTest.php

109 lines
3.6 KiB
PHP

<?php
namespace Tests\Unit\Actions;
use App\Models\Dish;
use App\Models\Schedule;
use App\Models\ScheduledUserDish;
use App\Models\User;
use DishPlanner\Schedule\Actions\RegenerateScheduleDayForUserAction;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
use Tests\Traits\HasPlanner;
class RegenerateScheduleDayForUserActionTest extends TestCase
{
use HasPlanner;
use RefreshDatabase;
protected function setUp(): void
{
parent::setUp();
$this->setUpHasPlanner();
}
public function test_it_creates(): void
{
$date = now();
$planner = $this->planner;
$dishes = Dish::factory()->planner($planner)->count(30)->create();
$schedule = Schedule::factory()->planner($planner)->date($date)->create();
$user = User::factory()->planner($planner)->create();
$user->dishes()->attach($dishes);
$this->assertEmpty($schedule->scheduledUserDishes);
resolve(RegenerateScheduleDayForUserAction::class)->execute($planner, $schedule, $user, true);
$expectedSchedule = Schedule::where('date', $date->format('Y-m-d'))->first();
$this->assertCount(1, $expectedSchedule->scheduledUserDishes);
$scheduledUserDish = ScheduledUserDish::all()->first();
$this->assertNotNull($scheduledUserDish);
$this->assertNotNull($scheduledUserDish->userDish->id);
}
public function test_it_updates_if_overwrite_is_true(): void
{
$planner = $this->planner;
/** @var Collection<Dish> $dishes */
$dishes = Dish::factory()->planner($planner)->count(30)->create();
$schedule = Schedule::factory()->planner($planner)->create();
$user = User::factory()->planner($planner)->create();
$user->dishes()->attach($dishes);
$startingDish = $user->userDishes->random();
ScheduledUserDish::factory()
->schedule($schedule)
->userDish($startingDish)
->create();
$this->assertCount(1, $schedule->refresh()->scheduledUserDishes);
resolve(RegenerateScheduleDayForUserAction::class)->execute($planner, $schedule, $user, true);
$schedule->refresh();
$this->assertCount(1, $schedule->scheduledUserDishes);
$scheduledUserDish = ScheduledUserDish::all()->first();
$this->assertNotNull($scheduledUserDish);
$this->assertNotNull($scheduledUserDish->userDish);
$this->assertNotEquals($startingDish->id, $scheduledUserDish->userDish->id); // TODO Flaky test
}
public function test_it_does_not_update_if_overwrite_is_false(): void
{
$planner = $this->planner;
/** @var Collection<Dish> $dishes */
$dishes = Dish::factory()->planner($planner)->count(30)->create();
$schedule = Schedule::factory()->planner($planner)->create();
$user = User::factory()->planner($planner)->create();
$user->dishes()->attach($dishes);
$startingUserDish = $user->userDishes->random();
ScheduledUserDish::factory()
->schedule($schedule)
->userDish($startingUserDish)
->create();
$this->assertCount(1, $schedule->refresh()->scheduledUserDishes);
resolve(RegenerateScheduleDayForUserAction::class)->execute($planner, $schedule, $user, false);
$schedule->refresh();
$this->assertCount(1, $schedule->scheduledUserDishes);
$scheduledUserDish = ScheduledUserDish::all()->first();
$this->assertNotNull($scheduledUserDish);
$this->assertEquals($startingUserDish->id, $scheduledUserDish->userDish->id);
}
}