1. 增加重复顺序校验
2. 增加测试用例
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"gorm.io/datatypes"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
@@ -54,6 +56,29 @@ func (Plan) TableName() string {
|
||||
return "plans"
|
||||
}
|
||||
|
||||
// ValidateExecutionOrder 校验计划中的步骤或子计划顺序不能有重复的
|
||||
func (p Plan) ValidateExecutionOrder() error {
|
||||
orderMap := make(map[int]bool)
|
||||
|
||||
switch p.ContentType {
|
||||
case PlanContentTypeTasks:
|
||||
for _, task := range p.Tasks {
|
||||
if orderMap[task.ExecutionOrder] {
|
||||
return fmt.Errorf("任务执行顺序重复: %d", task.ExecutionOrder)
|
||||
}
|
||||
orderMap[task.ExecutionOrder] = true
|
||||
}
|
||||
case PlanContentTypeSubPlans:
|
||||
for _, subPlan := range p.SubPlans {
|
||||
if orderMap[subPlan.ExecutionOrder] {
|
||||
return fmt.Errorf("子计划执行顺序重复: %d", subPlan.ExecutionOrder)
|
||||
}
|
||||
orderMap[subPlan.ExecutionOrder] = true
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// SubPlan 代表作为另一个计划一部分的子计划,具有执行顺序
|
||||
type SubPlan struct {
|
||||
gorm.Model
|
||||
|
||||
103
internal/infra/models/plan_test.go
Normal file
103
internal/infra/models/plan_test.go
Normal file
@@ -0,0 +1,103 @@
|
||||
package models_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPlan_ValidateExecutionOrder(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
plan models.Plan
|
||||
expectedError string // 期望的错误信息,如果为nil则表示不期望错误
|
||||
}{
|
||||
{
|
||||
name: "任务类型-无重复执行顺序",
|
||||
plan: models.Plan{
|
||||
ContentType: models.PlanContentTypeTasks,
|
||||
Tasks: []models.Task{
|
||||
{ExecutionOrder: 1},
|
||||
{ExecutionOrder: 2},
|
||||
{ExecutionOrder: 3},
|
||||
},
|
||||
},
|
||||
expectedError: "",
|
||||
},
|
||||
{
|
||||
name: "任务类型-重复执行顺序",
|
||||
plan: models.Plan{
|
||||
ContentType: models.PlanContentTypeTasks,
|
||||
Tasks: []models.Task{
|
||||
{ExecutionOrder: 1},
|
||||
{ExecutionOrder: 2},
|
||||
{ExecutionOrder: 1}, // 重复
|
||||
},
|
||||
},
|
||||
expectedError: fmt.Sprintf("任务执行顺序重复: %d", 1),
|
||||
},
|
||||
{
|
||||
name: "任务类型-空任务列表",
|
||||
plan: models.Plan{
|
||||
ContentType: models.PlanContentTypeTasks,
|
||||
Tasks: []models.Task{},
|
||||
},
|
||||
expectedError: "",
|
||||
},
|
||||
{
|
||||
name: "子计划类型-无重复执行顺序",
|
||||
plan: models.Plan{
|
||||
ContentType: models.PlanContentTypeSubPlans,
|
||||
SubPlans: []models.SubPlan{
|
||||
{ExecutionOrder: 1},
|
||||
{ExecutionOrder: 2},
|
||||
{ExecutionOrder: 3},
|
||||
},
|
||||
},
|
||||
expectedError: "",
|
||||
},
|
||||
{
|
||||
name: "子计划类型-重复执行顺序",
|
||||
plan: models.Plan{
|
||||
ContentType: models.PlanContentTypeSubPlans,
|
||||
SubPlans: []models.SubPlan{
|
||||
{ExecutionOrder: 1},
|
||||
{ExecutionOrder: 2},
|
||||
{ExecutionOrder: 1}, // 重复
|
||||
},
|
||||
},
|
||||
expectedError: fmt.Sprintf("子计划执行顺序重复: %d", 1),
|
||||
},
|
||||
{
|
||||
name: "子计划类型-空子计划列表",
|
||||
plan: models.Plan{
|
||||
ContentType: models.PlanContentTypeSubPlans,
|
||||
SubPlans: []models.SubPlan{},
|
||||
},
|
||||
expectedError: "",
|
||||
},
|
||||
{
|
||||
name: "未知内容类型",
|
||||
plan: models.Plan{
|
||||
ContentType: "UNKNOWN_TYPE", // 未知类型
|
||||
Tasks: []models.Task{{ExecutionOrder: 1}},
|
||||
},
|
||||
expectedError: "", // 对于未知类型,ValidateExecutionOrder 不会返回错误,因为它只处理已知类型
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
err := tt.plan.ValidateExecutionOrder()
|
||||
|
||||
if tt.expectedError != "" {
|
||||
assert.Error(t, err)
|
||||
assert.Contains(t, err.Error(), tt.expectedError)
|
||||
} else {
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user