Skip to content
This repository has been archived by the owner on Aug 12, 2022. It is now read-only.

Commit

Permalink
feat: Add new Resolver PathTableResolver (#440)
Browse files Browse the repository at this point in the history
  • Loading branch information
bbernays authored Jul 28, 2022
1 parent 1e6d030 commit 90e9c01
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 15 deletions.
13 changes: 13 additions & 0 deletions provider/schema/resolvers.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,19 @@ import (
"github.com/thoas/go-funk"
)

// PathTableResolver resolves a table in the parent.Item
//
// Examples:
// PathTableResolver("Field")
// PathTableResolver("InnerStruct.Field")
// PathTableResolver("InnerStruct.InnerInnerStruct.Field")
func PathTableResolver(path string) TableResolver {
return func(ctx context.Context, meta ClientMeta, parent *Resource, res chan<- interface{}) error {
res <- funk.Get(parent.Item, path, funk.WithAllowZero())
return nil
}
}

// PathResolver resolves a field in the Resource.Item
//
// Examples:
Expand Down
85 changes: 70 additions & 15 deletions provider/schema/resolvers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ type innerStruct struct {
}

type testStruct struct {
NilInner *innerStruct
Inner innerStruct
Value int
unexported bool
Expand Down Expand Up @@ -130,24 +131,78 @@ var UUIDTestTable = &Table{
},
}

func TestPathResolver(t *testing.T) {
r1 := PathResolver("Inner.Value")
r2 := PathResolver("Value")
r3 := PathResolver("unexported")
resource := NewResourceData(PostgresDialect{}, pathTestTable, nil, testStruct{Inner: innerStruct{Value: "bla"}, Value: 5, unexported: false}, nil, time.Now())
err := r1(context.TODO(), nil, resource, Column{Name: "test"})

assert.Nil(t, err)
assert.Equal(t, resource.Get("test"), "bla")
func TestPathTableResolver(t *testing.T) {
results := make(chan interface{})
pathTableTests := []struct {
path string
isNil bool
expectedValue interface{}
}{
{
path: "Inner",
expectedValue: innerStruct{Value: "bla"},
},
{
path: "Inner.Value",
expectedValue: "bla",
},
{
path: "NilInner.Value",
expectedValue: "",
}, {
path: "unexported",
expectedValue: nil,
},
}

err = r2(context.TODO(), nil, resource, Column{Name: "int_value"})
resource := NewResourceData(PostgresDialect{}, pathTestTable, nil, testStruct{Inner: innerStruct{Value: "bla"}, Value: 5, unexported: false}, nil, time.Now())
for _, test := range pathTableTests {
r1 := PathTableResolver(test.path)
go func() {
err := r1(context.TODO(), nil, resource, results)
assert.Nil(t, err)
}()
result := <-results
assert.Equal(t, test.expectedValue, result, "path: %s", test.path)
}
}

assert.Nil(t, err)
assert.Equal(t, resource.Get("int_value"), 5)
func TestPathResolver(t *testing.T) {
pathTableTests := []struct {
path string
getterPath string
isNil bool
value interface{}
}{
{
path: "Inner.Value",
getterPath: "test",
value: "bla",
},
{
path: "Value",
getterPath: "int_value",
value: 5,
},
{
path: "unexported",
getterPath: "unexported",
isNil: true,
value: nil,
},
}

err = r3(context.TODO(), nil, resource, Column{Name: "unexported"})
assert.Nil(t, err)
assert.Nil(t, resource.Get("unexported"))
resource := NewResourceData(PostgresDialect{}, pathTestTable, nil, testStruct{Inner: innerStruct{Value: "bla"}, Value: 5, unexported: false}, nil, time.Now())
for _, test := range pathTableTests {
r1 := PathResolver(test.path)
err := r1(context.TODO(), nil, resource, Column{Name: test.getterPath})
assert.Nil(t, err)
if test.isNil {
assert.Nil(t, resource.Get(test.getterPath))
} else {
assert.Equal(t, test.value, resource.Get(test.getterPath))
}
}
}

func TestInterfaceSlice(t *testing.T) {
Expand Down

0 comments on commit 90e9c01

Please sign in to comment.