test_unfreeze_exceptions.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <?php
  2. /**
  3. * 手动测试脚本:验证解冻异常抛出
  4. *
  5. * 测试解冻失败时是否正确抛出异常
  6. */
  7. require_once __DIR__ . '/../vendor/autoload.php';
  8. use App\Module\GameItems\Services\ItemService;
  9. use App\Module\GameItems\Enums\FREEZE_REASON_TYPE;
  10. use Illuminate\Support\Facades\DB;
  11. // 启动Laravel应用
  12. $app = require_once __DIR__ . '/../bootstrap/app.php';
  13. $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
  14. echo "=== 物品解冻异常抛出测试 ===\n\n";
  15. try {
  16. DB::beginTransaction();
  17. $userId = 1001;
  18. $itemId = 1;
  19. echo "1. 测试不存在的冻结日志\n";
  20. try {
  21. $unfreezeResult = ItemService::unfreezeItem(99999);
  22. echo " ❌ 意外成功\n";
  23. } catch (Exception $e) {
  24. echo " ✅ 预期异常: " . $e->getMessage() . "\n";
  25. }
  26. echo "\n2. 准备测试数据\n";
  27. // 添加物品
  28. $addResult = ItemService::addItem($userId, $itemId, 50);
  29. echo " 添加物品成功\n";
  30. // 冻结物品
  31. $freezeResult = ItemService::freezeItem(
  32. $userId,
  33. $itemId,
  34. null,
  35. 30,
  36. FREEZE_REASON_TYPE::TRADE_ORDER->value,
  37. [
  38. 'source_id' => 12345,
  39. 'source_type' => 'test_order',
  40. 'operator_id' => 1
  41. ]
  42. );
  43. $freezeLogId = $freezeResult['frozen_items'][0]['freeze_log_id'];
  44. echo " 冻结成功,日志ID: {$freezeLogId}\n";
  45. echo "\n3. 测试部分消耗后数量不足的解冻异常\n";
  46. // 部分消耗冻结物品
  47. ItemService::consumeItem($userId, $itemId, null, 20, ['include_frozen' => true, 'source_type' => 'test_consume', 'source_id' => 67890]);
  48. echo " 消耗20个冻结物品成功\n";
  49. // 消耗大部分可用物品,使其不足以补足
  50. ItemService::consumeItem($userId, $itemId, null, 15, ['include_frozen' => false, 'source_type' => 'test_consume_available', 'source_id' => 67891]);
  51. echo " 消耗15个可用物品成功\n";
  52. // 现在状态:冻结10个(30-20),可用5个(20-15)
  53. // 解冻需要补足20个,但只有5个可用
  54. // 测试原始解冻方法异常
  55. echo " 测试原始解冻方法:\n";
  56. try {
  57. $unfreezeResult = ItemService::unfreezeItem($freezeLogId);
  58. echo " ❌ 意外成功\n";
  59. } catch (Exception $e) {
  60. echo " ✅ 预期异常: " . $e->getMessage() . "\n";
  61. }
  62. // 测试安全解冻方法异常
  63. echo " 测试安全解冻方法:\n";
  64. try {
  65. $safeUnfreezeResult = ItemService::safeUnfreezeItem($freezeLogId);
  66. echo " ❌ 意外成功\n";
  67. } catch (Exception $e) {
  68. echo " ✅ 预期异常: " . $e->getMessage() . "\n";
  69. }
  70. echo "\n4. 测试完全消耗后的解冻异常\n";
  71. // 完全消耗冻结物品
  72. ItemService::consumeItem($userId, $itemId, null, 10, ['include_frozen' => true, 'source_type' => 'test_consume_all_frozen', 'source_id' => 67892]);
  73. echo " 完全消耗冻结物品成功\n";
  74. // 测试原始解冻方法(完全消耗后)
  75. echo " 测试原始解冻方法(完全消耗后):\n";
  76. try {
  77. $unfreezeResult2 = ItemService::unfreezeItem($freezeLogId);
  78. echo " ❌ 意外成功\n";
  79. } catch (Exception $e) {
  80. echo " ✅ 预期异常: " . $e->getMessage() . "\n";
  81. }
  82. // 测试安全解冻方法(完全消耗后)
  83. echo " 测试安全解冻方法(完全消耗后):\n";
  84. try {
  85. $safeUnfreezeResult2 = ItemService::safeUnfreezeItem($freezeLogId);
  86. echo " ❌ 意外成功\n";
  87. } catch (Exception $e) {
  88. echo " ✅ 预期异常: " . $e->getMessage() . "\n";
  89. }
  90. echo "\n5. 测试冻结物品不存在的异常\n";
  91. // 手动删除冻结物品记录来模拟数据不一致
  92. DB::table('item_users')->where('frozen_log_id', $freezeLogId)->where('is_frozen', true)->delete();
  93. echo " 手动删除冻结物品记录\n";
  94. // 测试原始解冻方法(冻结物品不存在)
  95. echo " 测试原始解冻方法(冻结物品不存在):\n";
  96. try {
  97. $unfreezeResult3 = ItemService::unfreezeItem($freezeLogId);
  98. echo " ❌ 意外成功\n";
  99. } catch (Exception $e) {
  100. echo " ✅ 预期异常: " . $e->getMessage() . "\n";
  101. }
  102. // 测试安全解冻方法(冻结物品不存在)
  103. echo " 测试安全解冻方法(冻结物品不存在):\n";
  104. try {
  105. $safeUnfreezeResult3 = ItemService::safeUnfreezeItem($freezeLogId);
  106. echo " ❌ 意外成功\n";
  107. } catch (Exception $e) {
  108. echo " ✅ 预期异常: " . $e->getMessage() . "\n";
  109. }
  110. echo "\n=== 测试完成 ===\n";
  111. echo "所有异常情况都正确抛出异常,不再返回false状态\n";
  112. DB::rollback();
  113. echo "已回滚测试数据\n";
  114. } catch (Exception $e) {
  115. DB::rollback();
  116. echo "测试失败: " . $e->getMessage() . "\n";
  117. }