|
|
@@ -0,0 +1,211 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Module\Pet\Tests;
|
|
|
+
|
|
|
+use App\Module\Pet\Models\PetUser;
|
|
|
+use App\Module\Pet\Enums\PetGrade;
|
|
|
+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' => '测试宠物',
|
|
|
+ 'grade' => PetGrade::FIRST,
|
|
|
+ 'level' => 1,
|
|
|
+ 'experience' => 0,
|
|
|
+ 'stamina' => 100,
|
|
|
+ 'max_experience' => 100,
|
|
|
+ 'max_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',
|
|
|
+ 'grade' => PetGrade::SECOND,
|
|
|
+ 'level' => 5,
|
|
|
+ 'experience' => 50,
|
|
|
+ 'stamina' => 80,
|
|
|
+ 'max_experience' => 200,
|
|
|
+ 'max_stamina' => 100,
|
|
|
+ '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',
|
|
|
+ 'grade' => PetGrade::THIRD,
|
|
|
+ 'level' => 10,
|
|
|
+ 'experience' => 100,
|
|
|
+ 'stamina' => 90,
|
|
|
+ 'max_experience' => 300,
|
|
|
+ 'max_stamina' => 100,
|
|
|
+ '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' => '正常宠物',
|
|
|
+ 'grade' => PetGrade::FIRST,
|
|
|
+ 'level' => 1,
|
|
|
+ 'experience' => 0,
|
|
|
+ 'stamina' => 100,
|
|
|
+ 'max_experience' => 100,
|
|
|
+ 'max_stamina' => 100,
|
|
|
+ 'status' => PetStatus::NORMAL,
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $pet2 = PetUser::create([
|
|
|
+ 'user_id' => 4,
|
|
|
+ 'name' => '将被删除的宠物',
|
|
|
+ 'grade' => PetGrade::SECOND,
|
|
|
+ 'level' => 2,
|
|
|
+ 'experience' => 20,
|
|
|
+ 'stamina' => 90,
|
|
|
+ 'max_experience' => 150,
|
|
|
+ 'max_stamina' => 100,
|
|
|
+ '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);
|
|
|
+ }
|
|
|
+}
|