コード例 #1
0
        public async Task Can_Pass_On_ClientMutationId_For_Relay_Nullable_Mutations()
        {
            var query = @"
                mutation _ {
                    foo(input: { clientMutationId: ""some-mutation-id-1"", a: 1 }) {
                        clientMutationId
                        result
                    }
                    bar(input: { clientMutationId: ""some-mutation-id-2"", b: 2 }) {
                        clientMutationId
                        result
                    }
                }";

            var mutations = new[]
            {
                typeof(SchemaDefinitionWithMutation <FooMutation>),
                typeof(SchemaDefinitionWithMutation <BarMutation>),
            };
            var engine = GraphQLEngine.New().BuildSchema(mutations);
            var result = await engine
                         .NewExecutor()
                         .WithQueryString(query)
                         .Execute();

            result.ShouldHaveNoErrors();
            result.Data.ShouldHaveFieldWithValue("foo", "clientMutationId", "some-mutation-id-1");
            result.Data.ShouldHaveFieldWithValue("foo", "result", 2);
            result.Data.ShouldHaveFieldWithValue("bar", "clientMutationId", "some-mutation-id-2");
            result.Data.ShouldHaveFieldWithValue("bar", "result", 102);
        }
コード例 #2
0
        public void Can_Construct_And_Describe_Schema_With_Enums()
        {
            var engine = GraphQLEngine.New <QueryWithEnums>();
            var schema = engine.Describe();

            schema.ShouldEqualWhenReformatted(@"
            schema {
                query: QueryWithEnums
            }
            enum Enum1 {
                OPTION1
                OPTION2
                OPTION3
            }
            input InputObject {
                anotherField: RenamedEnum
                someField: RenamedEnum = SOME_VALUE1
                yetAnotherDummyField: RenamedEnum = SOME_VALUE2
                yetAnotherField: RenamedEnum!
            }
            type QueryWithEnums {
                field1: Enum1!
                field2: RenamedEnum
                field3(arg1: RenamedEnum, arg2: Enum1!, arg3: RenamedEnum = SOME_VALUE2, arg4: Enum1 = OPTION3): RenamedEnum!
                field4(input: InputObject): RenamedEnum
                field5(arg: Enum1): Enum1
            }
            enum RenamedEnum {
                SOME_VALUE1
                SOME_VALUE2
            }
            ");
        }
コード例 #3
0
        public void Can_Construct_And_Describe_Basic_Schema()
        {
            var engine = GraphQLEngine.New <BasicQuery>();
            var schema = engine.Describe();

            schema.ShouldEqualWhenReformatted(@"
            schema {
                query: BasicQuery
            }
            type BasicQuery {
                booleanField1: Boolean
                booleanField2: Boolean!
                dateField1: Date
                dateField2: Date!
                doubleField1: Float
                doubleField2: Float!
                floatField1: Float
                floatField2: Float!
                fooField1: Foo
                fooField2: Foo!
                intField1: Int
                intField2: Int!
                stringField1: String
                stringField2: String!
                timeSpanField1: TimeSpan
                timeSpanField2: TimeSpan!
                urlField1: URL
                urlField2: URL!
            }
            type Foo {
                id: ID!
            }
            ");
        }
コード例 #4
0
            internal RequestHandlerImpl(
                IDependencyInjector dependencyInjector,
                IEnumerable <Type> schemaTypes,
                IEnumerable <Type> assemblyTypes,
                IEnumerable <Type> exceptionsTreatedAsWarning,
                bool useValidation,
                bool useProfiling,
                FieldResolutionStrategy fieldResolutionStrategy,
                ComplexityConfiguration complexityConfiguration,
                IEnumerable <Type> middleware,
                ITypeResolver typeResolver)
            {
                _engine             = new GraphQLEngine(typeResolver: typeResolver);
                _dependencyInjector = dependencyInjector;
                _engine.WithAttributesFromAssemblies(assemblyTypes);
                _exceptionsTreatedAsWarnings.AddRange(exceptionsTreatedAsWarning);
                _useValidation = useValidation;
                _useProfiling  = useProfiling;
                _engine.WithFieldResolutionStrategy(fieldResolutionStrategy);
                _engine.BuildSchema(schemaTypes.ToArray());
                _complexityConfiguration = complexityConfiguration;

                foreach (var type in middleware)
                {
                    _engine.WithMiddleware(type);
                }
            }
コード例 #5
0
        public async Task Will_Provide_Path_And_Code_For_Errors_In_Array_Fields()
        {
            var engine = GraphQLEngine.New <Query>();
            var result = await engine
                         .NewExecutor()
                         .WithQueryString("query Blah { getObject { arrayField { test } } }")
                         .Execute();

            result.Data.ShouldHaveFieldWithValue("getObject", "arrayField", 0, "test", "some value");
            result.Data.ShouldHaveFieldWithValue("getObject", "arrayField", 1, "test", null);
            result.Data.ShouldHaveFieldWithValue("getObject", "arrayField", 2, "test", "some value");
            result.Data.ShouldHaveFieldWithValue("getObject", "arrayField", 3, "test", null);

            result.Errors.ShouldNotBeNull();
            result.Errors.Count.ShouldEqual(2);

            var error = result.Errors.ElementAt(0);

            error.Message.ShouldEqual("Test error.");
            error.Code.ShouldEqual("ARGUMENT");
            error.Path.Count().ShouldEqual(4);
            error.Path.ElementAt(0).ShouldEqual("getObject");
            error.Path.ElementAt(1).ShouldEqual("arrayField");
            error.Path.ElementAt(2).ShouldEqual("1");
            error.Path.ElementAt(3).ShouldEqual("test");

            error = result.Errors.ElementAt(1);
            error.Message.ShouldEqual("Test error.");
            error.Code.ShouldEqual("ARGUMENT");
            error.Path.Count().ShouldEqual(4);
            error.Path.ElementAt(0).ShouldEqual("getObject");
            error.Path.ElementAt(1).ShouldEqual("arrayField");
            error.Path.ElementAt(2).ShouldEqual("3");
            error.Path.ElementAt(3).ShouldEqual("test");
        }
コード例 #6
0
        private void ConfigureGraphQL(IServiceRegistry serviceRegistry)
        {
            serviceRegistry.Register <IDependencyResolver>(factory => new FuncDependencyResolver(factory.GetInstance), new PerContainerLifetime());
            serviceRegistry.Register <IDependencyInjector, GraphQLDependencyInjector>(new PerContainerLifetime());
            serviceRegistry.Register <IUserContext, UserContext>();
            serviceRegistry.Register <DataLoaderContext>();

            serviceRegistry.Register <AircraftTypeQueries>();
            serviceRegistry.Register <MarineUnitQueries>();
            serviceRegistry.Register <AirportQueries>();
            serviceRegistry.Register <PlanningQueries>();
            serviceRegistry.Register <SolutionQueries>();

            serviceRegistry.Register <AircraftTypeMutations>();
            serviceRegistry.Register <MarineUnitMutations>();
            serviceRegistry.Register <AirportMutations>();
            serviceRegistry.Register <PlanningMutations>();


            var graphqlEngine = GraphQLEngine.New();

            graphqlEngine.WithQuery <AircraftTypeQueries>();
            graphqlEngine.WithQuery <MarineUnitQueries>();
            graphqlEngine.WithQuery <AirportQueries>();
            graphqlEngine.WithQuery <PlanningQueries>();
            graphqlEngine.WithQuery <SolutionQueries>();

            graphqlEngine.WithMutation <AircraftTypeMutations>();
            graphqlEngine.WithMutation <MarineUnitMutations>();
            graphqlEngine.WithMutation <AirportMutations>();
            graphqlEngine.WithMutation <PlanningMutations>();

            serviceRegistry.RegisterInstance(graphqlEngine.BuildSchema());
        }
コード例 #7
0
        public void Bug190_Discover_Possible_Types_From_Lists()
        {
            var schema = GraphQLEngine.New <Bug190Query_2>().GetSchema();
            var type   = schema.FindType(nameof(Bug190Query_2.TestImpl));

            type.ShouldNotBeNull();
        }
コード例 #8
0
ファイル: Startup.cs プロジェクト: slipalison/conventions
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            var typeAdapter   = new GraphTypeAdapter();
            var constructor   = new SchemaConstructor <ISchema, IGraphType>(typeAdapter);
            var schema        = constructor.Build(typeof(SchemaDefinition <GraphQl.Query, GraphQl.Mutation, GraphQl.Subscription>));
            var graphQLEngine = new GraphQLEngine()
                                .WithFieldResolutionStrategy(FieldResolutionStrategy.Normal)
                                .WithQuery <GraphQl.Query>()
                                .WithMutation <GraphQl.Mutation>()
                                .WithSubscription <GraphQl.Subscription>()
                                .BuildSchema();

            services.AddSingleton <MessageService>();
            services.AddSingleton(schema);
            services.AddMvc();
            services.AddTransient <IDependencyInjector, Injector>();
            services.AddSingleton(provider => graphQLEngine);
            services.AddSingleton <IDocumentExecuter, GraphQL.Conventions.DocumentExecuter>();
            services.AddSingleton <IDocumentWriter>(x =>
            {
                var jsonSerializerSettings = x.GetRequiredService <IOptions <JsonSerializerSettings> >();
                return(new DocumentWriter(Formatting.None, jsonSerializerSettings.Value));
            });
            services.AddTransient(typeof(IGraphQLExecuter <>), typeof(DefaultGraphQLExecuter <>));
            services.AddTransient <IWebSocketConnectionFactory <ISchema>, WebSocketConnectionFactory <ISchema> >();
            services.AddTransient <IOperationMessageListener, LogMessagesListener>();
            services.AddTransient <IOperationMessageListener, ProtocolMessageListener>();
        }
コード例 #9
0
 public void Can_Construct_And_Describe_Schema_With_Injections()
 {
     var engine = GraphQLEngine.New<Query>();
     var schema = engine.Describe();
     schema.ShouldEqualWhenReformatted(@"
     type Query {
         field: String
     }
     ");
 }
コード例 #10
0
        private async Task <ExecutionResult> ExecuteQuery(string query)
        {
            var engine = GraphQLEngine.New <Query>();
            var result = await engine
                         .NewExecutor()
                         .WithQueryString(query)
                         .Execute();

            return(result);
        }
コード例 #11
0
 public static IServiceCollection AddGraphQL <TQuery, TMutation>(this IServiceCollection services)
 {
     services.AddTransient <IGraphQLExecutor <ExecutionResult> >(provider =>
                                                                 GraphQLEngine.New <TQuery, TMutation>()
                                                                 .NewExecutor()
                                                                 .WithUserContext(provider.GetService <IUserContext>())
                                                                 .WithDependencyInjector(provider.GetService <IDependencyInjector>()));
     services.AddSingleton <IDocumentWriter, DocumentWriter>();
     return(services);
 }
コード例 #12
0
        public async Task Can_Subscribe()
        {
            var engine = GraphQLEngine.New().WithSubscription <Subscription>();
            var result = await engine
                         .NewExecutor()
                         .WithQueryString("subscription { test }")
                         .ExecuteAsync();

            Assert.AreEqual(1, ((SubscriptionExecutionResult)result).Streams.Count);
        }
コード例 #13
0
        public async Task Can_Execute_Query_On_Schema_Using_Interfaces_With_Generic_Types()
        {
            var engine = GraphQLEngine.New <Query>();
            var result = await engine
                         .NewExecutor()
                         .WithQueryString("{ account { id } }")
                         .EnableValidation()
                         .ExecuteAsync();

            result.ShouldHaveNoErrors();
            result.Data.ShouldHaveFieldWithValue("account", "id", 123);
        }
コード例 #14
0
        public async Task Can_Accept_Null_List_From_Literal()
        {
            var engine = GraphQLEngine
                         .New <TestQuery>();
            var result = await engine
                         .NewExecutor()
                         .WithQueryString(@"query _ { example(testInputs:null) }")
                         .Execute();

            result.ShouldHaveNoErrors();
            result.Data.ShouldHaveFieldWithValue("example", "null");
        }
コード例 #15
0
        public void Can_Construct_And_Describe_Schema_From_Abstract_Types()
        {
            var engine = GraphQLEngine.New <Query>();
            var schema = engine.Describe();

            schema.ShouldEqualWhenReformatted(@"
            type Query {
                commonField(value: Date!): Date!
                someOtherField: String
            }
            ");
        }
コード例 #16
0
        public async void Can_Execute_Query_On_Schema_With_Injections_In_Generic_Methods()
        {
            var engine = GraphQLEngine.New<QueryWithDIFields>();
            var result = await engine
                .NewExecutor()
                .WithQueryString("{ withDependency }")
                .WithDependencyInjector(new DependencyInjector())
                .Execute();

            result.ShouldHaveNoErrors();
            result.Data.ShouldHaveFieldWithValue("withDependency", 3);
        }
コード例 #17
0
        public async void Can_Execute_Query_On_Schema_With_Injections()
        {
            var engine = GraphQLEngine.New<Query>();
            var result = await engine
                .NewExecutor()
                .WithQueryString("{ field }")
                .WithDependencyInjector(new DependencyInjector())
                .Execute();

            result.ShouldHaveNoErrors();
            result.Data.ShouldHaveFieldWithValue("field", "Some Value");
        }
コード例 #18
0
 public void Can_Construct_And_Describe_Schema_With_Injections_In_Generic_Methods()
 {
     var engine = GraphQLEngine.New<QueryWithDIFields>();
     var schema = engine.Describe();
     schema.ShouldEqualWhenReformatted(@"
     schema {
         query: QueryWithDIFields
     }
     type QueryWithDIFields {
         withDependency: Int!
     }
     ");
 }
コード例 #19
0
        public async Task Can_Enable_Validation()
        {
            var engine = GraphQLEngine.New <Query>();
            var result = await engine
                         .NewExecutor()
                         .WithQueryString("{ test }")
                         .EnableValidation()
                         .ExecuteAsync();

            result.Errors.ShouldNotBeNull();
            result.Errors.Count.ShouldEqual(1);
            result.Errors.First().Message.ShouldEqual("Cannot query field \"test\" on type \"Query\".");
        }
コード例 #20
0
        private async Task Can_Resolve_Query_Private <TQuery>()
        {
            var engine = GraphQLEngine
                         .New <TQuery>();
            var result = await engine
                         .NewExecutor()
                         .WithQueryString("query { node { ... on ParentNode {  id, nested { id } } } }")
                         .ExecuteAsync();

            result.ShouldHaveNoErrors();
            result.Data.ShouldHaveFieldWithValue("node", "id", "UGFyZW50Tm9kZTox");
            result.Data.ShouldHaveFieldWithValue("node", "nested", "id", "Q2hpbGROb2RlOjE=");
        }
コード例 #21
0
        public async Task Can_Execute_Query_On_Schema_From_Abstract_Types()
        {
            var engine = GraphQLEngine.New <Query>();
            var result = await engine
                         .NewExecutor()
                         .WithQueryString("{ commonField(value: \"1970-01-01T00:00:00Z\") someOtherField }")
                         .EnableValidation()
                         .Execute();

            result.ShouldHaveNoErrors();
            result.Data.ShouldHaveFieldWithValue("commonField", new DateTime(1970, 1, 1));
            result.Data.ShouldHaveFieldWithValue("someOtherField", string.Empty);
        }
コード例 #22
0
        private async Task <ExecutionResult> ExecuteMutation(string query, Dictionary <string, object> inputs = null)
        {
            var engine = GraphQLEngine
                         .New()
                         .WithMutation <Mutation>();
            var result = await engine
                         .NewExecutor()
                         .WithQueryString(query)
                         .WithInputs(inputs)
                         .Execute();

            return(result);
        }
コード例 #23
0
        private async Task <ExecutionResult> ExecuteQuery(
            string query, Dictionary <string, object> inputs = null, IUserContext userContext = null)
        {
            var engine = GraphQLEngine.New <Query>();
            var result = await engine
                         .NewExecutor()
                         .WithQueryString(query)
                         .WithInputs(inputs)
                         .WithUserContext(userContext)
                         .WithDependencyInjector(new DependencyInjector())
                         .ExecuteAsync();

            return(result);
        }
コード例 #24
0
        public async void Can_Register_And_Use_Custom_Scalar_Types()
        {
            var engine = GraphQLEngine
                         .New()
                         .RegisterScalarType <Custom, CustomGraphType>()
                         .WithQuery <CustomTypesQuery>();
            var result = await engine
                         .NewExecutor()
                         .WithQueryString(@"{ customScalarType(arg:""CUSTOM:Test"") }")
                         .Execute();

            result.ShouldHaveNoErrors();
            result.Data.ShouldHaveFieldWithValue("customScalarType", "CUSTOM:WRAPPED:Test");
        }
コード例 #25
0
        public async Task Will_expose_exceptions_when_enabled()
        {
            var engine = GraphQLEngine.New <Query>();
            var result = await engine
                         .WithExposedExceptions()
                         .NewExecutor()
                         .WithQueryString("query { queryData }")
                         .Execute();

            result.ExposeExceptions.ShouldBeTrue($"{nameof(result.ExposeExceptions)} should be enabled when {nameof(GraphQLEngine.WithExposedExceptions)} is called.");
            JObject.FromObject(result)["errors"].First.Value <string>("message")
            .Contains("at Tests.Adapters.Engine.ExposingExceptionsTests.Query.QueryData() in")
            .ShouldBeTrue($"There should be stack trace in error messages when {nameof(result.ExposeExceptions)} is enabled.");
        }
コード例 #26
0
        public async void Can_Disable_Validation()
        {
            var engine = GraphQLEngine.New<Query>();
            var result = await engine
                .NewExecutor()
                .WithQueryString("{ test }")
                .DisableValidation()
                .Execute();

            result.Data.ShouldNotBeNull();
            var dict = result.Data as Dictionary<string, object>;
            dict.Count.ShouldEqual(0);

            result.Errors.ShouldBeNull();
        }
コード例 #27
0
        public GraphController(
            GraphQLEngine engine,
            IUserContext userContext,
            IDependencyInjector injector,
            ILogger <GraphController> logger)
        {
            _engine      = engine;
            _userContext = userContext;
            _injector    = injector;
            _logger      = logger;
#if !DEBUG
            _validationRules = new IValidationRule[] { new ValidationRules.DisableIntrospectionRule() };
#else
            _validationRules = null;
#endif
        }
コード例 #28
0
        public async Task Executor_Should_Use_UserContext_Injector()
        {
            var engine = new GraphQLEngine(documentExecuter: new ScopedDocumentExecuter())
                         .WithQuery <Query>()
                         .BuildSchema();

            var executor1 = engine
                            .NewExecutor()
                            .WithQueryString("{ field }")
                            .WithDependencyInjector(new DependencyInjector("Injector"));

            var result1 = await executor1.Execute();

            result1.ShouldHaveNoErrors();
            result1.Data.ShouldHaveFieldWithValue("field", "Injector->ChildScope");
        }
コード例 #29
0
        private async Task <ExecutionResult> Resolve_Query(string selectedFields = "testMethod noAttribute name", params string[] accessPermissions)
        {
            var engine = GraphQLEngine
                         .New <CustomAttributeQuery>();

            var user = new TestUserContext(accessPermissions);

            var result = await engine
                         .NewExecutor()
                         .WithQueryString("query { node { " + selectedFields + " } }")
                         .WithUserContext(user)
                         .WithValidationRules(new[] { new TestValidation() })
                         .ExecuteAsync();

            return(result);
        }
コード例 #30
0
        public async Task Will_Provide_Exception_Data()
        {
            var engine = GraphQLEngine.New <Query>();
            var result = await engine
                         .NewExecutor()
                         .WithQueryString("query Blah { errorWithData }")
                         .Execute();

            result.Data.ShouldHaveFieldWithValue("errorWithData", null);

            result.Errors.ShouldNotBeNull();
            result.Errors.Count.ShouldEqual(1);

            result.Errors.First().Message.ShouldEqual("Test error.");
            result.Errors.First().Data["someKey"].ShouldEqual("someValue");
        }