$userId, 'item_id' => $itemId, 'instance_id' => null, 'quantity' => 200, 'is_frozen' => false, ]); // 执行冻结操作 \DB::transaction(function () use ($userId, $itemId, $quantity) { $result = ItemFreeze::freezeNormalItem( $userId, $itemId, $quantity, FREEZE_REASON_TYPE::TRADE_ORDER, 12345, 'test_order', null ); $this->assertTrue($result['success']); $this->assertEquals($quantity, $result['frozen_quantity']); }); // 验证事件被触发 Event::assertDispatched(ItemFreezeStatusChanged::class, function ($event) use ($userId, $itemId) { return $event->userId === $userId && $event->itemId === $itemId && $event->instanceId === null && $event->oldFrozenStatus === false && $event->newFrozenStatus === true && $event->action === 'freeze'; }); } /** * 测试冻结单独属性物品时触发事件 */ public function test_freeze_unique_item_triggers_event() { // 准备测试数据 $userId = 1002; $itemId = 2002; $instanceId = 3001; // 创建用户物品记录 $userItem = ItemUser::create([ 'user_id' => $userId, 'item_id' => $itemId, 'instance_id' => $instanceId, 'quantity' => 1, 'is_frozen' => false, ]); // 执行冻结操作 \DB::transaction(function () use ($userId, $itemId, $instanceId) { $result = ItemFreeze::freezeUniqueItem( $userId, $itemId, $instanceId, FREEZE_REASON_TYPE::ADMIN_FREEZE, null, null, 1 ); $this->assertTrue($result['success']); }); // 验证事件被触发 Event::assertDispatched(ItemFreezeStatusChanged::class, function ($event) use ($userId, $itemId, $instanceId) { return $event->userId === $userId && $event->itemId === $itemId && $event->instanceId === $instanceId && $event->oldFrozenStatus === false && $event->newFrozenStatus === true && $event->action === 'freeze'; }); } /** * 测试解冻物品时触发事件 */ public function test_unfreeze_item_triggers_event() { // 准备测试数据 $userId = 1003; $itemId = 2003; // 先创建冻结的物品 $userItem = ItemUser::create([ 'user_id' => $userId, 'item_id' => $itemId, 'instance_id' => null, 'quantity' => 50, 'is_frozen' => true, 'frozen_log_id' => 1, // 假设的冻结日志ID ]); // 模拟冻结日志 $freezeLog = \App\Module\GameItems\Models\ItemFreezeLog::create([ 'user_id' => $userId, 'item_id' => $itemId, 'instance_id' => null, 'quantity' => 50, 'action' => 'freeze', 'reason' => 'test freeze', 'source_id' => null, 'source_type' => null, 'operator_id' => null, ]); $userItem->frozen_log_id = $freezeLog->id; $userItem->save(); // 执行解冻操作 \DB::transaction(function () use ($freezeLog) { $result = ItemFreeze::unfreezeByLogId($freezeLog->id); $this->assertTrue($result['success']); }); // 验证事件被触发 Event::assertDispatched(ItemFreezeStatusChanged::class, function ($event) use ($userId, $itemId) { return $event->userId === $userId && $event->itemId === $itemId && $event->instanceId === null && $event->oldFrozenStatus === true && $event->newFrozenStatus === false && $event->action === 'unfreeze'; }); } /** * 测试冻结状态变更临时数据存储 */ public function test_freeze_status_change_temp_data_storage() { // 创建冻结状态变更事件 $event = new ItemFreezeStatusChanged( 1004, 2004, null, 5001, false, true, 'freeze', 6001, ['reason' => 'test freeze'] ); // 处理事件 ItemFreezeTemp::handleItemFreezeStatusChanged($event); // 验证临时数据被存储 $tempData = ItemFreezeTemp::getUserFreezeChanges(1004); $this->assertCount(1, $tempData); $freezeChange = reset($tempData); $this->assertInstanceOf(ItemFreezeChangeTempDto::class, $freezeChange); $this->assertEquals(1004, $freezeChange->userId); $this->assertEquals(2004, $freezeChange->itemId); $this->assertEquals(5001, $freezeChange->userItemId); $this->assertFalse($freezeChange->oldFrozenStatus); $this->assertTrue($freezeChange->newFrozenStatus); $this->assertEquals('freeze', $freezeChange->action); } /** * 测试清理冻结状态变更临时数据 */ public function test_clear_freeze_status_change_temp_data() { $userId = 1005; // 先添加一些临时数据 $event = new ItemFreezeStatusChanged( $userId, 2005, null, 5002, false, true, 'freeze', 6002, [] ); ItemFreezeTemp::handleItemFreezeStatusChanged($event); // 验证数据存在 $tempData = ItemFreezeTemp::getUserFreezeChanges($userId); $this->assertCount(1, $tempData); // 清理数据 ItemFreezeTemp::clearUserFreezeChanges($userId); // 验证数据被清理 $tempData = ItemFreezeTemp::getUserFreezeChanges($userId); $this->assertCount(0, $tempData); } protected function tearDown(): void { // 清理缓存 Cache::flush(); parent::tearDown(); } }