HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/slenders.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 Illuminate\Support\Facades\Hash;
use \UserTableSeeder as KmsUserTableSeeder;
use App\Komma\Users\Models\KmsUser;
use App\Komma\Users\Models\SiteUser;
use Illuminate\Auth\Passwords\PasswordBroker;
use Illuminate\Support\Facades\Artisan;
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(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(route('site.register'))
                ->type('first_name', $newUser->first_name)
                ->type('last_name', $newUser->last_name)
                ->type('email', $newUser->email);

            $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(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(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(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(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(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(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(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(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(localized_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(localized_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(localized_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(localized_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(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->username = 'Komma Customer';
        $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(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')
                ->press(__('auth.log_in'))
                ->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'])
                ->press(__('auth.log_in'))
                ->assertSee(__('kms/kms_users.section.title')) // If this fails / crashes: have you ran php artisan shop:translations ?
                ->screenshot($this->getName());
        });
    }
}