'freeze', 'reason' => 'test freeze'] ); $this->assertEquals(1001, $event->userId); $this->assertEquals(2001, $event->itemId); $this->assertNull($event->instanceId); $this->assertEquals(100, $event->oldQuantity); $this->assertEquals(100, $event->newQuantity); $this->assertEquals(0, $event->changeAmount); // 数量未变 $this->assertEquals(5001, $event->userItemId); $this->assertFalse($event->oldFrozenStatus); $this->assertTrue($event->newFrozenStatus); $this->assertEquals(['freeze_action' => 'freeze', 'reason' => 'test freeze'], $event->options); } /** * 测试冻结状态变更临时数据存储 */ public function test_freeze_status_change_temp_data_storage() { // 创建带冻结状态变更的物品变更事件 $event = new ItemQuantityChanged( 1004, 2004, null, 50, // 旧数量 50, // 新数量(冻结时数量不变) 5001, false, // 旧冻结状态 true, // 新冻结状态 ['freeze_action' => 'freeze', 'reason' => 'test freeze'] ); // 处理事件 ItemTemp::handleItemQuantityChanged($event); // 验证临时数据被存储 $tempData = ItemTemp::getUserItemChanges(1004); $this->assertCount(1, $tempData); $itemChange = reset($tempData); $this->assertInstanceOf(ItemChangeTempDto::class, $itemChange); $this->assertEquals(2004, $itemChange->itemId); $this->assertEquals(50, $itemChange->oldQuantity); $this->assertEquals(50, $itemChange->newQuantity); $this->assertEquals(5001, $itemChange->userItemId); $this->assertFalse($itemChange->oldFrozenStatus); $this->assertTrue($itemChange->newFrozenStatus); } /** * 测试单独属性物品的冻结状态变更 */ public function test_unique_item_freeze_status_change() { // 创建单独属性物品的冻结状态变更事件 $event = new ItemQuantityChanged( 1005, 2005, 3001, // 有实例ID 1, // 旧数量(单独属性物品数量为1) 1, // 新数量(数量不变) 5002, false, // 旧冻结状态 true, // 新冻结状态 ['freeze_action' => 'freeze', 'reason' => 'unique item freeze'] ); // 处理事件 ItemTemp::handleItemQuantityChanged($event); // 验证临时数据被存储 $tempData = ItemTemp::getUserItemChanges(1005); $this->assertCount(1, $tempData); $itemChange = reset($tempData); $this->assertEquals(3001, $itemChange->instanceId); $this->assertFalse($itemChange->oldFrozenStatus); $this->assertTrue($itemChange->newFrozenStatus); } /** * 测试解冻状态变更 */ public function test_unfreeze_status_change() { // 创建解冻状态变更事件 $event = new ItemQuantityChanged( 1006, 2006, null, 30, // 旧数量 30, // 新数量(解冻时数量不变) 5003, true, // 旧冻结状态:已冻结 false, // 新冻结状态:未冻结 ['freeze_action' => 'unfreeze', 'original_freeze_log_id' => 6001] ); // 处理事件 ItemTemp::handleItemQuantityChanged($event); // 验证临时数据被存储 $tempData = ItemTemp::getUserItemChanges(1006); $this->assertCount(1, $tempData); $itemChange = reset($tempData); $this->assertTrue($itemChange->oldFrozenStatus); $this->assertFalse($itemChange->newFrozenStatus); $this->assertEquals(['freeze_action' => 'unfreeze', 'original_freeze_log_id' => 6001], $event->options); } /** * 测试同一物品多次冻结状态变更的数据覆盖 */ public function test_multiple_freeze_status_changes_override() { $userId = 1007; $itemId = 2007; // 第一次冻结 $event1 = new ItemQuantityChanged( $userId, $itemId, null, 80, // 旧数量 80, // 新数量 5004, false, // 旧冻结状态 true, // 新冻结状态 ['freeze_action' => 'freeze', 'reason' => 'first freeze'] ); ItemTemp::handleItemQuantityChanged($event1); // 第二次解冻(覆盖第一次的数据) $event2 = new ItemQuantityChanged( $userId, $itemId, null, 80, // 旧数量 80, // 新数量 5004, true, // 旧冻结状态 false, // 新冻结状态 ['freeze_action' => 'unfreeze', 'reason' => 'unfreeze'] ); ItemTemp::handleItemQuantityChanged($event2); // 验证只有最新的数据被保存 $tempData = ItemTemp::getUserItemChanges($userId); $this->assertCount(1, $tempData); $itemChange = reset($tempData); $this->assertTrue($itemChange->oldFrozenStatus); $this->assertFalse($itemChange->newFrozenStatus); } /** * 测试获取特定物品的变更数据 */ public function test_get_specific_item_change() { $userId = 1008; $itemId = 2008; // 添加物品变更数据(包含冻结状态变更) $event = new ItemQuantityChanged( $userId, $itemId, null, 60, // 旧数量 60, // 新数量 5005, false, // 旧冻结状态 true, // 新冻结状态 ['freeze_action' => 'freeze'] ); ItemTemp::handleItemQuantityChanged($event); // 获取用户的物品变更数据 $itemChanges = ItemTemp::getUserItemChanges($userId); $this->assertCount(1, $itemChanges); $itemChange = reset($itemChanges); $this->assertEquals($itemId, $itemChange->itemId); $this->assertFalse($itemChange->oldFrozenStatus); $this->assertTrue($itemChange->newFrozenStatus); } /** * 测试清理物品变更临时数据 */ public function test_clear_item_change_temp_data() { $userId = 1009; // 先添加一些临时数据 $event = new ItemQuantityChanged( $userId, 2009, null, 40, // 旧数量 40, // 新数量 5006, false, // 旧冻结状态 true, // 新冻结状态 ['freeze_action' => 'freeze'] ); ItemTemp::handleItemQuantityChanged($event); // 验证数据存在 $tempData = ItemTemp::getUserItemChanges($userId); $this->assertCount(1, $tempData); // 清理数据 ItemTemp::clearUserItemChanges($userId); // 验证数据被清理 $tempData = ItemTemp::getUserItemChanges($userId); $this->assertCount(0, $tempData); } /** * 测试ItemChangeTempDto的冻结状态字段 */ public function test_item_change_temp_dto_with_freeze_status() { $data = [ 'item_id' => 2010, 'instance_id' => null, 'old_quantity' => 100, 'new_quantity' => 100, 'change_amount' => 0, 'user_item_id' => 5007, 'old_frozen_status' => false, 'new_frozen_status' => true, 'updated_at' => time(), ]; $dto = ItemChangeTempDto::fromArray($data); $this->assertEquals(2010, $dto->itemId); $this->assertNull($dto->instanceId); $this->assertEquals(100, $dto->oldQuantity); $this->assertEquals(100, $dto->newQuantity); $this->assertEquals(0, $dto->changeAmount); $this->assertEquals(5007, $dto->userItemId); $this->assertFalse($dto->oldFrozenStatus); $this->assertTrue($dto->newFrozenStatus); $arrayData = $dto->toArray(); $this->assertEquals($data['item_id'], $arrayData['item_id']); $this->assertEquals($data['old_frozen_status'], $arrayData['old_frozen_status']); $this->assertEquals($data['new_frozen_status'], $arrayData['new_frozen_status']); } protected function tearDown(): void { // 清理缓存 Cache::flush(); parent::tearDown(); } }