2020-05-04 14:18:13 -05:00
|
|
|
package runner
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/nektos/act/pkg/model"
|
|
|
|
a "github.com/stretchr/testify/assert"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/sirupsen/logrus/hooks/test"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestRunContext_EvalBool(t *testing.T) {
|
|
|
|
hook := test.NewGlobal()
|
|
|
|
assert := a.New(t)
|
|
|
|
rc := &RunContext{
|
|
|
|
Config: &Config{
|
|
|
|
Workdir: ".",
|
|
|
|
},
|
|
|
|
Env: map[string]string{
|
2020-06-18 10:21:55 -05:00
|
|
|
"TRUE": "true",
|
|
|
|
"FALSE": "false",
|
2020-05-04 14:18:13 -05:00
|
|
|
"SOME_TEXT": "text",
|
|
|
|
},
|
|
|
|
Run: &model.Run{
|
|
|
|
JobID: "job1",
|
|
|
|
Workflow: &model.Workflow{
|
|
|
|
Name: "test-workflow",
|
|
|
|
Jobs: map[string]*model.Job{
|
|
|
|
"job1": {
|
|
|
|
Strategy: &model.Strategy{
|
|
|
|
Matrix: map[string][]interface{}{
|
|
|
|
"os": {"Linux", "Windows"},
|
|
|
|
"foo": {"bar", "baz"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Matrix: map[string]interface{}{
|
|
|
|
"os": "Linux",
|
|
|
|
"foo": "bar",
|
|
|
|
},
|
|
|
|
StepResults: map[string]*stepResult{
|
|
|
|
"id1": {
|
|
|
|
Outputs: map[string]string{
|
|
|
|
"foo": "bar",
|
|
|
|
},
|
|
|
|
Success: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
rc.ExprEval = rc.NewExpressionEvaluator()
|
|
|
|
|
|
|
|
tables := []struct {
|
2020-06-18 10:21:55 -05:00
|
|
|
in string
|
|
|
|
out bool
|
2020-05-04 14:18:13 -05:00
|
|
|
}{
|
|
|
|
// The basic ones
|
|
|
|
{"true", true},
|
|
|
|
{"false", false},
|
|
|
|
{"1 !== 0", true},
|
|
|
|
{"1 !== 1", false},
|
|
|
|
{"1 == 0", false},
|
|
|
|
{"1 == 1", true},
|
|
|
|
{"1 > 2", false},
|
|
|
|
{"1 < 2", true},
|
|
|
|
{"success()", true},
|
|
|
|
{"failure()", false},
|
|
|
|
// And or
|
|
|
|
{"true && false", false},
|
|
|
|
{"true && 1 < 2", true},
|
|
|
|
{"false || 1 < 2", true},
|
|
|
|
{"false || false", false},
|
|
|
|
// None boolable
|
|
|
|
{"env.SOME_TEXT", true},
|
|
|
|
{"env.UNKNOWN == 'true'", false},
|
|
|
|
{"env.UNKNOWN", false},
|
|
|
|
// Inline expressions
|
|
|
|
{"env.TRUE == 'true'", true},
|
|
|
|
{"env.FALSE == 'true'", false},
|
|
|
|
{"${{env.TRUE == 'true'}}", true},
|
|
|
|
{"${{env.FALSE == 'true'}}", false},
|
|
|
|
{"${{env.FALSE == 'false'}}", true},
|
|
|
|
// All together now
|
|
|
|
{"false || env.TRUE == 'true'", true},
|
|
|
|
{"true || env.FALSE == 'true'", true},
|
|
|
|
{"true && env.TRUE == 'true'", true},
|
|
|
|
{"false && env.TRUE == 'true'", false},
|
|
|
|
{"env.FALSE == 'true' && env.TRUE == 'true'", false},
|
|
|
|
{"env.FALSE == 'true' && true", false},
|
|
|
|
{"${{env.FALSE == 'true'}} && true", false},
|
|
|
|
// Check github context
|
|
|
|
{"github.actor == 'nektos/act'", true},
|
|
|
|
{"github.actor == 'unknown'", false},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, table := range tables {
|
|
|
|
table := table
|
|
|
|
t.Run(table.in, func(t *testing.T) {
|
|
|
|
defer hook.Reset()
|
|
|
|
b := rc.EvalBool(table.in)
|
|
|
|
|
|
|
|
assert.Equal(table.out, b, table.in)
|
|
|
|
assert.Empty(hook.LastEntry(), table.in)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|