unique()->safeEmail(); self::$testPlanner = Planner::factory()->create([ 'email' => self::$testEmail, 'password' => Hash::make(self::$testPassword), ]); } } public function testSuccessfulLogin(): void { $this->ensureTestPlannerExists(); $this->browse(function (Browser $browser) { $browser->driver->manage()->deleteAllCookies(); $browser->visit('http://dishplanner_app:8000/login') ->waitFor('input[id="email"]', self::TIMEOUT_SHORT) ->clear('input[id="email"]') ->type('input[id="email"]', self::$testEmail) ->clear('input[id="password"]') ->type('input[id="password"]', self::$testPassword) ->press('Login') ->waitForLocation('/dashboard', self::TIMEOUT_MEDIUM) ->assertPathIs('/dashboard'); }); } public function testLoginWithWrongCredentials(): void { $this->ensureTestPlannerExists(); $this->browse(function (Browser $browser) { $browser->driver->manage()->deleteAllCookies(); $browser->visit('http://dishplanner_app:8000/login') ->waitFor('input[id="email"]', self::TIMEOUT_SHORT) ->clear('input[id="email"]') ->type('input[id="email"]', self::$testEmail) ->clear('input[id="password"]') ->type('input[id="password"]', 'wrongpassword') ->press('Login') ->pause(self::PAUSE_MEDIUM) ->assertPathIs('/login') ->assertSee('These credentials do not match our records'); }); } public function testLoginFormRequiredFields(): void { $this->browse(function (Browser $browser) { $browser->driver->manage()->deleteAllCookies(); $browser->visit('http://dishplanner_app:8000/login') ->waitFor('input[id="email"]', self::TIMEOUT_SHORT); // Check that both fields have the required attribute $browser->assertAttribute('input[id="email"]', 'required', 'true'); $browser->assertAttribute('input[id="password"]', 'required', 'true'); // Verify email field is type email $browser->assertAttribute('input[id="email"]', 'type', 'email'); // Verify password field is type password $browser->assertAttribute('input[id="password"]', 'type', 'password'); // Test that we stay on login page if we try to submit with empty fields $browser->press('Login') ->pause(self::PAUSE_SHORT) ->assertPathIs('/login'); }); } }