mardi 6 mars 2018

Mockery, App Instance not working on some laravel tests

Basically, my question is; Why does the $this->app->instance() Call work on one instance of the mocked object, but the other doesn't...

In the example below, the getGroupSingleSignOnLink function actually gets called, the other is mocked and the test passes...

TEST

namespace Tests\Feature;

use App\Models\Group;
use App\Models\User;
use Tests\TestCase;
use App\Clients\SingleSignOnApi;
use Mockery;

class SingleSignOnTest extends TestCase
{

    private $validUrl = 'http://www.google.com';

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

        $single_sign_on = Mockery::mock(SingleSignOnApi::class);

        $single_sign_on->shouldReceive('getGroupSingleSignOnLink')->andReturn($this->validUrl);
        $single_sign_on->shouldReceive('getSingleSignOnLink')->andReturn($this->validUrl);

        $this->app->instance(SingleSignOnApi::class, $single_sign_on);
    }

    //THIS TEST FAILS, SingleSignOnApi Class Not Mocked
    public function testGroupAuthConnection()
    {
        $group = Group::whereNotNull('external_platform_key')->first();
        $user = $group->users()->first();

        $this->be($user);

        $group_sso = $group->groupAuthConnections()->first();
        $response = $this->get(route('sso.group.connect', ['id' => $group_sso->id]));

        $response->assertRedirect($this->validUrl);
        $response->assertSessionMissing('__danger');
    }

    //THIS TEST PASSES, The SingleSignOnApi Class is Mocked
    public function testAuthConnectionConnect()
    {
        $user = User::first();
        $this->be($user);

        $sso = $user->authConnections()->firstOrFail();
        $response = $this->get(route('sso.connect', ['id' => $sso->id]));

        $response->assertRedirect($this->validUrl);
        $response->assertSessionMissing('__danger');
    }

}

CONTROLLER FUNC - TEST MOCK WORKING

public function connect($id)
{
    $auth_connection = $this->findAuthConnection($id, Auth::user());

    if (!$auth_connection)
    {
        throw new \Exception('Invalid Auth Connection ID');
    }

    $sso_client = App::make(SingleSignOnApi::class);
    $url        = $sso_client->getSingleSignOnLink($auth_connection);

    return redirect($url);
}

CONTROLLER FUNC - TEST MOCK NOT WORKING

public function connect($id)
{
    $group_ids = Auth::user()->groups()->pluck('groups.id')->toArray();

    $group_auth_connection = $this->findGroupAuthConnection($id, Auth::user());

    if (! in_array($group_auth_connection->group_id, $group_ids)) {
        throw new \Exception('You do not have access to this group');
    }

    //This is the Mocked Object in my Test: SingleSignOnApi
    $sso_client = App::make(SingleSignOnApi::class, [$group_auth_connection->group->external_platform_key]);
    $url = $sso_client->getGroupSingleSignOnLink($group_auth_connection, Auth::user());

    return redirect($url);
}

Aucun commentaire:

Enregistrer un commentaire