PetUserSoftDeleteTest.php 6.1 KB

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