package integration import ( "encoding/json" "fmt" "testing" "github.com/break/junhong_cmp_fiber/internal/model" "github.com/break/junhong_cmp_fiber/pkg/constants" "github.com/break/junhong_cmp_fiber/pkg/response" "github.com/break/junhong_cmp_fiber/tests/testutils/integ" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestDevice_List(t *testing.T) { env := integ.NewIntegrationTestEnv(t) // 创建测试设备 devices := []*model.Device{ {DeviceNo: "TEST_DEVICE_001", DeviceName: "测试设备1", DeviceType: "router", MaxSimSlots: 4, Status: constants.DeviceStatusInStock}, {DeviceNo: "TEST_DEVICE_002", DeviceName: "测试设备2", DeviceType: "router", MaxSimSlots: 2, Status: constants.DeviceStatusInStock}, {DeviceNo: "TEST_DEVICE_003", DeviceName: "测试设备3", DeviceType: "mifi", MaxSimSlots: 1, Status: constants.DeviceStatusDistributed}, } for _, device := range devices { require.NoError(t, env.TX.Create(device).Error) } t.Run("获取设备列表-无过滤", func(t *testing.T) { resp, err := env.AsSuperAdmin().Request("GET", "/api/admin/devices?page=1&page_size=20", nil) 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) }) t.Run("获取设备列表-按设备类型过滤", func(t *testing.T) { resp, err := env.AsSuperAdmin().Request("GET", "/api/admin/devices?device_type=router", nil) 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) }) t.Run("获取设备列表-按状态过滤", func(t *testing.T) { resp, err := env.AsSuperAdmin().Request("GET", fmt.Sprintf("/api/admin/devices?status=%d", constants.DeviceStatusInStock), nil) 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) }) t.Run("未认证请求应返回错误", func(t *testing.T) { resp, err := env.ClearAuth().Request("GET", "/api/admin/devices", nil) 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, "未认证请求应返回错误码") }) } func TestDevice_GetByID(t *testing.T) { env := integ.NewIntegrationTestEnv(t) // 创建测试设备 device := &model.Device{ DeviceNo: "TEST_DEVICE_GET_001", DeviceName: "测试设备详情", DeviceType: "router", MaxSimSlots: 4, Status: constants.DeviceStatusInStock, } require.NoError(t, env.TX.Create(device).Error) t.Run("获取设备详情-成功", func(t *testing.T) { url := fmt.Sprintf("/api/admin/devices/%d", device.ID) resp, err := env.AsSuperAdmin().Request("GET", url, nil) 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_DEVICE_GET_001", dataMap["device_no"]) }) t.Run("获取不存在的设备-应返回错误", func(t *testing.T) { resp, err := env.AsSuperAdmin().Request("GET", "/api/admin/devices/999999", nil) 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, "不存在的设备应返回错误码") }) } func TestDevice_Delete(t *testing.T) { env := integ.NewIntegrationTestEnv(t) device := &model.Device{ DeviceNo: "TEST_DEVICE_DEL_001", DeviceName: "测试删除设备", DeviceType: "router", MaxSimSlots: 4, Status: constants.DeviceStatusInStock, } require.NoError(t, env.TX.Create(device).Error) t.Run("删除设备-成功", func(t *testing.T) { url := fmt.Sprintf("/api/admin/devices/%d", device.ID) resp, err := env.AsSuperAdmin().Request("DELETE", url, nil) 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) var deletedDevice model.Device err = env.RawDB().Unscoped().First(&deletedDevice, device.ID).Error require.NoError(t, err) assert.NotNil(t, deletedDevice.DeletedAt) }) } func TestDeviceImport_TaskList(t *testing.T) { env := integ.NewIntegrationTestEnv(t) task := &model.DeviceImportTask{ TaskNo: "TEST_DEVICE_IMPORT_001", Status: model.ImportTaskStatusCompleted, BatchNo: "TEST_BATCH_001", TotalCount: 100, } require.NoError(t, env.TX.Create(task).Error) t.Run("获取导入任务列表", func(t *testing.T) { resp, err := env.AsSuperAdmin().Request("GET", "/api/admin/devices/import/tasks?page=1&page_size=20", nil) 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) }) t.Run("获取导入任务详情", func(t *testing.T) { url := fmt.Sprintf("/api/admin/devices/import/tasks/%d", task.ID) resp, err := env.AsSuperAdmin().Request("GET", url, nil) 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) }) } func TestDevice_GetByIMEI(t *testing.T) { env := integ.NewIntegrationTestEnv(t) // 创建测试设备 device := &model.Device{ DeviceNo: "TEST_IMEI_001", DeviceName: "测试IMEI查询设备", DeviceType: "router", MaxSimSlots: 4, Status: constants.DeviceStatusInStock, } require.NoError(t, env.TX.Create(device).Error) t.Run("通过IMEI查询设备详情-成功", func(t *testing.T) { url := fmt.Sprintf("/api/admin/devices/by-imei/%s", device.DeviceNo) resp, err := env.AsSuperAdmin().Request("GET", url, nil) 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) { resp, err := env.AsSuperAdmin().Request("GET", "/api/admin/devices/by-imei/NONEXISTENT_IMEI", nil) 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) resp, err := env.ClearAuth().Request("GET", url, nil) 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, "未认证请求应返回错误码") }) }