Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

Kerm's avatar
Level 1

Laravel 10, how create logout api unit test?

Hello! I have api service based on laravel 10 arm, passport component with bearer tokens.

My logout function:

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

    $response = ['message' => __('You have been successfully logged out.')];

    return response()->json($response, ResponseAlias::HTTP_NO_CONTENT, Common::HEADER, JSON_UNESCAPED_UNICODE);
}

My test:

public function test_api_logout()
{
    User::factory()->create([
        "name" => "Name",
        "surname" => "Surname",
        "email" => "[email protected]",
        "password" => Hash::make("12345678"),
        "remember_token" => Str::random(10),
        "user_position_id" => 1,
        "factory_id" => 1,
        "user_role_id" => 1,
        "workcenter_group_id" => 1
    ]);

    $response = $this->postJson('/api/login', ['email' => '[email protected]', 'password' => '12345678']);
    $token = $response->json()['token'];

    $response = $this->withHeaders([
        'Authorization' => 'Bearer ' . $token,
    ])->get('/api/logout');

    if ($response->getStatusCode() === 204) {
        $response = $this->withHeaders([
            'Authorization' => 'Bearer ' . $token,
        ])->get('/api/logout');

        $response
            ->assertStatus(401);
    }
}

What i do in that test:

  1. create user through factory
  2. login
  3. using recived token i try logout
  4. after sucessfull logout i try logut again to test logout function

On second logout i must recive 401 code, not authorized (because route is closed), but recive again 204, why?

Api route:

Route::middleware('auth:api')->group(function () {
	Route::get('/logout', [ApiAuthController::class, 'logout'])->name('logout.api');
})

Anticipating your questions, i try login using:

Passport::actingAs($user);

But i have sql error:

DETAIL: Failing row contains (null, null, null, null, [], t, 2024-02-29 12:50:06, 2024-02-29 12:50:06, null). (Connection: pgsql, SQL: insert into "oauth_access_tokens" ("scopes", "revoked", "updated_at", "created_at") values ([], 1, 2024-02-29 12:50:06, 2024-02-29 12:50:06)), 197, #0 J:\OpenServer\domains\site.com\vendor\laravel\framework\src\Illuminate\Database\Connection.php(783): Illuminate\Database\Connection->runQueryCallback('insert into "oa...', Arra y, Object(Closure)) )

0 likes
0 replies

Please or to participate in this conversation.