|
|
@@ -0,0 +1,205 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+/**
|
|
|
+ * 手动测试物品消耗冻结功能
|
|
|
+ *
|
|
|
+ * 使用方法:php tests/manual_test_item_consume_frozen.php
|
|
|
+ */
|
|
|
+
|
|
|
+require_once __DIR__ . '/../vendor/autoload.php';
|
|
|
+
|
|
|
+use App\Module\GameItems\Services\ItemService;
|
|
|
+use App\Module\GameItems\Models\ItemUser;
|
|
|
+use Illuminate\Support\Facades\DB;
|
|
|
+
|
|
|
+// 启动Laravel应用
|
|
|
+$app = require_once __DIR__ . '/../bootstrap/app.php';
|
|
|
+$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
|
|
|
+$kernel->bootstrap();
|
|
|
+
|
|
|
+echo "=== 物品消耗冻结功能测试 ===\n";
|
|
|
+
|
|
|
+$testUserId = 99999;
|
|
|
+$testItemId = 1001;
|
|
|
+
|
|
|
+try {
|
|
|
+ // 清理测试数据
|
|
|
+ DB::transaction(function () use ($testUserId, $testItemId) {
|
|
|
+ ItemUser::where('user_id', $testUserId)->where('item_id', $testItemId)->delete();
|
|
|
+
|
|
|
+ // 创建测试数据
|
|
|
+ echo "创建测试数据...\n";
|
|
|
+
|
|
|
+ // 添加100个未冻结物品
|
|
|
+ ItemUser::create([
|
|
|
+ 'user_id' => $testUserId,
|
|
|
+ 'item_id' => $testItemId,
|
|
|
+ 'instance_id' => null,
|
|
|
+ 'quantity' => 100,
|
|
|
+ 'is_frozen' => false,
|
|
|
+ 'frozen_log_id' => null,
|
|
|
+ ]);
|
|
|
+
|
|
|
+ // 添加50个冻结物品
|
|
|
+ ItemUser::create([
|
|
|
+ 'user_id' => $testUserId,
|
|
|
+ 'item_id' => $testItemId,
|
|
|
+ 'instance_id' => null,
|
|
|
+ 'quantity' => 50,
|
|
|
+ 'is_frozen' => true,
|
|
|
+ 'frozen_log_id' => 999, // 假设的冻结日志ID
|
|
|
+ ]);
|
|
|
+
|
|
|
+ echo "测试数据创建完成:100个未冻结 + 50个冻结 = 150个总数\n\n";
|
|
|
+ });
|
|
|
+
|
|
|
+ // 测试1:不包含冻结物品的消耗(默认行为)
|
|
|
+ echo "=== 测试1:不包含冻结物品的消耗 ===\n";
|
|
|
+ DB::transaction(function () use ($testUserId, $testItemId) {
|
|
|
+ $result = ItemService::consumeItem(
|
|
|
+ $testUserId,
|
|
|
+ $testItemId,
|
|
|
+ null,
|
|
|
+ 80,
|
|
|
+ ['source_type' => 'test', 'source_id' => 1]
|
|
|
+ );
|
|
|
+
|
|
|
+ if ($result['success']) {
|
|
|
+ echo "✓ 消耗80个物品成功\n";
|
|
|
+
|
|
|
+ // 检查剩余数量
|
|
|
+ $items = ItemUser::where('user_id', $testUserId)
|
|
|
+ ->where('item_id', $testItemId)
|
|
|
+ ->get();
|
|
|
+
|
|
|
+ $unfrozenQuantity = $items->where('is_frozen', false)->sum('quantity');
|
|
|
+ $frozenQuantity = $items->where('is_frozen', true)->sum('quantity');
|
|
|
+
|
|
|
+ echo "剩余未冻结物品:{$unfrozenQuantity}个(期望:20个)\n";
|
|
|
+ echo "剩余冻结物品:{$frozenQuantity}个(期望:50个)\n";
|
|
|
+
|
|
|
+ if ($unfrozenQuantity == 20 && $frozenQuantity == 50) {
|
|
|
+ echo "✓ 测试1通过\n\n";
|
|
|
+ } else {
|
|
|
+ echo "✗ 测试1失败\n\n";
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ echo "✗ 消耗失败:" . ($result['message'] ?? '未知错误') . "\n\n";
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 重置测试数据
|
|
|
+ DB::transaction(function () use ($testUserId, $testItemId) {
|
|
|
+ ItemUser::where('user_id', $testUserId)->where('item_id', $testItemId)->delete();
|
|
|
+
|
|
|
+ ItemUser::create([
|
|
|
+ 'user_id' => $testUserId,
|
|
|
+ 'item_id' => $testItemId,
|
|
|
+ 'instance_id' => null,
|
|
|
+ 'quantity' => 100,
|
|
|
+ 'is_frozen' => false,
|
|
|
+ 'frozen_log_id' => null,
|
|
|
+ ]);
|
|
|
+
|
|
|
+ ItemUser::create([
|
|
|
+ 'user_id' => $testUserId,
|
|
|
+ 'item_id' => $testItemId,
|
|
|
+ 'instance_id' => null,
|
|
|
+ 'quantity' => 50,
|
|
|
+ 'is_frozen' => true,
|
|
|
+ 'frozen_log_id' => 999,
|
|
|
+ ]);
|
|
|
+ });
|
|
|
+
|
|
|
+ // 测试2:包含冻结物品的消耗
|
|
|
+ echo "=== 测试2:包含冻结物品的消耗 ===\n";
|
|
|
+ DB::transaction(function () use ($testUserId, $testItemId) {
|
|
|
+ $result = ItemService::consumeItem(
|
|
|
+ $testUserId,
|
|
|
+ $testItemId,
|
|
|
+ null,
|
|
|
+ 120,
|
|
|
+ [
|
|
|
+ 'source_type' => 'test',
|
|
|
+ 'source_id' => 1,
|
|
|
+ 'include_frozen' => true // 包含冻结物品
|
|
|
+ ]
|
|
|
+ );
|
|
|
+
|
|
|
+ if ($result['success']) {
|
|
|
+ echo "✓ 消耗120个物品成功(包含冻结物品)\n";
|
|
|
+
|
|
|
+ // 检查剩余数量
|
|
|
+ $totalQuantity = ItemUser::where('user_id', $testUserId)
|
|
|
+ ->where('item_id', $testItemId)
|
|
|
+ ->sum('quantity');
|
|
|
+
|
|
|
+ echo "剩余总数量:{$totalQuantity}个(期望:30个)\n";
|
|
|
+
|
|
|
+ if ($totalQuantity == 30) {
|
|
|
+ echo "✓ 测试2通过\n\n";
|
|
|
+ } else {
|
|
|
+ echo "✗ 测试2失败\n\n";
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ echo "✗ 消耗失败:" . ($result['message'] ?? '未知错误') . "\n\n";
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 测试3:不包含冻结物品时数量不足
|
|
|
+ echo "=== 测试3:不包含冻结物品时数量不足 ===\n";
|
|
|
+ DB::transaction(function () use ($testUserId, $testItemId) {
|
|
|
+ // 重置为只有100个未冻结物品
|
|
|
+ ItemUser::where('user_id', $testUserId)->where('item_id', $testItemId)->delete();
|
|
|
+
|
|
|
+ ItemUser::create([
|
|
|
+ 'user_id' => $testUserId,
|
|
|
+ 'item_id' => $testItemId,
|
|
|
+ 'instance_id' => null,
|
|
|
+ 'quantity' => 100,
|
|
|
+ 'is_frozen' => false,
|
|
|
+ 'frozen_log_id' => null,
|
|
|
+ ]);
|
|
|
+
|
|
|
+ ItemUser::create([
|
|
|
+ 'user_id' => $testUserId,
|
|
|
+ 'item_id' => $testItemId,
|
|
|
+ 'instance_id' => null,
|
|
|
+ 'quantity' => 50,
|
|
|
+ 'is_frozen' => true,
|
|
|
+ 'frozen_log_id' => 999,
|
|
|
+ ]);
|
|
|
+
|
|
|
+ try {
|
|
|
+ $result = ItemService::consumeItem(
|
|
|
+ $testUserId,
|
|
|
+ $testItemId,
|
|
|
+ null,
|
|
|
+ 120, // 尝试消耗120个,但只有100个未冻结
|
|
|
+ ['source_type' => 'test', 'source_id' => 1]
|
|
|
+ );
|
|
|
+
|
|
|
+ echo "✗ 测试3失败:应该抛出异常但没有\n\n";
|
|
|
+ } catch (Exception $e) {
|
|
|
+ if (strpos($e->getMessage(), '数量不足') !== false) {
|
|
|
+ echo "✓ 测试3通过:正确抛出数量不足异常\n";
|
|
|
+ echo "异常信息:" . $e->getMessage() . "\n\n";
|
|
|
+ } else {
|
|
|
+ echo "✗ 测试3失败:异常信息不正确\n";
|
|
|
+ echo "异常信息:" . $e->getMessage() . "\n\n";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 清理测试数据
|
|
|
+ DB::transaction(function () use ($testUserId, $testItemId) {
|
|
|
+ ItemUser::where('user_id', $testUserId)->where('item_id', $testItemId)->delete();
|
|
|
+ echo "测试数据清理完成\n";
|
|
|
+ });
|
|
|
+
|
|
|
+ echo "=== 所有测试完成 ===\n";
|
|
|
+
|
|
|
+} catch (Exception $e) {
|
|
|
+ echo "测试过程中发生错误:" . $e->getMessage() . "\n";
|
|
|
+ echo "堆栈跟踪:\n" . $e->getTraceAsString() . "\n";
|
|
|
+}
|