JoaoGracio89's avatar

Notifications populating database trough the browser but fails in test enviroment

Hi to all who might been reading this post. The title says it all i am starting a project where there are attestations and a single user of role "Funcionario as Staff" or "User" can change the status of an attestation. Therefor there is a controller method updateStatus witch allows users to change a the status of an attestation. The code is pretty raw but i supposed is understandable. So bellow i will put two view for "Funciocionario as Staff" and for "User" the one method in the controller witch allows "estado as status" changes and the test.

User View

@extends('layouts.app')
<?php
view()->share('pageTitle', __('Users'));
view()->share('hideSubHeader', true);
?>
@section('breadcrumbs')
    {{-- Breadcrumbs::render('users.index') --}}
@endsection
@push('styles')
	{{-- some styles --}}
@endpush


@section('content')

    <form method="POST" action="{{ route('users.atestados.atestado-da-situacao-economica.updateStatus', $atestado_da_situacao_economica->id) }}">

        @csrf
        @method('PUT')
        <select id="estado" name="estado">
            <option class="line1" value="Incompleto">Incompleto</option>
            <option class="line2" value="Completo">Completo<ooption>
        </select>

        <button type="submit">Submeter</button>
    </form>

@endsection

@push('scripts')
    <script src="{{ asset('js/bootstrap-select.js') }}"></script>
@endpush
´´´

Funcionario View

@extends('layouts.app')

@section('breadcrumbs') {{-- Breadcrumbs::render('users.index') --}} @endsection @push('styles') {{-- some style --}} @endpush

@section('content')

<form method="POST" action="{{ route('users.atestados.atestado-da-situacao-economica.update', $atestado_da_situacao_economica->id) }}">

    @csrf
    @method('PUT')
    <select id="estado" name="estado">
        <option class="line1" value="Válido">Válido</option>
        <option class="line2" value="Inválido">Inválido</option>
    </select>

    <button type="submit">Submeter</button>
</form>

@endsection

@push('scripts') @endpush ´´´

The updateStatus method inside 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();

                        $funcionarios = User::with('roles')->get()->reject(function ($user, $key){
                            return $user->hasRole('Funcionário');
                        });

                        foreach($funcionarios as $funcionario){
                            $detalhes = [
                                'texto' => 'O freguês deu o Atestado da Situação Económica como completo.',
                                'user_id' => $user->id,
                            ];

                            $funcionario->notify(new FuncionarioAtestadoDaSituacaoEconomica($detalhes));
                        }

                        break;
                    default:
                        break;
                }
            }
        }elseif($user->hasRole('Funcionário')){

        }

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

The Test
/** @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}',
    ]);
    */

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

´´´

The result:

The expected [App\Notifications\FuncionarioAtestadoDaSituacaoEconomica] notification was not sent. Failed asserting that false is true.

Expected Result:

Test passed

0 likes
1 reply
JoaoGracio89's avatar

already tried with fresh() method does not change behavior...

Please or to participate in this conversation.