mercredi 10 juin 2020

Why does laravel work on browser but fails on phpunit tests?

The title says it all. I have a feature of my code that is working in the browser but not in the tests.

So i im using laravel and phpunit. With phpunit i am trying to test the capability of the app change the state of a certain certificate object also call as "Atestado".

class Atestado extends Model implements HasMedia
{
use InteractsWithMedia;

protected $fillable = [
    /* Por Padrão */
    'tipo', 'estado',
    'atestado_da_situacao_economica_destina_a', 'atestado_da_situcao_economica_indicacoes_uteis',
    'created_at', 'updated_at',
];

public function users(){
    return $this->belongsToMany('App\User','atestado_user')->withPivot('tipo','created_at','updated_at');
}

public function pessoas(){
    return $this->hasMany('App\Pessoa');
}

}

with the help of updateStatus method of AtestadoDaSituacaoEconomicaController

    public function updateStatus(Request $request, Atestado $atestado_da_situacao_economica){
    $user = auth()->user();

    if($user->hasRole('User')){
        if($request->has('estado')){
            switch($request->input('estado')){
                case 'Completo':
                    $atestado_da_situacao_economica->fill(['estado' => 'Completo']);
                    $atestado_da_situacao_economica->save();
                    break;
                default:
                    break;
            }
        }
    }elseif($user->hasRole('Funcionário')){

    }

    return redirect(route('users.atestados.atestado-da-situacao-economica.index'));

The method is accessible trought the route:

    Route::put('/atestado-da-situacao-economica/{atestado_da_situacao_economica}/updateStatus', 'AtestadoDaSituacaoEconomicaController@updateStatus')->name('users.atestados.atestado-da-situacao-economica.updateStatus');

The test i am using is this one:

<?php

namespace Tests\Feature;

use App\Notifications\FuncionarioAtestadoDaSituacaoEconomica;
use App\Role;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Notification;
use Tests\TestCase;
use Faker;

class AtestadoTest extends TestCase
{
    use RefreshDatabase;
    use DatabaseMigrations;
    /**
     * A basic feature test example.
     *
     * @return void
     */

    protected $atestado, $user_user, $user_funcionario, $role_user, $role_funcionario;

    public function setUp() :void
    {
        parent::setUp();

        $this->atestado = factory('App\Atestado')->state('Atestado da Situação Económica Incompleto')->create();

        $this->user_user = factory('App\User')->state('Freguês')->create();

        $this->role_user = Role::create(['name' => 'User']);

        $this->user_user->assignRole($this->role_user);

        $this->user_funcionario = factory('App\User')->state('Funcionário')->create();

        $this->role_funcionario = Role::create(['name' => 'Funcionário']);

        $this->user_funcionario->assignRole($this->role_funcionario);

        $this->atestado->users()->attach([$this->user_user->id, $this->user_funcionario->id]);
    }

/** @test */
public function um_atestado_notifica_todos_os_funcionarios_assim_que_o_estado_muda_de_incompleto_para_completo(){
    $user_funcionario_ii = factory('App\User')->state('Funcionário')->create();

    $user_funcionario_ii->assignRole($this->role_funcionario);

    Notification::fake();

    $this->actingAs($this->user_user)
        ->put(route('users.atestados.atestado-da-situacao-economica.updateStatus', $this->atestado->id),array(
            'estado' => 'Completo'
        ))
        ->assertRedirect('atestado-da-situacao-economica');

    $this->atestado = $this->atestado->fresh();

    $this->assertTrue($this->atestado->estado == 'Completo');

    /*
    $this->assertDatabaseHas('notifications', [
       'type' => 'App\Notifications\FuncionarioAtestadoDaSituacaoEconomica',
       'notifiable_type' => 'App\User',
       'notifiable_id' => '2',
       'data' => '{"data":"O fregu\u00eas deu o Atestado da Situa\u00e7\u00e3o Econ\u00f3mica como completo.","user_id":1}',
    ]);
    */

    $this->refreshInMemoryDatabase();

    Notification::assertSentTo($this->user_funcionario, FuncionarioAtestadoDaSituacaoEconomica::class);
    Notification::assertSentTo($user_funcionario_ii, FuncionarioAtestadoDaSituacaoEconomica::class);
}

It failing asserTrue ($this->assertTrue($this->atestado->estado == 'Completo');).

Using Xdebug the value as correctly change inside the controller but when it gets to the lines of code in test enviroment the value "estado" do not change at all.

Anyone?

Thanks in advance

Aucun commentaire:

Enregistrer un commentaire