JoaoGracio89's avatar

Laravel vendor\bin\phpunit test do not pass but controller working as supposed.

class AtestadoTest extends TestCase
{
    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->assertTrue($this->atestado->estado === 'Completo');

        Notification::assertSentTo($this->user_funcionario, FuncionarioAtestadoCompleto::class);
        Notification::assertSentTo($user_funcionario_ii, FuncionarioAtestadoCompleto::class);
/* AtestadosDaSituacaoEconomicaController */
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'));
    }
0 likes
10 replies
JoaoGracio89's avatar

Happening with some other tests not shore why. I try to use AtestadoDaSituacaoEconomica@updateStatus for alter a single value of "Atestado". I works in browser not in test.

JoaoGracio89's avatar
    /** AtestadoDaSituacaoEconomicaController */
    Route::get('/atestado-da-situacao-economica', 'AtestadoDaSituacaoEconomicaController@index')->name('users.atestados.atestado-da-situacao-economica.index'); /*  */
    Route::post('/atestado-da-situacao-economica', 'AtestadoDaSituacaoEconomicaController@store')->name('users.atestados.atestado-da-situacao-economica.store'); /*  */
    Route::get('/atestado-da-situacao-economica/create', 'AtestadoDaSituacaoEconomicaController@create')->name('users.atestados.atestado-da-situacao-economica.create'); /*  */
    Route::get('/atestado-da-situacao-economica/{atestado_da_situacao_economica}', 'AtestadoDaSituacaoEconomicaController@show')->name('users.atestados.atestado-da-situacao-economica.show'); /*  */
    Route::get('/atestado-da-situacao-economica/{atestado_da_situacao_economica}/edit', 'AtestadoDaSituacaoEconomicaController@edit')->name('users.atestados.atestado-da-situacao-economica.edit'); /*  */
    Route::put('/atestado-da-situacao-economica/{atestado_da_situacao_economica}', 'AtestadoDaSituacaoEconomicaController@update')->name('users.atestados.atestado-da-situacao-economica.update'); /*  */
    Route::delete('/atestado-da-situacao-economica/{atestado_da_situacao_economica}', 'AtestadoDaSituacaoEconomicaController@destroy')->name('users.atestados.atestado-da-situacao-economica.destroy'); /*  */
    Route::put('/atestado-da-situacao-economica/{atestado_da_situacao_economica}/updateStatus', 'AtestadoDaSituacaoEconomicaController@updateStatus')->name('users.atestados.atestado-da-situacao-economica.updateStatus');
´´´
Tray2's avatar

What kind of error do you get in the test result?

JoaoGracio89's avatar

Failed asserting that false is true. C:\Gits\Portal_do_Fregues\Portal_do_Fregues\tests\Feature\AtestadoTest.php:69

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

JoaoGracio89's avatar

Thanks

This solves the issue!

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

Do i have to make to every test?

Should i make a helper function?

Tray2's avatar

When you pull something from the database into a variable and then make changes to that record in the database you need to refresh the data in that variable to reflect you changes. So yes every time you do that you need to refresh.

blacklotus's avatar

Alternatively you can do like this to check against the database in test cases. With this method you don't have to do fresh() everytime.

$this->assertDatabaseHas('atestados', ['id' => $this->atestados->id, 'estado' => 'Completo']);
JoaoGracio89's avatar

do i need to refresh in mysql database to? is it better to use a mysql database for tests? any opinions here?

Please or to participate in this conversation.