<?php

namespace Tests\Browser\Admin;

use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
use Tests\Browser\Traits\AuthTrait;
use Tests\DuskTestCase;

class UserTest extends DuskTestCase
{
    use DatabaseMigrations;
    use AuthTrait;

    public function testShouldFailValidationOnCreateUserWithoutRequiredFields()
    {
        $this->browse(function (Browser $browser) {

            $this->loginToAdminBackend();

            $browser->visit('/admin/admin-users/edit')
                ->assertSee('Manage User')
                ->type('#username_input', 'test_user')
                ->check('#user_permission_3')
                ->check('#user_permission_2')
                ->check('#user_permission_1')
                ->click('#user_save_btn')

                ->assertAttribute('#username_input', "data-original-title", "The username may only contain letters and numbers.")
                ->assertAttribute('#email_input', "data-original-title", "The email field is required.")
                ->assertAttribute('#first_name_input', "data-original-title", "The first name field is required.")
                ->assertAttribute('#last_name_input', "data-original-title", "The last name field is required.")
                ->assertAttribute('#password_input', "data-original-title", "The password field is required.")

                ->type('#email_input', 'test@eae.pt')
                ->type('#first_name_input', 'test')
                ->type('#last_name_input', 'done')
                ->type('#password_input', '12345678')
                ->click('#user_save_btn')

                ->assertAttribute('#password_input', "data-original-title", "The password confirmation does not match.");
        });
    }

    public function testShouldCreateUserWithPermissions()
    {
        $this->browse(function (Browser $browser) {

            // Session remains within TestCase

            $browser->visit('/admin/admin-users/edit')
                ->assertSee('Manage User')
                ->type('#username_input', 'testuser')
                ->type('#email_input', 'test@eae.pt')
                ->type('#first_name_input', 'test')
                ->type('#last_name_input', 'done')
                ->type('#password_input', '12345678')
                ->type('#password_conf_input', '12345678')
                ->check('#user_permission_3')
                ->check('#user_permission_2')
                ->check('#user_permission_1')
                ->click('#user_save_btn')

                ->waitForText('User updated successfully')

                ->assertPathIs('/admin/admin-users/edit/2')
                ->assertSee('User updated successfully')

                ->assertChecked('#user_permission_3')
                ->assertChecked('#user_permission_2')
                ->assertChecked('#user_permission_1');
        });
    }

    public function testShouldCreateUserWithoutPermissions()
    {
        $this->browse(function (Browser $browser) {

            // Session remains within TestCase

            $browser->visit('/admin/admin-users/edit')
                ->assertSee('Manage User')
                ->type('#username_input', 'testuser')
                ->type('#email_input', 'test@eae.pt')
                ->type('#first_name_input', 'test')
                ->type('#last_name_input', 'done')
                ->type('#password_input', '12345678')
                ->type('#password_conf_input', '12345678')
                ->click('#user_save_btn')

                ->waitForText('User updated successfully')

                ->assertPathIs('/admin/admin-users/edit/2')
                ->assertSee('User updated successfully')

                ->assertNotChecked('#user_permission_3')
                ->assertNotChecked('#user_permission_2')
                ->assertNotChecked('#user_permission_1');
        });
    }
}
