| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- <?php
- namespace App\Module\Pet\Tests;
- use App\Module\Pet\Models\PetUser;
- use App\Module\Pet\Enums\PetStatus;
- use Tests\TestCase;
- use Illuminate\Foundation\Testing\RefreshDatabase;
- /**
- * 宠物用户软删除测试
- */
- class PetUserSoftDeleteTest extends TestCase
- {
- use RefreshDatabase;
- /**
- * 测试软删除功能
- */
- public function test_soft_delete(): void
- {
- // 创建测试宠物
- $pet = PetUser::create([
- 'user_id' => 1,
- 'name' => '测试宠物',
- 'level' => 1,
- 'experience' => 0,
- 'stamina' => 100,
- 'status' => PetStatus::NORMAL,
- ]);
- // 验证宠物存在
- $this->assertDatabaseHas('kku_pet_users', [
- 'id' => $pet->id,
- 'name' => '测试宠物',
- 'user_id' => 1,
- ]);
- // 软删除宠物
- $pet->delete();
- // 验证宠物在正常查询中不可见
- $this->assertDatabaseMissing('kku_pet_users', [
- 'id' => $pet->id,
- 'name' => '测试宠物',
- 'user_id' => 1,
- 'deleted_at' => null,
- ]);
- // 验证宠物在软删除表中可见
- $this->assertSoftDeleted('kku_pet_users', [
- 'id' => $pet->id,
- 'name' => '测试宠物',
- 'user_id' => 1,
- ]);
- // 验证通过模型查询不到已删除的宠物
- $foundPet = PetUser::find($pet->id);
- $this->assertNull($foundPet);
- // 验证通过withTrashed可以查询到已删除的宠物
- $trashedPet = PetUser::withTrashed()->find($pet->id);
- $this->assertNotNull($trashedPet);
- $this->assertTrue($trashedPet->trashed());
- // 恢复宠物
- $trashedPet->restore();
- // 验证宠物恢复后可见
- $this->assertDatabaseHas('kku_pet_users', [
- 'id' => $pet->id,
- 'name' => '测试宠物',
- 'user_id' => 1,
- 'deleted_at' => null,
- ]);
- // 验证通过模型可以查询到恢复的宠物
- $restoredPet = PetUser::find($pet->id);
- $this->assertNotNull($restoredPet);
- $this->assertFalse($restoredPet->trashed());
- }
- /**
- * 测试强制删除功能
- */
- public function test_force_delete(): void
- {
- // 创建测试宠物
- $pet = PetUser::create([
- 'user_id' => 2,
- 'name' => '测试宠物2',
- 'level' => 5,
- 'experience' => 50,
- 'stamina' => 80,
- 'status' => PetStatus::NORMAL,
- ]);
- // 软删除宠物
- $pet->delete();
- // 验证软删除成功
- $this->assertSoftDeleted('kku_pet_users', [
- 'id' => $pet->id,
- 'name' => '测试宠物2',
- 'user_id' => 2,
- ]);
- // 强制删除宠物
- $pet->forceDelete();
- // 验证宠物完全删除
- $this->assertDatabaseMissing('kku_pet_users', [
- 'id' => $pet->id,
- 'name' => '测试宠物2',
- 'user_id' => 2,
- ]);
- // 验证即使使用withTrashed也查询不到
- $deletedPet = PetUser::withTrashed()->find($pet->id);
- $this->assertNull($deletedPet);
- }
- /**
- * 测试软删除对关联查询的影响
- */
- public function test_soft_delete_with_relations(): void
- {
- // 创建测试宠物
- $pet = PetUser::create([
- 'user_id' => 3,
- 'name' => '测试宠物3',
- 'level' => 10,
- 'experience' => 100,
- 'stamina' => 90,
- 'status' => PetStatus::NORMAL,
- ]);
- // 验证可以通过用户ID查询到宠物
- $userPets = PetUser::where('user_id', 3)->get();
- $this->assertCount(1, $userPets);
- // 软删除宠物
- $pet->delete();
- // 验证软删除后通过用户ID查询不到宠物
- $userPetsAfterDelete = PetUser::where('user_id', 3)->get();
- $this->assertCount(0, $userPetsAfterDelete);
- // 验证使用withTrashed可以查询到
- $userPetsWithTrashed = PetUser::withTrashed()->where('user_id', 3)->get();
- $this->assertCount(1, $userPetsWithTrashed);
- }
- /**
- * 测试软删除的查询作用域
- */
- public function test_soft_delete_scopes(): void
- {
- // 创建多个测试宠物
- $pet1 = PetUser::create([
- 'user_id' => 4,
- 'name' => '正常宠物',
- 'level' => 1,
- 'experience' => 0,
- 'stamina' => 100,
- 'status' => PetStatus::NORMAL,
- ]);
- $pet2 = PetUser::create([
- 'user_id' => 4,
- 'name' => '将被删除的宠物',
- 'level' => 2,
- 'experience' => 20,
- 'stamina' => 90,
- 'status' => PetStatus::NORMAL,
- ]);
- // 软删除第二个宠物
- $pet2->delete();
- // 测试默认查询(不包含已删除)
- $normalPets = PetUser::where('user_id', 4)->get();
- $this->assertCount(1, $normalPets);
- $this->assertEquals('正常宠物', $normalPets->first()->name);
- // 测试withTrashed(包含已删除)
- $allPets = PetUser::withTrashed()->where('user_id', 4)->get();
- $this->assertCount(2, $allPets);
- // 测试onlyTrashed(只查询已删除)
- $trashedPets = PetUser::onlyTrashed()->where('user_id', 4)->get();
- $this->assertCount(1, $trashedPets);
- $this->assertEquals('将被删除的宠物', $trashedPets->first()->name);
- }
- }
|