app/tests/Unit/Schedule/Actions/ClearScheduleForMonthActionTest.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());
}
}