diff --git a/pkg/expr/expr_test.go b/pkg/expr/expr_test.go index 5eafc368bed934e0bd0805f4818442a75256931c..8fb6831110137b1e4d2d897edd37628c20b35f5c 100644 --- a/pkg/expr/expr_test.go +++ b/pkg/expr/expr_test.go @@ -1,11 +1,13 @@ package expr import ( + "context" "fmt" "testing" "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestIsExpression(t *testing.T) { @@ -49,3 +51,65 @@ func TestIsExpression(t *testing.T) { }) } } + +type testEnvStruct struct { + ID string `expr:"id"` + Size int `expr:"size"` + Data interface{} `expr:"data"` +} + +func TestEval_StructInEnv(t *testing.T) { + ctx := context.Background() + + tests := []struct { + name string + exp string + env map[string]interface{} + wantErr bool + wantResult interface{} + }{ + { + name: "get field by expr tag", + exp: "s.id", + env: map[string]interface{}{"s": &testEnvStruct{ID: "id1"}}, + wantResult: "id1", + }, + { + name: "get field by field name", + exp: "s.ID", + env: map[string]interface{}{"s": &testEnvStruct{ID: "id1"}}, + wantResult: "id1", + }, + { + name: "get nested field", + exp: "m.s.size", + env: map[string]interface{}{"m": map[string]interface{}{"s": &testEnvStruct{Size: 1}}}, + wantResult: 1, + }, + { + name: "check field", + exp: "s.data.size < 100", + env: map[string]interface{}{"s": &testEnvStruct{Data: &testEnvStruct{Size: 0}}}, + wantResult: true, + }, + { + name: "field not exists", + exp: "s.not_exists", + env: map[string]interface{}{"s": &testEnvStruct{}}, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := Eval(ctx, tt.exp, tt.env) + if tt.wantErr { + require.Error(t, err) + return + } + + require.NoError(t, err) + require.Equal(t, tt.wantResult, result) + }) + } +} diff --git a/pkg/expr/mongo_test.go b/pkg/expr/mongo_test.go index c44296f7110381852d8b6ecb570eb8445f3c0c37..7f020faaeaa36060d0092b05e52d55b7d411afa8 100644 --- a/pkg/expr/mongo_test.go +++ b/pkg/expr/mongo_test.go @@ -69,6 +69,38 @@ func TestConvertToMongo(t *testing.T) { } } +func TestConvertToMongo_StructInEnv(t *testing.T) { + ctx := context.Background() + + tests := []struct { + name string + exp string + env map[string]interface{} + wantErr bool + wantResult interface{} + }{ + { + name: "get field", + exp: "db_item.id == env_item.id", + env: map[string]interface{}{"env_item": &testEnvStruct{ID: "id1"}}, + wantResult: bson.M{"db_item.id": "id1"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := ConvertToMongo(ctx, tt.exp, tt.env, nil) + if tt.wantErr { + require.Error(t, err) + return + } + + require.NoError(t, err) + require.Equal(t, tt.wantResult, result) + }) + } +} + func BenchmarkConvertToMongo(b *testing.B) { const idsNum = 1_000_000 ctx := context.Background() diff --git a/pkg/files/file.go b/pkg/files/file.go index 5700309d4e180d8a242eccc87bf8ed4581ff39bd..d2236b83368e3d5efc763fd6f7e53664e15cc827 100644 --- a/pkg/files/file.go +++ b/pkg/files/file.go @@ -16,13 +16,13 @@ const ( // File - описание файла РІ системе хранения perxis type File struct { - ID string `mapstructure:"id,omitempty" json:"id" expr:"id"` // Уникальный идентификатор файла РІ хранилище - Name string `mapstructure:"name,omitempty" json:"name" bson:"name,omitempty" expr:"name"` // РРјСЏ файла - Size int `mapstructure:"size,omitempty" json:"size" bson:"size,omitempty" expr:"size"` // Размер файла + ID string `mapstructure:"id,omitempty" json:"id" expr:"id"` // Уникальный идентификатор файла РІ хранилище + Name string `mapstructure:"name,omitempty" json:"name" bson:"name,omitempty" expr:"name"` // РРјСЏ файла + Size int `mapstructure:"size,omitempty" json:"size" bson:"size,omitempty" expr:"size"` // Размер файла MimeType string `mapstructure:"mimeType,omitempty" json:"mimeType" bson:"mimeType,omitempty" expr:"mime_type"` // Mime-type файла - URL string `mapstructure:"url,omitempty" json:"url" bson:"url,omitempty" expr:"url"` // Адрес для загрузки файла - Key string `mapstructure:"key,omitempty" json:"key" bson:"key,omitempty" expr:"key"` // Ключ для хранения файла РІ хранилище - File fs.File `mapstructure:"-" json:"-" bson:"-"` // Файл для загрузки(РёР· файловой системы) + URL string `mapstructure:"url,omitempty" json:"url" bson:"url,omitempty" expr:"url"` // Адрес для загрузки файла + Key string `mapstructure:"key,omitempty" json:"key" bson:"key,omitempty" expr:"key"` // Ключ для хранения файла РІ хранилище + File fs.File `mapstructure:"-" json:"-" bson:"-"` // Файл для загрузки(РёР· файловой системы) } func (f File) Clone() *File {