Skip to content

Commit

Permalink
Fix dataloaders tests
Browse files Browse the repository at this point in the history
  • Loading branch information
saturn4er committed Feb 1, 2019
1 parent c8e1144 commit de1208c
Show file tree
Hide file tree
Showing 14 changed files with 290 additions and 154 deletions.
83 changes: 83 additions & 0 deletions Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions example/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ func (Client) GetEmptiesMsg(ctx context.Context, in *example.Empty, opts ...grpc
return &example.Empty{}, nil
}

func (Client) ListSomeEntities(ctx context.Context, in *example.ListSomeEntitiesRequest, opts ...grpc.CallOption) (*example.ListSomeEntitiesResponse, error) {
return &example.ListSomeEntitiesResponse{}, nil
}

func main() {
schem, err := schema.GetExampleSchemaSchema(schema.ExampleSchemaSchemaClients{
ServiceExampleClient: Client{},
Expand Down
242 changes: 121 additions & 121 deletions example/proto/example.pb.go

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion example/proto/example.proto
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
syntax = "proto3";
package example;
package proto;

import "google/protobuf/timestamp.proto";

Expand Down
1 change: 1 addition & 0 deletions generator/plugins/dataloader/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ type DataLoadersConfig struct {
type ProviderConfig struct {
Name string `mapstructure:"name"`
WaitDuration time.Duration `mapstructure:"wait_duration_ms"`
Slice bool
}

type FieldConfig struct {
Expand Down
9 changes: 7 additions & 2 deletions generator/plugins/dataloader/data_loader_generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,14 @@ func (p *LoaderGenerator) GenerateDataLoaders() error {

for _, dataLoader := range p.dataLoader.Loaders {
if err := p.generateLoaders(dataLoader.InputGoType, dataLoader.OutputGoType, dataLoader.Slice); err != nil {
return err
return errors.Wrapf(err, "failed to generate %s data loader", dataLoader.Config.Name)
}
}

return nil
}

func (p *LoaderGenerator) generateLoaders(requestGoType graphql.GoType, responseGoType graphql.GoType, slice bool) error {
func (p *LoaderGenerator) generateLoaders(requestGoType graphql.GoType, responseGoType graphql.GoType, slice bool) (rerr error) {
keyType := requestGoType.ElemType.Kind.String()

var typeName string
Expand All @@ -74,6 +74,11 @@ func (p *LoaderGenerator) generateLoaders(requestGoType graphql.GoType, response
} else {
typeName = responseGoType.ElemType.Pkg + "." + responseGoType.ElemType.Name
}
defer func() {
if v := recover(); v != nil {
rerr = fmt.Errorf("failed to generate dataloader: %v", v)
}
}()

if err := generator.Generate(typeName, keyType, slice, true, p.dataLoader.OutputPath); err != nil {
return errors.Wrapf(err, "Failed to generate loader for '%s'", typeName)
Expand Down
20 changes: 20 additions & 0 deletions generator/plugins/graphql/lib/pluginconfig/decoder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package pluginconfig

import "github.com/mitchellh/mapstructure"

func Decode(input, output interface{}) error {
config := &mapstructure.DecoderConfig{
DecodeHook: mapstructure.ComposeDecodeHookFunc(
mapstructure.StringToTimeDurationHookFunc(),
),
Metadata: nil,
Result: output,
}

decoder, err := mapstructure.NewDecoder(config)
if err != nil {
return err
}

return decoder.Decode(input)
}
1 change: 1 addition & 0 deletions generator/plugins/proto2gql/dataloaders.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ func (g Proto2GraphQL) registerMethodDataLoader(name string, cfg DataLoaderConfi
Kind: reflect.Slice,
ElemType: &responseCopy,
}
dataLoaderOutType = graphql.GqlListTypeResolver(dataLoaderOutType)
} else {
fetchCode = g.oneToOneDataLoaderFetchCode(file, cfg, method)
}
Expand Down
4 changes: 3 additions & 1 deletion generator/plugins/proto2gql/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/EGT-Ukraine/go2gql/generator"
"github.com/EGT-Ukraine/go2gql/generator/plugins/dataloader"
"github.com/EGT-Ukraine/go2gql/generator/plugins/graphql"
"github.com/EGT-Ukraine/go2gql/generator/plugins/graphql/lib/pluginconfig"
)

const (
Expand Down Expand Up @@ -42,7 +43,7 @@ func (p *Plugin) Init(config *generator.GenerateConfig, plugins []generator.Plug
return errors.New("'dataloader' plugin is not installed")
}
cfg := new(Config)
err := mapstructure.Decode(config.PluginsConfigs[PluginConfigKey], cfg)
err := pluginconfig.Decode(config.PluginsConfigs[PluginConfigKey], cfg)
if err != nil {
return errors.Wrap(err, "failed to decode config")
}
Expand Down Expand Up @@ -70,6 +71,7 @@ func (p *Plugin) parseImports() error {

for _, config := range *configs {
var importFileDir = filepath.Dir(pluginsConfigsImports.Path)

var protoPath = filepath.Join(importFileDir, config.ProtoPath)

config.ProtoPath = protoPath
Expand Down
1 change: 1 addition & 0 deletions generator/plugins/swagger2gql/services.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ func (p *Plugin) addDataLoaderProvider(
OutputGoType: responseGoType,
OutputGraphqlType: dataLoaderOutType,
Config: dataLoaderProviderConfig,
Slice: dataLoaderProviderConfig.Slice,
}

p.dataLoaderPlugin.AddLoader(dataLoaderProvider)
Expand Down
3 changes: 2 additions & 1 deletion tests/dataloader/apis/category.proto
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,6 @@ message CategoryListResponse {
}

message Category {
string name = 1;
uint64 id = 1;
string name = 2;
}
15 changes: 7 additions & 8 deletions tests/dataloader/apis/reviews.proto
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,21 @@ option go_package = "github.com/EGT-Ukraine/go2gql/tests/dataloader/generated/cl
import "google/protobuf/empty.proto";

service ItemsReviewService {
rpc List (ListRequest) returns (ListResponse) {}
rpc List (ListRequest) returns (ListResponse) {
}
}

message ListRequest {
repeated int64 item_id = 1;
repeated int64 item_id = 1;
}

message ListResponse {
repeated ItemReviews item_reviews = 1;
repeated Review reviews = 1;
}

message ItemReviews {
repeated Review item_review = 1;
}

message Review {
int64 id = 1;
string text = 2;
int64 id = 1;
int64 item_id = 2;
string text = 3;
}
20 changes: 12 additions & 8 deletions tests/dataloader/dataloader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,11 @@ func TestDataLoader(t *testing.T) {
categoryClient.EXPECT().List(gomock.Any(), gomock.Any()).Return(&apis.CategoryListResponse{
Categories: []*apis.Category{
{
Id: 12,
Name: "category 12",
},
{
Id: 11,
Name: "category 11",
},
},
Expand Down Expand Up @@ -118,12 +120,15 @@ func TestDataLoaderWithKeyFieldSlice(t *testing.T) {
categoryClient.EXPECT().List(gomock.Any(), gomock.Any()).Return(&apis.CategoryListResponse{
Categories: []*apis.Category{
{
Id: 12,
Name: "category 12",
},
{
Id: 11,
Name: "category 11",
},
{
Id: 15,
Name: "category 15",
},
},
Expand Down Expand Up @@ -236,14 +241,15 @@ func TestDataLoaderGetOne(t *testing.T) {
itemsClient := mock.NewMockItemsServiceClient(mockCtrl)
itemsClient.EXPECT().GetOne(gomock.Any(), gomock.Any()).Return(&apis.Item{
Name: "item 1",
CategoryId: 12,
CategoryId: 1,
}, nil).AnyTimes()

categoryClient := mock.NewMockCategoryServiceClient(mockCtrl)

categoryClient.EXPECT().List(gomock.Any(), gomock.Any()).Return(&apis.CategoryListResponse{
Categories: []*apis.Category{
{
Id: 1,
Name: "category 1",
},
},
Expand Down Expand Up @@ -367,19 +373,17 @@ func TestDataLoaderWithProtoFieldUnwrapping(t *testing.T) {
itemsClient := mock.NewMockItemsServiceClient(mockCtrl)
itemsClient.EXPECT().GetOne(gomock.Any(), gomock.Any()).Return(&apis.Item{
Name: "item 1",
Id: 1,
CategoryId: 12,
}, nil).AnyTimes()

reviewsClient := mock.NewMockItemsReviewServiceClient(mockCtrl)
reviewsClient.EXPECT().List(gomock.Any(), gomock.Any()).Return(&apis.ListResponse{
ItemReviews: []*apis.ItemReviews{
Reviews: []*apis.Review{
{
ItemReview: []*apis.Review{
{
Id: 456,
Text: "excellent item",
},
},
Id: 456,
ItemId: 1,
Text: "excellent item",
},
},
}, nil).AnyTimes()
Expand Down

0 comments on commit de1208c

Please sign in to comment.