Merge branch 'main' into #4-users-crud
# Conflicts: # composer.lock # resources/js/Shared/MainMenu.vue
This commit is contained in:
commit
ffba69319c
23
.env.ci
Normal file
23
.env.ci
Normal file
@ -0,0 +1,23 @@
|
||||
APP_NAME=Laravel
|
||||
APP_ENV=testing
|
||||
APP_KEY=base64:4Hjdxw6l/vsqukgRVRk5YwKHNJfX9N+44dJdnDesrcc=
|
||||
APP_DEBUG=false
|
||||
APP_URL=http://127.0.0.1
|
||||
|
||||
LOG_CHANNEL=stack
|
||||
LOG_LEVEL=debug
|
||||
|
||||
DB_CONNECTION=mysql
|
||||
DB_HOST=127.0.0.1
|
||||
DB_PORT=3306
|
||||
DB_DATABASE=toby
|
||||
DB_USERNAME=toby
|
||||
DB_PASSWORD=password
|
||||
|
||||
BROADCAST_DRIVER=log
|
||||
CACHE_DRIVER=array
|
||||
QUEUE_CONNECTION=sync
|
||||
SESSION_DRIVER=array
|
||||
SESSION_LIFETIME=120
|
||||
FILESYSTEM_DRIVER=local
|
||||
MAIL_MAILER=array
|
28
.env.dusk.local
Normal file
28
.env.dusk.local
Normal file
@ -0,0 +1,28 @@
|
||||
APP_NAME=Laravel
|
||||
APP_ENV=testing
|
||||
APP_KEY=base64:uuizKfYGhrBB+ecWuxg570hdUgKwZ1sqEgHPngW15Xw=
|
||||
APP_DEBUG=false
|
||||
APP_URL=http://toby-web
|
||||
|
||||
DUSK_IN_DOCKER=true
|
||||
DUSK_DRIVER_URL=http://toby-selenium:4444/wd/hub
|
||||
|
||||
LOG_CHANNEL=stack
|
||||
LOG_LEVEL=debug
|
||||
|
||||
DB_CONNECTION=mysql
|
||||
DB_HOST=toby-db-test
|
||||
DB_PORT=3306
|
||||
DB_DATABASE=toby
|
||||
DB_USERNAME=toby
|
||||
DB_PASSWORD=password
|
||||
|
||||
BROADCAST_DRIVER=log
|
||||
CACHE_DRIVER=array
|
||||
QUEUE_CONNECTION=sync
|
||||
SESSION_DRIVER=file
|
||||
SESSION_LIFETIME=120
|
||||
FILESYSTEM_DRIVER=local
|
||||
MAIL_MAILER=array
|
||||
|
||||
TELESCOPE_ENABLED=false
|
18
.env.example
18
.env.example
@ -8,18 +8,24 @@ LOG_CHANNEL=stack
|
||||
LOG_LEVEL=debug
|
||||
|
||||
DB_CONNECTION=mysql
|
||||
DB_HOST=toby-db
|
||||
DB_HOST=toby-db-dev
|
||||
DB_PORT=3306
|
||||
DB_DATABASE=toby
|
||||
DB_USERNAME=toby
|
||||
DB_PASSWORD=password
|
||||
DB_ROOT_PASSWORD=example
|
||||
|
||||
DOCKER_DB_EXTERNAL_PORT=3306
|
||||
DOCKER_DB_DATABASE=${DB_DATABASE}
|
||||
DOCKER_DB_USERNAME=${DB_USERNAME}
|
||||
DOCKER_DB_PASSWORD=${DB_PASSWORD}
|
||||
DOCKER_DB_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
|
||||
DOCKER_DEV_DB_EXTERNAL_PORT=3306
|
||||
DOCKER_DEV_DB_DATABASE=${DB_DATABASE}
|
||||
DOCKER_DEV_DB_USERNAME=${DB_USERNAME}
|
||||
DOCKER_DEV_DB_PASSWORD=${DB_PASSWORD}
|
||||
DOCKER_DEV_DB_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
|
||||
|
||||
DOCKER_TEST_DB_EXTERNAL_PORT=3307
|
||||
DOCKER_TEST_DB_DATABASE=${DB_DATABASE}
|
||||
DOCKER_TEST_DB_USERNAME=${DB_USERNAME}
|
||||
DOCKER_TEST_DB_PASSWORD=${DB_PASSWORD}
|
||||
DOCKER_TEST_DB_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
|
||||
|
||||
EXTERNAL_WEBSERVER_PORT=
|
||||
XDG_CONFIG_HOME=/tmp
|
||||
|
10
.github/workflows/test-and-lint-php.yml
vendored
10
.github/workflows/test-and-lint-php.yml
vendored
@ -10,6 +10,16 @@ jobs:
|
||||
test-and-lint-php:
|
||||
name: Test & lint PHP stuff
|
||||
runs-on: ubuntu-20.04
|
||||
services:
|
||||
mysql:
|
||||
image: mysql:8.0
|
||||
env:
|
||||
MYSQL_DATABASE: toby
|
||||
MYSQL_USER: toby
|
||||
MYSQL_PASSWORD: password
|
||||
MYSQL_ALLOW_EMPTY_PASSWORD: 1
|
||||
ports:
|
||||
- 3306:3306
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
@ -21,6 +21,7 @@
|
||||
"enlightn/enlightn": "^1.22",
|
||||
"facade/ignition": "^2.5",
|
||||
"fakerphp/faker": "^1.9.1",
|
||||
"laravel/dusk": "^6.21",
|
||||
"mockery/mockery": "^1.4.4",
|
||||
"nunomaduro/collision": "^5.10",
|
||||
"phpunit/phpunit": "^9.5.10"
|
||||
|
@ -5,11 +5,6 @@ declare(strict_types=1);
|
||||
return [
|
||||
"default" => env("DB_CONNECTION", "mysql"),
|
||||
"connections" => [
|
||||
"testing" => [
|
||||
"driver" => "sqlite",
|
||||
"database" => ":memory:",
|
||||
"prefix" => "",
|
||||
],
|
||||
"mysql" => [
|
||||
"driver" => "mysql",
|
||||
"url" => env("DATABASE_URL"),
|
||||
|
@ -36,12 +36,12 @@ services:
|
||||
|
||||
database:
|
||||
image: mysql:8.0
|
||||
container_name: toby-db
|
||||
container_name: toby-db-dev
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=${DOCKER_DB_ROOT_PASSWORD}
|
||||
- MYSQL_DATABASE=${DOCKER_DB_DATABASE}
|
||||
- MYSQL_USER=${DOCKER_DB_USERNAME}
|
||||
- MYSQL_PASSWORD=${DOCKER_DB_PASSWORD}
|
||||
- MYSQL_ROOT_PASSWORD=${DOCKER_DEV_DB_ROOT_PASSWORD}
|
||||
- MYSQL_DATABASE=${DOCKER_DEV_DB_DATABASE}
|
||||
- MYSQL_USER=${DOCKER_DEV_DB_USERNAME}
|
||||
- MYSQL_PASSWORD=${DOCKER_DEV_DB_PASSWORD}
|
||||
ports:
|
||||
- ${DOCKER_DB_EXTERNAL_PORT:-3306}:3306
|
||||
volumes:
|
||||
@ -50,6 +50,20 @@ services:
|
||||
- toby-dev
|
||||
restart: unless-stopped
|
||||
|
||||
database-test:
|
||||
image: mysql:8.0
|
||||
container_name: toby-db-test
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=${DOCKER_TEST_DB_ROOT_PASSWORD}
|
||||
- MYSQL_DATABASE=${DOCKER_TEST_DB_DATABASE}
|
||||
- MYSQL_USER=${DOCKER_TEST_DB_USERNAME}
|
||||
- MYSQL_PASSWORD=${DOCKER_TEST_DB_PASSWORD}
|
||||
ports:
|
||||
- ${DOCKER_TEST_DB_EXTERNAL_PORT:-3307}:3306
|
||||
networks:
|
||||
- toby-dev
|
||||
restart: unless-stopped
|
||||
|
||||
node:
|
||||
image: node:17.2.0-alpine3.14
|
||||
container_name: toby-node
|
||||
@ -70,6 +84,14 @@ services:
|
||||
- toby-dev
|
||||
restart: unless-stopped
|
||||
|
||||
selenium:
|
||||
image: selenium/standalone-chrome
|
||||
container_name: toby-selenium
|
||||
volumes:
|
||||
- /dev/shm:/dev/shm
|
||||
networks:
|
||||
- toby-dev
|
||||
|
||||
networks:
|
||||
toby-dev:
|
||||
driver: bridge
|
||||
|
2
package-lock.json
generated
2
package-lock.json
generated
@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "toby",
|
||||
"name": "application",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
|
21
phpunit.xml
21
phpunit.xml
@ -19,14 +19,17 @@
|
||||
</coverage>
|
||||
<php>
|
||||
<server name="APP_ENV" value="testing"/>
|
||||
<server name="APP_KEY" value="base64:SKEJSy9oF9chQBCMbxqgj5zhtAvug9kwZ+cDiP1Y8A8="/>
|
||||
<server name="BCRYPT_ROUNDS" value="4"/>
|
||||
<server name="CACHE_DRIVER" value="array"/>
|
||||
<server name="DB_CONNECTION" value="testing"/>
|
||||
<server name="DB_DATABASE" value=":memory:"/>
|
||||
<server name="MAIL_MAILER" value="array"/>
|
||||
<server name="QUEUE_CONNECTION" value="sync"/>
|
||||
<server name="SESSION_DRIVER" value="array"/>
|
||||
<server name="TELESCOPE_ENABLED" value="false"/>
|
||||
<env name="APP_KEY" value="base64:SKEJSy9oF9chQBCMbxqgj5zhtAvug9kwZ+cDiP1Y8A8="/>
|
||||
<env name="BCRYPT_ROUNDS" value="4"/>
|
||||
<env name="CACHE_DRIVER" value="array"/>
|
||||
<env name="DB_CONNECTION" value="mysql"/>
|
||||
<env name="DB_HOST" value="toby-db-test"/>
|
||||
<env name="DB_DATABASE" value="toby"/>
|
||||
<env name="DB_USERNAME" value="toby"/>
|
||||
<env name="DB_PASSWORD" value="password"/>
|
||||
<env name="MAIL_MAILER" value="array"/>
|
||||
<env name="QUEUE_CONNECTION" value="sync"/>
|
||||
<env name="SESSION_DRIVER" value="array"/>
|
||||
<env name="TELESCOPE_ENABLED" value="false"/>
|
||||
</php>
|
||||
</phpunit>
|
||||
|
@ -38,6 +38,7 @@
|
||||
</transition>
|
||||
<div
|
||||
class="sm:mx-auto sm:w-full sm:max-w-md text-white space-y-4 flex flex-col items-center rounded-lg px-4 py-8"
|
||||
dusk="login-link"
|
||||
>
|
||||
<img
|
||||
class="mx-auto h-50 w-auto"
|
||||
|
@ -38,6 +38,7 @@
|
||||
<div>
|
||||
<MenuButton
|
||||
class="rounded-full flex text-sm ring-2 ring-white ring-opacity-20 focus:outline-none focus:ring-opacity-100"
|
||||
dusk="user-menu"
|
||||
>
|
||||
<span class="sr-only">Open user menu</span>
|
||||
<img
|
||||
@ -54,6 +55,7 @@
|
||||
>
|
||||
<MenuItems
|
||||
class="origin-top-right z-40 absolute -right-2 mt-2 w-48 rounded-md shadow-lg py-1 bg-white ring-1 ring-black ring-opacity-5 focus:outline-none"
|
||||
dusk="user-menu-list"
|
||||
>
|
||||
<MenuItem
|
||||
v-for="item in userNavigation"
|
||||
|
39
tests/Browser/AuthenticationTest.php
Normal file
39
tests/Browser/AuthenticationTest.php
Normal file
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Browser;
|
||||
|
||||
use Illuminate\Foundation\Testing\DatabaseMigrations;
|
||||
use Laravel\Dusk\Browser;
|
||||
use Tests\Browser\Pages\HomePage;
|
||||
use Tests\DuskTestCase;
|
||||
use Toby\Models\User;
|
||||
|
||||
class AuthenticationTest extends DuskTestCase
|
||||
{
|
||||
use DatabaseMigrations;
|
||||
|
||||
protected User $user;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
$this->user = User::factory()->create();
|
||||
}
|
||||
|
||||
public function testUserCanLogout(): void
|
||||
{
|
||||
$this->browse(function (Browser $browser): void {
|
||||
$browser->loginAs($this->user)
|
||||
->visit(new HomePage())
|
||||
->assertVisible("@user-menu")
|
||||
->click("@user-menu")
|
||||
->assertVisible("@user-menu-list")
|
||||
->assertSee("Sign out")
|
||||
->press("Sign out")
|
||||
->on(new HomePage())
|
||||
->waitFor("@login-link");
|
||||
});
|
||||
}
|
||||
}
|
20
tests/Browser/Pages/HomePage.php
Normal file
20
tests/Browser/Pages/HomePage.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Browser\Pages;
|
||||
|
||||
use Laravel\Dusk\Browser;
|
||||
|
||||
class HomePage extends Page
|
||||
{
|
||||
public function url()
|
||||
{
|
||||
return "/";
|
||||
}
|
||||
|
||||
public function assert(Browser $browser): void
|
||||
{
|
||||
$browser->assertPathIs($this->url());
|
||||
}
|
||||
}
|
17
tests/Browser/Pages/Page.php
Normal file
17
tests/Browser/Pages/Page.php
Normal file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Browser\Pages;
|
||||
|
||||
use Laravel\Dusk\Page as BasePage;
|
||||
|
||||
abstract class Page extends BasePage
|
||||
{
|
||||
public static function siteElements()
|
||||
{
|
||||
return [
|
||||
"@element" => "#selector",
|
||||
];
|
||||
}
|
||||
}
|
65
tests/DuskTestCase.php
Normal file
65
tests/DuskTestCase.php
Normal file
@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests;
|
||||
|
||||
use Facebook\WebDriver\Chrome\ChromeOptions;
|
||||
use Facebook\WebDriver\Remote\DesiredCapabilities;
|
||||
use Facebook\WebDriver\Remote\RemoteWebDriver;
|
||||
use Laravel\Dusk\TestCase as BaseTestCase;
|
||||
|
||||
abstract class DuskTestCase extends BaseTestCase
|
||||
{
|
||||
use CreatesApplication;
|
||||
|
||||
/**
|
||||
* @beforeClass
|
||||
*/
|
||||
public static function prepare(): void
|
||||
{
|
||||
if (!static::runningInDocker()) {
|
||||
static::startChromeDriver();
|
||||
}
|
||||
}
|
||||
|
||||
protected function driver(): RemoteWebDriver
|
||||
{
|
||||
$options = (new ChromeOptions())->addArguments(
|
||||
collect(
|
||||
[
|
||||
"--window-size=1920,1080",
|
||||
],
|
||||
)->unless(
|
||||
$this->hasHeadlessDisabled(),
|
||||
function ($items) {
|
||||
return $items->merge(
|
||||
[
|
||||
"--disable-gpu",
|
||||
"--headless",
|
||||
],
|
||||
);
|
||||
},
|
||||
)->all(),
|
||||
);
|
||||
|
||||
return RemoteWebDriver::create(
|
||||
env("DUSK_DRIVER_URL") ?? "http://localhost:" . env("SELENIUM_PORT"),
|
||||
DesiredCapabilities::chrome()->setCapability(
|
||||
ChromeOptions::CAPABILITY,
|
||||
$options,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
protected function hasHeadlessDisabled(): bool
|
||||
{
|
||||
return isset($_SERVER["DUSK_HEADLESS_DISABLED"]) ||
|
||||
isset($_ENV["DUSK_HEADLESS_DISABLED"]);
|
||||
}
|
||||
|
||||
protected static function runningInDocker(): bool
|
||||
{
|
||||
return isset($_ENV["DUSK_IN_DOCKER"]) && $_ENV["DUSK_IN_DOCKER"] === "true";
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user