Laravel Тест выхода из паспорта, возвращающий 200, когда он должен быть отклонен - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь написать тест для процедуры выхода из системы для Laravel Паспорт. Но каждый раз, когда я запускаю его, я получаю сообщение об ошибке expected 401 but got 200, которое означает, что пользователь фактически не выходит из системы.

Функциональность выхода из системы в AuthController выглядит следующим образом:

public function logout(Request $request): JsonResponse
{
    $accessToken = $request->user()->token();

    $refreshToken = DB::table('oauth_refresh_tokens')
        ->where('access_token_id', $accessToken->id)
        ->update([
            'revoked' => true
        ]);

    $accessToken->revoke();

    return response()->json(['message' => 'Successfully logged out']);
}

Это работает нормально, но проблема заключается в тестировании.

Мой тест выглядит следующим образом:

public function testUserIsLoggedOutProperly(): void
{
    $user = factory(User::class)->create();
    Passport::actingAs($user);

    $this->json('GET', 'api/user')->assertStatus(JsonResponse::HTTP_OK);
    $this->json('GET', 'api/logout')->assertStatus(JsonResponse::HTTP_OK);

    $this->json('GET', 'api/user')
        ->assertStatus(JsonResponse::HTTP_UNAUTHORIZED);
}

Последнее утверждение фактически возвращает HTTP_OK (200)

Любой помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 20 января 2020

Это просто быстрое отражение (не проверено), но вы должны сделать свой тест с:

  1. получить новый токен, (я думаю, вы можете сделать это без вызова API)
  2. вызов "api / logout" с токеном, входящим в 1)
  3. проверка с помощью функции assertDatabaseHas

    $response = $this->json('POST','oauth/token', [
        'form_params' => [
           'grant_type' => 'password',
           'client_id' => 'client-id',
           'client_secret' => 'client-secret',
           'username' => 'taylor@laravel.com',
           'password' => 'my-password',
           'scope' => '',
        ] 
    ]);
    $response->assertStatus(JsonResponse::HTTP_OK);
    $token = json_decode((string) $response->getBody(), true)['access_token'];
    
    $this->json('POST', 'api/logout')->withHeaders([
        'Accept' => 'application/json',
        'Authorization' => 'Bearer ' . $token  
    ])->assertStatus(JsonResponse::HTTP_OK);
    
    $this->assertDatabaseHas('oauth_refresh_tokens', [
      'access_token_id' => $token, 
      'revoked' => true
    ]);
    
...