From 1fedc201762ae4a2a14cfdad9044d64184afa766 Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Sat, 11 Apr 2020 16:37:07 +0800 Subject: [PATCH] Prepare test for user deletion bug --- app/Http/Controllers/UsersController.php | 27 +++++++++++++++----- tests/Feature/UsersDeletionTest.php | 44 ++++++++++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index 5619a86..3f65816 100644 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -2,12 +2,12 @@ namespace App\Http\Controllers; -use DB; -use Storage; -use App\User; use App\Couple; -use Illuminate\Http\Request; use App\Http\Requests\Users\UpdateRequest; +use App\User; +use DB; +use Illuminate\Http\Request; +use Storage; class UsersController extends Controller { @@ -216,9 +216,22 @@ class UsersController extends Controller private function replaceUserOnCouplesTable($oldUserId, $replacementUserId) { foreach (['husband_id', 'wife_id', 'manager_id'] as $field) { - DB::table('couples')->where($field, $oldUserId)->update([ - $field => $replacementUserId, - ]); + if (in_array($field, ['husband_id', 'wife_id'])) { + $replacementUserCouples = Couple::where('husband_id', $replacementUserId) + ->orWhere('wive_id', $replacementUserId) + ->get(); + if ($replacementUserCouples->isEmpty()) { + DB::table('couples')->where($field, $oldUserId)->update([ + $field => $replacementUserId, + ]); + } else { + $replacementUserCouples->first()->delete(); + } + } else { + DB::table('couples')->where($field, $oldUserId)->update([ + $field => $replacementUserId, + ]); + } } } diff --git a/tests/Feature/UsersDeletionTest.php b/tests/Feature/UsersDeletionTest.php index bb2fe42..6046762 100644 --- a/tests/Feature/UsersDeletionTest.php +++ b/tests/Feature/UsersDeletionTest.php @@ -2,10 +2,10 @@ namespace Tests\Feature; -use App\User; use App\Couple; -use Tests\TestCase; +use App\User; use Illuminate\Foundation\Testing\RefreshDatabase; +use Tests\TestCase; class UsersDeletionTest extends TestCase { @@ -253,4 +253,44 @@ class UsersDeletionTest extends TestCase $this->seeElement('option', ['value' => $replacementMaleUser->id]); $this->dontSeeElement('option', ['value' => $femaleUser->id]); } + + /** @test */ + public function bugfix_handle_duplicated_couple_on_user_deletion() + { + $manager = $this->loginAsUser(); + $oldUser = factory(User::class)->states('male')->create([ + 'manager_id' => $manager->id, + ]); + $replacementUser = factory(User::class)->states('male')->create([ + 'manager_id' => $manager->id, + ]); + $oldUserCouple = factory(Couple::class)->create([ + 'husband_id' => $oldUser->id, + 'wife_id' => '999999', + ]); + $duplicatedCouple = factory(Couple::class)->create([ + 'husband_id' => $replacementUser->id, + 'wife_id' => '999999', + ]); + + $this->visit(route('users.edit', [$oldUser, 'action' => 'delete'])); + $this->see(__('user.replace_delete_text')); + + $this->submitForm(__('user.replace_delete_button'), [ + 'replacement_user_id' => $replacementUser->id, + ]); + + $this->dontSeeInDatabase('users', [ + 'id' => $oldUser->id, + ]); + + $this->dontSeeInDatabase('couples', [ + 'husband_id' => $oldUser->id, + ]); + + $this->seeInDatabase('couples', [ + 'id' => $oldUserCouple->id, + 'husband_id' => $replacementUser->id, + ]); + } }