PetUserSoftDeleteTest.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <?php
  2. namespace App\Module\Pet\Tests;
  3. use App\Module\Pet\Models\PetUser;
  4. use App\Module\Pet\Enums\PetStatus;
  5. use Tests\TestCase;
  6. use Illuminate\Foundation\Testing\RefreshDatabase;
  7. /**
  8. * 宠物用户软删除测试
  9. */
  10. class PetUserSoftDeleteTest extends TestCase
  11. {
  12. use RefreshDatabase;
  13. /**
  14. * 测试软删除功能
  15. */
  16. public function test_soft_delete(): void
  17. {
  18. // 创建测试宠物
  19. $pet = PetUser::create([
  20. 'user_id' => 1,
  21. 'name' => '测试宠物',
  22. 'level' => 1,
  23. 'experience' => 0,
  24. 'stamina' => 100,
  25. 'status' => PetStatus::NORMAL,
  26. ]);
  27. // 验证宠物存在
  28. $this->assertDatabaseHas('kku_pet_users', [
  29. 'id' => $pet->id,
  30. 'name' => '测试宠物',
  31. 'user_id' => 1,
  32. ]);
  33. // 软删除宠物
  34. $pet->delete();
  35. // 验证宠物在正常查询中不可见
  36. $this->assertDatabaseMissing('kku_pet_users', [
  37. 'id' => $pet->id,
  38. 'name' => '测试宠物',
  39. 'user_id' => 1,
  40. 'deleted_at' => null,
  41. ]);
  42. // 验证宠物在软删除表中可见
  43. $this->assertSoftDeleted('kku_pet_users', [
  44. 'id' => $pet->id,
  45. 'name' => '测试宠物',
  46. 'user_id' => 1,
  47. ]);
  48. // 验证通过模型查询不到已删除的宠物
  49. $foundPet = PetUser::find($pet->id);
  50. $this->assertNull($foundPet);
  51. // 验证通过withTrashed可以查询到已删除的宠物
  52. $trashedPet = PetUser::withTrashed()->find($pet->id);
  53. $this->assertNotNull($trashedPet);
  54. $this->assertTrue($trashedPet->trashed());
  55. // 恢复宠物
  56. $trashedPet->restore();
  57. // 验证宠物恢复后可见
  58. $this->assertDatabaseHas('kku_pet_users', [
  59. 'id' => $pet->id,
  60. 'name' => '测试宠物',
  61. 'user_id' => 1,
  62. 'deleted_at' => null,
  63. ]);
  64. // 验证通过模型可以查询到恢复的宠物
  65. $restoredPet = PetUser::find($pet->id);
  66. $this->assertNotNull($restoredPet);
  67. $this->assertFalse($restoredPet->trashed());
  68. }
  69. /**
  70. * 测试强制删除功能
  71. */
  72. public function test_force_delete(): void
  73. {
  74. // 创建测试宠物
  75. $pet = PetUser::create([
  76. 'user_id' => 2,
  77. 'name' => '测试宠物2',
  78. 'level' => 5,
  79. 'experience' => 50,
  80. 'stamina' => 80,
  81. 'status' => PetStatus::NORMAL,
  82. ]);
  83. // 软删除宠物
  84. $pet->delete();
  85. // 验证软删除成功
  86. $this->assertSoftDeleted('kku_pet_users', [
  87. 'id' => $pet->id,
  88. 'name' => '测试宠物2',
  89. 'user_id' => 2,
  90. ]);
  91. // 强制删除宠物
  92. $pet->forceDelete();
  93. // 验证宠物完全删除
  94. $this->assertDatabaseMissing('kku_pet_users', [
  95. 'id' => $pet->id,
  96. 'name' => '测试宠物2',
  97. 'user_id' => 2,
  98. ]);
  99. // 验证即使使用withTrashed也查询不到
  100. $deletedPet = PetUser::withTrashed()->find($pet->id);
  101. $this->assertNull($deletedPet);
  102. }
  103. /**
  104. * 测试软删除对关联查询的影响
  105. */
  106. public function test_soft_delete_with_relations(): void
  107. {
  108. // 创建测试宠物
  109. $pet = PetUser::create([
  110. 'user_id' => 3,
  111. 'name' => '测试宠物3',
  112. 'level' => 10,
  113. 'experience' => 100,
  114. 'stamina' => 90,
  115. 'status' => PetStatus::NORMAL,
  116. ]);
  117. // 验证可以通过用户ID查询到宠物
  118. $userPets = PetUser::where('user_id', 3)->get();
  119. $this->assertCount(1, $userPets);
  120. // 软删除宠物
  121. $pet->delete();
  122. // 验证软删除后通过用户ID查询不到宠物
  123. $userPetsAfterDelete = PetUser::where('user_id', 3)->get();
  124. $this->assertCount(0, $userPetsAfterDelete);
  125. // 验证使用withTrashed可以查询到
  126. $userPetsWithTrashed = PetUser::withTrashed()->where('user_id', 3)->get();
  127. $this->assertCount(1, $userPetsWithTrashed);
  128. }
  129. /**
  130. * 测试软删除的查询作用域
  131. */
  132. public function test_soft_delete_scopes(): void
  133. {
  134. // 创建多个测试宠物
  135. $pet1 = PetUser::create([
  136. 'user_id' => 4,
  137. 'name' => '正常宠物',
  138. 'level' => 1,
  139. 'experience' => 0,
  140. 'stamina' => 100,
  141. 'status' => PetStatus::NORMAL,
  142. ]);
  143. $pet2 = PetUser::create([
  144. 'user_id' => 4,
  145. 'name' => '将被删除的宠物',
  146. 'level' => 2,
  147. 'experience' => 20,
  148. 'stamina' => 90,
  149. 'status' => PetStatus::NORMAL,
  150. ]);
  151. // 软删除第二个宠物
  152. $pet2->delete();
  153. // 测试默认查询(不包含已删除)
  154. $normalPets = PetUser::where('user_id', 4)->get();
  155. $this->assertCount(1, $normalPets);
  156. $this->assertEquals('正常宠物', $normalPets->first()->name);
  157. // 测试withTrashed(包含已删除)
  158. $allPets = PetUser::withTrashed()->where('user_id', 4)->get();
  159. $this->assertCount(2, $allPets);
  160. // 测试onlyTrashed(只查询已删除)
  161. $trashedPets = PetUser::onlyTrashed()->where('user_id', 4)->get();
  162. $this->assertCount(1, $trashedPets);
  163. $this->assertEquals('将被删除的宠物', $trashedPets->first()->name);
  164. }
  165. }