| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- <?php
- namespace App\Module\Transfer\Tests\Unit;
- use App\Module\Transfer\Validations\TransferInValidation;
- use App\Module\Transfer\Validations\TransferOutValidation;
- use App\Module\Transfer\Models\TransferApp;
- use Tests\TestCase;
- use Illuminate\Foundation\Testing\RefreshDatabase;
- /**
- * 划转验证测试
- */
- class TransferValidationTest extends TestCase
- {
- use RefreshDatabase;
- /**
- * 设置测试环境
- */
- protected function setUp(): void
- {
- parent::setUp();
-
- // 创建测试应用
- $this->testApp = TransferApp::create([
- 'keyname' => 'test_app',
- 'title' => '测试应用',
- 'description' => '用于单元测试的应用',
- 'out_id' => 1001,
- 'currency_id' => 1,
- 'fund_id' => 1,
- 'exchange_rate' => 1.0000,
- 'is_enabled' => true,
- ]);
- }
- /**
- * 测试转入验证 - 有效数据
- */
- public function testTransferInValidationWithValidData(): void
- {
- $data = [
- 'transfer_app_id' => $this->testApp->id,
- 'business_id' => 'test_in_' . time(),
- 'user_id' => 1001,
- 'amount' => '100.50',
- 'out_user_id' => 'ext_user_123',
- 'remark' => '测试转入',
- 'callback_data' => ['key' => 'value'],
- ];
- $validation = new TransferInValidation($data);
- $this->assertTrue($validation->validate());
- $this->assertEmpty($validation->getErrors());
- }
- /**
- * 测试转入验证 - 缺少必填字段
- */
- public function testTransferInValidationWithMissingFields(): void
- {
- $data = [
- // 缺少 transfer_app_id
- 'business_id' => 'test_in_' . time(),
- 'user_id' => 1001,
- 'amount' => '100.50',
- ];
- $validation = new TransferInValidation($data);
- $this->assertFalse($validation->validate());
- $this->assertArrayHasKey('transfer_app_id', $validation->getErrors());
- }
- /**
- * 测试转入验证 - 无效金额格式
- */
- public function testTransferInValidationWithInvalidAmount(): void
- {
- $data = [
- 'transfer_app_id' => $this->testApp->id,
- 'business_id' => 'test_in_' . time(),
- 'user_id' => 1001,
- 'amount' => 'invalid_amount', // 无效金额
- ];
- $validation = new TransferInValidation($data);
- $this->assertFalse($validation->validate());
- $this->assertArrayHasKey('amount', $validation->getErrors());
- }
- /**
- * 测试转入验证 - 业务ID重复
- */
- public function testTransferInValidationWithDuplicateBusinessId(): void
- {
- $businessId = 'duplicate_test_' . time();
-
- // 先创建一个订单
- \App\Module\Transfer\Models\TransferOrder::create([
- 'transfer_app_id' => $this->testApp->id,
- 'out_id' => $this->testApp->out_id,
- 'out_order_id' => $businessId,
- 'user_id' => 1001,
- 'currency_id' => 1,
- 'fund_id' => 1,
- 'type' => 1,
- 'status' => 1,
- 'out_amount' => 100,
- 'amount' => 100,
- 'exchange_rate' => 1.0000,
- ]);
- $data = [
- 'transfer_app_id' => $this->testApp->id,
- 'business_id' => $businessId, // 重复的业务ID
- 'user_id' => 1001,
- 'amount' => '100.50',
- ];
- $validation = new TransferInValidation($data);
- $this->assertFalse($validation->validate());
- $this->assertArrayHasKey('business_id', $validation->getErrors());
- }
- /**
- * 测试转入验证 - 回调数据过大
- */
- public function testTransferInValidationWithLargeCallbackData(): void
- {
- $largeData = str_repeat('x', 2000); // 超过1KB的数据
-
- $data = [
- 'transfer_app_id' => $this->testApp->id,
- 'business_id' => 'test_large_' . time(),
- 'user_id' => 1001,
- 'amount' => '100.50',
- 'callback_data' => ['large_field' => $largeData],
- ];
- $validation = new TransferInValidation($data);
- $this->assertFalse($validation->validate());
- $this->assertArrayHasKey('callback_data', $validation->getErrors());
- }
- /**
- * 测试转入验证 - 回调数据包含敏感字段
- */
- public function testTransferInValidationWithSensitiveCallbackData(): void
- {
- $data = [
- 'transfer_app_id' => $this->testApp->id,
- 'business_id' => 'test_sensitive_' . time(),
- 'user_id' => 1001,
- 'amount' => '100.50',
- 'callback_data' => ['password' => 'secret123'], // 敏感字段
- ];
- $validation = new TransferInValidation($data);
- $this->assertFalse($validation->validate());
- $this->assertArrayHasKey('callback_data', $validation->getErrors());
- }
- /**
- * 测试转出验证 - 有效数据
- */
- public function testTransferOutValidationWithValidData(): void
- {
- $data = [
- 'transfer_app_id' => $this->testApp->id,
- 'business_id' => 'test_out_' . time(),
- 'user_id' => 1001,
- 'amount' => '50.25',
- 'out_user_id' => 'ext_user_456',
- 'remark' => '测试转出',
- ];
- $validation = new TransferOutValidation($data);
- $this->assertTrue($validation->validate());
- $this->assertEmpty($validation->getErrors());
- }
- /**
- * 测试转出验证 - 缺少必填字段
- */
- public function testTransferOutValidationWithMissingFields(): void
- {
- $data = [
- 'transfer_app_id' => $this->testApp->id,
- // 缺少 business_id
- 'user_id' => 1001,
- 'amount' => '50.25',
- ];
- $validation = new TransferOutValidation($data);
- $this->assertFalse($validation->validate());
- $this->assertArrayHasKey('business_id', $validation->getErrors());
- }
- /**
- * 测试转出验证 - 无效用户ID
- */
- public function testTransferOutValidationWithInvalidUserId(): void
- {
- $data = [
- 'transfer_app_id' => $this->testApp->id,
- 'business_id' => 'test_out_' . time(),
- 'user_id' => 0, // 无效用户ID
- 'amount' => '50.25',
- ];
- $validation = new TransferOutValidation($data);
- $this->assertFalse($validation->validate());
- $this->assertArrayHasKey('user_id', $validation->getErrors());
- }
- /**
- * 测试应用验证 - 不存在的应用
- */
- public function testValidationWithNonExistentApp(): void
- {
- $data = [
- 'transfer_app_id' => 99999, // 不存在的应用ID
- 'business_id' => 'test_nonexistent_' . time(),
- 'user_id' => 1001,
- 'amount' => '100.00',
- ];
- $validation = new TransferInValidation($data);
- $this->assertFalse($validation->validate());
- $this->assertArrayHasKey('transfer_app_id', $validation->getErrors());
- }
- /**
- * 测试应用验证 - 已禁用的应用
- */
- public function testValidationWithDisabledApp(): void
- {
- // 禁用应用
- $this->testApp->update(['is_enabled' => false]);
- $data = [
- 'transfer_app_id' => $this->testApp->id,
- 'business_id' => 'test_disabled_' . time(),
- 'user_id' => 1001,
- 'amount' => '100.00',
- ];
- $validation = new TransferInValidation($data);
- $this->assertFalse($validation->validate());
- $this->assertArrayHasKey('transfer_app_id', $validation->getErrors());
- }
- /**
- * 测试字符串长度验证
- */
- public function testStringLengthValidation(): void
- {
- $data = [
- 'transfer_app_id' => $this->testApp->id,
- 'business_id' => str_repeat('x', 101), // 超过100字符
- 'user_id' => 1001,
- 'amount' => '100.00',
- 'out_user_id' => str_repeat('y', 51), // 超过50字符
- 'remark' => str_repeat('z', 256), // 超过255字符
- ];
- $validation = new TransferInValidation($data);
- $this->assertFalse($validation->validate());
-
- $errors = $validation->getErrors();
- $this->assertArrayHasKey('business_id', $errors);
- $this->assertArrayHasKey('out_user_id', $errors);
- $this->assertArrayHasKey('remark', $errors);
- }
- /**
- * 测试数据类型验证
- */
- public function testDataTypeValidation(): void
- {
- $data = [
- 'transfer_app_id' => 'invalid_id', // 应该是整数
- 'business_id' => 123, // 应该是字符串
- 'user_id' => 'invalid_user', // 应该是整数
- 'amount' => 100, // 应该是字符串
- ];
- $validation = new TransferInValidation($data);
- $this->assertFalse($validation->validate());
-
- $errors = $validation->getErrors();
- $this->assertArrayHasKey('transfer_app_id', $errors);
- $this->assertArrayHasKey('user_id', $errors);
- }
- /**
- * 清理测试环境
- */
- protected function tearDown(): void
- {
- parent::tearDown();
- }
- }
|