Skip to content
Snippets Groups Projects
Commit 4d84bb87 authored by Semyon Krestyaninov's avatar Semyon Krestyaninov :dog2:
Browse files

refactor

parent 14b9ee70
No related branches found
No related tags found
No related merge requests found
package validate
package evaluate
import "context"
import (
"context"
"git.perx.ru/perxis/perxis-go/pkg/schema/field"
)
type Evaluator interface {
Evaluate(ctx context.Context, tmpl string) (string, error)
......@@ -24,3 +28,8 @@ type TemplateEvaluatorContext map[string]any
type TemplateEvaluator struct {
ctx TemplateEvaluatorContext
}
func init() {
field.RegisterOption(collectionFilter{})
field.RegisterOption(itemFilter{})
}
package validate
package evaluate
import (
"context"
......@@ -20,7 +20,6 @@ func (f collectionFilter) GetName() string {
func (f *collectionFilter) Evaluate(ctx context.Context, evaluator Evaluator) error {
var err error
f.ID, err = EvaluateAll(ctx, evaluator, f.ID)
if err != nil {
return err
......@@ -39,7 +38,7 @@ func (f *collectionFilter) Evaluate(ctx context.Context, evaluator Evaluator) er
return nil
}
func (f collectionFilter) Validate(_ context.Context, field *field.Field, _ interface{}) error {
func (f collectionFilter) Validate(_ context.Context, _ *field.Field, _ interface{}) error {
return nil
}
......@@ -60,7 +59,6 @@ func (f itemFilter) GetName() string {
func (f *itemFilter) Evaluate(ctx context.Context, evaluator Evaluator) error {
var err error
f.Query, err = EvaluateAll(ctx, evaluator, f.Query)
if err != nil {
return err
......@@ -74,7 +72,7 @@ func (f *itemFilter) Evaluate(ctx context.Context, evaluator Evaluator) error {
return nil
}
func (f itemFilter) Validate(_ context.Context, field *field.Field, _ interface{}) error {
func (f itemFilter) Validate(_ context.Context, _ *field.Field, _ interface{}) error {
return nil
}
......
package validate
package evaluate
import (
"context"
......@@ -6,23 +6,31 @@ import (
"testing"
"text/template"
"git.perx.ru/perxis/perxis-go/pkg/items"
"github.com/stretchr/testify/assert"
)
type testEvaluator struct{}
type testEvaluator struct {
env map[string]any
}
func (e testEvaluator) Evaluate(ctx context.Context, tmpl string) (string, error) {
var b strings.Builder
t, err := template.New("").Parse(tmpl)
t, err := template.New("").Funcs(template.FuncMap{
"error": func(msg string) string {
e.env["Error"] = msg
return ""
},
}).Parse(tmpl)
if err != nil {
return "", err
}
err = t.Execute(&b, map[string]any{
"name": "Ivan",
})
err = t.Execute(&b, e.env)
if err != nil {
return "", err
}
return strings.TrimSpace(b.String()), nil
}
......@@ -30,6 +38,7 @@ func TestItemFilter_Evaluate(t *testing.T) {
tests := []struct {
name string
input itemFilter
env map[string]any
want itemFilter
assertErr assert.ErrorAssertionFunc
}{
......@@ -37,9 +46,10 @@ func TestItemFilter_Evaluate(t *testing.T) {
name: "query",
input: itemFilter{
Query: []string{
"name == '{{ .name }}'",
"name == '{{ .Item.Data.name }}'",
},
},
env: map[string]any{"Item": &items.Item{Data: map[string]any{"name": "Ivan"}}},
want: itemFilter{
Query: []string{
"name == 'Ivan'",
......@@ -51,9 +61,10 @@ func TestItemFilter_Evaluate(t *testing.T) {
name: "query with expression",
input: itemFilter{
Query: []string{
"{{ if .name }} name == 'Ivan' {{ else }} name == 'Oleg' {{ end }}",
"{{ if .Item.Data.name }} name == 'Ivan' {{ else }} name == 'Oleg' {{ end }}",
},
},
env: map[string]any{"Item": &items.Item{Data: map[string]any{"name": "Ivan"}}},
want: itemFilter{
Query: []string{
"name == 'Ivan'",
......@@ -61,11 +72,38 @@ func TestItemFilter_Evaluate(t *testing.T) {
},
assertErr: assert.NoError,
},
{
name: "invalid template",
input: itemFilter{
Query: []string{
"{{ if }} name == 'Ivan' {{ end }}",
},
},
want: itemFilter{},
assertErr: assert.Error,
},
{
name: "error func",
input: itemFilter{
Query: []string{
"{{ if .Item.Data.name }} name == '{{ .Item.Data.name }}' {{ else }} {{ error \"Name must be specified\" }} {{ end }}",
},
QueryError: "Error received: {{ .Error }}",
},
env: map[string]any{"Item": &items.Item{Data: map[string]any{}}},
want: itemFilter{
Query: []string{
"",
},
QueryError: "Error received: Name must be specified",
},
assertErr: assert.NoError,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := tt.input.Evaluate(context.Background(), testEvaluator{})
err := tt.input.Evaluate(context.Background(), testEvaluator{env: tt.env})
tt.assertErr(t, err)
assert.Equal(t, tt.want, tt.input)
})
......
......@@ -96,6 +96,4 @@ func init() {
field.RegisterOption(required(true))
field.RegisterOption(maxItems(0))
field.RegisterOption(schema(true))
field.RegisterOption(collectionFilter{})
field.RegisterOption(itemFilter{})
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment