Added dusk

Signed-off-by: snipe <snipe@snipe.net>
This commit is contained in:
snipe 2024-08-30 00:39:43 +01:00
parent 12fa505972
commit 6c1449cf92
10 changed files with 324 additions and 3 deletions

View file

@ -77,6 +77,7 @@
"brianium/paratest": "^7.0",
"fakerphp/faker": "^1.16",
"larastan/larastan": "^2.9",
"laravel/dusk": "^8.2",
"mockery/mockery": "^1.4",
"nunomaduro/phpinsights": "^2.11",
"php-mock/php-mock-phpunit": "^2.10",

140
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "3819ab4ef72eb77fabe494c0e746b83b",
"content-hash": "7a5bb887aeb2368dafece0dc0da75738",
"packages": [
{
"name": "alek13/slack",
@ -13071,6 +13071,78 @@
],
"time": "2024-05-27T18:33:26+00:00"
},
{
"name": "laravel/dusk",
"version": "v8.2.5",
"source": {
"type": "git",
"url": "https://github.com/laravel/dusk.git",
"reference": "e641800393ce4ad39f0a47133f51aae67ceb01ad"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/dusk/zipball/e641800393ce4ad39f0a47133f51aae67ceb01ad",
"reference": "e641800393ce4ad39f0a47133f51aae67ceb01ad",
"shasum": ""
},
"require": {
"ext-json": "*",
"ext-zip": "*",
"guzzlehttp/guzzle": "^7.5",
"illuminate/console": "^10.0|^11.0",
"illuminate/support": "^10.0|^11.0",
"php": "^8.1",
"php-webdriver/webdriver": "^1.9.0",
"symfony/console": "^6.2|^7.0",
"symfony/finder": "^6.2|^7.0",
"symfony/process": "^6.2|^7.0",
"vlucas/phpdotenv": "^5.2"
},
"require-dev": {
"mockery/mockery": "^1.6",
"orchestra/testbench": "^8.19|^9.0",
"phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^10.1|^11.0",
"psy/psysh": "^0.11.12|^0.12"
},
"suggest": {
"ext-pcntl": "Used to gracefully terminate Dusk when tests are running."
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Laravel\\Dusk\\DuskServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Laravel\\Dusk\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Taylor Otwell",
"email": "taylor@laravel.com"
}
],
"description": "Laravel Dusk provides simple end-to-end testing and browser automation.",
"keywords": [
"laravel",
"testing",
"webdriver"
],
"support": {
"issues": "https://github.com/laravel/dusk/issues",
"source": "https://github.com/laravel/dusk/tree/v8.2.5"
},
"time": "2024-08-26T12:34:33+00:00"
},
{
"name": "league/container",
"version": "4.2.2",
@ -13839,6 +13911,72 @@
},
"time": "2024-03-27T12:14:49+00:00"
},
{
"name": "php-webdriver/webdriver",
"version": "1.15.1",
"source": {
"type": "git",
"url": "https://github.com/php-webdriver/php-webdriver.git",
"reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/cd52d9342c5aa738c2e75a67e47a1b6df97154e8",
"reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8",
"shasum": ""
},
"require": {
"ext-curl": "*",
"ext-json": "*",
"ext-zip": "*",
"php": "^7.3 || ^8.0",
"symfony/polyfill-mbstring": "^1.12",
"symfony/process": "^5.0 || ^6.0 || ^7.0"
},
"replace": {
"facebook/webdriver": "*"
},
"require-dev": {
"ergebnis/composer-normalize": "^2.20.0",
"ondram/ci-detector": "^4.0",
"php-coveralls/php-coveralls": "^2.4",
"php-mock/php-mock-phpunit": "^2.0",
"php-parallel-lint/php-parallel-lint": "^1.2",
"phpunit/phpunit": "^9.3",
"squizlabs/php_codesniffer": "^3.5",
"symfony/var-dumper": "^5.0 || ^6.0"
},
"suggest": {
"ext-SimpleXML": "For Firefox profile creation"
},
"type": "library",
"autoload": {
"files": [
"lib/Exception/TimeoutException.php"
],
"psr-4": {
"Facebook\\WebDriver\\": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "A PHP client for Selenium WebDriver. Previously facebook/webdriver.",
"homepage": "https://github.com/php-webdriver/php-webdriver",
"keywords": [
"Chromedriver",
"geckodriver",
"php",
"selenium",
"webdriver"
],
"support": {
"issues": "https://github.com/php-webdriver/php-webdriver/issues",
"source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.1"
},
"time": "2023-10-20T12:21:20+00:00"
},
{
"name": "phpmyadmin/sql-parser",
"version": "5.9.0",

View file

@ -99,7 +99,7 @@ dir="{{ Helper::determineLanguageDirection() }}">
<a class="skip-main" href="#main">{{ trans('general.skip_to_main_content') }}</a>
<div class="wrapper">
<header class="main-header">
<header class="main-header" dusk="main-header">
<!-- Logo -->
@ -819,7 +819,7 @@ dir="{{ Helper::determineLanguageDirection() }}">
<!-- Content Header (Page header) -->
<section class="content-header" style="padding-bottom: 30px;">
<h1 class="pull-left pagetitle">@yield('title') </h1>
<h1 class="pull-left pagetitle" dusk="pagetitle">@yield('title') </h1>
@if (isset($helpText))
@include ('partials.more-info',

View file

@ -0,0 +1,71 @@
<?php
namespace Tests\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
class LoginTest extends DuskTestCase
{
/**
* A Dusk test example.
*/
public function testUserCanLoadLoginPage(): void
{
$this->browse(function (Browser $browser) {
$browser->visit('/')
->assertSee('Login');
});
}
/**
* A basic browser test example.
*/
public function testUserCanLoginAndSeeDashboard(): void
{
$user = User::factory()->superuser()->create([
'username' => 'admin',
'password' => 'password',
]);
$this->browse(function (Browser $browser) use ($user) {
$browser->visit('/login')
->type('username', $user->username)
->type('password', 'password')
->press('Login')
->assertPathIs('/')
->assertSeeIn('.pagetitle', 'Dashboard')
->assertSeeIn('.alert-success', 'Success')
->assertNotPresent('.alert-danger');
$browser->logout();
});
}
/**
* A basic browser test example.
*/
public function testRegularUserCanLoginAndSeeProfile(): void
{
$user = User::factory()->create([
'password' => Hash::make('password'),
]);
$this->browse(function (Browser $browser) use ($user) {
$browser->logout()
->visit('/login')
->type('username', $user->username)
->type('password', 'password')
->press('Login')
->assertPathIs('/account/view-assets')
->assertSeeIn('.pagetitle', 'Hello')
->assertNotPresent('.alert-danger')
->logout();
});
}
}

View file

@ -0,0 +1,36 @@
<?php
namespace Tests\Browser\Pages;
use Laravel\Dusk\Browser;
class HomePage extends Page
{
/**
* Get the URL for the page.
*/
public function url(): string
{
return '/';
}
/**
* Assert that the browser is on the page.
*/
public function assert(Browser $browser): void
{
//
}
/**
* Get the element shortcuts for the page.
*
* @return array<string, string>
*/
public function elements(): array
{
return [
'@element' => '#selector',
];
}
}

View file

@ -0,0 +1,20 @@
<?php
namespace Tests\Browser\Pages;
use Laravel\Dusk\Page as BasePage;
abstract class Page extends BasePage
{
/**
* Get the global element shortcuts for the site.
*
* @return array<string, string>
*/
public static function siteElements(): array
{
return [
'@element' => '#selector',
];
}
}

2
tests/Browser/console/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
*
!.gitignore

2
tests/Browser/screenshots/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
*
!.gitignore

2
tests/Browser/source/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
*
!.gitignore

49
tests/DuskTestCase.php Normal file
View file

@ -0,0 +1,49 @@
<?php
namespace Tests;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Illuminate\Support\Collection;
use Laravel\Dusk\TestCase as BaseTestCase;
use PHPUnit\Framework\Attributes\BeforeClass;
abstract class DuskTestCase extends BaseTestCase
{
use CreatesApplication;
/**
* Prepare for Dusk test execution.
*/
#[BeforeClass]
public static function prepare(): void
{
if (! static::runningInSail()) {
static::startChromeDriver(['--port=9515']);
}
}
/**
* Create the RemoteWebDriver instance.
*/
protected function driver(): RemoteWebDriver
{
$options = (new ChromeOptions)->addArguments(collect([
$this->shouldStartMaximized() ? '--start-maximized' : '--window-size=1920,1080',
'--disable-search-engine-choice-screen',
])->unless($this->hasHeadlessDisabled(), function (Collection $items) {
return $items->merge([
'--disable-gpu',
'--headless=new',
]);
})->all());
return RemoteWebDriver::create(
$_ENV['DUSK_DRIVER_URL'] ?? env('DUSK_DRIVER_URL') ?? 'http://localhost:9515',
DesiredCapabilities::chrome()->setCapability(
ChromeOptions::CAPABILITY, $options
)
);
}
}