dishplanner/tests/Pest.php

77 lines
1.7 KiB
PHP

<?php
use App\Models\Planner;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Hash;
use Pest\Browser\Api\AwaitableWebpage;
use Pest\Browser\Api\Webpage;
use Tests\BrowserTestCase;
use Tests\TestCase;
uses(TestCase::class)->in('Feature', 'Unit');
uses(BrowserTestCase::class, RefreshDatabase::class)->in('Browser');
// Livewire round-trips can be slower than the default 5s auto-wait budget.
pest()->browser()->timeout(10000);
/**
* Create a planner with a known password for browser logins.
*/
function createPlanner(?string $email = null): Planner
{
return Planner::factory()->create([
'email' => $email ?? fake()->unique()->safeEmail(),
'password' => Hash::make('password'),
]);
}
/**
* Log in as the given planner and navigate to the target page.
*
* @return Webpage
*/
function loginAs(Planner $planner, string $page = '/dashboard')
{
return visit('/login')
->type('input[id="email"]', $planner->email)
->type('input[id="password"]', 'password')
->press('Sign In')
->assertPathIs('/dashboard')
->navigate($page);
}
/**
* @return Webpage
*/
function loginAndGoToDishes()
{
return loginAs(createPlanner(), '/dishes');
}
/**
* @return Webpage
*/
function loginAndGoToUsers()
{
return loginAs(createPlanner(), '/users');
}
/**
* @return Webpage
*/
function loginAndGoToSchedule()
{
return loginAs(createPlanner(), '/schedule');
}
/**
* Open the account dropdown and submit the logout form.
*
* @return Webpage
*/
function logout(Webpage|AwaitableWebpage $page)
{
return $page
->click('button[\@click="open = !open"]')
->click('.sm\:flex form[action$="/logout"] button[type="submit"]');
}