Skip to content

Commit c4c8cf7

Browse files
committed
add validation
1 parent ec1c9f5 commit c4c8cf7

3 files changed

Lines changed: 61 additions & 6 deletions

File tree

internal/core/spec/builder.go

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1319,14 +1319,26 @@ func buildContinueOn(_ StepBuildContext, def stepDef, step *core.Step) error {
13191319

13201320
case map[string]any:
13211321
// Object syntax with detailed configuration
1322-
if failure, ok := v["failure"].(bool); ok {
1323-
step.ContinueOn.Failure = failure
1322+
if val, exists := v["failure"]; exists {
1323+
b, ok := val.(bool)
1324+
if !ok {
1325+
return core.NewValidationError("continueOn.failure", val, ErrContinueOnFieldMustBeBool)
1326+
}
1327+
step.ContinueOn.Failure = b
13241328
}
1325-
if skipped, ok := v["skipped"].(bool); ok {
1326-
step.ContinueOn.Skipped = skipped
1329+
if val, exists := v["skipped"]; exists {
1330+
b, ok := val.(bool)
1331+
if !ok {
1332+
return core.NewValidationError("continueOn.skipped", val, ErrContinueOnFieldMustBeBool)
1333+
}
1334+
step.ContinueOn.Skipped = b
13271335
}
1328-
if markSuccess, ok := v["markSuccess"].(bool); ok {
1329-
step.ContinueOn.MarkSuccess = markSuccess
1336+
if val, exists := v["markSuccess"]; exists {
1337+
b, ok := val.(bool)
1338+
if !ok {
1339+
return core.NewValidationError("continueOn.markSuccess", val, ErrContinueOnFieldMustBeBool)
1340+
}
1341+
step.ContinueOn.MarkSuccess = b
13301342
}
13311343

13321344
exitCodes, err := parseIntOrArray(v["exitCode"])

internal/core/spec/builder_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1351,6 +1351,48 @@ steps:
13511351
assert.Equal(t, []int{1, 2, 3}, th.Steps[0].ContinueOn.ExitCode)
13521352
assert.True(t, th.Steps[0].ContinueOn.MarkSuccess)
13531353
})
1354+
t.Run("ContinueOnInvalidFailureType", func(t *testing.T) {
1355+
t.Parallel()
1356+
1357+
data := []byte(`
1358+
steps:
1359+
- command: "echo 1"
1360+
continueOn:
1361+
failure: "true"
1362+
`)
1363+
_, err := spec.LoadYAML(context.Background(), data)
1364+
require.Error(t, err)
1365+
assert.Contains(t, err.Error(), "continueOn.failure")
1366+
assert.Contains(t, err.Error(), "boolean")
1367+
})
1368+
t.Run("ContinueOnInvalidSkippedType", func(t *testing.T) {
1369+
t.Parallel()
1370+
1371+
data := []byte(`
1372+
steps:
1373+
- command: "echo 1"
1374+
continueOn:
1375+
skipped: 1
1376+
`)
1377+
_, err := spec.LoadYAML(context.Background(), data)
1378+
require.Error(t, err)
1379+
assert.Contains(t, err.Error(), "continueOn.skipped")
1380+
assert.Contains(t, err.Error(), "boolean")
1381+
})
1382+
t.Run("ContinueOnInvalidMarkSuccessType", func(t *testing.T) {
1383+
t.Parallel()
1384+
1385+
data := []byte(`
1386+
steps:
1387+
- command: "echo 1"
1388+
continueOn:
1389+
markSuccess: "yes"
1390+
`)
1391+
_, err := spec.LoadYAML(context.Background(), data)
1392+
require.Error(t, err)
1393+
assert.Contains(t, err.Error(), "continueOn.markSuccess")
1394+
assert.Contains(t, err.Error(), "boolean")
1395+
})
13541396
t.Run("RetryPolicy", func(t *testing.T) {
13551397
t.Parallel()
13561398

internal/core/spec/errors.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ var (
1717
ErrContinueOnOutputMustBeStringOrArray = errors.New("continueOn.output must be a string or an array of strings")
1818
ErrContinueOnMustBeStringOrMap = errors.New("continueOn must be a string ('skipped' or 'failed') or an object")
1919
ErrContinueOnInvalidStringValue = errors.New("continueOn string value must be 'skipped' or 'failed'")
20+
ErrContinueOnFieldMustBeBool = errors.New("value must be a boolean")
2021
ErrInvalidSignal = errors.New("invalid signal")
2122
ErrDependsMustBeStringOrArray = errors.New("depends must be a string or an array of strings")
2223
ErrExecutorTypeMustBeString = errors.New("executor.type value must be string")

0 commit comments

Comments
 (0)