125 lines
4.2 KiB
PHP
125 lines
4.2 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace Tests\Browser\Schedule;
|
||
|
|
|
||
|
|
use App\Models\Dish;
|
||
|
|
use App\Models\Planner;
|
||
|
|
use App\Models\User;
|
||
|
|
use Illuminate\Support\Facades\Hash;
|
||
|
|
use Laravel\Dusk\Browser;
|
||
|
|
use Tests\DuskTestCase;
|
||
|
|
use Tests\Browser\Pages\SchedulePage;
|
||
|
|
|
||
|
|
class GenerateScheduleTest extends DuskTestCase
|
||
|
|
{
|
||
|
|
protected static $planner = null;
|
||
|
|
protected static $email = null;
|
||
|
|
protected static $password = 'password';
|
||
|
|
protected static $user = null;
|
||
|
|
protected static $dish = null;
|
||
|
|
|
||
|
|
protected function setUp(): void
|
||
|
|
{
|
||
|
|
parent::setUp();
|
||
|
|
|
||
|
|
// Create test data if not exists
|
||
|
|
if (self::$planner === null) {
|
||
|
|
self::$email = fake()->unique()->safeEmail();
|
||
|
|
self::$planner = Planner::factory()->create([
|
||
|
|
'email' => self::$email,
|
||
|
|
'password' => Hash::make(self::$password),
|
||
|
|
]);
|
||
|
|
|
||
|
|
// Create a user for this planner
|
||
|
|
self::$user = User::factory()->create([
|
||
|
|
'planner_id' => self::$planner->id,
|
||
|
|
'name' => 'Test User',
|
||
|
|
]);
|
||
|
|
|
||
|
|
// Create a dish and assign to user
|
||
|
|
self::$dish = Dish::factory()->create([
|
||
|
|
'planner_id' => self::$planner->id,
|
||
|
|
'name' => 'Test Dish',
|
||
|
|
]);
|
||
|
|
|
||
|
|
// Attach user to dish (creates UserDish)
|
||
|
|
self::$dish->users()->attach(self::$user);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
protected function loginAsPlanner(Browser $browser): Browser
|
||
|
|
{
|
||
|
|
$browser->driver->manage()->deleteAllCookies();
|
||
|
|
|
||
|
|
return $browser->visit('http://dishplanner_app:8000/login')
|
||
|
|
->waitFor('input[id="email"]', DuskTestCase::TIMEOUT_SHORT)
|
||
|
|
->clear('input[id="email"]')
|
||
|
|
->type('input[id="email"]', self::$email)
|
||
|
|
->clear('input[id="password"]')
|
||
|
|
->type('input[id="password"]', self::$password)
|
||
|
|
->press('Login')
|
||
|
|
->waitForLocation('/dashboard', DuskTestCase::TIMEOUT_MEDIUM)
|
||
|
|
->pause(DuskTestCase::PAUSE_SHORT)
|
||
|
|
->visit('http://dishplanner_app:8000/schedule')
|
||
|
|
->pause(DuskTestCase::PAUSE_MEDIUM);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function testCanGenerateScheduleWithUserAndDish(): void
|
||
|
|
{
|
||
|
|
$this->browse(function (Browser $browser) {
|
||
|
|
$this->loginAsPlanner($browser);
|
||
|
|
|
||
|
|
$browser->on(new SchedulePage)
|
||
|
|
->assertSee('Test User') // User should be in selection
|
||
|
|
->clickGenerate()
|
||
|
|
->pause(2000)
|
||
|
|
// Verify schedule was generated by checking dish appears on calendar
|
||
|
|
->assertSee('Test Dish');
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
public function testGeneratedScheduleShowsDishOnCalendar(): void
|
||
|
|
{
|
||
|
|
$this->browse(function (Browser $browser) {
|
||
|
|
$this->loginAsPlanner($browser);
|
||
|
|
|
||
|
|
$browser->on(new SchedulePage)
|
||
|
|
->clickGenerate()
|
||
|
|
->pause(2000)
|
||
|
|
// The dish should appear somewhere on the calendar
|
||
|
|
->assertSee('Test Dish');
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
public function testCanClearMonthSchedule(): void
|
||
|
|
{
|
||
|
|
$this->browse(function (Browser $browser) {
|
||
|
|
$this->loginAsPlanner($browser);
|
||
|
|
|
||
|
|
$browser->on(new SchedulePage)
|
||
|
|
// First generate a schedule
|
||
|
|
->clickGenerate()
|
||
|
|
->pause(2000)
|
||
|
|
->assertSee('Test Dish') // Verify generated
|
||
|
|
// Then clear it
|
||
|
|
->clickClearMonth()
|
||
|
|
->pause(1000)
|
||
|
|
// After clearing, should see "No dishes scheduled" on calendar days
|
||
|
|
->assertSee('No dishes scheduled');
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
public function testUserSelectionAffectsGeneration(): void
|
||
|
|
{
|
||
|
|
$this->browse(function (Browser $browser) {
|
||
|
|
$this->loginAsPlanner($browser);
|
||
|
|
|
||
|
|
$browser->on(new SchedulePage)
|
||
|
|
// Verify the user checkbox is present
|
||
|
|
->assertSee('Test User')
|
||
|
|
// User should be selected by default
|
||
|
|
->assertChecked("input[value='" . self::$user->id . "']");
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|