DiamondOperationTest.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <?php
  2. namespace App\Module\OpenAPI\Tests;
  3. use App\Module\OpenAPI\Enums\SCOPE_TYPE;
  4. use App\Module\OpenAPI\Services\DeveloperAccountService;
  5. use App\Module\OpenAPI\Handlers\Fund\DiamondRechargeHandler;
  6. use App\Module\OpenAPI\Handlers\Fund\DiamondWithdrawHandler;
  7. use App\Module\OpenAPI\Validations\DiamondRechargeValidation;
  8. use App\Module\OpenAPI\Validations\DiamondWithdrawValidation;
  9. use App\Module\OpenAPI\Models\OpenApiApp;
  10. use PHPUnit\Framework\TestCase;
  11. /**
  12. * 钻石操作测试类
  13. *
  14. * 测试钻石充值和提取功能
  15. */
  16. class DiamondOperationTest extends TestCase
  17. {
  18. /**
  19. * 测试权限范围枚举扩展
  20. */
  21. public function testScopeTypeExtension()
  22. {
  23. // 测试新增的权限范围
  24. $this->assertTrue(SCOPE_TYPE::FUND_RECHARGE instanceof SCOPE_TYPE);
  25. $this->assertTrue(SCOPE_TYPE::FUND_WITHDRAW instanceof SCOPE_TYPE);
  26. // 测试权限范围的值
  27. $this->assertEquals('FUND_RECHARGE', SCOPE_TYPE::FUND_RECHARGE->value);
  28. $this->assertEquals('FUND_WITHDRAW', SCOPE_TYPE::FUND_WITHDRAW->value);
  29. // 测试权限范围的标签
  30. $this->assertEquals('钻石充值权限', SCOPE_TYPE::FUND_RECHARGE->getLabel());
  31. $this->assertEquals('钻石提取权限', SCOPE_TYPE::FUND_WITHDRAW->getLabel());
  32. // 测试权限范围的风险级别
  33. $this->assertEquals(4, SCOPE_TYPE::FUND_RECHARGE->getRiskLevel());
  34. $this->assertEquals(4, SCOPE_TYPE::FUND_WITHDRAW->getRiskLevel());
  35. // 测试权限范围的分类
  36. $this->assertEquals('资金管理', SCOPE_TYPE::FUND_RECHARGE->getCategory());
  37. $this->assertEquals('资金管理', SCOPE_TYPE::FUND_WITHDRAW->getCategory());
  38. }
  39. /**
  40. * 测试开发者账户服务
  41. */
  42. public function testDeveloperAccountService()
  43. {
  44. // 测试用户ID生成
  45. $appId = 123;
  46. $rechargeUserId = DeveloperAccountService::getRechargeUserId($appId);
  47. $withdrawUserId = DeveloperAccountService::getWithdrawUserId($appId);
  48. $this->assertEquals(100123, $rechargeUserId);
  49. $this->assertEquals(200123, $withdrawUserId);
  50. // 测试不同应用ID生成不同的用户ID
  51. $appId2 = 456;
  52. $rechargeUserId2 = DeveloperAccountService::getRechargeUserId($appId2);
  53. $withdrawUserId2 = DeveloperAccountService::getWithdrawUserId($appId2);
  54. $this->assertEquals(100456, $rechargeUserId2);
  55. $this->assertEquals(200456, $withdrawUserId2);
  56. $this->assertNotEquals($rechargeUserId, $rechargeUserId2);
  57. $this->assertNotEquals($withdrawUserId, $withdrawUserId2);
  58. }
  59. /**
  60. * 测试钻石充值验证
  61. */
  62. public function testDiamondRechargeValidation()
  63. {
  64. // 测试有效数据
  65. $validData = [
  66. 'user_id' => 12345,
  67. 'amount' => 100.5,
  68. 'order_id' => 'ORDER_001',
  69. 'remark' => '测试充值'
  70. ];
  71. $validation = new DiamondRechargeValidation($validData);
  72. // 注意:这里只是测试验证类的创建,实际验证需要数据库连接
  73. $this->assertInstanceOf(DiamondRechargeValidation::class, $validation);
  74. // 测试无效数据
  75. $invalidData = [
  76. 'user_id' => -1,
  77. 'amount' => -100,
  78. ];
  79. $validation2 = new DiamondRechargeValidation($invalidData);
  80. $this->assertInstanceOf(DiamondRechargeValidation::class, $validation2);
  81. }
  82. /**
  83. * 测试钻石提取验证
  84. */
  85. public function testDiamondWithdrawValidation()
  86. {
  87. // 测试有效数据
  88. $validData = [
  89. 'user_id' => 12345,
  90. 'amount' => 50.25,
  91. 'order_id' => 'WITHDRAW_001',
  92. 'remark' => '测试提取'
  93. ];
  94. $validation = new DiamondWithdrawValidation($validData);
  95. $this->assertInstanceOf(DiamondWithdrawValidation::class, $validation);
  96. // 测试字段标签
  97. $labels = $validation->attributeLabels();
  98. $this->assertEquals('源用户ID', $labels['user_id']);
  99. $this->assertEquals('提取金额', $labels['amount']);
  100. }
  101. /**
  102. * 测试Handler类的权限要求
  103. */
  104. public function testHandlerPermissions()
  105. {
  106. // 创建模拟的ScopeService
  107. $scopeService = $this->createMock(\App\Module\OpenAPI\Services\ScopeService::class);
  108. // 测试充值Handler
  109. $rechargeHandler = new DiamondRechargeHandler($scopeService);
  110. $requiredScopes = $rechargeHandler->getRequiredScopes();
  111. $this->assertContains(SCOPE_TYPE::FUND_RECHARGE, $requiredScopes);
  112. // 测试提取Handler
  113. $withdrawHandler = new DiamondWithdrawHandler($scopeService);
  114. $requiredScopes = $withdrawHandler->getRequiredScopes();
  115. $this->assertContains(SCOPE_TYPE::FUND_WITHDRAW, $requiredScopes);
  116. }
  117. /**
  118. * 测试数据验证规则
  119. */
  120. public function testValidationRules()
  121. {
  122. $rechargeValidation = new DiamondRechargeValidation([]);
  123. $rules = $rechargeValidation->rules();
  124. // 检查是否包含必要的验证规则
  125. $this->assertIsArray($rules);
  126. $this->assertNotEmpty($rules);
  127. $withdrawValidation = new DiamondWithdrawValidation([]);
  128. $rules = $withdrawValidation->rules();
  129. $this->assertIsArray($rules);
  130. $this->assertNotEmpty($rules);
  131. }
  132. /**
  133. * 测试金额精度处理
  134. */
  135. public function testAmountPrecision()
  136. {
  137. // 测试钻石的精度设置
  138. $precision = \App\Module\Fund\Enums\FUND_CURRENCY_TYPE::ZUANSHI->getPrecision();
  139. $this->assertEquals(10, $precision);
  140. // 测试金额格式化
  141. $amount = 123.123456789012345;
  142. $formattedAmount = number_format($amount, $precision, '.', '');
  143. $this->assertEquals('123.1234567890', $formattedAmount);
  144. }
  145. /**
  146. * 测试错误处理
  147. */
  148. public function testErrorHandling()
  149. {
  150. // 测试无效的应用ID
  151. $invalidAppId = -1;
  152. $rechargeUserId = DeveloperAccountService::getRechargeUserId($invalidAppId);
  153. $withdrawUserId = DeveloperAccountService::getWithdrawUserId($invalidAppId);
  154. // 即使应用ID无效,也应该返回计算后的用户ID
  155. $this->assertEquals(99999, $rechargeUserId);
  156. $this->assertEquals(199999, $withdrawUserId);
  157. }
  158. }