92 lines
3.3 KiB
PHP
92 lines
3.3 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit\Schedule\Actions;
|
|
|
|
use App\Models\Dish;
|
|
use App\Models\Schedule;
|
|
use App\Models\ScheduledUserDish;
|
|
use App\Models\User;
|
|
use Carbon\Carbon;
|
|
use DishPlanner\Schedule\Actions\ClearScheduleForMonthAction;
|
|
use DishPlanner\Schedule\Actions\GenerateScheduleForMonthAction;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Tests\TestCase;
|
|
use Tests\Traits\HasPlanner;
|
|
|
|
class ClearScheduleForMonthActionTest extends TestCase
|
|
{
|
|
use HasPlanner;
|
|
use RefreshDatabase;
|
|
|
|
private ClearScheduleForMonthAction $action;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
$this->setUpHasPlanner();
|
|
$this->action = new ClearScheduleForMonthAction();
|
|
}
|
|
|
|
public function test_clears_scheduled_user_dishes_for_month(): void
|
|
{
|
|
$planner = $this->planner;
|
|
$user = User::factory()->planner($planner)->create();
|
|
$dish = Dish::factory()->planner($planner)->create();
|
|
$dish->users()->attach($user);
|
|
|
|
$month = 1;
|
|
$year = 2026;
|
|
$daysInMonth = Carbon::createFromDate($year, $month, 1)->daysInMonth;
|
|
|
|
(new GenerateScheduleForMonthAction())->execute($planner, $month, $year, [$user->id]);
|
|
|
|
$this->assertEquals($daysInMonth, ScheduledUserDish::where('user_id', $user->id)->count());
|
|
|
|
$this->action->execute($planner, $month, $year, [$user->id]);
|
|
|
|
$this->assertEquals(0, ScheduledUserDish::where('user_id', $user->id)->count());
|
|
$this->assertDatabaseCount(Schedule::class, $daysInMonth);
|
|
}
|
|
|
|
public function test_only_clears_specified_users(): void
|
|
{
|
|
$planner = $this->planner;
|
|
$user1 = User::factory()->planner($planner)->create();
|
|
$user2 = User::factory()->planner($planner)->create();
|
|
$dish = Dish::factory()->planner($planner)->create();
|
|
$dish->users()->attach([$user1->id, $user2->id]);
|
|
|
|
$month = 2;
|
|
$year = 2026;
|
|
$daysInMonth = Carbon::createFromDate($year, $month, 1)->daysInMonth;
|
|
|
|
(new GenerateScheduleForMonthAction())->execute($planner, $month, $year, [$user1->id, $user2->id]);
|
|
$this->assertEquals($daysInMonth * 2, ScheduledUserDish::whereIn('user_id', [$user1->id, $user2->id])->count());
|
|
|
|
$this->action->execute($planner, $month, $year, [$user1->id]);
|
|
|
|
$this->assertEquals($daysInMonth, ScheduledUserDish::whereIn('user_id', [$user1->id, $user2->id])->count());
|
|
$this->assertEquals(0, ScheduledUserDish::where('user_id', $user1->id)->count());
|
|
}
|
|
|
|
public function test_does_not_affect_other_months(): void
|
|
{
|
|
$planner = $this->planner;
|
|
$user = User::factory()->planner($planner)->create();
|
|
$dish = Dish::factory()->planner($planner)->create();
|
|
$dish->users()->attach($user);
|
|
|
|
$year = 2026;
|
|
$janDays = Carbon::createFromDate($year, 1, 1)->daysInMonth;
|
|
$febDays = Carbon::createFromDate($year, 2, 1)->daysInMonth;
|
|
|
|
(new GenerateScheduleForMonthAction())->execute($planner, 1, $year, [$user->id]);
|
|
(new GenerateScheduleForMonthAction())->execute($planner, 2, $year, [$user->id]);
|
|
|
|
$this->assertEquals($janDays + $febDays, ScheduledUserDish::where('user_id', $user->id)->count());
|
|
|
|
$this->action->execute($planner, 1, $year, [$user->id]);
|
|
|
|
$this->assertEquals($febDays, ScheduledUserDish::where('user_id', $user->id)->count());
|
|
}
|
|
}
|