|
|
@@ -0,0 +1,301 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace Tests\Unit\Game;
|
|
|
+
|
|
|
+use App\Module\Game\Dtos\ItemChangeTempDto;
|
|
|
+use App\Module\Game\Logics\ItemTemp;
|
|
|
+use App\Module\GameItems\Events\ItemQuantityChanged;
|
|
|
+use Tests\TestCase;
|
|
|
+use Illuminate\Support\Facades\Cache;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 物品冻结事件测试
|
|
|
+ *
|
|
|
+ * 测试物品冻结功能通过ItemQuantityChanged事件的处理和临时数据存储机制
|
|
|
+ */
|
|
|
+class ItemFreezeEventTest extends TestCase
|
|
|
+{
|
|
|
+ protected function setUp(): void
|
|
|
+ {
|
|
|
+ parent::setUp();
|
|
|
+
|
|
|
+ // 清理缓存
|
|
|
+ Cache::flush();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 测试带冻结状态变更的ItemQuantityChanged事件创建
|
|
|
+ */
|
|
|
+ public function test_item_quantity_changed_with_freeze_status()
|
|
|
+ {
|
|
|
+ $event = new ItemQuantityChanged(
|
|
|
+ 1001,
|
|
|
+ 2001,
|
|
|
+ null,
|
|
|
+ 100, // 旧数量
|
|
|
+ 100, // 新数量(冻结时数量不变)
|
|
|
+ 5001,
|
|
|
+ false, // 旧冻结状态
|
|
|
+ true, // 新冻结状态
|
|
|
+ ['freeze_action' => '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_freeze_status_change_temp_data()
|
|
|
+ {
|
|
|
+ $userId = 1009;
|
|
|
+
|
|
|
+ // 先添加一些临时数据
|
|
|
+ $event = new ItemFreezeStatusChanged(
|
|
|
+ $userId,
|
|
|
+ 2009,
|
|
|
+ null,
|
|
|
+ 5006,
|
|
|
+ false,
|
|
|
+ true,
|
|
|
+ 'freeze',
|
|
|
+ 6007,
|
|
|
+ []
|
|
|
+ );
|
|
|
+ ItemFreezeTemp::handleItemFreezeStatusChanged($event);
|
|
|
+
|
|
|
+ // 验证数据存在
|
|
|
+ $tempData = ItemFreezeTemp::getUserFreezeChanges($userId);
|
|
|
+ $this->assertCount(1, $tempData);
|
|
|
+
|
|
|
+ // 清理数据
|
|
|
+ ItemFreezeTemp::clearUserFreezeChanges($userId);
|
|
|
+
|
|
|
+ // 验证数据被清理
|
|
|
+ $tempData = ItemFreezeTemp::getUserFreezeChanges($userId);
|
|
|
+ $this->assertCount(0, $tempData);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 测试ItemFreezeChangeTempDto的数组转换
|
|
|
+ */
|
|
|
+ public function test_item_freeze_change_temp_dto_array_conversion()
|
|
|
+ {
|
|
|
+ $data = [
|
|
|
+ 'user_id' => 1010,
|
|
|
+ 'item_id' => 2010,
|
|
|
+ 'instance_id' => null,
|
|
|
+ 'user_item_id' => 5007,
|
|
|
+ 'old_frozen_status' => false,
|
|
|
+ 'new_frozen_status' => true,
|
|
|
+ 'action' => 'freeze',
|
|
|
+ 'freeze_log_id' => 6008,
|
|
|
+ 'options' => ['test' => 'value'],
|
|
|
+ 'updated_at' => time(),
|
|
|
+ ];
|
|
|
+
|
|
|
+ $dto = ItemFreezeChangeTempDto::fromArray($data);
|
|
|
+ $this->assertEquals(1010, $dto->userId);
|
|
|
+ $this->assertEquals(2010, $dto->itemId);
|
|
|
+ $this->assertNull($dto->instanceId);
|
|
|
+ $this->assertEquals(5007, $dto->userItemId);
|
|
|
+ $this->assertFalse($dto->oldFrozenStatus);
|
|
|
+ $this->assertTrue($dto->newFrozenStatus);
|
|
|
+ $this->assertEquals('freeze', $dto->action);
|
|
|
+
|
|
|
+ $arrayData = $dto->toArray();
|
|
|
+ $this->assertEquals($data['user_id'], $arrayData['user_id']);
|
|
|
+ $this->assertEquals($data['item_id'], $arrayData['item_id']);
|
|
|
+ $this->assertEquals($data['action'], $arrayData['action']);
|
|
|
+ }
|
|
|
+
|
|
|
+ protected function tearDown(): void
|
|
|
+ {
|
|
|
+ // 清理缓存
|
|
|
+ Cache::flush();
|
|
|
+ parent::tearDown();
|
|
|
+ }
|
|
|
+}
|