1. 增加重复顺序校验

2. 增加测试用例
This commit is contained in:
2025-09-13 21:14:22 +08:00
parent 287c27a5ab
commit 9fc9cda08e
4 changed files with 414 additions and 28 deletions

View File

@@ -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

View 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)
}
})
}
}