4

I'm trying to test my api that's made with JWT_auth: https://github.com/tymondesigns/jwt-auth

class UpdateTest extends TestCase
{
    use DatabaseTransactions;

    public $token;

    public function signIn($data = ['email'=>'[email protected]', 'password'=>'secret'])
    {
        $this->post('api/login', $data);
        $content = json_decode($this->response->getContent());
        $this->assertObjectHasAttribute('token', $content);
        $this->token = $content->token;

        return $this;
    }

    /** @test */
    public function a_user_updates_his_account()
    {
        factory(User::class)->create([
            'name'              => 'Test',
            'last_name'         => 'Test',
            'email'             => '[email protected]',
            'mobile'            => '062348383',
            'function'          => 'ceo',
            'about'             => 'About me.....',
            'corporation_id'    => 1
        ]);

        $user = User::first();
        $user->active = 2;
        $user->save();

        $this->signIn();

        $url = '/api/user/' . $user->slug . '?token=' . $this->token;
        $result = $this->json('GET', $url);
        dd($result);
    }
}

Result is always:

The token could not be parsed from the request

How do I get this t work!?

Source (https://github.com/tymondesigns/jwt-auth/issues/206)

2
  • Most likely because the the middleware reads the token from Authorization header, not by appending it as query parameter. Commented Oct 20, 2016 at 10:24
  • Yes, but how do I get this to work? Commented Oct 20, 2016 at 10:40

2 Answers 2

5

One way to test your API in this situation is to bypass the actual token verification, but still log your user in (if you need to identify the user). Here is a snippet of the helper method we used in our recent API-based application.

/**
 * Simulate call api
 *
 * @param  string $endpoint
 * @param  array  $params
 * @param  string $asUser
 *
 * @return mixed
 */
protected function callApi($endpoint, $params = [], $asUser = '[email protected]')
{
    $endpoint = starts_with($endpoint, '/')
        ? $endpoint
        : '/' . $endpoint;

    $headers = [];

    if (!is_null($asUser)) {
        $token = auth()->guard('api')
            ->login(\Models\User::whereEmail($asUser)->first());

        $headers['Authorization'] = 'Bearer ' . $token;
    }

    return $this->json(
        'POST', 
        'http://api.dev/' . $endpoint,
        $params,
        $headers
    );
}

And is used like this:

$this->callApi('orders/list', [
        'type' => 'customers' 
    ])
    ->seeStatusOk()
Sign up to request clarification or add additional context in comments.

Comments

1

Basically, there is not really a way for now. The fake request that is created during testing and is passed to Laravel to handle, somehow drops the token data.

It has alredy been reported in an issue (https://github.com/tymondesigns/jwt-auth/issues/852) but as far as I know, there is no solution yet.

2 Comments

So basically it's impossible for me to test my api -_-
Nothing is impossible, but to be honest, I found no way to do it - you might try to fix the bug in tymon/jwt-auth though. Or, you can disable the auth middleware in testing environment and test the REST (pun intended) of your API

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.