From 04774659f2ff36c4b949c465c516f1b6d61c20ca Mon Sep 17 00:00:00 2001 From: Danis Kirasirov <dbgbbu@gmail.com> Date: Mon, 24 Feb 2025 17:02:44 +0300 Subject: [PATCH] fix list fields --- pkg/files/field.go | 9 +++++++- pkg/files/field_test.go | 41 ++++++++++++++++++++++++++++++++++ pkg/references/field.go | 9 +++++++- pkg/references/field_test.go | 37 ++++++++++++++++++++++++++++++ pkg/schema/field/array.go | 5 ++++- pkg/schema/field/array_test.go | 37 ++++++++++++++++++++++++++++++ 6 files changed, 135 insertions(+), 3 deletions(-) diff --git a/pkg/files/field.go b/pkg/files/field.go index bd237bd6..ff4e7db1 100644 --- a/pkg/files/field.go +++ b/pkg/files/field.go @@ -33,14 +33,21 @@ func (p FileParameters) GetField(f *field.Field, name string) *field.Field { } func (p FileParameters) ListFields(f *field.Field, filter ...field.FieldFilterFunc) []*field.Field { - return []*field.Field{ + var res []*field.Field + + for _, fld := range []*field.Field{ f.SetFieldState("id", field.String()), f.SetFieldState("name", field.String()), f.SetFieldState("mimeType", field.String()), f.SetFieldState("size", field.Number(field.NumberFormatInt)), f.SetFieldState("url", field.String()), f.SetFieldState("key", field.String()), + } { + if field.ApplyFilterFunc(filter, fld) { + res = append(res, fld) + } } + return res } type FileType struct { diff --git a/pkg/files/field_test.go b/pkg/files/field_test.go index 7b631730..a51fbe46 100644 --- a/pkg/files/field_test.go +++ b/pkg/files/field_test.go @@ -6,6 +6,7 @@ import ( "git.perx.ru/perxis/perxis-go/pkg/schema" "git.perx.ru/perxis/perxis-go/pkg/schema/field" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestFileField_Get(t *testing.T) { @@ -32,3 +33,43 @@ func TestFileField_Get(t *testing.T) { assert.Equal(t, field.String(), sch.GetField("b.file.key")) assert.Equal(t, field.Number(field.NumberFormatInt), sch.GetField("b.file.size")) } + +func TestFileField_ListFields(t *testing.T) { + tests := []struct { + name string + file *field.Field + filter field.FieldFilterFunc + want []*field.Field + }{ + { + name: "Without filter", + file: Field(), + want: []*field.Field{ + field.String(), // id + field.String(), // name + field.String(), // mimeType + field.Number(field.NumberFormatInt), // size + field.String(), // url + field.String(), // key + }, + }, + { + name: "With filter", + file: Field(), + filter: func(f *field.Field) bool { return f.GetType().Name() == "number" }, + want: []*field.Field{ + field.Number(field.NumberFormatInt), // size + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var filters []field.FieldFilterFunc + if tt.filter != nil { + filters = append(filters, tt.filter) + } + got := tt.file.ListFields(filters...) + require.Equal(t, tt.want, got) + }) + } +} diff --git a/pkg/references/field.go b/pkg/references/field.go index f80e7b5a..f64143ce 100644 --- a/pkg/references/field.go +++ b/pkg/references/field.go @@ -37,11 +37,18 @@ func (p ReferenceParameters) GetField(f *field.Field, name string) *field.Field return f.SetFieldState(name, fld) } func (p ReferenceParameters) ListFields(f *field.Field, filter ...field.FieldFilterFunc) []*field.Field { - return []*field.Field{ + var res []*field.Field + + for _, fld := range []*field.Field{ f.SetFieldState("id", field.String()), f.SetFieldState("collection_id", field.String()), f.SetFieldState("disabled", field.Bool()), + } { + if field.ApplyFilterFunc(filter, fld) { + res = append(res, fld) + } } + return res } type ReferenceType struct{} diff --git a/pkg/references/field_test.go b/pkg/references/field_test.go index ac9d5c03..8f2458c8 100644 --- a/pkg/references/field_test.go +++ b/pkg/references/field_test.go @@ -318,3 +318,40 @@ func TestReferenceField_Get(t *testing.T) { assert.Equal(t, field.Bool(), sch.GetField("b.ref.disabled")) } + +func TestReferenceField_ListFields(t *testing.T) { + tests := []struct { + name string + file *field.Field + filter field.FieldFilterFunc + want []*field.Field + }{ + { + name: "Without filter", + file: Field([]string{}), + want: []*field.Field{ + field.String(), // id + field.String(), // collection_id + field.Bool(), // disabled + }, + }, + { + name: "With filter", + file: Field([]string{}), + filter: func(f *field.Field) bool { return f.GetType().Name() == "bool" }, + want: []*field.Field{ + field.Bool(), // disabled + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var filters []field.FieldFilterFunc + if tt.filter != nil { + filters = append(filters, tt.filter) + } + got := tt.file.ListFields(filters...) + require.Equal(t, tt.want, got) + }) + } +} diff --git a/pkg/schema/field/array.go b/pkg/schema/field/array.go index 682b6e5e..b804dd92 100644 --- a/pkg/schema/field/array.go +++ b/pkg/schema/field/array.go @@ -35,7 +35,10 @@ func (a ArrayParameters) GetField(f *Field, name string) *Field { func (a ArrayParameters) ListFields(f *Field, filterFunc ...FieldFilterFunc) []*Field { f.SetFieldState("Item", a.Item) - return []*Field{a.Item} + if ApplyFilterFunc(filterFunc, a.Item) { + return []*Field{a.Item} + } + return nil } type ArrayType struct{} diff --git a/pkg/schema/field/array_test.go b/pkg/schema/field/array_test.go index ab8eae74..976c0d52 100644 --- a/pkg/schema/field/array_test.go +++ b/pkg/schema/field/array_test.go @@ -267,3 +267,40 @@ func TestArrayField_WithType(t *testing.T) { assert.ElementsMatch(t, got, []interface{}{map[string]interface{}{"a": "1", "b": "2"}}) }) } + +func TestArrayField_ListFields(t *testing.T) { + tests := []struct { + name string + field *Field + filter FieldFilterFunc + want []*Field + }{ + { + name: "Without filter", + field: Array(Number("number")), + want: []*Field{Number("number")}, + }, + { + name: "With filter positive", + field: Array(Number("number").SetTextSearch(true)), + filter: func(f *Field) bool { return f.TextSearch }, + want: []*Field{Number("number").SetTextSearch(true)}, + }, + { + name: "With filter negative", + field: Array(Number("float")), + filter: func(f *Field) bool { return f.TextSearch }, + want: nil, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var filters []FieldFilterFunc + if tt.filter != nil { + filters = append(filters, tt.filter) + } + got := tt.field.ListFields(filters...) + require.Equal(t, tt.want, got) + }) + } +} -- GitLab