public async Task RemoteExecute_with_link_exception()
        {
            /* Given */
            var builder = new SchemaBuilder()
                          .Scalar("Long", out _, new StringConverter())
                          .Scalar("Lat", out _, new StringConverter())
                          .Scalar("Polyline", out _, new StringConverter())
                          .ImportIntrospectedSchema(GetDigitransitIntrospection());

            /* When */
            var schema = RemoteSchemaTools.MakeRemoteExecutable(
                builder,
                (document, variables, cancellationToken) =>
                throw new InvalidOperationException("error"));

            var result = await Executor.ExecuteAsync(new ExecutionOptions
            {
                Schema   = schema,
                Document = Parser.ParseDocument(@"
                    {
                        feeds {
                            feedId
                        }
                    }
                    ")
            });

            /* Then */
            result.ShouldMatchJson(@"
                {
                  ""data"": {
                    ""feeds"": null
                  },
                  ""errors"": [
                    {
                      ""message"": ""error"",
                      ""locations"": [
                        {
                          ""end"": 137,
                          ""start"": 47
                        }
                      ],
                      ""path"": [
                        ""feeds""
                      ],
                      ""extensions"": {
                        ""code"": ""INVALIDOPERATION""
                      }
                    }
                  ]
                }
            ");
        }
    public async Task Execute_with_StaticLink()
    {
        /* Given */
        TypeSystemDocument schemaOne =
            @"
                    extend type User {
                        id: ID!
                        name: String!
                    }

                    extend type Query {
                        userById(id: ID!): User
                    }

                    extend schema {
                        query: Query
                    }
                    ";

        TypeSystemDocument schemaTwo =
            @"
                    type Address {
                        city: String!
                    }

                    type User {
                        address: Address!
                    }

                    type Query {

                    }
                    ";

        var schemaOneResolvers = RemoteSchemaTools.CreateLinkResolvers(
            schemaOne,
            RemoteLinks.Static(new ExecutionResult
        {
            Data = new Dictionary <string, object>
            {
                ["userById"] = new Dictionary <string, object>
                {
                    ["id"]   = "1",
                    ["name"] = "name"
                }
            }
        }));

        var schemaTwoResolvers =
            new ResolversMap
        {
        public async Task ExecuteWithStaticDataLink()
        {
            /* Given */
            var builder = new SchemaBuilder()
                          .Scalar("Long", out _, new StringConverter())
                          .Scalar("Lat", out _, new StringConverter())
                          .Scalar("Polyline", out _, new StringConverter())
                          .ImportIntrospectedSchema(GetDigitransitIntrospection());

            /* When */
            var schema = RemoteSchemaTools.MakeRemoteExecutable(
                builder,
                link: RemoteLinks.Static(new ExecutionResult
            {
                Data = new Dictionary <string, object>
                {
                    ["feeds"] = new Dictionary <string, object>
                    {
                        ["feedId"] = "123"
                    }
                }
            }));

            var result = await Executor.ExecuteAsync(new ExecutionOptions
            {
                Schema   = schema,
                Document = Parser.ParseDocument(@"
                    {
                        feeds {
                            feedId
                        }
                    }
                    ")
            });

            /* Then */
            result.ShouldMatchJson(
                @"
                {
                  ""data"": {
                    ""feeds"": [
                      {
                        ""feedId"": ""123""
                      }
                    ]
                  }
                }
            ");
        }
        public async Task ExecuteRemotely()
        {
            /* Given */
            var builder = new SchemaBuilder()
                          .Scalar("Long", out _, new StringConverter())
                          .Scalar("Lat", out _, new StringConverter())
                          .Scalar("Polyline", out _, new StringConverter())
                          .ImportIntrospectedSchema(GetDigitransitIntrospection());

            /* When */
            var schema = RemoteSchemaTools.MakeRemoteExecutable(
                builder,
                link: RemoteLinks.Http(
                    url: "https://api.digitransit.fi/routing/v1/routers/next-hsl/index/graphql"
                    )
                );

            var result = await Executor.ExecuteAsync(new ExecutionOptions
            {
                Schema   = schema,
                Document = Parser.ParseDocument(@"
                    {
                        feeds {
                            feedId
                        }
                    }
                    ")
            });

            /* Then */
            result.ShouldMatchJson(@"
              {
              ""data"": {
                ""feeds"": [
                  {
                    ""feedId"": ""HSL""
                  },
                  {
                    ""feedId"": ""HSLlautta""
                  }
                ]
              }
            }
            ");
        }
Пример #5
0
        private async Task <ISchema> Create(ICacheEntry cacheEntry)
        {
            cacheEntry.SetSlidingExpiration(TimeSpan.FromHours(6));

            try
            {
                // create channelsSchema by introspecting channels service
                var channelsLink = Links.SignalROrHttp(
                    _configuration["Remotes:Channels"],
                    _configuration["Remotes:ChannelsHttp"],
                    _accessor);

                var channelsSchema = RemoteSchemaTools.MakeRemoteExecutable(
                    await new SchemaBuilder()
                    .ImportIntrospectedSchema(channelsLink),
                    channelsLink);

                // create messagesSchema by introspecting messages service
                var messagesLink = Links.SignalR(
                    _configuration["Remotes:Messages"],
                    _accessor);

                var messagesSchema = RemoteSchemaTools.MakeRemoteExecutable(
                    await new SchemaBuilder()
                    .ImportIntrospectedSchema(messagesLink),
                    messagesLink);

                // combine schemas into one
                var schema = new SchemaBuilder()
                             .Merge(channelsSchema, messagesSchema)
                             .Build();

                // introspect and merge with schema
                var introspection = Introspect.Schema(schema);
                return(new SchemaBuilder()
                       .Merge(schema, introspection)
                       .Build());
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
        public async Task ExecuteRemotely_with_link_graphql_error()
        {
            /* Given */
            var builder = new SchemaBuilder()
                          .Scalar("Long", out _, new StringConverter())
                          .Scalar("Lat", out _, new StringConverter())
                          .Scalar("Polyline", out _, new StringConverter())
                          .ImportIntrospectedSchema(GetDigitransitIntrospection());

            /* When */
            var schema = RemoteSchemaTools.MakeRemoteExecutable(
                builder,
                async(document, variables, cancellationToken) =>
            {
                var channel         = Channel.CreateBounded <ExecutionResult>(1);
                var executionResult = new ExecutionResult
                {
                    Errors = new[]
                    {
                        new ExecutionError("failed to find...")
                    }
                };
                await channel.Writer.WriteAsync(executionResult, cancellationToken);
                channel.Writer.TryComplete();

                return(channel);
            });

            var result = await Executor.ExecuteAsync(new ExecutionOptions
            {
                Schema   = schema,
                Document = Parser.ParseDocument(@"
                    {
                        feeds {
                            feedId
                        }
                    }
                    ")
            });

            /* Then */
            result.ShouldMatchJson(@"
                {
                  ""data"": {
                    ""feeds"": null
                  },
                  ""errors"": [
                    {
                      ""message"": ""failed to find..."",
                      ""locations"": [
                        {
                          ""end"": 137,
                          ""start"": 47
                        }
                      ],
                      ""path"": [
                        ""feeds""
                      ],
                      ""extensions"": {
                        ""code"": ""QUERYEXECUTION"",
                        ""remoteError"": {
                          ""data"": null,
                          ""errors"": [
                            {
                              ""message"": ""failed to find...""
                            }
                          ],
                          ""extensions"": null
                        }
                      }
                    }
                  ]
                }
            ");
        }
Пример #7
0
        public async Task Execute_with_StaticLink()
        {
            /* Given */
            var schemaOneBuilder = new SchemaBuilder()
                                   .Sdl(
                @"
                    type User {
                        id: ID!
                        name: String!
                    }

                    type Query {
                        userById(id: ID!): User
                    }

                    schema {
                        query: Query
                    }
                    ");

            var schemaTwoBuilder = new SchemaBuilder()
                                   .Sdl(
                @"
                    type Address {
                        city: String!
                    }

                    type User {
                        address: Address!
                    }

                    type Query {

                    }
                    "
                );

            var schemaOne = RemoteSchemaTools.MakeRemoteExecutable(
                schemaOneBuilder,
                RemoteLinks.Static(new ExecutionResult
            {
                Data = new Dictionary <string, object>
                {
                    ["userById"] = new Dictionary <string, object>
                    {
                        ["id"]   = "1",
                        ["name"] = "name"
                    }
                }
            }));

            var schemaTwo = SchemaTools.MakeExecutableSchema(
                schemaTwoBuilder,
                new ObjectTypeMap
            {
                ["Address"] = new FieldResolversMap
                {
                    { "city", context => ResolveSync.As(context.ObjectValue) }
                },
                ["User"] = new FieldResolversMap
                {
                    { "address", context => ResolveSync.As("Vantaa") }
                }
            });

            var schema = new SchemaBuilder()
                         .Merge(schemaOne, schemaTwo)
                         .Build();

            /* When */
            var result = await Executor.ExecuteAsync(new ExecutionOptions
            {
                Schema   = schema,
                Document = Parser.ParseDocument(@"
                {
                    userById(id: ""1"") {
                        id
                        name
                        address {
                            city
                        }
                    }
                }")
            });

            /* Then */
            result.ShouldMatchJson(
                @"
                {
                  ""data"": {
                    ""userById"": {
                      ""address"": {
                        ""city"": ""Vantaa""
                      },
                      ""name"": ""name"",
                      ""id"": ""1""
                    }
                  }
                }
                ");
        }
Пример #8
0
        public async Task Subscriptions()
        {
            /* Given */
            var schemaOneBuilder = new SchemaBuilder()
                                   .Sdl(
                @"
                    type User {
                        id: ID!
                        name: String!
                    }

                    type Query {
                        userById(id: ID!): User
                    }

                    type Subscription {
                        userAdded: User
                    }

                    schema {
                        query: Query
                        subscription: Subscription
                    }
                    ");

            var schemaTwoBuilder = new SchemaBuilder()
                                   .Sdl(
                @"
                    type Address {
                        city: String!
                    }

                    type User {
                        address: Address!
                    }

                    type Query {

                    }

                    type Subscription {

                    }
                    "
                );

            var schemaOne = RemoteSchemaTools.MakeRemoteExecutable(
                schemaOneBuilder,
                RemoteLinks.Static(new ExecutionResult
            {
                Data = new Dictionary <string, object>
                {
                    ["userAdded"] = new Dictionary <string, object>
                    {
                        ["id"]   = "1",
                        ["name"] = "name"
                    }
                }
            }));

            var schemaTwo = SchemaTools.MakeExecutableSchema(
                schemaTwoBuilder,
                new ObjectTypeMap
            {
                ["Address"] = new FieldResolversMap
                {
                    { "city", context => ResolveSync.As(context.ObjectValue) }
                },
                ["User"] = new FieldResolversMap
                {
                    { "address", context => ResolveSync.As("Vantaa") }
                }
            });

            var schema = new SchemaBuilder()
                         .Merge(schemaOne, schemaTwo)
                         .Build();

            var unsubscribe = new CancellationTokenSource(TimeSpan.FromSeconds(30));


            /* When */
            var subscriptionResult = await Executor.SubscribeAsync(new ExecutionOptions
            {
                Schema   = schema,
                Document = Parser.ParseDocument(@"
                subscription {
                    userAdded {
                        id
                        name
                        address {
                            city
                        }
                    }
                }")
            }, unsubscribe.Token);

            var result = await subscriptionResult.Source.Reader.ReadAsync(unsubscribe.Token);

            /* Then */
            result.ShouldMatchJson(
                @"
                {
                  ""data"": {
                    ""userAdded"": {
                      ""address"": {
                        ""city"": ""Vantaa""
                      },
                      ""name"": ""name"",
                      ""id"": ""1""
                    }
                  }
                }
                ");
        }