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(); } }