tests/acceptance/TypeControllerTest.php
<?php

namespace Tests\Acceptance;

use Tests\AcceptanceTestCase;
use App\Entities\Type;

class TypeControllerTest extends AcceptanceTestCase
{
    public function testView()
    {
        $this->visit('/')->see('mdl-navigation__link" href="'.$this->baseUrl.'/type">');
    
        $this->visit('/type')
            ->see('<i class="material-icons">filter_list</i>')
        ;
    }
    
    public function testCreate()
    {
        $this->visit('/type')->see('<a href="'.$this->baseUrl.'/type/create');
        
        $this->visit('/type/create');
    
        $this->type('Nome Tipo', 'name')
            ->type('Entity Key', 'entity_key')
            ->press('Enviar')
            ->seePageIs('/type')
        ;
    
        $this->seeInDatabase('types', ['name' => 'Nome Tipo', 'entity_key' => 'Entity Key']);
    }

    public function testUpdate()
    {
        $this->visit('/type/'.Type::all()->last()['id'].'/edit');
        
        $this->type('Nome Tipo Editado', 'name')
            ->type('Entity Key Editado', 'entity_key')
            ->press('Enviar')
            ->seePageIs('/type')
        ;
        
        $this->seeInDatabase('types', ['name' => 'Nome Tipo Editado', 'entity_key' => 'Entity Key Editado']);
    }
    
    public function testDelete()
    {
        $idDelete = Type::all()->last()['id'];
        
        factory(\App\Entities\Model::class)->create([
            'model_type_id' => $idDelete,
        ]);

        $this->seeInDatabase('types', ['id' => $idDelete]);
        $this->visit('/type/destroy/'.$idDelete)
            ->seePageIs('/type')
            ->see('Este registro possui refer');
        $this->seeIsNotSoftDeletedInDatabase('types', ['id' => $idDelete]);
        
        $type = Type::find($idDelete);
        $type->contacts()->delete();
        $type->entries()->delete();
        $type->models()->delete();
        $type->trips()->delete();
        
        $this->seeInDatabase('types', ['id' => $idDelete]);
        $this->visit('/type/destroy/'.$idDelete);
        $this->seeIsSoftDeletedInDatabase('types', ['id' => $idDelete]);
    }
    
    public function testErrors()
    {
        $this->visit('/type/create')
            ->press('Enviar')
            ->seePageIs('/type/create')
            ->see('de um valor para o campo nome.</span>')
        ;
    }
    
    public function testFilters()
    {
        $this->visit('/type')
            ->type('entry', 'entity_key')
            ->type('service', 'name')
            ->press('Buscar')
            ->see('entry</div>')
            ->see('Serviço</div>')
        ;
    }
    
    public function testSort()
    {
        $this->visit('/type?id=&entity-key=&name=&sort=id-desc')
            ->see('mode_edit</i>');
        
        $this->visit('/type?id=&entity-key=&name=&sort=id-asc')
            ->see('mode_edit</i>');
        
        $this->visit('/type?id=&entity-key=&name=&sort=entity-key-desc')
            ->see('mode_edit</i>');
            
        $this->visit('/type?id=&entity-key=&name=&sort=entity-key-asc')
            ->see('mode_edit</i>');
        
        $this->visit('/type?id=&entity-key=&name=&sort=name-desc')
            ->see('mode_edit</i>');
            
        $this->visit('/type?id=&entity-key=&name=&sort=name-asc')
            ->see('mode_edit</i>');
    }
}
