feat: 实现企业设备授权功能并归档 OpenSpec 变更
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m39s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m39s
- 新增企业设备授权模块(Model、DTO、Service、Handler、Store) - 实现设备授权的创建、查询、更新、删除等完整业务逻辑 - 添加企业卡授权与设备授权的关联关系 - 新增 2 个数据库迁移脚本 - 同步 OpenSpec delta specs 到 main specs - 归档 add-enterprise-device-authorization 变更 - 更新 API 文档和路由配置 - 新增完整的集成测试和单元测试覆盖
This commit is contained in:
322
tests/integration/enterprise_device_h5_test.go
Normal file
322
tests/integration/enterprise_device_h5_test.go
Normal file
@@ -0,0 +1,322 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/break/junhong_cmp_fiber/internal/model"
|
||||
"github.com/break/junhong_cmp_fiber/internal/model/dto"
|
||||
"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 uniqueEDH5TestPrefix() string {
|
||||
return fmt.Sprintf("H5ED%d", time.Now().UnixNano()%1000000000)
|
||||
}
|
||||
|
||||
func TestEnterpriseDeviceH5_ListDevices(t *testing.T) {
|
||||
env := integ.NewIntegrationTestEnv(t)
|
||||
|
||||
prefix := uniqueEDH5TestPrefix()
|
||||
shop := env.CreateTestShop(prefix+"_SHOP", 1, nil)
|
||||
enterprise := env.CreateTestEnterprise(prefix+"_ENTERPRISE", &shop.ID)
|
||||
enterpriseUser := env.CreateTestAccount(prefix+"_USER", "Password123", constants.UserTypeEnterprise, nil, &enterprise.ID)
|
||||
|
||||
device := &model.Device{
|
||||
DeviceNo: prefix + "_D001",
|
||||
DeviceName: "测试设备",
|
||||
Status: 2,
|
||||
ShopID: &shop.ID,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(device).Error)
|
||||
|
||||
now := time.Now()
|
||||
deviceAuth := &model.EnterpriseDeviceAuthorization{
|
||||
EnterpriseID: enterprise.ID,
|
||||
DeviceID: device.ID,
|
||||
AuthorizedBy: 1,
|
||||
AuthorizedAt: now,
|
||||
AuthorizerType: constants.UserTypePlatform,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(deviceAuth).Error)
|
||||
|
||||
t.Run("企业用户获取授权设备列表", func(t *testing.T) {
|
||||
resp, err := env.AsUser(enterpriseUser).Request("GET", "/api/h5/devices?page=1&page_size=10", 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)
|
||||
|
||||
data := result.Data.(map[string]interface{})
|
||||
assert.Equal(t, float64(1), data["total"])
|
||||
})
|
||||
}
|
||||
|
||||
func TestEnterpriseDeviceH5_GetDeviceDetail(t *testing.T) {
|
||||
env := integ.NewIntegrationTestEnv(t)
|
||||
|
||||
prefix := uniqueEDH5TestPrefix()
|
||||
shop := env.CreateTestShop(prefix+"_SHOP", 1, nil)
|
||||
enterprise := env.CreateTestEnterprise(prefix+"_ENTERPRISE", &shop.ID)
|
||||
enterpriseUser := env.CreateTestAccount(prefix+"_USER", "Password123", constants.UserTypeEnterprise, nil, &enterprise.ID)
|
||||
|
||||
carrier := &model.Carrier{CarrierName: "测试运营商", CarrierType: "CMCC", Status: 1}
|
||||
require.NoError(t, env.TX.Create(carrier).Error)
|
||||
|
||||
device := &model.Device{
|
||||
DeviceNo: prefix + "_D001",
|
||||
DeviceName: "测试设备",
|
||||
Status: 2,
|
||||
ShopID: &shop.ID,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(device).Error)
|
||||
|
||||
card := &model.IotCard{ICCID: prefix + "0001", CardType: "normal", CarrierID: carrier.ID, Status: 2, ShopID: &shop.ID, NetworkStatus: 1}
|
||||
require.NoError(t, env.TX.Create(card).Error)
|
||||
|
||||
now := time.Now()
|
||||
binding := &model.DeviceSimBinding{DeviceID: device.ID, IotCardID: card.ID, SlotPosition: 1, BindStatus: 1, BindTime: &now}
|
||||
require.NoError(t, env.TX.Create(binding).Error)
|
||||
|
||||
deviceAuth := &model.EnterpriseDeviceAuthorization{
|
||||
EnterpriseID: enterprise.ID,
|
||||
DeviceID: device.ID,
|
||||
AuthorizedBy: 1,
|
||||
AuthorizedAt: now,
|
||||
AuthorizerType: constants.UserTypePlatform,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(deviceAuth).Error)
|
||||
|
||||
cardAuth := &model.EnterpriseCardAuthorization{
|
||||
EnterpriseID: enterprise.ID,
|
||||
CardID: card.ID,
|
||||
DeviceAuthID: &deviceAuth.ID,
|
||||
AuthorizedBy: 1,
|
||||
AuthorizedAt: now,
|
||||
AuthorizerType: constants.UserTypePlatform,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(cardAuth).Error)
|
||||
|
||||
t.Run("成功获取设备详情", func(t *testing.T) {
|
||||
url := fmt.Sprintf("/api/h5/devices/%d", device.ID)
|
||||
resp, err := env.AsUser(enterpriseUser).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)
|
||||
|
||||
data := result.Data.(map[string]interface{})
|
||||
deviceInfo := data["device"].(map[string]interface{})
|
||||
assert.Equal(t, float64(device.ID), deviceInfo["device_id"])
|
||||
assert.Equal(t, device.DeviceNo, deviceInfo["device_no"])
|
||||
|
||||
cards := data["cards"].([]interface{})
|
||||
assert.Len(t, cards, 1)
|
||||
})
|
||||
|
||||
t.Run("设备未授权返回错误", func(t *testing.T) {
|
||||
device2 := &model.Device{
|
||||
DeviceNo: prefix + "_D002",
|
||||
DeviceName: "未授权设备",
|
||||
Status: 2,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(device2).Error)
|
||||
|
||||
url := fmt.Sprintf("/api/h5/devices/%d", device2.ID)
|
||||
resp, err := env.AsUser(enterpriseUser).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)
|
||||
})
|
||||
}
|
||||
|
||||
func TestEnterpriseDeviceH5_SuspendCard(t *testing.T) {
|
||||
env := integ.NewIntegrationTestEnv(t)
|
||||
|
||||
prefix := uniqueEDH5TestPrefix()
|
||||
shop := env.CreateTestShop(prefix+"_SHOP", 1, nil)
|
||||
enterprise := env.CreateTestEnterprise(prefix+"_ENTERPRISE", &shop.ID)
|
||||
enterpriseUser := env.CreateTestAccount(prefix+"_USER", "Password123", constants.UserTypeEnterprise, nil, &enterprise.ID)
|
||||
|
||||
carrier := &model.Carrier{CarrierName: "测试运营商", CarrierType: "CMCC", Status: 1}
|
||||
require.NoError(t, env.TX.Create(carrier).Error)
|
||||
|
||||
device := &model.Device{
|
||||
DeviceNo: prefix + "_D001",
|
||||
DeviceName: "测试设备",
|
||||
Status: 2,
|
||||
ShopID: &shop.ID,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(device).Error)
|
||||
|
||||
card := &model.IotCard{ICCID: prefix + "0001", CardType: "normal", CarrierID: carrier.ID, Status: 2, ShopID: &shop.ID, NetworkStatus: 1}
|
||||
require.NoError(t, env.TX.Create(card).Error)
|
||||
|
||||
now := time.Now()
|
||||
binding := &model.DeviceSimBinding{DeviceID: device.ID, IotCardID: card.ID, SlotPosition: 1, BindStatus: 1, BindTime: &now}
|
||||
require.NoError(t, env.TX.Create(binding).Error)
|
||||
|
||||
deviceAuth := &model.EnterpriseDeviceAuthorization{
|
||||
EnterpriseID: enterprise.ID,
|
||||
DeviceID: device.ID,
|
||||
AuthorizedBy: 1,
|
||||
AuthorizedAt: now,
|
||||
AuthorizerType: constants.UserTypePlatform,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(deviceAuth).Error)
|
||||
|
||||
cardAuth := &model.EnterpriseCardAuthorization{
|
||||
EnterpriseID: enterprise.ID,
|
||||
CardID: card.ID,
|
||||
DeviceAuthID: &deviceAuth.ID,
|
||||
AuthorizedBy: 1,
|
||||
AuthorizedAt: now,
|
||||
AuthorizerType: constants.UserTypePlatform,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(cardAuth).Error)
|
||||
|
||||
t.Run("成功停机", func(t *testing.T) {
|
||||
reqBody := dto.DeviceCardOperationReq{Reason: "测试停机"}
|
||||
body, _ := json.Marshal(reqBody)
|
||||
|
||||
url := fmt.Sprintf("/api/h5/devices/%d/cards/%d/suspend", device.ID, card.ID)
|
||||
resp, err := env.AsUser(enterpriseUser).Request("POST", url, body)
|
||||
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)
|
||||
|
||||
data := result.Data.(map[string]interface{})
|
||||
assert.Equal(t, true, data["success"])
|
||||
})
|
||||
|
||||
t.Run("卡不属于设备返回错误", func(t *testing.T) {
|
||||
card2 := &model.IotCard{ICCID: prefix + "0002", CardType: "normal", CarrierID: carrier.ID, Status: 2}
|
||||
require.NoError(t, env.TX.Create(card2).Error)
|
||||
|
||||
reqBody := dto.DeviceCardOperationReq{Reason: "测试停机"}
|
||||
body, _ := json.Marshal(reqBody)
|
||||
|
||||
url := fmt.Sprintf("/api/h5/devices/%d/cards/%d/suspend", device.ID, card2.ID)
|
||||
resp, err := env.AsUser(enterpriseUser).Request("POST", url, body)
|
||||
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 TestEnterpriseDeviceH5_ResumeCard(t *testing.T) {
|
||||
env := integ.NewIntegrationTestEnv(t)
|
||||
|
||||
prefix := uniqueEDH5TestPrefix()
|
||||
shop := env.CreateTestShop(prefix+"_SHOP", 1, nil)
|
||||
enterprise := env.CreateTestEnterprise(prefix+"_ENTERPRISE", &shop.ID)
|
||||
enterpriseUser := env.CreateTestAccount(prefix+"_USER", "Password123", constants.UserTypeEnterprise, nil, &enterprise.ID)
|
||||
|
||||
carrier := &model.Carrier{CarrierName: "测试运营商", CarrierType: "CMCC", Status: 1}
|
||||
require.NoError(t, env.TX.Create(carrier).Error)
|
||||
|
||||
device := &model.Device{
|
||||
DeviceNo: prefix + "_D001",
|
||||
DeviceName: "测试设备",
|
||||
Status: 2,
|
||||
ShopID: &shop.ID,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(device).Error)
|
||||
|
||||
card := &model.IotCard{ICCID: prefix + "0001", CardType: "normal", CarrierID: carrier.ID, Status: 2, ShopID: &shop.ID, NetworkStatus: 0}
|
||||
require.NoError(t, env.TX.Create(card).Error)
|
||||
|
||||
now := time.Now()
|
||||
binding := &model.DeviceSimBinding{DeviceID: device.ID, IotCardID: card.ID, SlotPosition: 1, BindStatus: 1, BindTime: &now}
|
||||
require.NoError(t, env.TX.Create(binding).Error)
|
||||
|
||||
deviceAuth := &model.EnterpriseDeviceAuthorization{
|
||||
EnterpriseID: enterprise.ID,
|
||||
DeviceID: device.ID,
|
||||
AuthorizedBy: 1,
|
||||
AuthorizedAt: now,
|
||||
AuthorizerType: constants.UserTypePlatform,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(deviceAuth).Error)
|
||||
|
||||
cardAuth := &model.EnterpriseCardAuthorization{
|
||||
EnterpriseID: enterprise.ID,
|
||||
CardID: card.ID,
|
||||
DeviceAuthID: &deviceAuth.ID,
|
||||
AuthorizedBy: 1,
|
||||
AuthorizedAt: now,
|
||||
AuthorizerType: constants.UserTypePlatform,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(cardAuth).Error)
|
||||
|
||||
t.Run("成功复机", func(t *testing.T) {
|
||||
reqBody := dto.DeviceCardOperationReq{Reason: "测试复机"}
|
||||
body, _ := json.Marshal(reqBody)
|
||||
|
||||
url := fmt.Sprintf("/api/h5/devices/%d/cards/%d/resume", device.ID, card.ID)
|
||||
resp, err := env.AsUser(enterpriseUser).Request("POST", url, body)
|
||||
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)
|
||||
|
||||
data := result.Data.(map[string]interface{})
|
||||
assert.Equal(t, true, data["success"])
|
||||
})
|
||||
|
||||
t.Run("设备未授权返回错误", func(t *testing.T) {
|
||||
device2 := &model.Device{
|
||||
DeviceNo: prefix + "_D002",
|
||||
DeviceName: "未授权设备",
|
||||
Status: 2,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(device2).Error)
|
||||
|
||||
reqBody := dto.DeviceCardOperationReq{Reason: "测试复机"}
|
||||
body, _ := json.Marshal(reqBody)
|
||||
|
||||
url := fmt.Sprintf("/api/h5/devices/%d/cards/%d/resume", device2.ID, card.ID)
|
||||
resp, err := env.AsUser(enterpriseUser).Request("POST", url, body)
|
||||
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)
|
||||
})
|
||||
}
|
||||
249
tests/integration/enterprise_device_test.go
Normal file
249
tests/integration/enterprise_device_test.go
Normal file
@@ -0,0 +1,249 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/break/junhong_cmp_fiber/internal/model"
|
||||
"github.com/break/junhong_cmp_fiber/internal/model/dto"
|
||||
"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 uniqueEDTestPrefix() string {
|
||||
return fmt.Sprintf("ED%d", time.Now().UnixNano()%1000000000)
|
||||
}
|
||||
|
||||
func TestEnterpriseDevice_AllocateDevices(t *testing.T) {
|
||||
env := integ.NewIntegrationTestEnv(t)
|
||||
|
||||
prefix := uniqueEDTestPrefix()
|
||||
shop := env.CreateTestShop(prefix+"_SHOP", 1, nil)
|
||||
enterprise := env.CreateTestEnterprise(prefix+"_ENTERPRISE", &shop.ID)
|
||||
|
||||
device1 := &model.Device{
|
||||
DeviceNo: prefix + "_D001",
|
||||
DeviceName: "测试设备1",
|
||||
Status: 2,
|
||||
ShopID: &shop.ID,
|
||||
}
|
||||
device2 := &model.Device{
|
||||
DeviceNo: prefix + "_D002",
|
||||
DeviceName: "测试设备2",
|
||||
Status: 2,
|
||||
ShopID: &shop.ID,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(device1).Error)
|
||||
require.NoError(t, env.TX.Create(device2).Error)
|
||||
|
||||
carrier := &model.Carrier{CarrierName: "测试运营商", CarrierType: "CMCC", Status: 1}
|
||||
require.NoError(t, env.TX.Create(carrier).Error)
|
||||
|
||||
card := &model.IotCard{ICCID: prefix + "0001", CardType: "normal", CarrierID: carrier.ID, Status: 2, ShopID: &shop.ID}
|
||||
require.NoError(t, env.TX.Create(card).Error)
|
||||
|
||||
now := time.Now()
|
||||
binding := &model.DeviceSimBinding{DeviceID: device1.ID, IotCardID: card.ID, SlotPosition: 1, BindStatus: 1, BindTime: &now}
|
||||
require.NoError(t, env.TX.Create(binding).Error)
|
||||
|
||||
t.Run("成功授权设备给企业", func(t *testing.T) {
|
||||
reqBody := dto.AllocateDevicesReq{
|
||||
DeviceNos: []string{device1.DeviceNo},
|
||||
Remark: "集成测试授权",
|
||||
}
|
||||
body, _ := json.Marshal(reqBody)
|
||||
|
||||
url := fmt.Sprintf("/api/admin/enterprises/%d/allocate-devices", enterprise.ID)
|
||||
resp, err := env.AsSuperAdmin().Request("POST", url, body)
|
||||
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)
|
||||
|
||||
data := result.Data.(map[string]interface{})
|
||||
assert.Equal(t, float64(1), data["success_count"])
|
||||
assert.Equal(t, float64(0), data["fail_count"])
|
||||
})
|
||||
|
||||
t.Run("设备不存在时记录失败", func(t *testing.T) {
|
||||
reqBody := dto.AllocateDevicesReq{
|
||||
DeviceNos: []string{"NOT_EXIST_DEVICE"},
|
||||
}
|
||||
body, _ := json.Marshal(reqBody)
|
||||
|
||||
url := fmt.Sprintf("/api/admin/enterprises/%d/allocate-devices", enterprise.ID)
|
||||
resp, err := env.AsSuperAdmin().Request("POST", url, body)
|
||||
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)
|
||||
|
||||
data := result.Data.(map[string]interface{})
|
||||
assert.Equal(t, float64(0), data["success_count"])
|
||||
assert.Equal(t, float64(1), data["fail_count"])
|
||||
})
|
||||
|
||||
t.Run("企业不存在返回错误", func(t *testing.T) {
|
||||
reqBody := dto.AllocateDevicesReq{
|
||||
DeviceNos: []string{device2.DeviceNo},
|
||||
}
|
||||
body, _ := json.Marshal(reqBody)
|
||||
|
||||
resp, err := env.AsSuperAdmin().Request("POST", "/api/admin/enterprises/99999/allocate-devices", body)
|
||||
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 TestEnterpriseDevice_RecallDevices(t *testing.T) {
|
||||
env := integ.NewIntegrationTestEnv(t)
|
||||
|
||||
prefix := uniqueEDTestPrefix()
|
||||
shop := env.CreateTestShop(prefix+"_SHOP", 1, nil)
|
||||
enterprise := env.CreateTestEnterprise(prefix+"_ENTERPRISE", &shop.ID)
|
||||
|
||||
device := &model.Device{
|
||||
DeviceNo: prefix + "_D001",
|
||||
DeviceName: "测试设备",
|
||||
Status: 2,
|
||||
ShopID: &shop.ID,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(device).Error)
|
||||
|
||||
now := time.Now()
|
||||
deviceAuth := &model.EnterpriseDeviceAuthorization{
|
||||
EnterpriseID: enterprise.ID,
|
||||
DeviceID: device.ID,
|
||||
AuthorizedBy: 1,
|
||||
AuthorizedAt: now,
|
||||
AuthorizerType: constants.UserTypePlatform,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(deviceAuth).Error)
|
||||
|
||||
t.Run("成功撤销设备授权", func(t *testing.T) {
|
||||
reqBody := dto.RecallDevicesReq{
|
||||
DeviceNos: []string{device.DeviceNo},
|
||||
}
|
||||
body, _ := json.Marshal(reqBody)
|
||||
|
||||
url := fmt.Sprintf("/api/admin/enterprises/%d/recall-devices", enterprise.ID)
|
||||
resp, err := env.AsSuperAdmin().Request("POST", url, body)
|
||||
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)
|
||||
|
||||
data := result.Data.(map[string]interface{})
|
||||
assert.Equal(t, float64(1), data["success_count"])
|
||||
})
|
||||
|
||||
t.Run("设备未授权时返回失败", func(t *testing.T) {
|
||||
reqBody := dto.RecallDevicesReq{
|
||||
DeviceNos: []string{prefix + "_D002"},
|
||||
}
|
||||
body, _ := json.Marshal(reqBody)
|
||||
|
||||
url := fmt.Sprintf("/api/admin/enterprises/%d/recall-devices", enterprise.ID)
|
||||
resp, err := env.AsSuperAdmin().Request("POST", url, body)
|
||||
require.NoError(t, err)
|
||||
defer resp.Body.Close()
|
||||
|
||||
var result response.Response
|
||||
err = json.NewDecoder(resp.Body).Decode(&result)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, 0, result.Code)
|
||||
|
||||
data := result.Data.(map[string]interface{})
|
||||
assert.Equal(t, float64(0), data["success_count"])
|
||||
assert.Equal(t, float64(1), data["fail_count"])
|
||||
})
|
||||
}
|
||||
|
||||
func TestEnterpriseDevice_ListDevices(t *testing.T) {
|
||||
env := integ.NewIntegrationTestEnv(t)
|
||||
|
||||
prefix := uniqueEDTestPrefix()
|
||||
shop := env.CreateTestShop(prefix+"_SHOP", 1, nil)
|
||||
enterprise := env.CreateTestEnterprise(prefix+"_ENTERPRISE", &shop.ID)
|
||||
|
||||
devices := make([]*model.Device, 3)
|
||||
for i := 0; i < 3; i++ {
|
||||
devices[i] = &model.Device{
|
||||
DeviceNo: fmt.Sprintf("%s_D%03d", prefix, i+1),
|
||||
DeviceName: fmt.Sprintf("测试设备%d", i+1),
|
||||
Status: 2,
|
||||
ShopID: &shop.ID,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(devices[i]).Error)
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
for _, device := range devices[:2] {
|
||||
auth := &model.EnterpriseDeviceAuthorization{
|
||||
EnterpriseID: enterprise.ID,
|
||||
DeviceID: device.ID,
|
||||
AuthorizedBy: 1,
|
||||
AuthorizedAt: now,
|
||||
AuthorizerType: constants.UserTypePlatform,
|
||||
}
|
||||
require.NoError(t, env.TX.Create(auth).Error)
|
||||
}
|
||||
|
||||
t.Run("获取企业授权设备列表", func(t *testing.T) {
|
||||
url := fmt.Sprintf("/api/admin/enterprises/%d/devices?page=1&page_size=10", enterprise.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)
|
||||
|
||||
data := result.Data.(map[string]interface{})
|
||||
assert.Equal(t, float64(2), data["total"])
|
||||
})
|
||||
|
||||
t.Run("分页查询", func(t *testing.T) {
|
||||
url := fmt.Sprintf("/api/admin/enterprises/%d/devices?page=1&page_size=1", enterprise.ID)
|
||||
resp, err := env.AsSuperAdmin().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.Equal(t, 0, result.Code)
|
||||
|
||||
data := result.Data.(map[string]interface{})
|
||||
items := data["items"].([]interface{})
|
||||
assert.Len(t, items, 1)
|
||||
})
|
||||
}
|
||||
@@ -48,18 +48,17 @@ func TestRoleAPI_Create(t *testing.T) {
|
||||
assert.Equal(t, int64(1), count)
|
||||
})
|
||||
|
||||
// TODO: 当前 RoleHandler 未实现请求验证,跳过此测试
|
||||
// t.Run("缺少必填字段返回错误", func(t *testing.T) {
|
||||
// reqBody := map[string]interface{}{
|
||||
// "role_desc": "缺少名称",
|
||||
// }
|
||||
// jsonBody, _ := json.Marshal(reqBody)
|
||||
// resp, err := env.AsSuperAdmin().Request("POST", "/api/admin/roles", jsonBody)
|
||||
// require.NoError(t, err)
|
||||
// var result response.Response
|
||||
// json.NewDecoder(resp.Body).Decode(&result)
|
||||
// assert.NotEqual(t, 0, result.Code)
|
||||
// })
|
||||
t.Run("缺少必填字段返回错误", func(t *testing.T) {
|
||||
reqBody := map[string]interface{}{
|
||||
"role_desc": "缺少名称",
|
||||
}
|
||||
jsonBody, _ := json.Marshal(reqBody)
|
||||
resp, err := env.AsSuperAdmin().Request("POST", "/api/admin/roles", jsonBody)
|
||||
require.NoError(t, err)
|
||||
var result response.Response
|
||||
json.NewDecoder(resp.Body).Decode(&result)
|
||||
assert.NotEqual(t, 0, result.Code)
|
||||
})
|
||||
}
|
||||
|
||||
func TestRoleAPI_Get(t *testing.T) {
|
||||
@@ -278,7 +277,4 @@ func TestRoleAPI_UpdateStatus(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, errors.CodeRoleNotFound, result.Code)
|
||||
})
|
||||
|
||||
// TODO: 当前 RoleHandler 未实现请求验证,跳过此测试
|
||||
// t.Run("无效状态值返回错误", func(t *testing.T) { ... })
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user