Vaibhavraj Roham
Vaibhavraj Roham

Reputation: 1165

Test redirection functionality in Laravel

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);
    }
}

Upvotes: 2

Views: 3233

Answers (3)

niilante
niilante

Reputation: 538

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

Upvotes: 1

Cezary
Cezary

Reputation: 151

$this->assertRedirectedTo($uri, $with = []);

maybe try something like that

This PHPUnit method will assert whether you have been redirected to the $uri you provide within the arguments.

https://laravel.com/docs/5.4/testing

you can read more about this in the official laravel documentation for testing

Upvotes: 2

rbur0425
rbur0425

Reputation: 479

Create a 2nd user that is not of type superadmin. Make sure they get redirected to /superadmin/setup.

Upvotes: 0

Related Questions