229 lines
6.2 KiB
JavaScript
229 lines
6.2 KiB
JavaScript
const { Farm } = require('./models');
|
||
const { sequelize } = require('./config/database');
|
||
const farmController = require('./controllers/farmController');
|
||
|
||
// 模拟Express请求和响应对象
|
||
function createMockReq(body, params = {}) {
|
||
return {
|
||
body,
|
||
params
|
||
};
|
||
}
|
||
|
||
function createMockRes() {
|
||
const res = {
|
||
statusCode: 200,
|
||
data: null,
|
||
status: function(code) {
|
||
this.statusCode = code;
|
||
return this;
|
||
},
|
||
json: function(data) {
|
||
this.data = data;
|
||
return this;
|
||
}
|
||
};
|
||
return res;
|
||
}
|
||
|
||
// 模拟前端输入处理逻辑
|
||
function simulateFrontendInputProcessing(userInput) {
|
||
console.log(`\n🔍 模拟用户输入: "${userInput}"`);
|
||
|
||
// 模拟 a-input-number 的 parser 函数
|
||
const parser = (value) => {
|
||
if (!value) return value;
|
||
// 移除非数字字符,保留小数点和负号
|
||
const cleaned = value.toString().replace(/[^\d.-]/g, '');
|
||
// 确保只有一个小数点和负号在开头
|
||
const parts = cleaned.split('.');
|
||
if (parts.length > 2) {
|
||
return parts[0] + '.' + parts.slice(1).join('');
|
||
}
|
||
return cleaned;
|
||
};
|
||
|
||
const parsedValue = parser(userInput);
|
||
console.log(` 📝 Parser处理后: "${parsedValue}"`);
|
||
|
||
// 模拟 v-model 的数值转换
|
||
let finalValue;
|
||
if (parsedValue === '' || parsedValue === undefined || parsedValue === null) {
|
||
finalValue = undefined;
|
||
} else {
|
||
const numValue = parseFloat(parsedValue);
|
||
finalValue = isNaN(numValue) ? undefined : numValue;
|
||
}
|
||
|
||
console.log(` 🔢 最终绑定值: ${finalValue} (类型: ${typeof finalValue})`);
|
||
|
||
return finalValue;
|
||
}
|
||
|
||
// 测试各种用户输入场景
|
||
async function testCoordinateInputFlow() {
|
||
console.log('=== 经纬度输入流程测试 ===\n');
|
||
|
||
let testFarmId = null;
|
||
|
||
try {
|
||
// 1. 创建测试记录
|
||
console.log('1. 创建测试养殖场...');
|
||
const createReq = createMockReq({
|
||
name: '输入测试农场',
|
||
owner: '测试负责人',
|
||
phone: '13800138003',
|
||
address: '测试地址',
|
||
longitude: 106.2309,
|
||
latitude: 38.4872,
|
||
status: 'active'
|
||
});
|
||
|
||
const createRes = createMockRes();
|
||
await farmController.createFarm(createReq, createRes);
|
||
|
||
testFarmId = createRes.data.data.id;
|
||
console.log('✓ 创建成功,初始location:', createRes.data.data.location);
|
||
|
||
// 2. 测试各种用户输入场景
|
||
const testCases = [
|
||
{
|
||
name: '正常小数输入',
|
||
longitude: '106.2400',
|
||
latitude: '38.4900'
|
||
},
|
||
{
|
||
name: '整数输入',
|
||
longitude: '106',
|
||
latitude: '38'
|
||
},
|
||
{
|
||
name: '高精度小数输入',
|
||
longitude: '106.234567',
|
||
latitude: '38.487654'
|
||
},
|
||
{
|
||
name: '负数输入',
|
||
longitude: '-106.2400',
|
||
latitude: '-38.4900'
|
||
},
|
||
{
|
||
name: '包含非法字符的输入',
|
||
longitude: '106.24abc',
|
||
latitude: '38.49xyz'
|
||
},
|
||
{
|
||
name: '多个小数点的输入',
|
||
longitude: '106.24.56',
|
||
latitude: '38.49.78'
|
||
},
|
||
{
|
||
name: '空字符串输入',
|
||
longitude: '',
|
||
latitude: ''
|
||
},
|
||
{
|
||
name: '只输入小数点',
|
||
longitude: '.',
|
||
latitude: '.'
|
||
},
|
||
{
|
||
name: '边界值输入',
|
||
longitude: '180.0',
|
||
latitude: '90.0'
|
||
},
|
||
{
|
||
name: '超出范围的输入',
|
||
longitude: '200.0',
|
||
latitude: '100.0'
|
||
}
|
||
];
|
||
|
||
for (let i = 0; i < testCases.length; i++) {
|
||
const testCase = testCases[i];
|
||
console.log(`\n${i + 2}. 测试场景: ${testCase.name}`);
|
||
|
||
// 模拟前端输入处理
|
||
const processedLongitude = simulateFrontendInputProcessing(testCase.longitude);
|
||
const processedLatitude = simulateFrontendInputProcessing(testCase.latitude);
|
||
|
||
// 构建提交数据
|
||
const submitData = {
|
||
name: '输入测试农场',
|
||
owner: '测试负责人',
|
||
phone: '13800138003',
|
||
address: '测试地址',
|
||
longitude: processedLongitude,
|
||
latitude: processedLatitude,
|
||
status: 'active'
|
||
};
|
||
|
||
console.log(` 📤 提交数据:`, {
|
||
longitude: submitData.longitude,
|
||
latitude: submitData.latitude
|
||
});
|
||
|
||
// 调用后端API
|
||
const updateReq = createMockReq(submitData, { id: testFarmId });
|
||
const updateRes = createMockRes();
|
||
|
||
try {
|
||
await farmController.updateFarm(updateReq, updateRes);
|
||
|
||
console.log(` ✅ 更新成功:`, {
|
||
location: updateRes.data.data.location,
|
||
has_lng: 'lng' in (updateRes.data.data.location || {}),
|
||
has_lat: 'lat' in (updateRes.data.data.location || {})
|
||
});
|
||
|
||
// 验证数据范围
|
||
const location = updateRes.data.data.location || {};
|
||
if (location.lng !== undefined) {
|
||
if (location.lng < -180 || location.lng > 180) {
|
||
console.log(` ⚠️ 警告: 经度超出有效范围 (-180~180): ${location.lng}`);
|
||
}
|
||
}
|
||
if (location.lat !== undefined) {
|
||
if (location.lat < -90 || location.lat > 90) {
|
||
console.log(` ⚠️ 警告: 纬度超出有效范围 (-90~90): ${location.lat}`);
|
||
}
|
||
}
|
||
|
||
} catch (error) {
|
||
console.log(` ❌ 更新失败:`, error.message);
|
||
}
|
||
}
|
||
|
||
console.log('\n=== 输入流程测试完成 ===');
|
||
|
||
} catch (error) {
|
||
console.error('❌ 测试过程中出现错误:', error);
|
||
throw error;
|
||
} finally {
|
||
// 清理测试数据
|
||
if (testFarmId) {
|
||
console.log('\n🧹 清理测试数据...');
|
||
try {
|
||
await Farm.destroy({ where: { id: testFarmId } });
|
||
console.log('✓ 测试数据已清理');
|
||
} catch (error) {
|
||
console.error('清理测试数据失败:', error);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 运行测试
|
||
if (require.main === module) {
|
||
testCoordinateInputFlow()
|
||
.then(() => {
|
||
console.log('\n🎉 所有输入流程测试完成!');
|
||
process.exit(0);
|
||
})
|
||
.catch((error) => {
|
||
console.error('\n💥 输入流程测试失败:', error.message);
|
||
process.exit(1);
|
||
});
|
||
}
|
||
|
||
module.exports = { testCoordinateInputFlow }; |