Пример #1
0
        private ISchema CreateSchema()
        {
            var builder        = new TestServerBuilder();
            var defaultScalars = new DefaultScalarTypeProvider();

            foreach (var scalarConcreteType in defaultScalars.ConcreteTypes)
            {
                builder.AddGraphType(scalarConcreteType);
            }

            builder.AddGraphType(typeof(TestEnum));
            return(builder.Build().Schema);
        }
Пример #2
0
        public void Introspected_ListType_NotNullType_NotNullList_PropertyCheck()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <string>()
                                .Build();

            var schema = new IntrospectedSchema(server.Schema);

            schema.Rebuild();

            var scalar = GraphQLProviders.ScalarProvider.RetrieveScalar(typeof(string));

            var spected = schema.FindIntrospectedType(scalar);

            var wrapped = Introspection.WrapBaseTypeWithModifiers(spected, GraphTypeExpression.RequiredListRequiredItem);

            Assert.AreEqual(TypeKind.NON_NULL, wrapped.Kind);

            var unwrappedList = wrapped.OfType;

            Assert.AreEqual(TypeKind.LIST, unwrappedList.Kind);

            var unwrappedItemType = unwrappedList.OfType;

            Assert.AreEqual(TypeKind.NON_NULL, unwrappedItemType.Kind);

            var itemType = unwrappedItemType.OfType;

            Assert.AreEqual(spected, itemType);
        }
Пример #3
0
        public void Introspected_ListType_PropertyCheck()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <string>()
                                .Build();

            var schema = new IntrospectedSchema(server.Schema);

            schema.Rebuild();

            var scalar = GraphQLProviders.ScalarProvider.RetrieveScalar(typeof(string));

            var spected = schema.FindIntrospectedType(scalar);

            var wrapped = Introspection.WrapBaseTypeWithModifiers(spected, MetaGraphTypes.IsList);

            Assert.AreEqual(TypeKind.LIST, wrapped.Kind);

            Assert.IsNull(wrapped.Fields);
            Assert.IsNull(wrapped.Interfaces);
            Assert.IsNull(wrapped.PossibleTypes);
            Assert.IsNull(wrapped.EnumValues);
            Assert.IsNull(wrapped.InputFields);
            Assert.IsNull(wrapped.Name);
            Assert.IsNull(wrapped.Description);
            Assert.AreEqual(spected, wrapped.OfType);
        }
Пример #4
0
        public void IntrospectedUnion_PropertyCheck()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <SodaFountainController>()
                                .Build();

            var proxy  = new SodaTypeUnionProxy();
            var schema = new IntrospectedSchema(server.Schema);

            schema.Rebuild();

            var spected = schema.FindIntrospectedType(proxy.Name);

            spected.Initialize(schema);

            Assert.AreEqual(proxy.Name, spected.Name);
            Assert.AreEqual(proxy.Description, spected.Description);
            Assert.AreEqual(TypeKind.UNION, spected.Kind);
            Assert.AreEqual(2, spected.PossibleTypes.Count);
            Assert.IsTrue(spected.PossibleTypes.Any(x => x.Name == "SodaTypeA"));
            Assert.IsTrue(spected.PossibleTypes.Any(x => x.Name == "SodaTypeB"));

            Assert.IsNull(spected.Fields);
            Assert.IsNull(spected.Interfaces);
            Assert.IsNull(spected.EnumValues);
            Assert.IsNull(spected.InputFields);
            Assert.IsNull(spected.OfType);
        }
Пример #5
0
        public void IntrospectedScalar_PropertyCheck()
        {
            var serverBuilder = new TestServerBuilder();

            serverBuilder.AddGraphType <string>();
            var server = serverBuilder.Build();

            var schema = new IntrospectedSchema(server.Schema);
            var scalar = GraphQLProviders.ScalarProvider.RetrieveScalar(typeof(string));

            var spected = new IntrospectedType(scalar);

            spected.Initialize(schema);

            Assert.AreEqual(scalar.Name, spected.Name);
            Assert.AreEqual(scalar.Description, spected.Description);
            Assert.AreEqual(scalar.Kind, spected.Kind);

            Assert.IsNull(spected.Fields);
            Assert.IsNull(spected.Interfaces);
            Assert.IsNull(spected.PossibleTypes);
            Assert.IsNull(spected.EnumValues);
            Assert.IsNull(spected.InputFields);
            Assert.IsNull(spected.OfType);
        }
Пример #6
0
        public async Task Schema_QueryAndMutationTypeNames_ReturnsValidData()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <SodaCanController>()
                                .Build();

            var builder = server.CreateQueryContextBuilder();

            // need to resolve type field now
            builder.AddQueryText(@"{
                               __schema
                              {
                                 queryType { name }
                                 mutationType { name }
                              }
                            }");

            var response = await server.RenderResult(builder);

            var output =
                @"{
                    ""data"": {
                        ""__schema"" : {
                            ""queryType"" : {""name"": ""Query""},
                            ""mutationType"" : null
                        }
                    }
                }";

            CommonAssertions.AreEqualJsonStrings(output, response);
        }
Пример #7
0
        public async Task SingleType_ScalarType_ReturnsValidData()
        {
            var serverBuilder = new TestServerBuilder();

            // contains an enum CapacityType on SodaCanBuildingData
            var server  = serverBuilder.AddGraphType <SodaCanBuildingController>().Build();
            var builder = server.CreateQueryContextBuilder();

            // need to resolve type field now
            builder.AddQueryText(@"{
                               __type(name: ""Int"")
                              {
                                name  kind
                                }
                            }");

            var response = await server.RenderResult(builder);

            var output = @"
                            {
                                ""data"": {
                                   ""__type"": {
                                            ""name"": ""Int"",
                                            ""kind"" : ""SCALAR"",
                                        }
                                }
                            }";

            CommonAssertions.AreEqualJsonStrings(output, response);
        }
        private (IGraphQLHttpProcessor <GraphSchema> Processor, HttpContext Context) CreateQueryArtifacts(GraphQueryData data = null)
        {
            var builder = new TestServerBuilder(TestOptions.UseCodeDeclaredNames);

            builder.AddGraphType <CandyController>();
            var server = builder.Build();

            return(server.CreateHttpQueryProcessor(), server.CreateHttpContext(data));
        }
Пример #9
0
        public async Task SingleType_EnumType_ReturnsValidData()
        {
            var serverBuilder = new TestServerBuilder();

            // contains an enum CapacityType on SodaCanBuildingData
            var server = serverBuilder.AddGraphType <SodaCanBuildingController>()
                         .AddSchemaBuilderAction(o =>
            {
                o.Options.ResponseOptions.ExposeExceptions = true;
            })
                         .Build();
            var builder = server.CreateQueryContextBuilder();

            // need to resolve type field now
            builder.AddQueryText(@"{
                               __type(name: ""CapacityType"")
                              {
                                name
                                kind
                                enumValues (includeDeprecated: true) {name description isDeprecated deprecationReason}
                                }
                            }");

            var response = await server.RenderResult(builder);

            var output = @"
                            {
                            ""data"": {
                                  ""__type"": {
                                            ""name"": ""CapacityType"",
                                            ""kind"" : ""ENUM"",
                                            ""enumValues"": [
                                            {
                                                ""name"": ""SMALL"",
                                                ""description"": ""A small room"",
                                                ""isDeprecated"": false,
                                                ""deprecationReason"" : null,
                                            },
                                            {
                                                ""name"": ""MEDIUM"",
                                                ""description"": null,
                                                ""isDeprecated"": false,
                                                ""deprecationReason"" : null,
                                            },
                                            {
                                                ""name"": ""LARGE"",
                                                ""description"": null,
                                                ""isDeprecated"": true,
                                                ""deprecationReason"" : ""Room too big"",
                                            },
                                        ]}
                                    }
                                }";

            CommonAssertions.AreEqualJsonStrings(output, response);
        }
Пример #10
0
        public async Task StandardExcution_EnsureResultsMakeSense()
        {
            var serverBuilder = new TestServerBuilder(TestOptions.IncludeMetrics);

            serverBuilder.AddGraphType <SimpleExecutionController>();
            var server = serverBuilder.Build();

            var builder = server.CreateQueryContextBuilder()
                          .AddQueryText("query Operation1{  simple {  simpleQueryMethod { property1 } } }")
                          .AddOperationName("Operation1");

            builder.AddMetrics(new ApolloTracingMetricsV1(server.Schema));
            var context = builder.Build();

            await server.ExecuteQuery(context);

            var metrics = context.Metrics as ApolloTracingMetricsV1;

            Assert.AreEqual(0, context.Messages.Count);

            // parse, validation, execution
            Assert.AreEqual(3, metrics.PhaseEntries.Count);

            // simple, SimpleQueryMethod, Property1
            Assert.AreEqual(3, metrics.ResolverEntries.Count);

            // ensure phase ordering follows natural progression
            var parsePhase      = metrics.PhaseEntries[ApolloExecutionPhase.PARSING];
            var validationPhase = metrics.PhaseEntries[ApolloExecutionPhase.VALIDATION];
            var executionPhase  = metrics.PhaseEntries[ApolloExecutionPhase.EXECUTION];

            Assert.IsTrue(parsePhase.StartOffsetTicks < parsePhase.EndOffsetTicks);
            Assert.IsTrue(parsePhase.EndOffsetTicks < validationPhase.StartOffsetTicks);

            Assert.IsTrue(validationPhase.StartOffsetTicks < validationPhase.EndOffsetTicks);
            Assert.IsTrue(validationPhase.EndOffsetTicks < executionPhase.StartOffsetTicks);

            Assert.IsTrue(executionPhase.StartOffsetTicks < executionPhase.EndOffsetTicks);
            Assert.IsTrue(executionPhase.EndOffsetTicks < metrics.TotalTicks);

            // ensure resolver tree follows natural progresion
            var simple      = metrics.ResolverEntries.First(x => x.Key.Field.Name == "simple").Value;
            var queryMethod = metrics.ResolverEntries.First(x => x.Key.Field.Name == "simpleQueryMethod").Value;
            var property1   = metrics.ResolverEntries.First(x => x.Key.Field.Name == "property1").Value;

            Assert.IsTrue(executionPhase.StartOffsetTicks < simple.StartOffsetTicks);

            Assert.IsTrue(simple.StartOffsetTicks < simple.EndOffsetTicks);
            Assert.IsTrue(simple.EndOffsetTicks < queryMethod.StartOffsetTicks);

            Assert.IsTrue(queryMethod.StartOffsetTicks < queryMethod.EndOffsetTicks);
            Assert.IsTrue(queryMethod.EndOffsetTicks < property1.StartOffsetTicks);

            Assert.IsTrue(property1.StartOffsetTicks < property1.EndOffsetTicks);
            Assert.IsTrue(property1.EndOffsetTicks < executionPhase.EndOffsetTicks);
        }
Пример #11
0
        public async Task SingleType_WrappedTypeOnField_ReturnsValidData()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <VendingMachineController>().Build();
            var builder       = server.CreateQueryContextBuilder();

            // need to resolve type field now
            builder.AddQueryText(@"{
                               __type(name: ""Query_Vending"")
                              {
                                name
                                fields{
                                    name
                                    type {
                                        kind
                                        ofType {
                                            kind
                                            ofType {name kind }
                                        }
                                    }
                                }
                              }
                            }");

            var response = await server.RenderResult(builder);

            var output = @"
                        {
                        ""data"": {
                              ""__type"": {
                                        ""name"": ""Query_Vending"",
                                        ""fields"": [
                                        {
                                            ""name"": ""cansPerRow"",
                                            ""type"": {
                                                ""kind"": ""LIST"",
                                                ""ofType"": {
                                                    ""kind"": ""NON_NULL"",
                                                    ""ofType"": {
                                                        ""name"": ""Int"",
                                                        ""kind"": ""SCALAR""
                                                    }
                                                }
                                            }
                                        }]
                                    }
                                }
                            }";

            CommonAssertions.AreEqualJsonStrings(output, response);
        }
Пример #12
0
        private TestServer <GraphSchema> CreateTestServer(out TestLogger logInstance)
        {
            // fake a logger with a single instance that will accept
            // log entries from the run time so they can be validated in the test.
            logInstance = new TestLogger();

            var builder = new TestServerBuilder();

            builder.AddGraphType <LogTestController>();
            builder.AddGraphQLLocalQueryCache();
            builder.Logging.AddLoggerProvider(new TestLoggingProvider(logInstance));
            builder.Logging.SetMinimumLogLevel(LogLevel.Trace);
            return(builder.Build());
        }
Пример #13
0
        public async Task Schema_TypeNameAndKind_ThroughAFragment_ReturnsValidData()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <SodaCanController>().Build();
            var builder       = server.CreateQueryContextBuilder();

            builder.AddQueryText(@"
                            {
                               __schema
                              {
                                 types {
                                    ...FullType
                                }
                              }
                            }
                             fragment FullType on __Type {
                                  kind
                                  name
                            }");

            var response = await server.RenderResult(builder);

            var output = @"
                        {
                            ""data"": {
                                ""__schema"": {
                                    ""types"": [
                                      { ""name"": ""__DirectiveLocation"", ""kind"": ""ENUM"" },
                                      { ""name"": ""__InputValue"", ""kind"": ""OBJECT"" },
                                      { ""name"": ""__Directive"", ""kind"": ""OBJECT"" },
                                      { ""name"": ""__Type"", ""kind"": ""OBJECT"" },
                                      { ""name"": ""__TypeKind"", ""kind"": ""ENUM"" },
                                      { ""name"": ""__Schema"", ""kind"": ""OBJECT"" },
                                        { ""name"": ""__Field"", ""kind"": ""OBJECT"" },
                                        { ""name"": ""__EnumValue"", ""kind"": ""OBJECT"" },
                                        { ""name"": ""String"", ""kind"": ""SCALAR"" },
                                        { ""name"": ""Boolean"", ""kind"": ""SCALAR"" },
                                        { ""name"": ""Int"", ""kind"": ""SCALAR"" },
                                        { ""name"": ""SodaCan"", ""kind"": ""OBJECT"" },
                                        { ""name"": ""Query_Sodas"", ""kind"": ""OBJECT"" },
                                        { ""name"": ""Query"", ""kind"": ""OBJECT"" },
                                        ]
                                }
                            }
                        }";

            CommonAssertions.AreEqualJsonStrings(output, response);
        }
Пример #14
0
        public void IntrospectedEnum_PropertyCheck()
        {
            var serverBuilder = new TestServerBuilder(TestOptions.UseCodeDeclaredNames);
            var server        = serverBuilder
                                .AddGraphType <IntrospectableEnum>()
                                .Build();

            var template = TemplateHelper.CreateEnumTemplate <IntrospectableEnum>();
            var schema   = new IntrospectedSchema(server.Schema);

            schema.Rebuild();

            var enumGraphType = server.CreateGraphType(typeof(IntrospectableEnum), TypeKind.ENUM).GraphType as IEnumGraphType;

            Assert.IsNotNull(enumGraphType);

            var spected = schema.FindIntrospectedType(enumGraphType);

            Assert.AreEqual(enumGraphType.Name, spected.Name);
            Assert.AreEqual(enumGraphType.Description, spected.Description);
            Assert.AreEqual(enumGraphType.Kind, spected.Kind);

            Assert.IsNotNull(spected.EnumValues);

            var expected1 = template.Values[0];
            var expected2 = template.Values[1];

            var val1 = spected.EnumValues[0];
            var val2 = spected.EnumValues[1];

            Assert.AreEqual(expected1.Name, val1.Name);
            Assert.AreEqual(expected1.Description, val1.Description);
            Assert.AreEqual(expected1.IsDeprecated, val1.IsDeprecated);
            Assert.AreEqual(expected1.DeprecationReason, val1.DeprecationReason);

            Assert.AreEqual(expected2.Name, val2.Name);
            Assert.AreEqual(expected2.Description, val2.Description);
            Assert.AreEqual(expected2.IsDeprecated, val2.IsDeprecated);
            Assert.AreEqual(expected2.DeprecationReason, val2.DeprecationReason);

            Assert.IsNull(spected.Fields);
            Assert.IsNull(spected.Interfaces);
            Assert.IsNull(spected.PossibleTypes);
            Assert.IsNull(spected.InputFields);
            Assert.IsNull(spected.OfType);
        }
Пример #15
0
        public async Task Schema_FieldYieldsAUnion_ReturnsValidData()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <SodaFountainController>().Build();
            var builder       = server.CreateQueryContextBuilder();

            builder.AddQueryText(@"{
                               __schema
                              {
                                 types { name kind }
                              }
                            }");

            var response = await server.RenderResult(builder);

            var output = @"
                        {
                         ""data"": {
                              ""__schema"": {
                                        ""types"": [
                                            { ""name"": ""__DirectiveLocation"", ""kind"": ""ENUM"" },
                                            { ""name"": ""__InputValue"", ""kind"": ""OBJECT"" },
                                            { ""name"": ""__Directive"", ""kind"": ""OBJECT"" },
                                            { ""name"": ""__Type"", ""kind"": ""OBJECT"" },
                                            { ""name"": ""__TypeKind"", ""kind"": ""ENUM"" },
                                            { ""name"": ""__Schema"", ""kind"": ""OBJECT"" },
                                            { ""name"": ""__Field"", ""kind"": ""OBJECT"" },
                                            { ""name"": ""__EnumValue"", ""kind"": ""OBJECT"" },
                                            { ""name"": ""String"", ""kind"": ""SCALAR"" },
                                            { ""name"": ""Boolean"", ""kind"": ""SCALAR"" },
                                            { ""name"": ""SodaTypeA"", ""kind"": ""OBJECT"" },
                                            { ""name"": ""SodaTypeB"", ""kind"": ""OBJECT"" },
                                            { ""name"": ""SodaTypes"", ""kind"": ""UNION"" },
                                            { ""name"": ""Query_Fountain"", ""kind"": ""OBJECT"" },
                                            { ""name"": ""Query"", ""kind"": ""OBJECT"" },
                                        ]
                                    }
                            }
                        }
                        ";

            CommonAssertions.AreEqualJsonStrings(output, response);
        }
Пример #16
0
        public void Introspected_NotNullType_WhenSuppliedANotNullType_ThrowsException()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <string>()
                                .Build();

            var schema = new IntrospectedSchema(server.Schema);

            schema.Rebuild();

            var scalar = GraphQLProviders.ScalarProvider.RetrieveScalar(typeof(string));

            var spected = schema.FindIntrospectedType(scalar);

            var wrapped = Introspection.WrapBaseTypeWithModifiers(spected, MetaGraphTypes.IsNotNull);

            Assert.Throws <GraphTypeDeclarationException>(() =>
            {
                var _ = new IntrospectedType(wrapped, TypeKind.NON_NULL);
            });
        }
Пример #17
0
        public async Task Schema_EnumValues_ReturnsValidData()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <IntrospectableEnum>()
                                .Build();
            var builder = server.CreateQueryContextBuilder();

            builder.AddQueryText(@"
                            {
                               __type(name: ""IntrospectableEnum"")
                              {
                                kind
                                  name
                                  enumValues (includeDeprecated: true) { name }
                              }
                            }");

            var response = await server.RenderResult(builder);

            var output = @"
                        {
                            ""data"": {
                                ""__type"": {
                                    ""kind"": ""ENUM"",
                                    ""name"": ""IntrospectableEnum"",
                                    ""enumValues"": [
                                        {
                                            ""name"" : ""VALUE1""
                                        },
                                        {
                                            ""name"" : ""VALUE2""
                                        }
                                    ]
                                }
                            }
                        }";

            CommonAssertions.AreEqualJsonStrings(output, response);
        }
Пример #18
0
        public async Task SingleType_FieldYieldsAUnion_UnionDeliversPossibleTypes()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <SodaFountainController>().Build();
            var builder       = server.CreateQueryContextBuilder();

            builder.AddQueryText(@"
                            {
                               __type(name : ""SodaTypes"")
                              {
                                 name kind possibleTypes { name kind } fields
                              }
                            }");

            var response = await server.RenderResult(builder);

            var output = @"
                        {
                        ""data"": {
                              ""__type"": {
                                    ""name"": ""SodaTypes"",
                                    ""kind"": ""UNION"",
                                    ""possibleTypes"": [
                                        {
                                            ""name"": ""SodaTypeA"",
                                            ""kind"": ""OBJECT""
                                        },
                                        {
                                            ""name"": ""SodaTypeB"",
                                            ""kind"": ""OBJECT""
                                        }
                                    ],
                                    ""fields"" : null
                                }
                           }
                       } ";

            CommonAssertions.AreEqualJsonStrings(output, response);
        }
Пример #19
0
        public void IntrospectedSchema_PropertyCheck()
        {
            var serverBuilder = new TestServerBuilder();

            serverBuilder.AddGraphType <string>();

            var server = serverBuilder.Build();

            var schema = new IntrospectedSchema(server.Schema);

            schema.Rebuild();

            Assert.AreEqual(server.Schema.Name, schema.Name);
            Assert.IsNotNull(schema.FindGraphType(Constants.ScalarNames.STRING));
            Assert.IsNotNull(schema.FindIntrospectedType(Constants.ScalarNames.STRING));
            Assert.AreEqual(11, schema.KnownTypes.Count());

            Assert.IsNotNull(schema.QueryType);
            Assert.IsNull(schema.MutationType);
            Assert.IsNull(schema.SubscriptionType);
            Assert.IsNotNull(schema.Directives);
            Assert.AreEqual(2, schema.Directives.Count()); // skip , include
        }
Пример #20
0
        public async Task ProductionDefaults_NoChanges()
        {
            var builder = new TestServerBuilder();
            var server  = builder.AddGraphType <FanController>()
                          .Build();
            var queryBuilder = server.CreateQueryContextBuilder();

            queryBuilder.AddQueryText("{ retrieveFan(name: \"bob\"){ id, name, fanSpeed} }");

            var result = await server.RenderResult(queryBuilder).ConfigureAwait(false);

            var expectedResult = @"
            {
                ""data"" : {
                    ""retrieveFan"": {
                        ""id"" : 1,
                        ""name"" : ""bob"",
                        ""fanSpeed"" : ""MEDIUM""
                    }
                }
            }";

            CommonAssertions.AreEqualJsonStrings(expectedResult, result);
        }
Пример #21
0
        public async Task SingleType_ObjectType_Interfaces_ReturnsValidData()
        {
            var serverBuilder = new TestServerBuilder();

            // contains an enum CapacityType on SodaCanBuildingData
            var server = serverBuilder.AddGraphType <SodaCan2>()
                         .AddGraphType <ICan>()
                         .Build();

            var builder = server.CreateQueryContextBuilder();

            // need to resolve type field now
            builder.AddQueryText(@"{
                               __type(name: ""SodaCan2"")
                              {
                                name
                                kind
                                interfaces { name kind }
                                }
                            }");

            var response = await server.RenderResult(builder);

            var output = @"
                            {
                                ""data"": {
                                      ""__type"": {
                                                ""name"": ""SodaCan2"",
                                                ""kind"" : ""OBJECT"",
                                                ""interfaces"": [{""name"" : ""ICan"", ""kind"" : ""INTERFACE""}]
                                        }
                                }
                            }";

            CommonAssertions.AreEqualJsonStrings(output, response);
        }
Пример #22
0
        public async Task EndToEndIntegrationTest()
        {
            var builder = new TestServerBuilder();

            builder.AddScoped <IMusicService, MusicService>();
            builder.AddSingleton <IMusicRepository, MusicRepository>();
            builder.AddGraphType <MusicController>();
            builder.AddGraphQL(o =>
            {
                o.ExecutionOptions.AwaitEachRequestedField = true;
            });

            var server = builder.Build();

            // Test the following areas
            // -----------------------------------
            // queries
            // input values: scalars
            // batch child query ("records" is a batch list extension method)
            // root level controller actions (note no nesting under the declared "music" field of the controller for the "artists" field)
            var expected     = LoadOutputFile("RetrieveArtistsAndRecords.json");
            var queryBuilder = server.CreateQueryContextBuilder();

            queryBuilder.AddQueryText(
                @"query {
                                artists(searchText: ""queen"") {
                                    id
                                    name
                                    records {
                                        id
                                        name
                                        genre {
                                            id
                                            name
                                        }
                                    }
                                }
                            }");

            var result1 = await server.RenderResult(queryBuilder);

            CommonAssertions.AreEqualJsonStrings(expected, result1, "(1): " + result1);

            // Test the following areas
            // -----------------------------------
            // virtual routing (the "music" field is a virtual field declared on the controller)
            // mutations
            // input values: scalars
            // batch sybling query ("company" is a batch sybling extension method)
            expected     = LoadOutputFile("CreateNewArtist.json");
            queryBuilder = server.CreateQueryContextBuilder();
            queryBuilder.AddQueryText(
                @"mutation {
                          music{
                            createArtist(artistName: ""EXO"", recordCompanyId: 4) {
                                id
                                name
                                company {
                                    id
                                    name
                                }
                            }
                        }}");

            var result2 = await server.RenderResult(queryBuilder);

            CommonAssertions.AreEqualJsonStrings(expected, result2, "(2): " + result2);

            // Test the following areas
            // -----------------------------------
            // virtual routing (the "music" field is a virtual field declared on the controller)
            // mutations
            // input values: complex objects
            // unicode characters
            expected     = LoadOutputFile("CreateRecord.json");
            queryBuilder = server.CreateQueryContextBuilder();
            queryBuilder.AddQueryText(
                @"mutation {
                          music{
                            createRecord(artist: {id: 10, name: ""EXO"", recordCompanyId: 4},
                                         genre: {id:2, name: ""pop""},
                                         songName:""다이아몬드"") {
                                id
                                artistId
                                genre { id name }
                                name
                            }
                        }}");

            var result3 = await server.RenderResult(queryBuilder);

            CommonAssertions.AreEqualJsonStrings(expected, result3, "(3): " + result3);
        }
Пример #23
0
        public async Task StandardExcution_OutputTest()
        {
            var serverBuilder = new TestServerBuilder(TestOptions.IncludeMetrics);

            serverBuilder.AddGraphType <SimpleExecutionController>();

            serverBuilder.AddGraphQL(o =>
            {
                o.ResponseOptions.ExposeMetrics = true;
            });

            var server  = serverBuilder.Build();
            var builder = server.CreateQueryContextBuilder()
                          .AddQueryText("query Operation1{  simple {  simpleQueryMethod { property1} } }")
                          .AddOperationName("Operation1");

            var metrics = new ApolloTracingMetricsV1(server.Schema);

            builder.AddMetrics(metrics);

            var result = await server.RenderResult(builder);

            var parsePhase      = metrics.PhaseEntries[ApolloExecutionPhase.PARSING];
            var validationPhase = metrics.PhaseEntries[ApolloExecutionPhase.VALIDATION];
            var simple          = metrics.ResolverEntries.First(x => x.Key.Field.Name == "simple").Value;
            var queryMethod     = metrics.ResolverEntries.First(x => x.Key.Field.Name == "simpleQueryMethod").Value;
            var property1       = metrics.ResolverEntries.First(x => x.Key.Field.Name == "property1").Value;

            var expectedResult = @"
                        {
                          ""data"": {
                                    ""simple"": {
                                        ""simpleQueryMethod"": {
                                            ""property1"": ""default string""
                                        }
                                    }
                                },
                                ""extensions"": {
                                    ""tracing"": {
                                        ""version"": 1,
                                        ""startTime"": ""[StartTime]"",
                                        ""endTime"": ""[EndTime]"",
                                        ""duration"": [Duration],
                                        ""parsing"": {
                                            ""startOffset"": [ParsingOffset],
                                            ""duration"": [ParsingDuration]
                                        },
                                        ""validation"": {
                                            ""startOffset"":[ValidationOffset],
                                            ""duration"": [ValidationDuration]
                                        },
                                        ""execution"": {
                                            ""resolvers"": [
                                            {
                                                ""path"": [""simple""],
                                                ""fieldName"": ""simple"",
                                                ""parentType"" : ""Query"",
                                                ""returnType"": ""Query_Simple"",
                                                ""startOffset"": [simpleStartOffset],
                                                ""duration"": [simpleDuration]
                                            },
                                            {
                                                ""path"": [""simple"", ""simpleQueryMethod""],
                                                ""fieldName"": ""simpleQueryMethod"",
                                                ""parentType"": ""Query_Simple"",
                                                ""returnType"": ""TwoPropertyObject"",
                                                ""startOffset"": [SimpleQueryMethodOffset],
                                                ""duration"": [SimpleQueryMethodDuration]
                                            },
                                            {
                                                ""path"": [""simple"", ""simpleQueryMethod"", ""property1""],
                                                ""fieldName"": ""property1"",
                                                ""parentType"": ""TwoPropertyObject"",
                                                ""returnType"": ""String"",
                                                ""startOffset"": [Property1Offset],
                                                ""duration"": [Property1Duration]
                                            }
                                            ]
                                        }
                                    }
                                }
                            }";

            expectedResult = expectedResult.Replace("[StartTime]", metrics.StartDate.ToRfc3339String())
                             .Replace("[EndTime]", metrics.StartDate.AddTicks(metrics.TotalTicks).ToRfc3339String())
                             .Replace("[Duration]", metrics.TotalTicks.ToString())
                             .Replace("[ParsingOffset]", parsePhase.StartOffsetNanoseconds.ToString())
                             .Replace("[ParsingDuration]", parsePhase.DurationNanoSeconds.ToString())
                             .Replace("[ValidationOffset]", validationPhase.StartOffsetNanoseconds.ToString())
                             .Replace("[ValidationDuration]", validationPhase.DurationNanoSeconds.ToString())
                             .Replace("[simpleStartOffset]", simple.StartOffsetNanoseconds.ToString())
                             .Replace("[simpleDuration]", simple.DurationNanoSeconds.ToString())
                             .Replace("[SimpleQueryMethodOffset]", queryMethod.StartOffsetNanoseconds.ToString())
                             .Replace("[SimpleQueryMethodDuration]", queryMethod.DurationNanoSeconds.ToString())
                             .Replace("[Property1Offset]", property1.StartOffsetNanoseconds.ToString())
                             .Replace("[Property1Duration]", property1.DurationNanoSeconds.ToString());

            CommonAssertions.AreEqualJsonStrings(expectedResult, result);
        }
Пример #24
0
        public async Task SingleType_InputObjectOnFields_ObjectType_ReturnsValidData()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <SodaBottleController>().Build();
            var builder       = server.CreateQueryContextBuilder();

            // need to resolve type field now
            builder.AddQueryText(@"{
                               __type(name: ""Query_Bottles"")
                              {
                                name
                                kind
                                fields{
                                    name
                                    args {
                                        name
                                        type {
                                            name
                                            kind
                                            inputFields{
                                                name
                                                description
                                                type {name}
                                            }
                                        }
                                    }
                                }
                              }
                            }");

            var response = await server.RenderResult(builder);

            var output = @"
                            {
                            ""data"": {
                              ""__type"": {
                                        ""name"": ""Query_Bottles"",
                                        ""kind"": ""OBJECT"",
                                        ""fields"": [
                                        {
                                            ""name"": ""retrieveSodaBottles"",
                                            ""args"": [
                                            {
                                                ""name"": ""bottleData"",
                                                ""type"": {
                                                    ""name"": ""BottleSearch"",
                                                    ""kind"": ""INPUT_OBJECT"",
                                                    ""inputFields"": [
                                                        {
                                                            ""name"": ""name"",
                                                            ""description"": null,
                                                            ""type"": {""name"": ""String""},
                                                        },
                                                        {
                                                            ""name"": ""size"",
                                                            ""description"": null,
                                                            ""type"": {""name"": ""Int""},
                                                        }
                                                    ]
                                                }
                                            }
                                            ]
                                        }
                                        ]
                                    }
                                }
                             }
                            ";

            CommonAssertions.AreEqualJsonStrings(output, response);
        }
Пример #25
0
        public async Task SingleType_InputScalarsOnFields_ObjectType_ReturnsValidData()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <SodaCanController>()
                                .Build();

            var builder = server.CreateQueryContextBuilder();

            // need to resolve type field now
            builder.AddQueryText(@"{
                               __type(name: ""Query_Sodas"")
                              {
                                name
                                kind
                                fields{
                                    name
                                    args {
                                        name
                                        type {name kind ofType {name kind}}
                                    }
                                }
                              }
                            }");

            var response = await server.RenderResult(builder);

            var output = @"
                            {
                            ""data"" : {
                                  ""__type"": {
                                            ""name"": ""Query_Sodas"",
                                            ""kind"": ""OBJECT"",
                                            ""fields"": [
                                            {
                                                ""name"": ""retrieveSoda"",
                                                ""args"": [
                                                {
                                                    ""name"": ""id"",
                                                    ""type"": {
                                                        ""name"": null,
                                                        ""kind"": ""NON_NULL"",
                                                        ""ofType"": {
                                                            ""name"": ""Int"",
                                                            ""kind"": ""SCALAR""
                                                        }
                                                    }
                                                }
                                                ]
                                            },
                                            {
                                                ""name"": ""canCount"",
                                                ""args"": [
                                                {
                                                    ""name"": ""id"",
                                                    ""type"": {
                                                        ""name"": null,
                                                        ""kind"": ""NON_NULL"",
                                                        ""ofType"": {
                                                            ""name"": ""Int"",
                                                            ""kind"": ""SCALAR""
                                                        }
                                                    }
                                                }
                                                ]
                                            }
                                            ]
                                        }
                                }
                            }
                            ";

            CommonAssertions.AreEqualJsonStrings(output, response);
        }
Пример #26
0
        public async Task SingleType_NameAndFields_ObjectType_ReturnsValidData()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <SodaCanController>()
                                .Build();

            var builder = server.CreateQueryContextBuilder();

            // need to resolve type field now
            builder.AddQueryText(@"{
                                   __type(name: ""SodaCan"")
                                  {
                                    name
                                    description
                                    kind
                                    fields{
                                        name
                                        description
                                        isDeprecated
                                        type {
                                            name
                                            description
                                            kind
                                        }
                                    }
                                  }
                            }");

            var response = await server.RenderResult(builder);

            var output = @"{
                            ""data"": {
                              ""__type"": {
                                        ""name"": ""SodaCan"",
                                        ""description"": null,
                                        ""kind"": ""OBJECT"",
                                        ""fields"": [
                                        {
                                            ""name"": ""brand"",
                                            ""description"": null,
                                            ""isDeprecated"": false,
                                            ""type"": {
                                                ""name"": ""String"",
                                                ""description"": ""A UTF-8 encoded string of characters."",
                                                ""kind"": ""SCALAR""
                                            }
                                        },
                                        {
                                            ""name"": ""id"",
                                            ""description"": null,
                                            ""isDeprecated"": false,
                                            ""type"": {
                                                ""name"": null,
                                                ""description"": null,
                                                ""kind"": ""NON_NULL""
                                            }
                                        }
                                        ]
                                    }
                            }
                         }";

            CommonAssertions.AreEqualJsonStrings(output, response);
        }
Пример #27
0
        public void IntrospectedObject_PropertyCheck()
        {
            var serverBuilder = new TestServerBuilder(TestOptions.UseCodeDeclaredNames);
            var server        = serverBuilder
                                .AddGraphType <IntrospectableObject>()
                                .Build();

            var template = TemplateHelper.CreateObjectTemplate <IntrospectableObject>();

            var schema = new IntrospectedSchema(server.Schema);

            schema.Rebuild();

            var ogt     = server.Schema.KnownTypes.FindGraphType(typeof(IntrospectableObject)) as IObjectGraphType;
            var spected = schema.FindIntrospectedType(ogt);

            Assert.AreEqual(ogt.Name, spected.Name);
            Assert.AreEqual(ogt.Description, spected.Description);
            Assert.AreEqual(ogt.Kind, spected.Kind);

            Assert.IsNotNull(spected.Fields);
            Assert.AreEqual(3, spected.Fields.Count);

            var expected0 = template.FieldTemplates[$"[type]/{nameof(IntrospectableObject)}/{nameof(IntrospectableObject.Method1)}"];
            var expected1 = template.FieldTemplates[$"[type]/{nameof(IntrospectableObject)}/{nameof(IntrospectableObject.Method2)}"];
            var expected2 = template.FieldTemplates[$"[type]/{nameof(IntrospectableObject)}/{nameof(IntrospectableObject.Prop1)}"];

            var field0 = spected.Fields.FirstOrDefault(x => x.Name == nameof(IntrospectableObject.Method1));
            var field1 = spected.Fields.FirstOrDefault(x => x.Name == nameof(IntrospectableObject.Method2));
            var field2 = spected.Fields.FirstOrDefault(x => x.Name == nameof(IntrospectableObject.Prop1));

            Assert.IsNotNull(field0);
            Assert.AreEqual(field0.Name, expected0.Name);
            Assert.AreEqual(nameof(TwoPropertyObject), field0.IntrospectedGraphType.Name);
            Assert.AreEqual(field0.Description, expected0.Description);
            Assert.AreEqual(field0.IsDeprecated, expected0.IsDeprecated);
            Assert.AreEqual(field0.DeprecationReason, expected0.DeprecationReason);
            Assert.AreEqual(2, field0.Arguments.Count);

            var arg1 = field0.Arguments[0];
            var arg2 = field0.Arguments[1];

            Assert.IsNotNull(arg1);
            Assert.AreEqual(expected0.Arguments[0].Name, arg1.Name);
            Assert.AreEqual(expected0.Arguments[0].Description, arg1.Description);

            var expectedDefault = $"\"{expected0.Arguments[0].DefaultValue}\"";

            Assert.AreEqual(expectedDefault, arg1.DefaultValue);

            Assert.IsNotNull(arg2);
            Assert.AreEqual(expected0.Arguments[1].Name, arg2.Name);
            Assert.AreEqual(expected0.Arguments[1].Description, arg2.Description);
            Assert.AreEqual(expected0.Arguments[1].DefaultValue?.ToString(), arg2.DefaultValue);

            Assert.IsNotNull(field1);
            Assert.AreEqual(field1.Name, expected1.Name);
            Assert.AreEqual(nameof(TwoPropertyObjectV2), field1.IntrospectedGraphType.Name);
            Assert.AreEqual(field1.Description, expected1.Description);
            Assert.AreEqual(field1.IsDeprecated, expected1.IsDeprecated);
            Assert.AreEqual(field1.DeprecationReason, expected1.DeprecationReason);
            Assert.AreEqual(0, field1.Arguments.Count);

            Assert.IsNotNull(field2);
            Assert.AreEqual(field2.Name, expected2.Name);
            Assert.AreEqual(TypeKind.NON_NULL, field2.IntrospectedGraphType.Kind);
            Assert.AreEqual(TypeKind.SCALAR, field2.IntrospectedGraphType.OfType.Kind);
            Assert.AreEqual(Constants.ScalarNames.LONG, field2.IntrospectedGraphType.OfType.Name);
            Assert.AreEqual(field2.Description, expected2.Description);
            Assert.AreEqual(field2.IsDeprecated, expected2.IsDeprecated);
            Assert.AreEqual(field2.DeprecationReason, expected2.DeprecationReason);
            Assert.AreEqual(0, field2.Arguments.Count);

            // the not null wrapper should all be null
            Assert.IsNull(field2.IntrospectedGraphType.Fields);
            Assert.IsNull(field2.IntrospectedGraphType.EnumValues);
            Assert.IsNull(field2.IntrospectedGraphType.Interfaces);
            Assert.IsNull(field2.IntrospectedGraphType.PossibleTypes);
            Assert.IsNull(field2.IntrospectedGraphType.InputFields);
            Assert.IsNull(field2.IntrospectedGraphType.Name);
            Assert.IsNull(field2.IntrospectedGraphType.Description);

            // objects shoudl always return an interface collection even if empty
            Assert.IsNotNull(spected.Interfaces);
            Assert.AreEqual(0, spected.Interfaces.Count);

            Assert.IsNull(spected.EnumValues);
            Assert.IsNull(spected.PossibleTypes);
            Assert.IsNull(spected.InputFields);
            Assert.IsNull(spected.OfType);
        }