ItemFreezeEventTest.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. <?php
  2. namespace Tests\Unit\Game;
  3. use App\Module\Game\Dtos\ItemChangeTempDto;
  4. use App\Module\Game\Logics\ItemTemp;
  5. use App\Module\GameItems\Events\ItemQuantityChanged;
  6. use Tests\TestCase;
  7. use Illuminate\Support\Facades\Cache;
  8. /**
  9. * 物品冻结事件测试
  10. *
  11. * 测试物品冻结功能通过ItemQuantityChanged事件的处理和临时数据存储机制
  12. */
  13. class ItemFreezeEventTest extends TestCase
  14. {
  15. protected function setUp(): void
  16. {
  17. parent::setUp();
  18. // 清理缓存
  19. Cache::flush();
  20. }
  21. /**
  22. * 测试带冻结状态变更的ItemQuantityChanged事件创建
  23. */
  24. public function test_item_quantity_changed_with_freeze_status()
  25. {
  26. $event = new ItemQuantityChanged(
  27. 1001,
  28. 2001,
  29. null,
  30. 100, // 旧数量
  31. 100, // 新数量(冻结时数量不变)
  32. 5001,
  33. false, // 旧冻结状态
  34. true, // 新冻结状态
  35. ['freeze_action' => 'freeze', 'reason' => 'test freeze']
  36. );
  37. $this->assertEquals(1001, $event->userId);
  38. $this->assertEquals(2001, $event->itemId);
  39. $this->assertNull($event->instanceId);
  40. $this->assertEquals(100, $event->oldQuantity);
  41. $this->assertEquals(100, $event->newQuantity);
  42. $this->assertEquals(0, $event->changeAmount); // 数量未变
  43. $this->assertEquals(5001, $event->userItemId);
  44. $this->assertFalse($event->oldFrozenStatus);
  45. $this->assertTrue($event->newFrozenStatus);
  46. $this->assertEquals(['freeze_action' => 'freeze', 'reason' => 'test freeze'], $event->options);
  47. }
  48. /**
  49. * 测试冻结状态变更临时数据存储
  50. */
  51. public function test_freeze_status_change_temp_data_storage()
  52. {
  53. // 创建带冻结状态变更的物品变更事件
  54. $event = new ItemQuantityChanged(
  55. 1004,
  56. 2004,
  57. null,
  58. 50, // 旧数量
  59. 50, // 新数量(冻结时数量不变)
  60. 5001,
  61. false, // 旧冻结状态
  62. true, // 新冻结状态
  63. ['freeze_action' => 'freeze', 'reason' => 'test freeze']
  64. );
  65. // 处理事件
  66. ItemTemp::handleItemQuantityChanged($event);
  67. // 验证临时数据被存储
  68. $tempData = ItemTemp::getUserItemChanges(1004);
  69. $this->assertCount(1, $tempData);
  70. $itemChange = reset($tempData);
  71. $this->assertInstanceOf(ItemChangeTempDto::class, $itemChange);
  72. $this->assertEquals(2004, $itemChange->itemId);
  73. $this->assertEquals(50, $itemChange->oldQuantity);
  74. $this->assertEquals(50, $itemChange->newQuantity);
  75. $this->assertEquals(5001, $itemChange->userItemId);
  76. $this->assertFalse($itemChange->oldFrozenStatus);
  77. $this->assertTrue($itemChange->newFrozenStatus);
  78. }
  79. /**
  80. * 测试单独属性物品的冻结状态变更
  81. */
  82. public function test_unique_item_freeze_status_change()
  83. {
  84. // 创建单独属性物品的冻结状态变更事件
  85. $event = new ItemQuantityChanged(
  86. 1005,
  87. 2005,
  88. 3001, // 有实例ID
  89. 1, // 旧数量(单独属性物品数量为1)
  90. 1, // 新数量(数量不变)
  91. 5002,
  92. false, // 旧冻结状态
  93. true, // 新冻结状态
  94. ['freeze_action' => 'freeze', 'reason' => 'unique item freeze']
  95. );
  96. // 处理事件
  97. ItemTemp::handleItemQuantityChanged($event);
  98. // 验证临时数据被存储
  99. $tempData = ItemTemp::getUserItemChanges(1005);
  100. $this->assertCount(1, $tempData);
  101. $itemChange = reset($tempData);
  102. $this->assertEquals(3001, $itemChange->instanceId);
  103. $this->assertFalse($itemChange->oldFrozenStatus);
  104. $this->assertTrue($itemChange->newFrozenStatus);
  105. }
  106. /**
  107. * 测试解冻状态变更
  108. */
  109. public function test_unfreeze_status_change()
  110. {
  111. // 创建解冻状态变更事件
  112. $event = new ItemQuantityChanged(
  113. 1006,
  114. 2006,
  115. null,
  116. 30, // 旧数量
  117. 30, // 新数量(解冻时数量不变)
  118. 5003,
  119. true, // 旧冻结状态:已冻结
  120. false, // 新冻结状态:未冻结
  121. ['freeze_action' => 'unfreeze', 'original_freeze_log_id' => 6001]
  122. );
  123. // 处理事件
  124. ItemTemp::handleItemQuantityChanged($event);
  125. // 验证临时数据被存储
  126. $tempData = ItemTemp::getUserItemChanges(1006);
  127. $this->assertCount(1, $tempData);
  128. $itemChange = reset($tempData);
  129. $this->assertTrue($itemChange->oldFrozenStatus);
  130. $this->assertFalse($itemChange->newFrozenStatus);
  131. $this->assertEquals(['freeze_action' => 'unfreeze', 'original_freeze_log_id' => 6001], $event->options);
  132. }
  133. /**
  134. * 测试同一物品多次冻结状态变更的数据覆盖
  135. */
  136. public function test_multiple_freeze_status_changes_override()
  137. {
  138. $userId = 1007;
  139. $itemId = 2007;
  140. // 第一次冻结
  141. $event1 = new ItemQuantityChanged(
  142. $userId,
  143. $itemId,
  144. null,
  145. 80, // 旧数量
  146. 80, // 新数量
  147. 5004,
  148. false, // 旧冻结状态
  149. true, // 新冻结状态
  150. ['freeze_action' => 'freeze', 'reason' => 'first freeze']
  151. );
  152. ItemTemp::handleItemQuantityChanged($event1);
  153. // 第二次解冻(覆盖第一次的数据)
  154. $event2 = new ItemQuantityChanged(
  155. $userId,
  156. $itemId,
  157. null,
  158. 80, // 旧数量
  159. 80, // 新数量
  160. 5004,
  161. true, // 旧冻结状态
  162. false, // 新冻结状态
  163. ['freeze_action' => 'unfreeze', 'reason' => 'unfreeze']
  164. );
  165. ItemTemp::handleItemQuantityChanged($event2);
  166. // 验证只有最新的数据被保存
  167. $tempData = ItemTemp::getUserItemChanges($userId);
  168. $this->assertCount(1, $tempData);
  169. $itemChange = reset($tempData);
  170. $this->assertTrue($itemChange->oldFrozenStatus);
  171. $this->assertFalse($itemChange->newFrozenStatus);
  172. }
  173. /**
  174. * 测试获取特定物品的变更数据
  175. */
  176. public function test_get_specific_item_change()
  177. {
  178. $userId = 1008;
  179. $itemId = 2008;
  180. // 添加物品变更数据(包含冻结状态变更)
  181. $event = new ItemQuantityChanged(
  182. $userId,
  183. $itemId,
  184. null,
  185. 60, // 旧数量
  186. 60, // 新数量
  187. 5005,
  188. false, // 旧冻结状态
  189. true, // 新冻结状态
  190. ['freeze_action' => 'freeze']
  191. );
  192. ItemTemp::handleItemQuantityChanged($event);
  193. // 获取用户的物品变更数据
  194. $itemChanges = ItemTemp::getUserItemChanges($userId);
  195. $this->assertCount(1, $itemChanges);
  196. $itemChange = reset($itemChanges);
  197. $this->assertEquals($itemId, $itemChange->itemId);
  198. $this->assertFalse($itemChange->oldFrozenStatus);
  199. $this->assertTrue($itemChange->newFrozenStatus);
  200. }
  201. /**
  202. * 测试清理物品变更临时数据
  203. */
  204. public function test_clear_item_change_temp_data()
  205. {
  206. $userId = 1009;
  207. // 先添加一些临时数据
  208. $event = new ItemQuantityChanged(
  209. $userId,
  210. 2009,
  211. null,
  212. 40, // 旧数量
  213. 40, // 新数量
  214. 5006,
  215. false, // 旧冻结状态
  216. true, // 新冻结状态
  217. ['freeze_action' => 'freeze']
  218. );
  219. ItemTemp::handleItemQuantityChanged($event);
  220. // 验证数据存在
  221. $tempData = ItemTemp::getUserItemChanges($userId);
  222. $this->assertCount(1, $tempData);
  223. // 清理数据
  224. ItemTemp::clearUserItemChanges($userId);
  225. // 验证数据被清理
  226. $tempData = ItemTemp::getUserItemChanges($userId);
  227. $this->assertCount(0, $tempData);
  228. }
  229. /**
  230. * 测试ItemChangeTempDto的冻结状态字段
  231. */
  232. public function test_item_change_temp_dto_with_freeze_status()
  233. {
  234. $data = [
  235. 'item_id' => 2010,
  236. 'instance_id' => null,
  237. 'old_quantity' => 100,
  238. 'new_quantity' => 100,
  239. 'change_amount' => 0,
  240. 'user_item_id' => 5007,
  241. 'old_frozen_status' => false,
  242. 'new_frozen_status' => true,
  243. 'updated_at' => time(),
  244. ];
  245. $dto = ItemChangeTempDto::fromArray($data);
  246. $this->assertEquals(2010, $dto->itemId);
  247. $this->assertNull($dto->instanceId);
  248. $this->assertEquals(100, $dto->oldQuantity);
  249. $this->assertEquals(100, $dto->newQuantity);
  250. $this->assertEquals(0, $dto->changeAmount);
  251. $this->assertEquals(5007, $dto->userItemId);
  252. $this->assertFalse($dto->oldFrozenStatus);
  253. $this->assertTrue($dto->newFrozenStatus);
  254. $arrayData = $dto->toArray();
  255. $this->assertEquals($data['item_id'], $arrayData['item_id']);
  256. $this->assertEquals($data['old_frozen_status'], $arrayData['old_frozen_status']);
  257. $this->assertEquals($data['new_frozen_status'], $arrayData['new_frozen_status']);
  258. }
  259. protected function tearDown(): void
  260. {
  261. // 清理缓存
  262. Cache::flush();
  263. parent::tearDown();
  264. }
  265. }