mirror of
https://gitea.com/gitea/act_runner.git
synced 2026-03-05 11:20:24 +00:00
142 lines
3.6 KiB
Go
142 lines
3.6 KiB
Go
package model
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
v2 "gitea.com/gitea/act_runner/internal/eval/v2"
|
|
"gitea.com/gitea/act_runner/internal/templateeval"
|
|
"gitea.com/gitea/act_runner/pkg/schema"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
func TestParseWorkflow(t *testing.T) {
|
|
ee := &templateeval.ExpressionEvaluator{
|
|
EvaluationContext: v2.EvaluationContext{
|
|
Variables: v2.CaseInsensitiveObject[any]{},
|
|
Functions: v2.GetFunctions(),
|
|
},
|
|
}
|
|
var node yaml.Node
|
|
err := yaml.Unmarshal([]byte(`
|
|
on: push
|
|
run-name: ${{ fromjson('{}') }}
|
|
jobs:
|
|
_:
|
|
name: ${{ github.ref_name }}
|
|
steps:
|
|
- run: echo Hello World
|
|
env:
|
|
TAG: ${{ env.global }}
|
|
`), &node)
|
|
require.NoError(t, err)
|
|
err = ee.EvaluateYamlNode(context.Background(), node.Content[0], &schema.Node{
|
|
Definition: "workflow-root",
|
|
Schema: schema.GetWorkflowSchema(),
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
ee.RestrictEval = true
|
|
ee.EvaluationContext.Variables = v2.CaseInsensitiveObject[any]{
|
|
"github": v2.CaseInsensitiveObject[any]{
|
|
"ref_name": "self",
|
|
},
|
|
"vars": v2.CaseInsensitiveObject[any]{},
|
|
"inputs": v2.CaseInsensitiveObject[any]{},
|
|
}
|
|
|
|
err = ee.EvaluateYamlNode(context.Background(), node.Content[0], &schema.Node{
|
|
Definition: "workflow-root",
|
|
Schema: schema.GetWorkflowSchema(),
|
|
})
|
|
require.Error(t, err)
|
|
var myw Workflow
|
|
require.NoError(t, node.Decode(&myw))
|
|
}
|
|
|
|
func TestParseWorkflowCall(t *testing.T) {
|
|
ee := &templateeval.ExpressionEvaluator{
|
|
EvaluationContext: v2.EvaluationContext{
|
|
Variables: v2.CaseInsensitiveObject[any]{},
|
|
Functions: v2.GetFunctions(),
|
|
},
|
|
}
|
|
var node yaml.Node
|
|
// jobs.test.outputs.test
|
|
err := yaml.Unmarshal([]byte(`
|
|
on:
|
|
workflow_call:
|
|
outputs:
|
|
test:
|
|
value: ${{ jobs.test.outputs.test }} # tojson(vars.raw)
|
|
run-name: ${{ github.ref_name }}
|
|
jobs:
|
|
_:
|
|
runs-on: ubuntu-latest
|
|
name: ${{ github.ref_name }}
|
|
steps:
|
|
- run: echo Hello World
|
|
env:
|
|
TAG: ${{ env.global }}
|
|
`), &node)
|
|
require.NoError(t, err)
|
|
require.NoError(t, resolveAliases(node.Content[0]))
|
|
require.NoError(t, (&schema.Node{
|
|
Definition: "workflow-root",
|
|
Schema: schema.GetWorkflowSchema(),
|
|
}).UnmarshalYAML(node.Content[0]))
|
|
err = ee.EvaluateYamlNode(context.Background(), node.Content[0], &schema.Node{
|
|
Definition: "workflow-root",
|
|
Schema: schema.GetWorkflowSchema(),
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
var raw any
|
|
err = node.Content[0].Decode(&raw)
|
|
require.NoError(t, err)
|
|
|
|
ee.RestrictEval = true
|
|
ee.EvaluationContext.Variables = v2.CaseInsensitiveObject[any]{
|
|
"github": v2.CaseInsensitiveObject[any]{
|
|
"ref_name": "self",
|
|
},
|
|
"vars": v2.CaseInsensitiveObject[any]{
|
|
"raw": raw,
|
|
},
|
|
"inputs": v2.CaseInsensitiveObject[any]{},
|
|
"jobs": v2.CaseInsensitiveObject[any]{
|
|
"test": v2.CaseInsensitiveObject[any]{
|
|
"outputs": v2.CaseInsensitiveObject[any]{
|
|
"test": "Hello World",
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
err = ee.EvaluateYamlNode(context.Background(), node.Content[0], &schema.Node{
|
|
RestrictEval: true,
|
|
Definition: "workflow-root",
|
|
Schema: schema.GetWorkflowSchema(),
|
|
})
|
|
require.NoError(t, err)
|
|
var myw Workflow
|
|
require.NoError(t, node.Decode(&myw))
|
|
workflowCall := myw.On.WorkflowCall
|
|
if workflowCall != nil {
|
|
for _, out := range workflowCall.Outputs {
|
|
err = ee.EvaluateYamlNode(context.Background(), &out.Value, &schema.Node{
|
|
RestrictEval: true,
|
|
Definition: "workflow-output-context",
|
|
Schema: schema.GetWorkflowSchema(),
|
|
})
|
|
require.NoError(t, err)
|
|
require.Equal(t, "Hello World", out.Value.Value)
|
|
}
|
|
}
|
|
out, err := yaml.Marshal(&myw)
|
|
require.NoError(t, err)
|
|
assert.NotEmpty(t, out)
|
|
}
|