admin = $this->createAdminUser(); $this->token = $this->admin->createToken('test-token')->plainTextToken; } /** * 관리자 역할 생성 및 할당 */ private function createAdminUser(): User { $user = User::factory()->create([ 'status' => 'active', ]); // 사용자 업데이트 권한 생성 $permission = Permission::firstOrCreate( ['identifier' => 'core.users.update'], [ 'name' => json_encode(['ko' => '사용자 수정', 'en' => 'Update Users']), 'description' => json_encode(['ko' => '사용자 정보 수정 권한', 'en' => 'Permission to update users']), 'extension_type' => ExtensionOwnerType::Core, 'extension_identifier' => 'core', 'type' => 'admin', ] ); // 관리자 역할 생성 $adminRole = Role::firstOrCreate( ['identifier' => 'admin'], [ 'name' => json_encode(['ko' => '관리자', 'en' => 'Administrator']), 'description' => json_encode(['ko' => '시스템 관리자', 'en' => 'System Administrator']), 'extension_type' => ExtensionOwnerType::Core, 'extension_identifier' => 'core', 'type' => 'admin', 'is_active' => true, ] ); // 역할에 권한 할당 if (! $adminRole->permissions()->where('permissions.id', $permission->id)->exists()) { $adminRole->permissions()->attach($permission->id); } // 사용자에게 역할 할당 $user->roles()->attach($adminRole->id, [ 'assigned_at' => now(), 'assigned_by' => null, ]); return $user->fresh(); } /** * 인증된 요청 헬퍼 메서드 */ private function authRequest(): static { return $this->withHeaders([ 'Authorization' => 'Bearer '.$this->token, 'Accept' => 'application/json', ]); } /** * 현재 로그인된 사용자가 일괄 변경 대상에 포함되면 422 오류를 반환한다. */ public function test_cannot_bulk_update_current_user_status(): void { $otherUser = User::factory()->create(['status' => 'active']); $response = $this->authRequest()->patchJson('/api/admin/users/bulk-status', [ 'ids' => [$this->admin->uuid, $otherUser->uuid], 'status' => 'inactive', ]); $response->assertStatus(422); $response->assertJsonValidationErrors(['ids']); // 다른 사용자의 상태도 변경되지 않았는지 확인 $otherUser->refresh(); $this->assertEquals('active', $otherUser->status); } /** * 현재 로그인된 사용자를 제외하면 정상적으로 일괄 변경된다. */ public function test_can_bulk_update_other_users_status(): void { $users = User::factory()->count(3)->create(['status' => 'active']); $response = $this->authRequest()->patchJson('/api/admin/users/bulk-status', [ 'ids' => $users->pluck('uuid')->toArray(), 'status' => 'inactive', ]); $response->assertOk(); $response->assertJson([ 'success' => true, ]); // 모든 사용자의 상태가 변경되었는지 확인 foreach ($users as $user) { $user->refresh(); $this->assertEquals('inactive', $user->status); } } /** * 현재 로그인된 사용자만 포함된 경우 422 오류를 반환한다. */ public function test_cannot_bulk_update_only_current_user(): void { $response = $this->authRequest()->patchJson('/api/admin/users/bulk-status', [ 'ids' => [$this->admin->uuid], 'status' => 'inactive', ]); $response->assertStatus(422); $response->assertJsonValidationErrors(['ids']); } /** * 빈 ID 배열로 요청하면 422 오류를 반환한다. */ public function test_validation_fails_for_empty_ids(): void { $response = $this->authRequest()->patchJson('/api/admin/users/bulk-status', [ 'ids' => [], 'status' => 'inactive', ]); $response->assertStatus(422); } /** * 잘못된 상태 값으로 요청하면 422 오류를 반환한다. */ public function test_validation_fails_for_invalid_status(): void { $user = User::factory()->create(['status' => 'active']); $response = $this->authRequest()->patchJson('/api/admin/users/bulk-status', [ 'ids' => [$user->uuid], 'status' => 'invalid_status', ]); $response->assertStatus(422); } /** * 존재하지 않는 사용자 ID로 요청하면 422 오류를 반환한다. */ public function test_validation_fails_for_nonexistent_user_id(): void { $response = $this->authRequest()->patchJson('/api/admin/users/bulk-status', [ 'ids' => ['00000000-0000-0000-0000-000000000000'], 'status' => 'inactive', ]); $response->assertStatus(422); } /** * 인증되지 않은 사용자는 401 오류를 반환한다. */ public function test_unauthenticated_user_cannot_bulk_update(): void { $user = User::factory()->create(); $response = $this->patchJson('/api/admin/users/bulk-status', [ 'ids' => [$user->uuid], 'status' => 'inactive', ]); $response->assertStatus(401); } }