feat: 添加设备IMEI和单卡ICCID查询接口
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
- 新增 GET /api/admin/devices/by-imei/:imei 接口,支持通过设备号查询设备详情 - 新增 GET /api/admin/iot-cards/by-iccid/:iccid 接口,支持通过ICCID查询单卡详情 - 添加对应的 Service 层方法和 Handler - 更新 OpenAPI 文档 - 添加集成测试并修复测试环境配置(使用环境变量) - 归档已完成的 OpenSpec 变更记录 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -40,8 +40,17 @@ type deviceTestEnv struct {
|
||||
func setupDeviceTestEnv(t *testing.T) *deviceTestEnv {
|
||||
t.Helper()
|
||||
|
||||
t.Setenv("CONFIG_ENV", "dev")
|
||||
t.Setenv("CONFIG_PATH", "../../configs/config.dev.yaml")
|
||||
// 设置测试环境变量
|
||||
t.Setenv("JUNHONG_DATABASE_HOST", "cxd.whcxd.cn")
|
||||
t.Setenv("JUNHONG_DATABASE_PORT", "16159")
|
||||
t.Setenv("JUNHONG_DATABASE_USER", "erp_pgsql")
|
||||
t.Setenv("JUNHONG_DATABASE_PASSWORD", "erp_2025")
|
||||
t.Setenv("JUNHONG_DATABASE_DBNAME", "junhong_cmp_test")
|
||||
t.Setenv("JUNHONG_REDIS_ADDRESS", "cxd.whcxd.cn")
|
||||
t.Setenv("JUNHONG_REDIS_PORT", "16299")
|
||||
t.Setenv("JUNHONG_REDIS_PASSWORD", "cpNbWtAaqgo1YJmbMp3h")
|
||||
t.Setenv("JUNHONG_JWT_SECRET_KEY", "test_secret_key_for_integration_tests")
|
||||
|
||||
cfg, err := config.Load()
|
||||
require.NoError(t, err)
|
||||
err = config.Set(cfg)
|
||||
@@ -331,3 +340,69 @@ func TestDeviceImport_TaskList(t *testing.T) {
|
||||
assert.Equal(t, 0, result.Code)
|
||||
})
|
||||
}
|
||||
|
||||
func TestDevice_GetByIMEI(t *testing.T) {
|
||||
env := setupDeviceTestEnv(t)
|
||||
defer env.teardown()
|
||||
|
||||
// 创建测试设备
|
||||
device := &model.Device{
|
||||
DeviceNo: "TEST_IMEI_001",
|
||||
DeviceName: "测试IMEI查询设备",
|
||||
DeviceType: "router",
|
||||
MaxSimSlots: 4,
|
||||
Status: constants.DeviceStatusInStock,
|
||||
}
|
||||
require.NoError(t, env.db.Create(device).Error)
|
||||
|
||||
t.Run("通过IMEI查询设备详情-成功", func(t *testing.T) {
|
||||
url := fmt.Sprintf("/api/admin/devices/by-imei/%s", device.DeviceNo)
|
||||
req := httptest.NewRequest("GET", url, nil)
|
||||
req.Header.Set("Authorization", "Bearer "+env.adminToken)
|
||||
|
||||
resp, err := env.app.Test(req, -1)
|
||||
require.NoError(t, err)
|
||||
defer resp.Body.Close()
|
||||
|
||||
assert.Equal(t, 200, resp.StatusCode)
|
||||
|
||||
var result response.Response
|
||||
err = json.NewDecoder(resp.Body).Decode(&result)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, 0, result.Code)
|
||||
|
||||
// 验证返回数据
|
||||
dataMap, ok := result.Data.(map[string]interface{})
|
||||
require.True(t, ok)
|
||||
assert.Equal(t, "TEST_IMEI_001", dataMap["device_no"])
|
||||
assert.Equal(t, "测试IMEI查询设备", dataMap["device_name"])
|
||||
})
|
||||
|
||||
t.Run("通过不存在的IMEI查询-应返回错误", func(t *testing.T) {
|
||||
req := httptest.NewRequest("GET", "/api/admin/devices/by-imei/NONEXISTENT_IMEI", nil)
|
||||
req.Header.Set("Authorization", "Bearer "+env.adminToken)
|
||||
|
||||
resp, err := env.app.Test(req, -1)
|
||||
require.NoError(t, err)
|
||||
defer resp.Body.Close()
|
||||
|
||||
var result response.Response
|
||||
err = json.NewDecoder(resp.Body).Decode(&result)
|
||||
require.NoError(t, err)
|
||||
assert.NotEqual(t, 0, result.Code, "不存在的IMEI应返回错误码")
|
||||
})
|
||||
|
||||
t.Run("未认证请求-应返回错误", func(t *testing.T) {
|
||||
url := fmt.Sprintf("/api/admin/devices/by-imei/%s", device.DeviceNo)
|
||||
req := httptest.NewRequest("GET", url, nil)
|
||||
|
||||
resp, err := env.app.Test(req, -1)
|
||||
require.NoError(t, err)
|
||||
defer resp.Body.Close()
|
||||
|
||||
var result response.Response
|
||||
err = json.NewDecoder(resp.Body).Decode(&result)
|
||||
require.NoError(t, err)
|
||||
assert.NotEqual(t, 0, result.Code, "未认证请求应返回错误码")
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user