postJson('/api/v1/register', [ 'name' => 'Test User', 'email' => 'test@example.com', 'password' => 'password123', 'password_confirmation' => 'password123', ]); $response->assertStatus(201) ->assertJsonStructure([ 'success', 'message', 'data' => [ 'user' => ['id', 'name', 'email'], 'token', ], ]) ->assertJson([ 'success' => true, 'message' => 'User registered successfully', ]); $this->assertDatabaseHas('users', [ 'email' => 'test@example.com', ]); }); it('fails registration with invalid data', function () { $response = $this->postJson('/api/v1/register', [ 'name' => '', 'email' => 'invalid-email', 'password' => 'short', ]); $response->assertStatus(422); }); it('fails registration with duplicate email', function () { User::factory()->create(['email' => 'existing@example.com']); $response = $this->postJson('/api/v1/register', [ 'name' => 'Test User', 'email' => 'existing@example.com', 'password' => 'password123', 'password_confirmation' => 'password123', ]); $response->assertStatus(422); }); }); describe('Login', function () { it('logs in with valid credentials', function () { $user = User::factory()->create([ 'password' => bcrypt('password123'), ]); $response = $this->postJson('/api/v1/login', [ 'email' => $user->email, 'password' => 'password123', ]); $response->assertStatus(200) ->assertJsonStructure([ 'success', 'message', 'data' => [ 'user' => ['id', 'name', 'email'], 'token', ], ]) ->assertJson([ 'success' => true, 'message' => 'Login successful', ]); }); it('fails login with invalid credentials', function () { $user = User::factory()->create([ 'password' => bcrypt('password123'), ]); $response = $this->postJson('/api/v1/login', [ 'email' => $user->email, 'password' => 'wrongpassword', ]); $response->assertStatus(401) ->assertJson([ 'success' => false, 'message' => 'Invalid credentials', ]); }); it('fails login with non-existent user', function () { $response = $this->postJson('/api/v1/login', [ 'email' => 'nonexistent@example.com', 'password' => 'password123', ]); $response->assertStatus(401); }); }); describe('Logout', function () { it('logs out authenticated user', function () { $user = User::factory()->create(); $token = $user->createToken('test-token')->plainTextToken; $response = $this->withHeader('Authorization', "Bearer {$token}") ->postJson('/api/v1/logout'); $response->assertStatus(200) ->assertJson([ 'success' => true, 'message' => 'Logged out successfully', ]); }); it('fails logout without authentication', function () { $response = $this->postJson('/api/v1/logout'); $response->assertStatus(401); }); }); describe('Me', function () { it('returns authenticated user data', function () { $user = User::factory()->create(); $token = $user->createToken('test-token')->plainTextToken; $response = $this->withHeader('Authorization', "Bearer {$token}") ->getJson('/api/v1/me'); $response->assertStatus(200) ->assertJsonStructure([ 'success', 'message', 'data' => ['id', 'name', 'email'], ]) ->assertJson([ 'success' => true, 'data' => [ 'id' => $user->id, 'email' => $user->email, ], ]); }); it('fails without authentication', function () { $response = $this->getJson('/api/v1/me'); $response->assertStatus(401); }); });