package tpl import ( "encoding/json" "strings" "testing" "github.com/OliveTin/OliveTin/internal/entities" "github.com/stretchr/testify/assert" ) type parseTemplateJsonTestCase struct { name string source string ent *entities.Entity args map[string]string expectedOutput string expectError bool checkJsonOnly bool } func assertParseTemplateJsonCase(t *testing.T, tt parseTemplateJsonTestCase, output string, err error) { if tt.expectError { assert.Error(t, err) return } assert.NoError(t, err) if tt.checkJsonOnly { prefix := strings.TrimSuffix(tt.expectedOutput, " ") assert.True(t, strings.HasPrefix(output, prefix), "output %q should start with %q", output, prefix) jsonPart := strings.TrimSpace(strings.TrimPrefix(output, prefix)) var decoded map[string]string err := json.Unmarshal([]byte(jsonPart), &decoded) assert.NoError(t, err) for k, v := range tt.args { assert.Equal(t, v, decoded[k], "decoded JSON should contain %s=%s", k, v) } assert.Len(t, decoded, len(tt.args)) return } assert.Equal(t, tt.expectedOutput, output) } func TestParseTemplateWithActionContext_Json(t *testing.T) { tests := []parseTemplateJsonTestCase{ { name: "Arguments piped to Json", source: `echo {{ .Arguments | Json }}`, ent: nil, args: map[string]string{"value": "true", "ot_username": "alice"}, expectedOutput: `echo `, expectError: false, checkJsonOnly: true, }, { name: "CurrentEntity field piped to Json", source: `curl -d {{ .CurrentEntity.foo.bar | Json }}`, ent: &entities.Entity{Data: map[string]any{"foo": map[string]any{"bar": "baz"}}}, args: nil, expectedOutput: `curl -d "baz"`, expectError: false, }, { name: "CurrentEntity nested object piped to Json", source: `curl --json -d {{ .CurrentEntity.payload | Json }}`, ent: &entities.Entity{Data: map[string]any{"payload": map[string]any{"on": true}}}, args: nil, expectedOutput: `curl --json -d {"on":true}`, expectError: false, }, { name: "Single argument value as Json", source: `echo {{ .Arguments.value | Json }}`, ent: nil, args: map[string]string{"value": "hello"}, expectedOutput: `echo "hello"`, expectError: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { output, err := ParseTemplateWithActionContext(tt.source, tt.ent, tt.args) assertParseTemplateJsonCase(t, tt, output, err) }) } }