ItemFreezeLastDataSyncTest.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <?php
  2. namespace Tests\Unit\Game;
  3. use App\Module\Game\Dtos\ItemFreezeChangeTempDto;
  4. use App\Module\Game\Logics\ItemFreezeTemp;
  5. use App\Module\GameItems\Events\ItemFreezeStatusChanged;
  6. use App\Module\GameItems\Logics\ItemFreeze;
  7. use App\Module\GameItems\Models\ItemUser;
  8. use App\Module\GameItems\Services\ItemService;
  9. use App\Module\GameItems\Enums\FREEZE_REASON_TYPE;
  10. use Illuminate\Foundation\Testing\RefreshDatabase;
  11. use Illuminate\Support\Facades\Event;
  12. use Tests\TestCase;
  13. use UCore\Helper\Cache;
  14. /**
  15. * 物品冻结LastData同步测试
  16. *
  17. * 测试物品冻结功能的lastdata同步机制是否正常工作
  18. */
  19. class ItemFreezeLastDataSyncTest extends TestCase
  20. {
  21. use RefreshDatabase;
  22. protected function setUp(): void
  23. {
  24. parent::setUp();
  25. // 启用事件监听
  26. Event::fake([
  27. ItemFreezeStatusChanged::class,
  28. ]);
  29. }
  30. /**
  31. * 测试冻结统一属性物品时触发事件
  32. */
  33. public function test_freeze_normal_item_triggers_event()
  34. {
  35. // 准备测试数据
  36. $userId = 1001;
  37. $itemId = 2001;
  38. $quantity = 100;
  39. // 创建用户物品记录
  40. $userItem = ItemUser::create([
  41. 'user_id' => $userId,
  42. 'item_id' => $itemId,
  43. 'instance_id' => null,
  44. 'quantity' => 200,
  45. 'is_frozen' => false,
  46. ]);
  47. // 执行冻结操作
  48. \DB::transaction(function () use ($userId, $itemId, $quantity) {
  49. $result = ItemFreeze::freezeNormalItem(
  50. $userId,
  51. $itemId,
  52. $quantity,
  53. FREEZE_REASON_TYPE::TRADE_ORDER,
  54. 12345,
  55. 'test_order',
  56. null
  57. );
  58. $this->assertTrue($result['success']);
  59. $this->assertEquals($quantity, $result['frozen_quantity']);
  60. });
  61. // 验证事件被触发
  62. Event::assertDispatched(ItemFreezeStatusChanged::class, function ($event) use ($userId, $itemId) {
  63. return $event->userId === $userId
  64. && $event->itemId === $itemId
  65. && $event->instanceId === null
  66. && $event->oldFrozenStatus === false
  67. && $event->newFrozenStatus === true
  68. && $event->action === 'freeze';
  69. });
  70. }
  71. /**
  72. * 测试冻结单独属性物品时触发事件
  73. */
  74. public function test_freeze_unique_item_triggers_event()
  75. {
  76. // 准备测试数据
  77. $userId = 1002;
  78. $itemId = 2002;
  79. $instanceId = 3001;
  80. // 创建用户物品记录
  81. $userItem = ItemUser::create([
  82. 'user_id' => $userId,
  83. 'item_id' => $itemId,
  84. 'instance_id' => $instanceId,
  85. 'quantity' => 1,
  86. 'is_frozen' => false,
  87. ]);
  88. // 执行冻结操作
  89. \DB::transaction(function () use ($userId, $itemId, $instanceId) {
  90. $result = ItemFreeze::freezeUniqueItem(
  91. $userId,
  92. $itemId,
  93. $instanceId,
  94. FREEZE_REASON_TYPE::ADMIN_FREEZE,
  95. null,
  96. null,
  97. 1
  98. );
  99. $this->assertTrue($result['success']);
  100. });
  101. // 验证事件被触发
  102. Event::assertDispatched(ItemFreezeStatusChanged::class, function ($event) use ($userId, $itemId, $instanceId) {
  103. return $event->userId === $userId
  104. && $event->itemId === $itemId
  105. && $event->instanceId === $instanceId
  106. && $event->oldFrozenStatus === false
  107. && $event->newFrozenStatus === true
  108. && $event->action === 'freeze';
  109. });
  110. }
  111. /**
  112. * 测试解冻物品时触发事件
  113. */
  114. public function test_unfreeze_item_triggers_event()
  115. {
  116. // 准备测试数据
  117. $userId = 1003;
  118. $itemId = 2003;
  119. // 先创建冻结的物品
  120. $userItem = ItemUser::create([
  121. 'user_id' => $userId,
  122. 'item_id' => $itemId,
  123. 'instance_id' => null,
  124. 'quantity' => 50,
  125. 'is_frozen' => true,
  126. 'frozen_log_id' => 1, // 假设的冻结日志ID
  127. ]);
  128. // 模拟冻结日志
  129. $freezeLog = \App\Module\GameItems\Models\ItemFreezeLog::create([
  130. 'user_id' => $userId,
  131. 'item_id' => $itemId,
  132. 'instance_id' => null,
  133. 'quantity' => 50,
  134. 'action' => 'freeze',
  135. 'reason' => 'test freeze',
  136. 'source_id' => null,
  137. 'source_type' => null,
  138. 'operator_id' => null,
  139. ]);
  140. $userItem->frozen_log_id = $freezeLog->id;
  141. $userItem->save();
  142. // 执行解冻操作
  143. \DB::transaction(function () use ($freezeLog) {
  144. $result = ItemFreeze::unfreezeByLogId($freezeLog->id);
  145. $this->assertTrue($result['success']);
  146. });
  147. // 验证事件被触发
  148. Event::assertDispatched(ItemFreezeStatusChanged::class, function ($event) use ($userId, $itemId) {
  149. return $event->userId === $userId
  150. && $event->itemId === $itemId
  151. && $event->instanceId === null
  152. && $event->oldFrozenStatus === true
  153. && $event->newFrozenStatus === false
  154. && $event->action === 'unfreeze';
  155. });
  156. }
  157. /**
  158. * 测试冻结状态变更临时数据存储
  159. */
  160. public function test_freeze_status_change_temp_data_storage()
  161. {
  162. // 创建冻结状态变更事件
  163. $event = new ItemFreezeStatusChanged(
  164. 1004,
  165. 2004,
  166. null,
  167. 5001,
  168. false,
  169. true,
  170. 'freeze',
  171. 6001,
  172. ['reason' => 'test freeze']
  173. );
  174. // 处理事件
  175. ItemFreezeTemp::handleItemFreezeStatusChanged($event);
  176. // 验证临时数据被存储
  177. $tempData = ItemFreezeTemp::getUserFreezeChanges(1004);
  178. $this->assertCount(1, $tempData);
  179. $freezeChange = reset($tempData);
  180. $this->assertInstanceOf(ItemFreezeChangeTempDto::class, $freezeChange);
  181. $this->assertEquals(1004, $freezeChange->userId);
  182. $this->assertEquals(2004, $freezeChange->itemId);
  183. $this->assertEquals(5001, $freezeChange->userItemId);
  184. $this->assertFalse($freezeChange->oldFrozenStatus);
  185. $this->assertTrue($freezeChange->newFrozenStatus);
  186. $this->assertEquals('freeze', $freezeChange->action);
  187. }
  188. /**
  189. * 测试清理冻结状态变更临时数据
  190. */
  191. public function test_clear_freeze_status_change_temp_data()
  192. {
  193. $userId = 1005;
  194. // 先添加一些临时数据
  195. $event = new ItemFreezeStatusChanged(
  196. $userId,
  197. 2005,
  198. null,
  199. 5002,
  200. false,
  201. true,
  202. 'freeze',
  203. 6002,
  204. []
  205. );
  206. ItemFreezeTemp::handleItemFreezeStatusChanged($event);
  207. // 验证数据存在
  208. $tempData = ItemFreezeTemp::getUserFreezeChanges($userId);
  209. $this->assertCount(1, $tempData);
  210. // 清理数据
  211. ItemFreezeTemp::clearUserFreezeChanges($userId);
  212. // 验证数据被清理
  213. $tempData = ItemFreezeTemp::getUserFreezeChanges($userId);
  214. $this->assertCount(0, $tempData);
  215. }
  216. protected function tearDown(): void
  217. {
  218. // 清理缓存
  219. Cache::flush();
  220. parent::tearDown();
  221. }
  222. }