File: D:/HostingSpaces/SBogers10/blije-gasten.komma.pro/tests/Browser/AuthFlowTest.php
<?php
namespace Tests\Browser;
use App\Komma\Shop\seeds\UserTableSeeder as ShopUserTableSeeder;
use App\Komma\Users\Models\KmsUserRole;
use App\Komma\Users\Models\SiteUserRole;
use function Functional\select;
use Illuminate\Support\Facades\Hash;
use App\Komma\Users\Models\KmsUser;
use App\Komma\Users\Models\SiteUser;
use Illuminate\Auth\Passwords\PasswordBroker;
use Illuminate\Support\Facades\Artisan;
use KmsUserTableSeeder;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;
class AuthFlowTest extends DuskTestCase
{
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testRegistrationFail()
{
$this->browse(function (Browser $browser) {
$browser->visit(localized_route('site.register'))
->assertSee(__('auth.first_name'))
->assertSee(__('auth.last_name'))
->assertSee(__('auth.email_address'));
$browser->driver->executeScript('window.scrollTo(0,document.body.scrollHeight);'); //Scroll to bottom
$browser->assertSeeIn('@register', strtoupper(__('auth.register')))
->click('@register')
->assertSee(__('validation.required', ['attribute' => ucfirst(__('validation.attributes.first_name'))]));
});
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testRegistration()
{
$newUser = factory(SiteUser::class)->make();
$this->browse(function (Browser $browser) use($newUser) {
$browser->visit(localized_route('site.register'))
->type('first_name', $newUser->first_name)
->type('last_name', $newUser->last_name)
->type('email', $newUser->email)->pause(150)
->select('#country', 'BEL')->pause(150)
->assertVisible('@language')
->assertSelectHasOptions('@language', ['nld', 'fra', 'deu'])
->select('@country', 'DEU')->pause(150)
->assertMissing('@language') //Germany has 1 registered language. So the language select should be missing.
->select('@country', 'BEL')->pause(150)
->assertVisible('@language')
->assertSelectHasOptions('@language', ['nld', 'fra', 'deu']);
$browser->driver->executeScript('window.scrollTo(0,document.body.scrollHeight);'); //Scroll to bottom
$browser->check('@accept_legal')
->click('@register')
->assertSee(__('auth.registered'));
});
$newUser->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testSetPasswordFailWithWrongPassword()
{
/** @var SiteUser $newUser */
$newUser = factory(SiteUser::class)->make();
$newUser->role = SiteUserRole::Customer;
$newUser->save();
//Generate a password reset token manually here since we cannot intercept mails from dusk
/** @var PasswordBroker $passwordBroker */
$passwordBroker = app(PasswordBroker::class);
$token = $passwordBroker->createToken($newUser);
$this->browse(function (Browser $browser) use ($newUser, $token) {
$browser->visit(localized_route('site.password.request_set', ['token' => $token]))
->type('email', $newUser->email)
->type('password', 'Test12345678')
->type('password_confirmation', 'Test321')
->assertValue('@set_password', __('auth.update_password'))
->click('@set_password')
->assertSee(ucfirst(__('validation.confirmed', ['attribute' => __('validation.attributes.password')])));
});
$newUser->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testSetPasswordFailWithWrongEmail()
{
/** @var SiteUser $newUser */
$newUser = factory(SiteUser::class)->make();
$newUser->role = SiteUserRole::Customer;
$newUser->save();
//Generate a password reset token manually here since we cannot intercept mails from dusk
/** @var PasswordBroker $passwordBroker */
$passwordBroker = app(PasswordBroker::class);
$token = $passwordBroker->createToken($newUser);
$this->browse(function (Browser $browser) use ($newUser, $token) {
$browser->visit(localized_route('site.password.request_set', ['token' => $token]))
->type('email', 'oops_'.$newUser->email)
->type('password', 'Test1234567845678')
->type('password_confirmation', 'Test1234567845678')
->assertValue('@set_password', __('auth.update_password'))
->click('@set_password')
->assertSee(ucfirst(__('passwords.user')));
});
$newUser->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testSetPasswordFailWithWrongToken()
{
/** @var SiteUser $newUser */
$newUser = factory(SiteUser::class)->make();
$newUser->role = SiteUserRole::Customer;
$newUser->save();
$this->browse(function (Browser $browser) use ($newUser) {
$browser->visit(localized_route('site.password.request_set', ['token' => 'randomfaketoken2124']))
->type('email', $newUser->email)
->type('password', 'Test12345678')
->type('password_confirmation', 'Test12345678')
->assertValue('@set_password', __('auth.update_password'))
->click('@set_password')
->assertSee(__('passwords.token'));
});
$newUser->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testSetPassword()
{
/** @var SiteUser $newUser */
$newUser = factory(SiteUser::class)->make();
$newUser->role = SiteUserRole::Customer;
$newUser->save();
//Generate a password reset token manually here since we cannot intercept mails from dusk
/** @var PasswordBroker $passwordBroker */
$passwordBroker = app(PasswordBroker::class);
$token = $passwordBroker->createToken($newUser);
$this->browse(function (Browser $browser) use ($newUser, $token) {
$browser->visit(route('site.password.request_set', ['email' => $newUser->email, 'token' => $token]))
->type('@email', $newUser->email)
->type('@password', $newUser->password)
->type('@password_confirmation', $newUser->password)
->assertValue('@set_password', __('auth.update_password'))
->click('@set_password')
->assertSee(__('auth.password-reset'));
});
$newUser->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testMailForgotPasswordFail()
{
$this->browse(function (Browser $browser) {
$browser->visit(localized_route('site.password.request'))
->type('email', 'doesnotexist@komma.pro')
->assertValue('@send_email', __('auth.send_email'))
->click('@send_email')
->assertSee(__('passwords.user'));
});
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testMailForgotPassword()
{
/** @var SiteUser $newUser */
$newUser = factory(SiteUser::class)->make();
$newUser->role = SiteUserRole::Customer;
$newUser->save();
$this->browse(function (Browser $browser) use ($newUser) {
$browser->visit(localized_route('site.password.request'))
->type('email', $newUser->email)
->assertValue('@send_email', __('auth.send_email'))
->click('@send_email')
->assertSee(__('passwords.sent'));
});
$newUser->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testMailForgotPasswordFailKms()
{
$this->browse(function (Browser $browser) {
$browser->visit(route('kms.password.request'))
->type('email', 'doesnotexist@komma.pro')
->assertValue('@send_email', __('auth.send_email'))
->click('@send_email')
->assertSee(__('passwords.user'));
});
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testMailForgotPasswordKms()
{
/** @var SiteUser $newUser */
$newUser = factory(KmsUser::class)->make();
$newUser->role = SiteUserRole::Customer;
$newUser->save();
$this->browse(function (Browser $browser) use ($newUser) {
$browser->visit(route('kms.password.request'))
->type('email', $newUser->email)
->assertValue('@send_email', __('auth.send_email'))
->click('@send_email')
->assertSee(__('passwords.sent'));
});
$newUser->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testResetPasswordFailWithWrongPassword()
{
/** @var SiteUser $newUser */
$newUser = factory(SiteUser::class)->make();
$newUser->role = SiteUserRole::Customer;
$newUser->save();
//Generate a password reset token manually here since we cannot intercept mails from dusk
/** @var PasswordBroker $passwordBroker */
$passwordBroker = app(PasswordBroker::class);
$token = $passwordBroker->createToken($newUser);
$this->browse(function (Browser $browser) use ($newUser, $token) {
$browser->visit(localized_route('site.password.reset', ['token' => $token]))
->type('email', $newUser->email)
->type('password', 'Test12345678')
->type('password_confirmation', 'Test321')
->assertValue('@reset_password', __('auth.update_password'))
->click('@reset_password')
->assertSee(ucfirst(__('validation.confirmed', ['attribute' => __('validation.attributes.password')])));
});
$newUser->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testResetPasswordFailWithNonExistingEmail()
{
/** @var SiteUser $newUser */
$newUser = factory(SiteUser::class)->make();
$newUser->role = SiteUserRole::Customer;
$newUser->save();
//Generate a password reset token manually here since we cannot intercept mails from dusk
/** @var PasswordBroker $passwordBroker */
$passwordBroker = app(PasswordBroker::class);
$token = $passwordBroker->createToken($newUser);
$this->browse(function (Browser $browser) use ($token) {
$browser->visit(localized_route('site.password.reset', ['token' => $token]))
->type('email', 'fake@example.org')
->type('password', 'Test12345678')
->type('password_confirmation', 'Test12345678')
->assertValue('@reset_password', __('auth.update_password'))
->click('@reset_password')
->assertSee(__('passwords.user'));
});
$newUser->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testResetPasswordFailWithFakeToken()
{
/** @var SiteUser $newUser */
$newUser = factory(SiteUser::class)->make();
$newUser->role = SiteUserRole::Customer;
$newUser->save();
$this->browse(function (Browser $browser) use ($newUser) {
$browser->visit(localized_route('site.password.reset', ['token' => 'fakepassresettoken']))
->type('email', $newUser->email)
->type('password', $newUser->password)
->type('password_confirmation', $newUser->password)
->assertValue('@reset_password', __('auth.update_password'))
->click('@reset_password')
->assertSee(__('passwords.token'));
});
$newUser->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testResetPassword()
{
/** @var SiteUser $newUser */
$newUser = factory(SiteUser::class)->make();
$newUser->role = SiteUserRole::Customer;
$newUser->save();
//Generate a password reset token manually here since we cannot intercept mails from dusk
/** @var PasswordBroker $passwordBroker */
$passwordBroker = app(PasswordBroker::class);
$token = $passwordBroker->createToken($newUser);
$this->browse(function (Browser $browser) use ($newUser, $token) {
$browser->visit(localized_route('site.password.reset', [$token]).'?email='.$newUser->email)
->type('password', $newUser->password)
->type('password_confirmation', $newUser->password)
->assertValue('@reset_password', __('auth.update_password'))
->click('@reset_password')
->assertSee(__('auth.password-reset'));
});
$newUser->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testResetPasswordFailWithWrongPasswordKms()
{
/** @var KmsUser $newUser */
$newUser = factory(KmsUser::class)->make();
$newUser->role = KmsUserRole::Editor;
$newUser->save();
//Generate a password reset token manually here since we cannot intercept mails from dusk
/** @var PasswordBroker $passwordBroker */
$passwordBroker = app(PasswordBroker::class);
$token = $passwordBroker->createToken($newUser);
$this->browse(function (Browser $browser) use ($newUser, $token) {
$browser->visit(route('kms.password.reset', ['token' => $token]))
->type('email', $newUser->email)
->type('password', 'Test12345678')
->type('password_confirmation', 'Test321')
->assertValue('@reset_password', __('auth.update_password'))
->click('@reset_password')
->assertSee(__('validation.confirmed', ['attribute' => __('validation.attributes.password')]));
});
$newUser->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testResetPasswordFailWithNonExistingEmailKms()
{
/** @var KmsUser $newUser */
$newUser = factory(KmsUser::class)->make();
$newUser->role = KmsUserRole::Editor;
$newUser->save();
//Generate a password reset token manually here since we cannot intercept mails from dusk
/** @var PasswordBroker $passwordBroker */
$passwordBroker = app(PasswordBroker::class);
$token = $passwordBroker->createToken($newUser);
$this->browse(function (Browser $browser) use ($token) {
$browser->visit(route('kms.password.reset', ['token' => $token]))
->type('email', 'fake@example.org')
->type('password', 'Test12345678')
->type('password_confirmation', 'Test12345678')
->assertValue('@reset_password', __('auth.update_password'))
->click('@reset_password')
->assertSee(__('passwords.user'));
});
$newUser->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testResetPasswordFailWithFakeTokenKms()
{
/** @var KmsUser $newUser */
$newUser = factory(KmsUser::class)->make();
$newUser->role = KmsUserRole::Editor;
$newUser->save();
$this->browse(function (Browser $browser) use ($newUser) {
$browser->visit(route('kms.password.reset', ['token' => 'fakepassresettoken']))
->type('email', $newUser->email)
->type('password', $newUser->password)
->type('password_confirmation', $newUser->password)
->assertValue('input[type="submit"]', __('auth.update_password'))
->click('input[type="submit"]')
->assertSee(__('passwords.token'));
});
$newUser->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testResetPasswordKms()
{
/** @var KmsUser $newUser */
$newUser = factory(KmsUser::class)->make();
$newUser->role = KmsUserRole::Editor;
$newUser->save();
//Generate a password reset token manually here since we cannot intercept mails from dusk
/** @var PasswordBroker $passwordBroker */
$passwordBroker = app(PasswordBroker::class);
$token = $passwordBroker->createToken($newUser);
$this->browse(function (Browser $browser) use ($newUser, $token) {
$browser->visit(route('kms.password.reset', ['email' => $newUser->email, 'token' => $token]))
->type('password', $newUser->password)
->type('password_confirmation', $newUser->password)
->assertValue('input[type="submit"]', __('auth.update_password'))
->click('input[type="submit"]')
->assertSee(__('auth.password-reset'))
->screenshot('test');
});
$newUser->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testLoginFail()
{
Artisan::call('cache:clear'); //Clears auth throttling if active.
$this->browse(function (Browser $browser) {
$browser->visit(localized_route('site.login'))
->type('email', ShopUserTableSeeder::getCustomerDefaultCredentials()['email'])
->type('password', ShopUserTableSeeder::getCustomerDefaultCredentials()['password'].'_dusk_test')
->click('@log_in')
->assertSee('Het opgeven e-mailadres en')
->screenshot($this->getName());
});
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testSiteLogin()
{
Artisan::call('cache:clear'); //Clears auth throttling if active.
$user = new SiteUser();
$user->role = KmsUserRole::Editor;
$user->email = 'customer123@komma.pro';
$user->password = Hash::make('Customer123');
$user->first_name = 'Komma';
$user->last_name = 'Customer';
$user->culture = 'nl-NL';
$user->save();
$this->browse(function(Browser $browser) {
$browser->logout('site'); //Make sure the user is logged out
});
$this->browse(function (Browser $browser) use($user) {
$browser->visit(localized_route('site.login'))
->type('email', $user->email)
->type('password', 'Customer123')
->click('@log_in')
->assertVisible('@site_logout');
});
$user->delete();
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testLoginFailKms()
{
Artisan::call('cache:clear'); //Clears auth throttling if active.
$this->browse(function (Browser $browser) {
$browser->logout('kms');
$browser->visit(route('kms.login'))
->type('email', KmsUserTableSeeder::getSuperAdminDefaultCredentials()['email'])
->type('password', KmsUserTableSeeder::getSuperAdminDefaultCredentials()['password'].'_dusk_test')
->click('@submit')
->assertSee('Het opgeven e-mailadres en')
->screenshot($this->getName());
});
}
/**
* @test
* @group AuthFlow
* @throws \Throwable
*/
public function testLoginKms()
{
Artisan::call('cache:clear'); //Clears auth throttling if active.
$this->browse(function (Browser $browser) {
$browser->logout('kms');
$browser->visit(route('kms.login'))
->type('email', KmsUserTableSeeder::getSuperAdminDefaultCredentials()['email'])
->type('password', KmsUserTableSeeder::getSuperAdminDefaultCredentials()['password'])
->click('@submit')
->assertSee(__('kms/kms_users.section.title')) // If this fails / crashes: have you ran php artisan shop:translations ?
->screenshot($this->getName());
});
}
}