JoaoGracio89's avatar

Test enviroment assign role to user without being programmed to do it, why?

The project consists in the interaction between user and attestations. But never the less the problem is when i create a user using my User Factory (the user comes with an assing role out of no where):

$factory->define(User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => 'yIXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
        'remember_token' => Str::random(10),
        'num_id_fiscal' => $faker->unique()->numberBetween($min = 100000000, $max = 299999999),
        'nomes_proprios' => $faker->firstName,
        'apelidos' => $faker->lastName,
        'data_de_nascimento' => $faker->dateTimeBetween($startDate = '-50 years', $endDate = '-18 years', $timezone = null),
        'data_de_validade' => $faker->dateTimeBetween($startDate = 'now', $endDate = '+8 years', $timezone = null),
        'num_id_civil' => $faker->unique()->numberBetween($min = 10000000, $max = 19999999),
        'num_id_seg_social' => $faker->unique()->numberBetween($min = 10000000000, $max = 19999999999),
        'estado' => 'Dados Confirmados',
        'profissao' => $faker->jobTitle,
        'nome_do_pai' => $faker->name,
        'nome_da_mae' => $faker->name,
        'estado_civil' => 'Casado',
        'natural_da_freguesia_de' => $faker->citySuffix,
        'natural_do_concelho_de' => $faker->city,
        'created_at' => \Carbon\Carbon::now(),
        'updated_at' => \Carbon\Carbon::now(),
    ];
});

In the setUp() : void function of InteracaoComAtestadoTest (the user comes with an assing role out of no where):

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

        // Seed the default permissions
        $permissions = Permission::defaultPermissions();

        foreach ($permissions as $perms) {
            Permission::firstOrCreate(['name' => $perms]);
        }

        $roles_array = ['SuperAdmin', 'Admin', 'Funcionário', 'Freguês'];

        // add roles
        foreach($roles_array as $role) {
            $role = Role::firstOrCreate(['guard_name' => 'web', 'name' => trim($role)]);

            if( $role->name == 'Admin' ) {
                // assign all permissions
                $role->syncPermissions(Permission::where('name', 'LIKE', 'access_%')->get());
                $role->syncPermissions(Permission::where('name', 'LIKE', 'manage_%')->get());
                $role->syncPermissions(Permission::where('name', 'LIKE', 'admin_%')->get());
            } elseif($role->name == 'Freguês') {
                // for others by default only read access
                $role->syncPermissions(Permission::where('name', 'LIKE', 'access_%')->get());
            } elseif($role->name == 'Funcionário'){
                $role->syncPermissions(Permission::where('name', 'LIKE', 'access_%')->get());
            } elseif( $role->name == 'SuperAdmin') {
                $role->syncPermissions(Permission::all());
            }

        }

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

        $this->user_user = factory('App\User')->create();

        $condition = $this->user_user->hasRole('Freguês');

        $this->user_user->assignRole('Freguês');

        $condition = $this->user_user->hasRole('Freguês');

        $this->user_funcionario = factory('App\User')->create();

        $condition = $this->user_funcionario->hasRole('Freguês');

        $this->user_funcionario->assignRole('Funcionário');

        $condition = $this->user_funcionario->hasRole('Freguês');

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

The test where it falling:

    /** @test */
    public function um_atestado_so_pode_mudar_para_valido_ou_invalido_apenas_depois_de_ser_dado_como_completo(){

        $response = $this->actingAs($this->user_funcionario)
            ->put(route('users.atestados.atestado-da-situacao-economica.updateStatus', $this->atestado->id), array(
                'estado' => 'Inválido'
            ))
            ->assertRedirect('atestado-da-situacao-economica/'. $this->atestado->id);

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

The controller related with this test:

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

        if(tem_permissao($user,'Freguês','access_App') && $atestado_da_situacao_economica->users->contains($user->id)){
            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')){
		// where it was supposed to enter not above
        }

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

Expect result:

Test passed with out error.

Actual Behavior:

Failed asserting that two strings are equal. Expected :'http://localhost/atestado-da-situacao-economica/1' Actual :'http://localhost/atestado-da-situacao-economica'

0 likes
1 reply
JoaoGracio89's avatar
JoaoGracio89
OP
Best Answer
Level 6

It was happening due to AppServiceProvider:

User::created(function ($user) {

            
            if(Helpers\stringEndsWith($user->email,'@jf.pt')){
                $user->assignRole('Funcionário');
            }elseif(Helpers\stringEndsWith($user->email,'@noop.pt') || Helpers\stringEndsWith($user->email, '[email protected]')){
                $user->assignRole('SuperAdmin');
            }elseif(Helpers\stringEndsWith($user->email,'@presidente-jf.pt')){
                $user->assignRole('Admin');
            }else{
                $user->assignRole('Freguês');
            }

        });

Please or to participate in this conversation.