Test redirection functionality in Laravel

Viewed 2335

Scenario :

I have following test case in which I want to test scenario as, if user found with usertype superadmin then redirect user to /home route and if user not found redirect him to /superadmin/setup route. Tried multiple approch but can't figure out. How can pass this test?

I'm using Laravel 5.4.

Test Case :

<?php

namespace Tests\Feature;

use App\User;
use Tests\TestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;

class SuperAdminRegistrationTest extends TestCase
{
    use DatabaseMigrations;

    public function testRegistrationForm()
    {
        factory(User::class)->create(['usertype' => 'superadmin']);
        $user = User::getUserFromUsertype('superadmin');
        //If valid user is found with usertype 'superadmin' then
            // $this->get('/home');
            // $this->assertStatus(200);
        //Else user not found with given usertype then
           // $this->get('/superadmin/setup');
           // $this->assertStatus(200);
    }
}
3 Answers

As a rule of thumb, do not use if else statements in your test methods. Since you want to test all the possible cases, but if else statements selects only one case.

From experience, I recommend you use two test methods as follows:

public function testSuperAdminCanViewRegistrationForm()
{
    factory(User::class)->create(['usertype' => 'superadmin']);
    $user = User::getUserFromUsertype('superadmin');

    $this->actingAs($user);

    $response = $this->get('/home');
    $response->assertStatus(200);
}

public function testNonSuperAdminCanViewRegistrationForm()
{
    factory(User::class)->create(['usertype' => 'non_superadmin']);
    $user = User::getUserFromUsertype('non_superadmin');

    $this->actingAs($user);

    $response = $this->get('/home');
    $response->assertStatus(302);
    $response->assertRedirect('/superadmin/setup');
}

NB: I worked in Laravel ^6.0

Related