TransferValidationTest.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <?php
  2. namespace App\Module\Transfer\Tests\Unit;
  3. use App\Module\Transfer\Validations\TransferInValidation;
  4. use App\Module\Transfer\Validations\TransferOutValidation;
  5. use App\Module\Transfer\Models\TransferApp;
  6. use Tests\TestCase;
  7. use Illuminate\Foundation\Testing\RefreshDatabase;
  8. /**
  9. * 划转验证测试
  10. */
  11. class TransferValidationTest extends TestCase
  12. {
  13. use RefreshDatabase;
  14. /**
  15. * 设置测试环境
  16. */
  17. protected function setUp(): void
  18. {
  19. parent::setUp();
  20. // 创建测试应用
  21. $this->testApp = TransferApp::create([
  22. 'keyname' => 'test_app',
  23. 'title' => '测试应用',
  24. 'description' => '用于单元测试的应用',
  25. 'out_id' => 1001,
  26. 'currency_id' => 1,
  27. 'fund_id' => 1,
  28. 'exchange_rate' => 1.0000,
  29. 'is_enabled' => true,
  30. ]);
  31. }
  32. /**
  33. * 测试转入验证 - 有效数据
  34. */
  35. public function testTransferInValidationWithValidData(): void
  36. {
  37. $data = [
  38. 'transfer_app_id' => $this->testApp->id,
  39. 'business_id' => 'test_in_' . time(),
  40. 'user_id' => 1001,
  41. 'amount' => '100.50',
  42. 'out_user_id' => 'ext_user_123',
  43. 'remark' => '测试转入',
  44. 'callback_data' => ['key' => 'value'],
  45. ];
  46. $validation = new TransferInValidation($data);
  47. $this->assertTrue($validation->validate());
  48. $this->assertEmpty($validation->getErrors());
  49. }
  50. /**
  51. * 测试转入验证 - 缺少必填字段
  52. */
  53. public function testTransferInValidationWithMissingFields(): void
  54. {
  55. $data = [
  56. // 缺少 transfer_app_id
  57. 'business_id' => 'test_in_' . time(),
  58. 'user_id' => 1001,
  59. 'amount' => '100.50',
  60. ];
  61. $validation = new TransferInValidation($data);
  62. $this->assertFalse($validation->validate());
  63. $this->assertArrayHasKey('transfer_app_id', $validation->getErrors());
  64. }
  65. /**
  66. * 测试转入验证 - 无效金额格式
  67. */
  68. public function testTransferInValidationWithInvalidAmount(): void
  69. {
  70. $data = [
  71. 'transfer_app_id' => $this->testApp->id,
  72. 'business_id' => 'test_in_' . time(),
  73. 'user_id' => 1001,
  74. 'amount' => 'invalid_amount', // 无效金额
  75. ];
  76. $validation = new TransferInValidation($data);
  77. $this->assertFalse($validation->validate());
  78. $this->assertArrayHasKey('amount', $validation->getErrors());
  79. }
  80. /**
  81. * 测试转入验证 - 业务ID重复
  82. */
  83. public function testTransferInValidationWithDuplicateBusinessId(): void
  84. {
  85. $businessId = 'duplicate_test_' . time();
  86. // 先创建一个订单
  87. \App\Module\Transfer\Models\TransferOrder::create([
  88. 'transfer_app_id' => $this->testApp->id,
  89. 'out_id' => $this->testApp->out_id,
  90. 'out_order_id' => $businessId,
  91. 'user_id' => 1001,
  92. 'currency_id' => 1,
  93. 'fund_id' => 1,
  94. 'type' => 1,
  95. 'status' => 1,
  96. 'out_amount' => 100,
  97. 'amount' => 100,
  98. 'exchange_rate' => 1.0000,
  99. ]);
  100. $data = [
  101. 'transfer_app_id' => $this->testApp->id,
  102. 'business_id' => $businessId, // 重复的业务ID
  103. 'user_id' => 1001,
  104. 'amount' => '100.50',
  105. ];
  106. $validation = new TransferInValidation($data);
  107. $this->assertFalse($validation->validate());
  108. $this->assertArrayHasKey('business_id', $validation->getErrors());
  109. }
  110. /**
  111. * 测试转入验证 - 回调数据过大
  112. */
  113. public function testTransferInValidationWithLargeCallbackData(): void
  114. {
  115. $largeData = str_repeat('x', 2000); // 超过1KB的数据
  116. $data = [
  117. 'transfer_app_id' => $this->testApp->id,
  118. 'business_id' => 'test_large_' . time(),
  119. 'user_id' => 1001,
  120. 'amount' => '100.50',
  121. 'callback_data' => ['large_field' => $largeData],
  122. ];
  123. $validation = new TransferInValidation($data);
  124. $this->assertFalse($validation->validate());
  125. $this->assertArrayHasKey('callback_data', $validation->getErrors());
  126. }
  127. /**
  128. * 测试转入验证 - 回调数据包含敏感字段
  129. */
  130. public function testTransferInValidationWithSensitiveCallbackData(): void
  131. {
  132. $data = [
  133. 'transfer_app_id' => $this->testApp->id,
  134. 'business_id' => 'test_sensitive_' . time(),
  135. 'user_id' => 1001,
  136. 'amount' => '100.50',
  137. 'callback_data' => ['password' => 'secret123'], // 敏感字段
  138. ];
  139. $validation = new TransferInValidation($data);
  140. $this->assertFalse($validation->validate());
  141. $this->assertArrayHasKey('callback_data', $validation->getErrors());
  142. }
  143. /**
  144. * 测试转出验证 - 有效数据
  145. */
  146. public function testTransferOutValidationWithValidData(): void
  147. {
  148. $data = [
  149. 'transfer_app_id' => $this->testApp->id,
  150. 'business_id' => 'test_out_' . time(),
  151. 'user_id' => 1001,
  152. 'amount' => '50.25',
  153. 'out_user_id' => 'ext_user_456',
  154. 'remark' => '测试转出',
  155. ];
  156. $validation = new TransferOutValidation($data);
  157. $this->assertTrue($validation->validate());
  158. $this->assertEmpty($validation->getErrors());
  159. }
  160. /**
  161. * 测试转出验证 - 缺少必填字段
  162. */
  163. public function testTransferOutValidationWithMissingFields(): void
  164. {
  165. $data = [
  166. 'transfer_app_id' => $this->testApp->id,
  167. // 缺少 business_id
  168. 'user_id' => 1001,
  169. 'amount' => '50.25',
  170. ];
  171. $validation = new TransferOutValidation($data);
  172. $this->assertFalse($validation->validate());
  173. $this->assertArrayHasKey('business_id', $validation->getErrors());
  174. }
  175. /**
  176. * 测试转出验证 - 无效用户ID
  177. */
  178. public function testTransferOutValidationWithInvalidUserId(): void
  179. {
  180. $data = [
  181. 'transfer_app_id' => $this->testApp->id,
  182. 'business_id' => 'test_out_' . time(),
  183. 'user_id' => 0, // 无效用户ID
  184. 'amount' => '50.25',
  185. ];
  186. $validation = new TransferOutValidation($data);
  187. $this->assertFalse($validation->validate());
  188. $this->assertArrayHasKey('user_id', $validation->getErrors());
  189. }
  190. /**
  191. * 测试应用验证 - 不存在的应用
  192. */
  193. public function testValidationWithNonExistentApp(): void
  194. {
  195. $data = [
  196. 'transfer_app_id' => 99999, // 不存在的应用ID
  197. 'business_id' => 'test_nonexistent_' . time(),
  198. 'user_id' => 1001,
  199. 'amount' => '100.00',
  200. ];
  201. $validation = new TransferInValidation($data);
  202. $this->assertFalse($validation->validate());
  203. $this->assertArrayHasKey('transfer_app_id', $validation->getErrors());
  204. }
  205. /**
  206. * 测试应用验证 - 已禁用的应用
  207. */
  208. public function testValidationWithDisabledApp(): void
  209. {
  210. // 禁用应用
  211. $this->testApp->update(['is_enabled' => false]);
  212. $data = [
  213. 'transfer_app_id' => $this->testApp->id,
  214. 'business_id' => 'test_disabled_' . time(),
  215. 'user_id' => 1001,
  216. 'amount' => '100.00',
  217. ];
  218. $validation = new TransferInValidation($data);
  219. $this->assertFalse($validation->validate());
  220. $this->assertArrayHasKey('transfer_app_id', $validation->getErrors());
  221. }
  222. /**
  223. * 测试字符串长度验证
  224. */
  225. public function testStringLengthValidation(): void
  226. {
  227. $data = [
  228. 'transfer_app_id' => $this->testApp->id,
  229. 'business_id' => str_repeat('x', 101), // 超过100字符
  230. 'user_id' => 1001,
  231. 'amount' => '100.00',
  232. 'out_user_id' => str_repeat('y', 51), // 超过50字符
  233. 'remark' => str_repeat('z', 256), // 超过255字符
  234. ];
  235. $validation = new TransferInValidation($data);
  236. $this->assertFalse($validation->validate());
  237. $errors = $validation->getErrors();
  238. $this->assertArrayHasKey('business_id', $errors);
  239. $this->assertArrayHasKey('out_user_id', $errors);
  240. $this->assertArrayHasKey('remark', $errors);
  241. }
  242. /**
  243. * 测试数据类型验证
  244. */
  245. public function testDataTypeValidation(): void
  246. {
  247. $data = [
  248. 'transfer_app_id' => 'invalid_id', // 应该是整数
  249. 'business_id' => 123, // 应该是字符串
  250. 'user_id' => 'invalid_user', // 应该是整数
  251. 'amount' => 100, // 应该是字符串
  252. ];
  253. $validation = new TransferInValidation($data);
  254. $this->assertFalse($validation->validate());
  255. $errors = $validation->getErrors();
  256. $this->assertArrayHasKey('transfer_app_id', $errors);
  257. $this->assertArrayHasKey('user_id', $errors);
  258. }
  259. /**
  260. * 清理测试环境
  261. */
  262. protected function tearDown(): void
  263. {
  264. parent::tearDown();
  265. }
  266. }