| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- <?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_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();
- }
- }
|