| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- <?php
- namespace App\Module\GameItems\Tests;
- use App\Module\GameItems\Enums\FREEZE_ACTION_TYPE;
- use App\Module\GameItems\Enums\FREEZE_REASON_TYPE;
- use App\Module\GameItems\Logics\ItemFreeze;
- use App\Module\GameItems\Models\Item;
- use App\Module\GameItems\Models\ItemFreezeLog;
- use App\Module\GameItems\Models\ItemUser;
- use App\Module\GameItems\Services\ItemService;
- use Illuminate\Foundation\Testing\RefreshDatabase;
- use Tests\TestCase;
- use UCore\Db\Helper;
- /**
- * 物品冻结功能测试
- */
- class ItemFreezeTest extends TestCase
- {
- use RefreshDatabase;
- private int $testUserId = 1001;
- private int $testItemId = 2001;
- protected function setUp(): void
- {
- parent::setUp();
- // 创建测试物品
- Item::create([
- 'id' => $this->testItemId,
- 'name' => '测试物品',
- 'description' => '用于测试冻结功能的物品',
- 'category_id' => 1,
- 'type' => 1,
- 'is_unique' => false,
- 'max_stack' => 100,
- 'sell_price' => 10,
- 'tradable' => true,
- 'dismantlable' => true,
- 'default_expire_seconds' => 0,
- ]);
- }
- /**
- * 测试冻结统一属性物品
- */
- public function testFreezeNormalItem()
- {
- Helper::begin_tr();
- try {
- // 先给用户添加物品
- ItemService::addItem($this->testUserId, $this->testItemId, 50);
- // 验证添加成功
- $availableQuantity = ItemFreeze::getAvailableQuantity($this->testUserId, $this->testItemId);
- $this->assertEquals(50, $availableQuantity);
- // 冻结部分物品
- $result = ItemFreeze::freezeNormalItem(
- $this->testUserId,
- $this->testItemId,
- 20,
- FREEZE_REASON_TYPE::TRADE_ORDER,
- 123,
- 'order'
- );
- // 验证冻结结果
- $this->assertTrue($result['success']);
- $this->assertEquals(20, $result['frozen_quantity']);
- // 验证可用数量减少
- $availableQuantity = ItemFreeze::getAvailableQuantity($this->testUserId, $this->testItemId);
- $this->assertEquals(30, $availableQuantity);
- // 验证冻结记录
- $freezeLog = ItemFreezeLog::where('user_id', $this->testUserId)
- ->where('item_id', $this->testItemId)
- ->where('action_type', FREEZE_ACTION_TYPE::FREEZE)
- ->first();
- $this->assertNotNull($freezeLog);
- $this->assertEquals(20, $freezeLog->quantity);
- $this->assertEquals('交易订单', $freezeLog->reason);
- Helper::commit_tr();
- } catch (\Exception $e) {
- Helper::rollback_tr();
- throw $e;
- }
- }
- /**
- * 测试解冻物品
- */
- public function testUnfreezeItem()
- {
- Helper::begin_tr();
- try {
- // 先添加物品并冻结
- ItemService::addItem($this->testUserId, $this->testItemId, 50);
- $freezeResult = ItemFreeze::freezeNormalItem(
- $this->testUserId,
- $this->testItemId,
- 20,
- FREEZE_REASON_TYPE::TRADE_ORDER,
- 123,
- 'order'
- );
- $freezeLogId = $freezeResult['frozen_items'][0]['freeze_log_id'];
- // 验证冻结状态
- $availableQuantity = ItemFreeze::getAvailableQuantity($this->testUserId, $this->testItemId);
- $this->assertEquals(30, $availableQuantity);
- // 解冻物品
- $unfreezeResult = ItemFreeze::unfreezeByLogId($freezeLogId);
- // 验证解冻结果
- $this->assertTrue($unfreezeResult['success']);
- $this->assertEquals(20, $unfreezeResult['unfrozen_quantity']);
- // 验证可用数量恢复
- $availableQuantity = ItemFreeze::getAvailableQuantity($this->testUserId, $this->testItemId);
- $this->assertEquals(50, $availableQuantity);
- // 验证解冻记录
- $unfreezeLog = ItemFreezeLog::where('user_id', $this->testUserId)
- ->where('item_id', $this->testItemId)
- ->where('action_type', FREEZE_ACTION_TYPE::UNFREEZE)
- ->first();
- $this->assertNotNull($unfreezeLog);
- $this->assertEquals(20, $unfreezeLog->quantity);
- Helper::commit_tr();
- } catch (\Exception $e) {
- Helper::rollback_tr();
- throw $e;
- }
- }
- /**
- * 测试消耗物品时排除冻结物品
- */
- public function testConsumeExcludesFrozenItems()
- {
- Helper::begin_tr();
- try {
- // 添加物品
- ItemService::addItem($this->testUserId, $this->testItemId, 50);
- // 冻结部分物品
- ItemFreeze::freezeNormalItem(
- $this->testUserId,
- $this->testItemId,
- 20,
- FREEZE_REASON_TYPE::TRADE_ORDER,
- 123,
- 'order'
- );
- // 尝试消耗物品,应该只能消耗未冻结的30个
- $result = ItemService::consumeItem($this->testUserId, $this->testItemId, null, 25);
- // 验证消耗成功
- $this->assertTrue($result['success']);
- $this->assertEquals(25, $result['quantity']);
- // 验证剩余可用数量
- $availableQuantity = ItemFreeze::getAvailableQuantity($this->testUserId, $this->testItemId);
- $this->assertEquals(5, $availableQuantity);
- // 尝试消耗超过可用数量的物品,应该失败
- $this->expectException(\Exception::class);
- ItemService::consumeItem($this->testUserId, $this->testItemId, null, 10);
- Helper::commit_tr();
- } catch (\Exception $e) {
- Helper::rollback_tr();
- throw $e;
- }
- }
- /**
- * 测试批量冻结物品
- */
- public function testBatchFreezeItems()
- {
- Helper::check_tr();
- try {
- // 添加多种物品
- ItemService::addItem($this->testUserId, $this->testItemId, 100);
- // 创建另一个测试物品
- $testItemId2 = $this->testItemId + 1;
- Item::create([
- 'id' => $testItemId2,
- 'name' => '测试物品2',
- 'description' => '用于测试批量冻结的物品',
- 'category_id' => 1,
- 'type' => 1,
- 'is_unique' => false,
- 'max_stack' => 100,
- 'sell_price' => 10,
- 'tradable' => true,
- 'dismantlable' => true,
- 'default_expire_seconds' => 0,
- ]);
- ItemService::addItem($this->testUserId, $testItemId2, 50);
- // 批量冻结
- $items = [
- ['item_id' => $this->testItemId, 'quantity' => 30],
- ['item_id' => $testItemId2, 'quantity' => 20],
- ];
- $result = ItemFreeze::batchFreezeItems(
- $this->testUserId,
- $items,
- FREEZE_REASON_TYPE::SYSTEM_FREEZE,
- null,
- 'system'
- );
- // 验证批量冻结结果
- $this->assertTrue($result['success']);
- $this->assertEquals(2, $result['frozen_items_count']);
- // 验证各物品的可用数量
- $availableQuantity1 = ItemFreeze::getAvailableQuantity($this->testUserId, $this->testItemId);
- $availableQuantity2 = ItemFreeze::getAvailableQuantity($this->testUserId, $testItemId2);
- $this->assertEquals(70, $availableQuantity1);
- $this->assertEquals(30, $availableQuantity2);
- Helper::commit_tr();
- } catch (\Exception $e) {
- Helper::rollback_tr();
- throw $e;
- }
- }
- /**
- * 测试获取冻结统计信息
- */
- public function testGetFreezeStatistics()
- {
- Helper::begin_tr();
- try {
- // 添加物品并冻结
- ItemService::addItem($this->testUserId, $this->testItemId, 100);
- ItemFreeze::freezeNormalItem(
- $this->testUserId,
- $this->testItemId,
- 30,
- FREEZE_REASON_TYPE::TRADE_ORDER,
- 123,
- 'order'
- );
- ItemFreeze::freezeNormalItem(
- $this->testUserId,
- $this->testItemId,
- 20,
- FREEZE_REASON_TYPE::ADMIN_FREEZE,
- null,
- 'admin'
- );
- // 获取统计信息
- $statistics = ItemFreeze::getFreezeStatistics($this->testUserId);
- // 验证统计结果
- $this->assertEquals(2, $statistics['total_frozen_items']);
- $this->assertEquals(50, $statistics['total_frozen_quantity']);
- $this->assertArrayHasKey('frozen_by_reason', $statistics);
- $this->assertArrayHasKey('frozen_by_source_type', $statistics);
- Helper::commit_tr();
- } catch (\Exception $e) {
- Helper::rollback_tr();
- throw $e;
- }
- }
- }
|