From d7ca8aef0bc0131d0f5532e7a3162a8756f6b7b5 Mon Sep 17 00:00:00 2001 From: catch <catch@35733.no-reply.drupal.org> Date: Fri, 31 Aug 2012 12:32:50 +0100 Subject: [PATCH] Issue #1723774 by googletorp, Berdir, corvus_ch: user_delete_multiple() does not use UserStorageController. --- .../lib/Drupal/user/Tests/UserDeleteTest.php | 64 +++++++++++++++++++ .../lib/Drupal/user/UserStorageController.php | 12 ++++ core/modules/user/user.module | 36 +---------- 3 files changed, 77 insertions(+), 35 deletions(-) create mode 100644 core/modules/user/lib/Drupal/user/Tests/UserDeleteTest.php diff --git a/core/modules/user/lib/Drupal/user/Tests/UserDeleteTest.php b/core/modules/user/lib/Drupal/user/Tests/UserDeleteTest.php new file mode 100644 index 000000000000..2b9442dcad41 --- /dev/null +++ b/core/modules/user/lib/Drupal/user/Tests/UserDeleteTest.php @@ -0,0 +1,64 @@ +<?php + +/** + * @file + * Definition of Drupal\user\Tests\UserDeleteTest. + */ + +namespace Drupal\user\Tests; + +use Drupal\simpletest\WebTestBase; + +/** + * Tests user_delete() and user_delete_multiple() behavior. + */ +class UserDeleteTest extends WebTestBase { + + public static function getInfo() { + return array( + 'name' => 'User delete test', + 'description' => 'Test account deleting of users.', + 'group' => 'User', + ); + } + + /** + * Test deleting multiple users. + */ + function testUserDeleteMultiple() { + // Create a few users with permissions, so roles will be created. + $user_a = $this->drupalCreateUser(array('access content')); + $user_b = $this->drupalCreateUser(array('access content')); + $user_c = $this->drupalCreateUser(array('access content')); + + $uids = array($user_a->uid, $user_b->uid, $user_c->uid); + + // These users should have a role + $query = db_select('users_roles', 'r'); + $roles_created = $query + ->fields('r', array('uid')) + ->condition('uid', $uids) + ->countQuery() + ->execute() + ->fetchField(); + + $this->assertTrue($roles_created > 0, 'Role assigments created for new users and deletion of role assigments can be tested'); + // We should be able to load one of the users. + $this->assertTrue(user_load($user_a->uid), 'User is created and deltion of user can be tested'); + // Delete the users. + user_delete_multiple($uids); + // Test if the roles assignments are deleted. + $query = db_select('users_roles', 'r'); + $roles_after_deletion = $query + ->fields('r', array('uid')) + ->condition('uid', $uids) + ->countQuery() + ->execute() + ->fetchField(); + $this->assertTrue($roles_after_deletion == 0, 'Role assigments deleted along with users'); + // Test if the users are deleted, user_load() will return FALSE. + $this->assertFalse(user_load($user_a->uid), format_string('User with id @uid deleted.', array('@uid' => $user_a->uid))); + $this->assertFalse(user_load($user_b->uid), format_string('User with id @uid deleted.', array('@uid' => $user_b->uid))); + $this->assertFalse(user_load($user_c->uid), format_string('User with id @uid deleted.', array('@uid' => $user_c->uid))); + } +} diff --git a/core/modules/user/lib/Drupal/user/UserStorageController.php b/core/modules/user/lib/Drupal/user/UserStorageController.php index bb1d9d2b905f..1bc70d864d6b 100644 --- a/core/modules/user/lib/Drupal/user/UserStorageController.php +++ b/core/modules/user/lib/Drupal/user/UserStorageController.php @@ -221,4 +221,16 @@ protected function postSave(StorableInterface $entity, $update) { } } } + + /** + * Overrides Drupal\entity\DatabaseStorageController::postDelete(). + */ + protected function postDelete($entities) { + db_delete('users_roles') + ->condition('uid', array_keys($entities), 'IN') + ->execute(); + db_delete('authmap') + ->condition('uid', array_keys($entities), 'IN') + ->execute(); + } } diff --git a/core/modules/user/user.module b/core/modules/user/user.module index 1c91293ef750..f7cef205cfe2 100644 --- a/core/modules/user/user.module +++ b/core/modules/user/user.module @@ -2018,41 +2018,7 @@ function user_delete($uid) { * @see hook_user_delete() */ function user_delete_multiple(array $uids) { - if (!empty($uids)) { - $accounts = user_load_multiple($uids); - - $transaction = db_transaction(); - try { - foreach ($accounts as $uid => $account) { - // Allow modules to act prior to user deletion. - module_invoke_all('user_predelete', $account); - module_invoke_all('entity_predelete', $account, 'user'); - - field_attach_delete('user', $account); - drupal_session_destroy_uid($account->uid); - } - - db_delete('users') - ->condition('uid', $uids, 'IN') - ->execute(); - db_delete('users_roles') - ->condition('uid', $uids, 'IN') - ->execute(); - db_delete('authmap') - ->condition('uid', $uids, 'IN') - ->execute(); - - // Allow modules to respond to user deletion. - module_invoke_all('user_delete', $account); - module_invoke_all('entity_delete', $account, 'user'); - } - catch (Exception $e) { - $transaction->rollback(); - watchdog_exception('user', $e); - throw $e; - } - entity_get_controller('user')->resetCache(); - } + entity_get_controller('user')->delete($uids); } /** -- GitLab