diff --git a/pkg/expr/expr_test.go b/pkg/expr/expr_test.go
index 14bab92fb4fdf2c4d1a890e918a4809615c83c2f..35153da271daace9f9acb6c7a02411f948f47054 100644
--- a/pkg/expr/expr_test.go
+++ b/pkg/expr/expr_test.go
@@ -62,7 +62,7 @@ func (s *testEnvStruct) Equal(other *testEnvStruct) bool {
 	return s.ID == other.ID
 }
 
-func TestEval_StructInEnv(t *testing.T) {
+func TestExpr_Example(t *testing.T) {
 	ctx := context.Background()
 
 	tests := []struct {
diff --git a/pkg/expr/mongo_test.go b/pkg/expr/mongo_test.go
index 7f020faaeaa36060d0092b05e52d55b7d411afa8..8fb87de5fa00f666018c45d2c187e56e20d4c576 100644
--- a/pkg/expr/mongo_test.go
+++ b/pkg/expr/mongo_test.go
@@ -55,6 +55,7 @@ func TestConvertToMongo(t *testing.T) {
 		{"in", "In(s, [1,2,3])", nil, bson.M{"s": bson.M{"$in": []interface{}{1, 2, 3}}}, false},
 		{"in", "In(s, 1)", nil, bson.M{"s": bson.M{"$in": []interface{}{1}}}, false},
 		{"text search or id", "id", nil, nil, true},
+		{"struct env", "db_item.id == env_item.id", map[string]interface{}{"env_item": &testEnvStruct{ID: "id1"}}, bson.M{"db_item.id": "id1"}, true},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -69,38 +70,6 @@ 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_test.go b/pkg/files/file_test.go
index 14fb89ce8c054d57ea708a10eb27318b474ff99c..617bed4c09ef95ab58874d856a36c5584abd4589 100644
--- a/pkg/files/file_test.go
+++ b/pkg/files/file_test.go
@@ -1,9 +1,11 @@
 package files
 
 import (
+	"context"
 	"testing"
 	"text/template"
 
+	"git.perx.ru/perxis/perxis-go/pkg/expr"
 	"github.com/stretchr/testify/require"
 )
 
@@ -55,3 +57,35 @@ func TestFile_SetURLWithTemplate(t *testing.T) {
 		})
 	}
 }
+
+func TestFile_InExpr(t *testing.T) {
+	ctx := context.Background()
+
+	tests := []struct {
+		exp        string
+		env        map[string]interface{}
+		wantResult interface{}
+		wantErr    bool
+	}{
+		{"f.id", map[string]interface{}{"f": &File{ID: "some_id"}}, "some_id", false},
+		{"f.name", map[string]interface{}{"f": &File{Name: "some_name"}}, "some_name", false},
+		{"f.size", map[string]interface{}{"f": &File{Size: 1}}, 1, false},
+		{"f.mime_type", map[string]interface{}{"f": &File{MimeType: "some_mime_type"}}, "some_mime_type", false},
+		{"f.url", map[string]interface{}{"f": &File{URL: "some_url"}}, "some_url", false},
+		{"f.key", map[string]interface{}{"f": &File{Key: "some_key"}}, "some_key", false},
+		{"f.not_exists", map[string]interface{}{"f": &File{}}, "", true},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.exp, func(t *testing.T) {
+			result, err := expr.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/references/reference_test.go b/pkg/references/reference_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..5e79de47ab96cc9e48b8ba0eb644f9519e9ee914
--- /dev/null
+++ b/pkg/references/reference_test.go
@@ -0,0 +1,41 @@
+package references
+
+import (
+	"context"
+	"testing"
+
+	"git.perx.ru/perxis/perxis-go/pkg/expr"
+	"github.com/stretchr/testify/require"
+)
+
+func TestReference_InExpr(t *testing.T) {
+	ctx := context.Background()
+
+	tests := []struct {
+		exp        string
+		env        map[string]interface{}
+		wantResult interface{}
+		wantErr    bool
+	}{
+		{"r.id", map[string]interface{}{"r": &Reference{ID: "some_id"}}, "some_id", false},
+		{"r.collection_id", map[string]interface{}{"r": &Reference{CollectionID: "some_coll_id"}}, "some_coll_id", false},
+		{"r.disabled", map[string]interface{}{"r": &Reference{Disabled: true}}, true, false},
+		{"r.String()", map[string]interface{}{"r": &Reference{ID: "id", CollectionID: "collID"}}, "collID.id", false},
+		{"r1.Equal(r2)", map[string]interface{}{"r1": &Reference{"id", "collID", false}, "r2": &Reference{"id", "collID", false}}, true, false},
+		{"r.IsValid()", map[string]interface{}{"r": &Reference{}}, false, false},
+		{"r.not_exists", map[string]interface{}{"r": &Reference{}}, false, true},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.exp, func(t *testing.T) {
+			result, err := expr.Eval(ctx, tt.exp, tt.env)
+			if tt.wantErr {
+				require.Error(t, err)
+				return
+			}
+
+			require.NoError(t, err)
+			require.Equal(t, tt.wantResult, result)
+		})
+	}
+}