dishplanner/tests/Browser/Schedule/GenerateScheduleTest.php

129 lines
4.1 KiB
PHP
Raw Permalink Normal View History

<?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\Browser\Pages\SchedulePage;
2026-08-17 13:30:49 +02:00
use Tests\DuskTestCase;
class GenerateScheduleTest extends DuskTestCase
{
protected static $planner = null;
2026-08-17 13:30:49 +02:00
protected static $email = null;
2026-08-17 13:30:49 +02:00
protected static $password = 'password';
2026-08-17 13:30:49 +02:00
protected static $user = null;
2026-08-17 13:30:49 +02:00
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')
2026-08-17 13:30:49 +02:00
->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);
}
2026-08-17 13:30:49 +02:00
public function test_can_generate_schedule_with_user_and_dish(): void
{
$this->browse(function (Browser $browser) {
$this->loginAsPlanner($browser);
$browser->on(new SchedulePage)
2026-08-17 13:30:49 +02:00
->assertSee('Test User') // User should be in selection
->clickGenerate()
->pause(2000)
// Verify schedule was generated by checking dish appears on calendar
2026-08-17 13:30:49 +02:00
->assertSee('Test Dish');
});
}
2026-08-17 13:30:49 +02:00
public function test_generated_schedule_shows_dish_on_calendar(): void
{
$this->browse(function (Browser $browser) {
$this->loginAsPlanner($browser);
$browser->on(new SchedulePage)
2026-08-17 13:30:49 +02:00
->clickGenerate()
->pause(2000)
// The dish should appear somewhere on the calendar
2026-08-17 13:30:49 +02:00
->assertSee('Test Dish');
});
}
2026-08-17 13:30:49 +02:00
public function test_can_clear_month_schedule(): void
{
$this->browse(function (Browser $browser) {
$this->loginAsPlanner($browser);
$browser->on(new SchedulePage)
// First generate a schedule
2026-08-17 13:30:49 +02:00
->clickGenerate()
->pause(2000)
->assertSee('Test Dish') // Verify generated
// Then clear it
2026-08-17 13:30:49 +02:00
->clickClearMonth()
->pause(1000)
// After clearing, should see "No dishes scheduled" on calendar days
2026-08-17 13:30:49 +02:00
->assertSee('No dishes scheduled');
});
}
2026-08-17 13:30:49 +02:00
public function test_user_selection_affects_generation(): void
{
$this->browse(function (Browser $browser) {
$this->loginAsPlanner($browser);
$browser->on(new SchedulePage)
// Verify the user checkbox is present
2026-08-17 13:30:49 +02:00
->assertSee('Test User')
// User should be selected by default
2026-08-17 13:30:49 +02:00
->assertChecked("input[value='".self::$user->id."']");
});
}
}