Пример #1
0
        public void ShouldSetTitle()
        {
            var generator = new SchemaGenerator <ISampleService>();
            var schema    = generator.Generate();

            Assert.Equal(nameof(ISampleService), schema.Title);
        }
            /// <inheritdoc />
            protected override void PostStart(IComponentContext componentContext)
            {
                base.PostStart(componentContext);
                var contextManager   = componentContext.Resolve <UniversalContextFactory>();
                var config           = componentContext.Resolve <Config>();
                var connectionString = config.GetString(NodeManagerActor.ConfigConnectionStringPath);
                var repository       = componentContext.Resolve <IPackageRepository>();
                var databaseName     = config.GetString(NodeManagerActor.ConfigDatabaseNamePath);

                using (var context =
                           contextManager.CreateContext <ConfigurationContext>("InMemory", connectionString, databaseName))
                {
                    context.ResetValueGenerators();
                    context.Database.EnsureDeleted();
                    var seeder = new Seeder(config, contextManager, repository);
                    Serilog.Log.Information("!!!!!!!!!!! Seeding started");
                    seeder.Seed();
                    Serilog.Log.Information("!!!!!!!!!!! Seeding finished");
                }

                var schemaProvider = componentContext.Resolve <SchemaProvider>();

                var apiProviders = componentContext.Resolve <IEnumerable <API.Provider.ApiProvider> >()
                                   .Select(p => new DirectProvider(p, error => Serilog.Log.Error("API ERROR: {error}", error)))
                                   .Cast <ApiProvider>()
                                   .ToList();

                schemaProvider.CurrentSchema = SchemaGenerator.Generate(apiProviders);
            }
Пример #3
0
        public void ShouldSetNameWhenAttribute()
        {
            var generator = new SchemaGenerator <ISampleService>();
            var schema    = generator.Generate();

            Assert.Equal(typeof(ISampleService).GetTypeInfo().GetCustomAttribute <ServiceAttribute>().Name, schema.Name);
        }
        public void Trivial2Test()
        {
            var api = new ApiDescription
            {
                ApiName  = "TestApi1",
                TypeName = "TestApi1",
                Version  = new Version("0.0.0.1"),
            };

            var provider = new MoqProvider {
                Description = api
            };
            var schema = SchemaGenerator.Generate(new List <ApiProvider> {
                provider
            });

            using (var printer = new SchemaPrinter(schema))
            {
                var description = printer.Print();
                this.output.WriteLine(description);
                Assert.False(string.IsNullOrWhiteSpace(description));
            }

            Assert.NotNull(schema.Query);
            Assert.Equal(3, schema.Query.Fields.Count());
            Assert.True(schema.Query.HasField("api"));
        }
Пример #5
0
        static void Main(string[] args)
        {
            while (true)
            {
                var gen = new SchemaGenerator(new List <string> {
                    @"C:\Users\toshe\source\repos\Test\Test\bin\Test.dll"
                });

                var schema = gen.Generate(url: "http://*****:*****@"C:\Users\toshe\Desktop\Test.schema");

                var endpoint = schema.Controllers[0].Endpoints[0];

                System.Console.WriteLine(JsonConvert.SerializeObject(schema, Formatting.Indented));

                System.Console.WriteLine("============================");

                System.Console.WriteLine(schema.Do(endpoint));

                System.Console.WriteLine("============================");

                System.Console.WriteLine(Request.Do(schema, schema.Controllers[0].Endpoints[1], Input.Get(schema.Controllers[0].Endpoints[1].Input)));

                System.Console.WriteLine("============================");

                System.Console.WriteLine(schema.Do(schema.Controllers[0].Endpoints[2]));

                System.Console.ReadKey();
            }
        }
Пример #6
0
        public void ShouldSetNameWhenNotAttribute()
        {
            var generator = new SchemaGenerator <INoAttributeService>();
            var schema    = generator.Generate(new SchemaGenerationOptions
            {
                MemberNameToSchemaName = Extensions.ToDottedName
            });

            Assert.Equal(nameof(INoAttributeService).ToDottedName(true), schema.Name);
        }
        public void TrivialTest()
        {
            var schema = SchemaGenerator.Generate(new List <ApiProvider>());

            using (var printer = new SchemaPrinter(schema))
            {
                var description = printer.Print();
                this.output.WriteLine(description);
                Assert.False(string.IsNullOrEmpty(description));
            }
        }
Пример #8
0
        public static int Run(string[] args)
        {
            var sw = Stopwatch.StartNew();

            int loadResult = LoadOptions(args);

            if (loadResult != 0)
            {
                return(loadResult);
            }

            _basePath = AbsolutePath(_options.Source);
            AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly;            // Look in the base path for referenced .dll files instead of the startup path

            Console.Write("Scanning for DTO objects in {0}...  ", _basePath);
            var apiControllers   = GetApiControllers(_basePath);
            var controllerModels = new HashSet <Type>(apiControllers.SelectMany(GetModelsFromController));           // return and parameter models
            var allModels        = GetAllModelsToGenerate(controllerModels);

            Console.WriteLine("Found {0}", allModels.Count);

            var targetPath = AbsolutePath(_options.Destination);

            Console.WriteLine("Generating to Target Path: " + targetPath);
            // Invoke all generators and pass the results to the index generator
            List <string> allGeneratedNames;

            if (_options.Generator == "react")
            {
                allGeneratedNames = IndexGenerator.Generate(targetPath,
                                                            InterfaceGenerator.Generate(targetPath, allModels, _options),
                                                            PromiseDataServiceGenerator.Generate(apiControllers, controllerModels, targetPath, _options)

                                                            ).Select(n => n + ".ts").ToList();
            }
            else
            {
                allGeneratedNames = IndexGenerator.Generate(targetPath,
                                                            EntityGenerator.Generate(targetPath, allModels, _options),
                                                            DataServiceGenerator.Generate(apiControllers, controllerModels, targetPath, _options)

                                                            ).Select(n => n + ".ts").ToList();
            }


            allGeneratedNames.AddRange(SchemaGenerator.Generate(targetPath, allModels, _options));

            RemoveNonGeneratedFiles(targetPath, allGeneratedNames);

            Console.WriteLine("Done in {0:N3}s", sw.Elapsed.TotalSeconds);
            return(0);
        }
        public async Task EnumApiTest()
        {
            var enumType = new ApiEnumType("EnumType", new[] { "item1", "item2" });

            var api = new ApiDescription(
                "TestApi1",
                "0.0.0.1",
                new ApiType[] { enumType },
                new[] { ApiField.Object("enumField", enumType.TypeName) });

            var provider = new MoqProvider {
                Description = api, Data = "{\"enumField\": \"item2\"}"
            };

            var schema = SchemaGenerator.Generate(new List <ApiProvider> {
                provider
            });

            using (var printer = new SchemaPrinter(schema))
            {
                var description = printer.Print();
                this.output.WriteLine("-------- Schema -----------");
                this.output.WriteLine(description);
                Assert.False(string.IsNullOrWhiteSpace(description));
            }

            Assert.NotNull(schema.Query);
            Assert.Equal(3, schema.Query.Fields.Count());
            Assert.True(schema.Query.HasField("api"));

            var result = await new DocumentExecuter().ExecuteAsync(
                r =>
            {
                r.Schema = schema;
                r.Query  = "query { api { enumField } } ";
            }).ConfigureAwait(true);

            this.output.WriteLine("-------- Response -----------");
            var response = new DocumentWriter(true).Write(result);

            this.output.WriteLine(response);

            var expectedResponse = @"{
                                      ""data"": {
                                        ""api"": {
                                            ""enumField"": ""item2"" 
                                        }
                                     }                                      
                                    }";

            Assert.Equal(CleanResponse(expectedResponse), CleanResponse(response));
        }
Пример #10
0
        static void Main(string[] args)
        {
            var schema = new ServiceSchema
            {
                Title   = "Test",
                Name    = "test",
                Version = Version.Parse("1.0")
            };

            schema.Endpoints.Add("event1", new EventEndpointSchema
            {
                Title = "Event1",
                Event = new ObjectTypeSchema
                {
                }
            });

            schema.Endpoints.Add("cmd1", new CommandEndpointSchema
            {
                Title = "Command1"
            });

            schema.Endpoints.Add("call1", new CallableEndpointSchema()
            {
                Title = "Call1"
            });

            var json = schema.ToString();
            var obj  = ServiceSchema.FromString(json);

            var generator = new SchemaGenerator <ISampleService>();

            schema = generator.Generate(new SchemaGenerationOptions(new RabbitSchemaGenerator()));
            json   = schema.ToString();
            schema.ToFile("sample.json");
            schema = ServiceSchema.FromString(json);
            var csgenerator = new CSharpCodeGenerator(schema, new CSharpCodeGenerationOptions("Test")
            {
                ExcludedTypes       = new[] { "SampleCommand" },
                Endpoints           = new[] { "AwesomeEvent" }.Include(),
                GeneratedProperties = new Dictionary <string, SkipInclude>
                {
                    { "SampleEvent", new [] { "Order" }.Skip() }
                }
            }, new RabbitCSharpGenerator());
            var csharp = csgenerator.GenerateContracts();
            //File.WriteAllText("sample.cs", csharp);
            var cintf = csgenerator.GenerateInterface();

            File.WriteAllText("sample.cs", csharp + "\n" + cintf);
            Console.ReadKey();
        }
Пример #11
0
        public void ApiGenerationTest()
        {
            var system = ActorSystem.Create("test");
            var api    = new ApiProvider(system, new TestRepository());

            foreach (var error in api.GenerationErrors)
            {
                this.output.WriteLine($"Error: {error}");
            }

            Assert.Equal(0, api.GenerationErrors.Count);

            var webApiProvider = new DirectProvider(api, this.output.WriteLine)
            {
                UseJsonRepack = true
            };
            var schema = SchemaGenerator.Generate(new List <Web.GraphQL.Publisher.ApiProvider> {
                webApiProvider
            });

            var hasSchemaErrors = false;

            foreach (var error in SchemaGenerator.CheckSchema(schema))
            {
                hasSchemaErrors = true;
                this.output.WriteLine($"Schema error: {error}");
            }

            using (var printer = new SchemaPrinter(schema))
            {
                var description = printer.Print();
                this.output.WriteLine("-------- Schema -----------");
                this.output.WriteLine(description);
                Assert.False(string.IsNullOrWhiteSpace(description));
            }

            Assert.False(hasSchemaErrors);

            hasSchemaErrors = false;
            foreach (var error in SchemaGenerator.CheckSchemaIntrospection(schema))
            {
                hasSchemaErrors = true;
                this.output.WriteLine($"Schema introspection error: {error}");
            }

            Assert.False(hasSchemaErrors);
        }
Пример #12
0
        public async Task EmptyVariablesTest(string variables)
        {
            this.ExpectNoMsg();
            var internalApiProvider = new TestProvider();
            var publishingProvider  = new DirectProvider(internalApiProvider, this.output.WriteLine)
            {
                UseJsonRepack = true
            };
            var schemaProvider = this.Container.Resolve <SchemaProvider>();

            schemaProvider.CurrentSchema = SchemaGenerator.Generate(new List <ApiProvider> {
                publishingProvider
            });

            var client = new RestClient($"http://*****:*****@"
            {                
                api {
                    syncScalarField
                }
            }";

            var body = $"{{\"query\": {JsonConvert.SerializeObject(query)}, \"variables\": {variables}}}";

            request.AddParameter("application/json", body, ParameterType.RequestBody);
            var result = await client.ExecuteTaskAsync(request);

            Assert.Equal(ResponseStatus.Completed, result.ResponseStatus);
            Assert.Equal(HttpStatusCode.OK, result.StatusCode);
            this.Sys.Log.Info("Response {Response}", result.Content);
        }
        public async Task SchemaDescriptionTest()
        {
            var checkAttributeArguments = new[]
            {
                ApiField.Scalar(
                    "attribute",
                    EnScalarType.String,
                    description: "attribute to check")
            };

            var objectFields = new[]
            {
                ApiField.Scalar(
                    "uid",
                    EnScalarType.Guid,
                    description: "The object unique identifier"),
                ApiField.Scalar("name", EnScalarType.String, description: "The object name"),
                ApiField.Scalar(
                    "attributes",
                    EnScalarType.String,
                    EnFieldFlags.IsArray,
                    description: "The object attributes"),
                ApiField.Scalar(
                    "checkAttribute",
                    EnScalarType.Boolean,
                    arguments: checkAttributeArguments,
                    description: "checks the attribute")
            };

            var objectType = new ApiObjectType("object", objectFields)
            {
                Description = "Some abstract object"
            };
            var apiField = objectType.CreateField(
                "new",
                description: "The new object data");

            var mutations = new[]
            {
                ApiMutation.CreateFromField(
                    ApiField.Object(
                        "objects_create",
                        "object",
                        arguments: new[] { apiField },
                        description: "creates a new object"),
                    ApiMutation.EnType.ConnectionCreate,
                    new List <ApiRequest>())
            };

            var api = new ApiDescription(
                "TestApi",
                "0.0.0.1",
                new[] { objectType },
                new[] { objectType.CreateField("objects", EnFieldFlags.IsConnection, "The objects dataset") },
                mutations)
            {
                Description = "The test api"
            };

            var provider = new MoqProvider {
                Description = api
            };
            var schema = SchemaGenerator.Generate(new List <ApiProvider> {
                provider
            });

            var errors = SchemaGenerator.CheckSchema(schema).Select(e => $"Schema type error: {e}")
                         .Union(SchemaGenerator.CheckSchemaIntrospection(schema))
                         .Select(e => $"Schema introspection error: {e}");

            var hasErrors = false;

            foreach (var error in errors)
            {
                hasErrors = true;
                this.output.WriteLine(error);
            }

            using (var printer = new SchemaPrinter(schema))
            {
                var description = printer.Print();
                this.output.WriteLine("-------- Schema -----------");
                this.output.WriteLine(description);
                Assert.False(string.IsNullOrWhiteSpace(description));
            }

            Assert.False(hasErrors);
            var query = BaseInstaller.ReadTextResource(
                this.GetType().GetTypeInfo().Assembly,
                "KlusterKite.Web.Tests.GraphQL.Resources.IntrospectionQuery.txt");

            var result = await new DocumentExecuter().ExecuteAsync(
                r =>
            {
                r.Schema = schema;

                r.Query = query;
            }).ConfigureAwait(true);
            var response = new DocumentWriter(true).Write(result);

            this.output.WriteLine(response);

            var expectedResponse = BaseInstaller.ReadTextResource(
                this.GetType().GetTypeInfo().Assembly,
                "KlusterKite.Web.Tests.GraphQL.Resources.SchemaDescriptionTestSnapshot.txt");

            Assert.Equal(CleanResponse(expectedResponse), CleanResponse(response));
        }
Пример #14
0
        public void ShouldThrowWhenNoNameAttribute()
        {
            var generator = new SchemaGenerator <INoAttributeService>();

            Assert.Throws <ServiceInterfaceException>(() => generator.Generate());
        }
Пример #15
0
        public async Task LoadTest()
        {
            this.ExpectNoMsg();
            var initialObjects = new List <TestObject>
            {
                new TestObject
                {
                    Id =
                        Guid.Parse(
                            "{3BEEE369-11DF-4A30-BF11-1D8465C87110}"),
                    Name  = "1-test",
                    Value = 100m
                },
                new TestObject
                {
                    Id =
                        Guid.Parse(
                            "{B500CA20-F649-4DCD-BDA8-1FA5031ECDD3}"),
                    Name  = "2-test",
                    Value = 50m
                },
                new TestObject
                {
                    Id =
                        Guid.Parse(
                            "{67885BA0-B284-438F-8393-EE9A9EB299D1}"),
                    Name  = "3-test",
                    Value = 50m
                },
                new TestObject
                {
                    Id =
                        Guid.Parse(
                            "{3AF2C973-D985-4F95-A0C7-AA928D276881}"),
                    Name  = "4-test",
                    Value = 70m
                },
                new TestObject
                {
                    Id =
                        Guid.Parse(
                            "{F0607502-5B77-4A3C-9142-E6197A7EE61E}"),
                    Name  = "5-test",
                    Value = 6m
                },
            };

            var internalApiProvider = new TestProvider(initialObjects);
            var publishingProvider  = new DirectProvider(internalApiProvider, this.output.WriteLine)
            {
                UseJsonRepack = true
            };
            var schemaProvider = this.Container.Resolve <SchemaProvider>();

            schemaProvider.CurrentSchema = SchemaGenerator.Generate(new List <ApiProvider> {
                publishingProvider
            });

            var client = new RestClient($"http://*****:*****@"
            {                
                api {
                    asyncArrayOfScalarField,
                    asyncForwardedScalar,
                    nestedAsync {
                        asyncScalarField,
                        syncScalarField                        
                    },
                    asyncScalarField,
                    forwardedArray,
                    syncArrayOfScalarField,
                    nestedSync {
                        asyncScalarField,
                        syncScalarField  
                    },
                    syncScalarField,
                    syncEnumField,
                    syncFlagsField,
                    connection(sort: [value_asc, name_asc], filter: {value_gt: 10}, offset: 1, limit: 2) {
                            count,
                            edges {
                                cursor,
                                node {
                                    id,
                                    __id,
                                    name,
                                    value
                                }                    
                            }
                        }
                }
            }                
            ";

            var stopwatch = new Stopwatch();
            var request   = new RestRequest {
                Method = Method.POST
            };

            request.AddHeader("Accept", "application/json, text/json");
            var body = $"{{\"query\": {JsonConvert.SerializeObject(query)}, \"variables\": null}}";

            request.AddParameter("application/json", body, ParameterType.RequestBody);
            stopwatch.Start();
            var result = client.ExecuteTaskAsync(request).Result;

            stopwatch.Stop();
            Assert.Equal(ResponseStatus.Completed, result.ResponseStatus);
            Assert.Equal(HttpStatusCode.OK, result.StatusCode);
            this.Sys.Log.Info("!!!!!!!!!! First request served in {StopWatch}ms", (double)stopwatch.ElapsedTicks * 1000 / Stopwatch.Frequency);
            stopwatch.Reset();
            stopwatch.Start();
            client.ExecuteTaskAsync(request).Wait();
            stopwatch.Stop();
            this.Sys.Log.Info("!!!!!!!!!! Second request served in {StopWatch}ms", (double)stopwatch.ElapsedTicks * 1000 / Stopwatch.Frequency);
            stopwatch.Reset();
            stopwatch.Start();

            var numberOfRequests = 3000;
            await Task.WhenAll(Enumerable.Range(1, numberOfRequests).Select(i => client.ExecuteTaskAsync(request)));

            stopwatch.Stop();
            this.Sys.Log.Info(
                "!!!!!!!!!! Served {numberOfRequests} requests in {StopWatch}ms ({StopWatchRequest}ms/req)",
                numberOfRequests,
                (double)stopwatch.ElapsedTicks * 1000 / Stopwatch.Frequency,
                (double)stopwatch.ElapsedTicks * 1000 / numberOfRequests / Stopwatch.Frequency);

            this.Sys.Log.Info("Response {Response}", result.Content);
        }
Пример #16
0
        public async Task SchemaInitializedTest()
        {
            this.ExpectNoMsg();
            var internalApiProvider = new TestProvider();
            var publishingProvider  = new DirectProvider(internalApiProvider, this.output.WriteLine)
            {
                UseJsonRepack = true
            };
            var schemaProvider = this.Container.Resolve <SchemaProvider>();

            schemaProvider.CurrentSchema = SchemaGenerator.Generate(new List <ApiProvider> {
                publishingProvider
            });

            var client = new RestClient($"http://*****:*****@"
            {                
                api {
                    asyncArrayOfScalarField,
                    asyncForwardedScalar,
                    nestedAsync {
                        asyncScalarField,
                        syncScalarField                        
                    },
                    asyncScalarField,
                    faultedSyncField,
                    forwardedArray,
                    syncArrayOfScalarField,
                    nestedSync {
                        asyncScalarField,
                        syncScalarField  
                    },
                    syncScalarField,
                    faultedASyncMethod {
                        asyncScalarField,
                        syncScalarField 
                    }
                }
            }";

            request.AddJsonBody(new EndpointController.QueryRequest {
                Query = query
            });
            var result = await client.ExecuteTaskAsync(request);

            this.Sys.Log.Info("Response {Response}", result.Content);
            Assert.Equal(ResponseStatus.Completed, result.ResponseStatus);
            Assert.Equal(HttpStatusCode.OK, result.StatusCode);

            var expectedResult = @"
                        {
                          ""data"": {
                            ""api"": {
                              ""asyncArrayOfScalarField"": [
                                4.0,
                                5.0
                              ],
                              ""asyncForwardedScalar"": ""AsyncForwardedScalar"",
                              ""nestedAsync"": {
                                ""asyncScalarField"": ""AsyncScalarField"",
                                ""syncScalarField"": ""SyncScalarField""
                              },
                              ""asyncScalarField"": ""AsyncScalarField"",
                              ""faultedSyncField"": null,
                              ""forwardedArray"": [
                                5,
                                6,
                                7
                              ],
                              ""syncArrayOfScalarField"": [
                                1,
                                2,
                                3
                              ],
                              ""nestedSync"": {
                                ""asyncScalarField"": ""AsyncScalarField"",
                                ""syncScalarField"": ""SyncScalarField""
                              },
                              ""syncScalarField"": ""SyncScalarField"",
                              ""faultedASyncMethod"": null
                            }
                          }
                        }
                        ";

            Assert.Equal(
                ApiProviderPublishResolveIntegration.CleanResponse(expectedResult),
                ApiProviderPublishResolveIntegration.CleanResponse(result.Content));
        }
        public async Task NonEmptyApiTest()
        {
            var viewerType = new ApiObjectType(
                "viewer",
                new[] { ApiField.Scalar("id", EnScalarType.Integer), ApiField.Scalar("name", EnScalarType.String) });

            var api = new ApiDescription(
                "TestApi1",
                "0.0.0.1",
                new[] { viewerType },
                new[] { viewerType.CreateField("viewer") });

            var provider = new MoqProvider
            {
                Description = api,
                Data        = "{\"viewer\": {\"__id\": 1, \"name\": \"test name\"}}"
            };

            var schema = SchemaGenerator.Generate(new List <ApiProvider> {
                provider
            });

            using (var printer = new SchemaPrinter(schema))
            {
                var description = printer.Print();
                this.output.WriteLine("-------- Schema -----------");
                this.output.WriteLine(description);
                Assert.False(string.IsNullOrWhiteSpace(description));
            }

            Assert.NotNull(schema.Query);
            Assert.Equal(3, schema.Query.Fields.Count());
            Assert.True(schema.Query.HasField("api"));

            var result = await new DocumentExecuter().ExecuteAsync(
                r =>
            {
                r.Schema = schema;
                r.Query  = @"
                                query {
                                    api {
                                        viewer {
                                            __id,
                                            name
                                        }
                                    }
                                }            
                                ";
            }).ConfigureAwait(true);

            this.output.WriteLine("-------- Response -----------");
            var response = new DocumentWriter(true).Write(result);

            this.output.WriteLine(response);
            var expectedResponse = @"{
                                      ""data"": {
                                        ""api"": {
                                          ""viewer"": {
                                            ""__id"": 1,
                                            ""name"": ""test name""
                                          }
                                        }
                                      }
                                    }";

            Assert.Equal(CleanResponse(expectedResponse), CleanResponse(response));
        }
        public async Task ArraysApiTest()
        {
            var viewerFields = new[]
            {
                ApiField.Scalar("id", EnScalarType.Guid, EnFieldFlags.Queryable | EnFieldFlags.IsKey),
                ApiField.Scalar("name", EnScalarType.String),
                ApiField.Scalar("numbers", EnScalarType.Integer, EnFieldFlags.IsArray | EnFieldFlags.Queryable)
            };
            var viewerType = new ApiObjectType("viewer", viewerFields);

            var objectFields = new[]
            {
                ApiField.Scalar("id", EnScalarType.Integer, EnFieldFlags.IsKey | EnFieldFlags.Queryable),
                ApiField.Scalar("name", EnScalarType.String)
            };

            var objectType = new ApiObjectType("object", objectFields);

            var api = new ApiDescription(
                "TestApi1",
                "0.0.0.1",
                new[] { viewerType, objectType },
                new[] { viewerType.CreateField("viewer"), objectType.CreateField("object", EnFieldFlags.IsConnection | EnFieldFlags.Queryable) });

            var provider = new MoqProvider
            {
                Description = api,
                Data        = @"{
	                    ""viewer"": {
		                    ""__id"": ""FD73BAFB-3698-4FA1-81F5-27C8C83BB4F0"", 
		                    ""name"": ""test name"",
		                    ""numbers"": [1, 2, 3]
	                    }, 
	                    ""object"": {
		                    ""count"": 2, 
		                    ""edges"": [
			                    {""__id"": 10, ""node___id"": 10}, 
			                    {""__id"": 20, ""node___id"": 20}
		                    ]
	                    }
                    }"
            };

            var schema = SchemaGenerator.Generate(new List <ApiProvider> {
                provider
            });

            using (var printer = new SchemaPrinter(schema))
            {
                var description = printer.Print();
                this.output.WriteLine("-------- Schema -----------");
                this.output.WriteLine(description);
                Assert.False(string.IsNullOrWhiteSpace(description));
            }

            Assert.NotNull(schema.Query);
            Assert.Equal(3, schema.Query.Fields.Count());
            Assert.True(schema.Query.HasField("api"));

            var result = await new DocumentExecuter().ExecuteAsync(
                r =>
            {
                r.Schema = schema;
                r.Query  = @"
                                query {
                                    api {
                                        viewer {
                                            __id,
                                            name,
                                            numbers
                                        },
                                        object {
                                            count,
                                            edges {
                                                cursor,                                                
                                                node {
                                                    __id
                                                }
                                            }
                                        }
                                    }
                                }            
                                ";
            }).ConfigureAwait(true);

            this.output.WriteLine("-------- Response -----------");
            var response = new DocumentWriter(true).Write(result);

            this.output.WriteLine(response);

            var expectedResponse = @"{
                                      ""data"": {
                                        ""api"": {
                                          ""viewer"": {
                                            ""__id"": ""fd73bafb-3698-4fa1-81f5-27c8c83bb4f0"",
                                            ""name"": ""test name"",
		                                    ""numbers"": [1, 2, 3]
                                          },
                                          ""object"": {
                                            ""count"": 2,
                                            ""edges"": [
                                              {
                                                ""cursor"": 10,
                                                ""node"": {
                                                  ""__id"": 10
                                                }
                                              },
                                              {
                                                ""cursor"": 20,
                                                ""node"": {
                                                  ""__id"": 20
                                                }
                                              }
                                            ]
                                          }
                                        }
                                      }
                                    }";

            Assert.Equal(CleanResponse(expectedResponse), CleanResponse(response));
        }