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"" } ] } } "); }
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 } } } ] } "); }
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"" } } } "); }
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"" } } } "); }