예제 #1
0
        public void BuildRequest_QueryAndSetExtensions_RequestIsCreated_5()
        {
            // arrange
            IDictionary <string, object> ext =
                new Dictionary <string, object>
            {
                { "three", "baz" }
            };

            // act
            IReadOnlyQueryRequest request =
                QueryRequestBuilder.New()
                .SetQuery("{ foo }")
                .AddExtension("one", "foo")
                .AddExtension("two", "bar")
                .SetExtensions(ext)
                .AddExtension("four", "bar")
                .Create();

            // assert
            // only three should exist
            request.MatchSnapshot();
        }
예제 #2
0
        public static QueryRequestBuilder From(IReadOnlyQueryRequest request)
        {
            var builder = new QueryRequestBuilder
            {
                _query                  = request.Query,
                _queryName              = request.QueryId,
                _queryHash              = request.QueryHash,
                _operationName          = request.OperationName,
                _readOnlyVariableValues = request.VariableValues,
                _initialValue           = request.InitialValue,
                _readOnlyProperties     = request.ContextData,
                _readOnlyExtensions     = request.Extensions,
                _services               = request.Services
            };

            if (builder._query is null && builder._queryName is null)
            {
                throw new QueryRequestBuilderException(
                          AbstractionResources.QueryRequestBuilder_QueryIsNull);
            }

            return(builder);
        }
예제 #3
0
        BuildBatchRequestAsync(
            HttpContext context,
            IServiceProvider services,
            GraphQLRequest request,
            IReadOnlyList <string> operationNames)
        {
            var queryBatch = new IReadOnlyQueryRequest[operationNames.Count];

            for (var i = 0; i < operationNames.Count; i++)
            {
                IQueryRequestBuilder requestBuilder =
                    QueryRequestBuilder.From(request)
                    .SetOperation(operationNames[i]);

                queryBatch[i] = await BuildRequestAsync(
                    context,
                    services,
                    requestBuilder)
                                .ConfigureAwait(false);
            }

            return(queryBatch);
        }
예제 #4
0
        public static async Task ExpectError(
            string query,
            TestConfiguration?configuration,
            params Action <IError>[] elementInspectors)
        {
            // arrange
            IRequestExecutor executor = await CreateExecutorAsync(configuration);

            IReadOnlyQueryRequest request = CreateRequest(configuration, query);

            // act
            IExecutionResult result = await executor.ExecuteAsync(request, default);

            // assert
            Assert.NotNull(result.Errors);

            if (elementInspectors.Length > 0)
            {
                Assert.Collection(result.Errors, elementInspectors);
            }

            result.MatchSnapshot();
        }
예제 #5
0
        public async Task Custom_Scalar_Delegated_Argument()
        {
            // arrange
            IHttpClientFactory clientFactory = CreateRemoteSchemas();

            var serviceCollection = new ServiceCollection();

            serviceCollection.AddSingleton(clientFactory);
            serviceCollection.AddStitchedSchema(builder => builder
                                                .AddSchemaFromHttp("special")
                                                .AddExtensionsFromString("extend type Query { custom_scalar_stitched(bar: MyCustomScalarValue): MyCustomScalarValue @delegate(schema: \"special\", path: \"custom_scalar(bar: $arguments:bar)\") }")
                                                .AddSchemaConfiguration(c => {
                c.RegisterType <MyCustomScalarType>();
            }));

            IServiceProvider services =
                serviceCollection.BuildServiceProvider();

            IQueryExecutor executor = services
                                      .GetRequiredService <IQueryExecutor>();
            IExecutionResult result = null;

            // act
            using (IServiceScope scope = services.CreateScope())
            {
                IReadOnlyQueryRequest request =
                    QueryRequestBuilder.New()
                    .SetQuery("{ custom_scalar_stitched(bar: \"2019-11-11\") }")
                    .SetServices(scope.ServiceProvider)
                    .Create();

                result = await executor.ExecuteAsync(request);
            }

            // assert
            result.MatchSnapshot();
        }
        public async Task TestSensorsQuery()
        {
            IServiceProvider serviceProvider =
                new ServiceCollection()
                .AddSingleton <ITimeSeriesRepository, TimeSeriesRepository>()
                .AddSingleton <IDatabaseConfig>(sp =>
                                                new DatabaseConfig()
            {
                DatabaseConnectionString = dbConnectionString
            }
                                                )
                .BuildServiceProvider();

            IQueryExecutor executor = Schema.Create(c =>
            {
                c.RegisterQueryType(new ObjectType <TimeSeriesQuery>(d => d.Name("Query")));
            })
                                      .MakeExecutable();

            IReadOnlyQueryRequest request =
                QueryRequestBuilder.New()
                .SetQuery(@"query sensors{
                              sensors {
                                sensorTypeName,
                                sensorIds,
                                sensorColumns
                              }
                            }")
                .SetServices(serviceProvider)
                .Create();

            // act
            IExecutionResult result = await executor.ExecuteAsync(request);

            //Snapshot.Match(result);
            result.MatchSnapshot();
        }
예제 #7
0
        public async Task InvokeAsync(IMiddlewareContext context)
        {
            DelegateDirective delegateDirective = context.Field
                                                  .Directives[DirectiveNames.Delegate]
                                                  .FirstOrDefault()?.ToObject <DelegateDirective>();

            if (delegateDirective != null)
            {
                IImmutableStack <SelectionPathComponent> path =
                    delegateDirective.Path is null
                    ? ImmutableStack <SelectionPathComponent> .Empty
                    : SelectionPathParser.Parse(delegateDirective.Path);

                IReadOnlyQueryRequest request =
                    CreateQuery(context, delegateDirective.Schema, path);

                IReadOnlyQueryResult result = await ExecuteQueryAsync(
                    context, request, delegateDirective.Schema)
                                              .ConfigureAwait(false);

                UpdateContextData(context, result, delegateDirective);

                context.Result = new SerializedData(ExtractData(result.Data, path.Count()));
                if (result.Errors is { })
예제 #8
0
        public DefaultExecutionPipelineBenchmark()
        {
            var md5       = new MD5DocumentHashProvider();
            var resources = new ResourceHelper();
            var services  = new ServiceCollection()
                            .AddStarWarsRepositories()
                            .AddGraphQL()
                            .AddStarWarsTypes()
                            .ModifyRequestOptions(o => o.IncludeExceptionDetails = true)
                            .Services
                            .BuildServiceProvider();

            _executor = services
                        .GetRequiredService <IRequestExecutorResolver>()
                        .GetRequestExecutorAsync()
                        .Result;
            _getHeroRequest                 = CreateRequest(md5, resources, "GetHeroQuery.graphql");
            _getHeroWithFriendsRequest      = CreateRequest(md5, resources, "GetHeroWithFriendsQuery.graphql");
            _getTwoHeroesWithFriendsRequest = CreateRequest(md5, resources, "GetTwoHeroesWithFriendsRequest.graphql");
            _largeQuery           = CreateRequest(md5, resources, "LargeQuery.graphql");
            _introspectionRequest = CreateRequest(md5, resources, "IntrospectionQuery.graphql");

            SchemaIntrospection().Wait();
        }
예제 #9
0
        public async Task GetCinema_With_Results()
        {
            //arrange

            Mock <ICinemaLogic> cinemaLogicMock = new Mock <ICinemaLogic>();

            cinemaLogicMock.Setup(p => p.GetCinemas()).Returns(_GetCinemaList());
            Mock <IServiceProvider> serviceProvider = new Mock <IServiceProvider>();

            serviceProvider.Setup(p => p.GetService(typeof(ICinemaLogic))).Returns(cinemaLogicMock.Object);

            IQueryExecutor        queryExecutor = QueryExecutorFactory.Create <CinemaQuery>();
            IReadOnlyQueryRequest queryRequest  = QueryRequestBuilder.New()
                                                  .SetQuery(@"query GetAllCinemas{
                          cinemas{
                            edges{
                              cursor
                            }
                            nodes{
                              title
                              description
                              iD
                              duration
                            }
                          }
                        }")
                                                  .AddProperty("Key", "value")
                                                  .SetServices(serviceProvider.Object)
                                                  .Create();

            //act
            IExecutionResult result = await queryExecutor.ExecuteAsync(queryRequest);

            //assert
            result.MatchSnapshot();
        }
예제 #10
0
        private Task <IExecutionResult> ExecuteStitchedQuery(
            IReadOnlyQueryRequest request)
        {
            // arrange
            IHttpClientFactory clientFactory = CreateRemoteSchemas();

            var serviceCollection = new ServiceCollection();

            serviceCollection.AddSingleton(clientFactory);

            serviceCollection.AddRemoteQueryExecutor(b => b
                                                     .SetSchemaName("contract")
                                                     .SetSchema(FileResource.Open("Contract.graphql"))
                                                     .AddScalarType <DateTimeType>());

            serviceCollection.AddRemoteQueryExecutor(b => b
                                                     .SetSchemaName("customer")
                                                     .SetSchema(FileResource.Open("Customer.graphql")));

            serviceCollection.AddStitchedSchema(
                FileResource.Open("Stitching.graphql"),
                c => c.RegisterType <DateTimeType>());

            IServiceProvider services =
                serviceCollection.BuildServiceProvider();

            request = QueryRequestBuilder.From(request)
                      .SetServices(services)
                      .Create();

            IQueryExecutor executor = services
                                      .GetRequiredService <IQueryExecutor>();

            // act
            return(executor.ExecuteAsync(request));
        }
예제 #11
0
        public void Sort_ComparableAsc_PrefilterInResolver()
        {
            // arrange
            IQueryable <Foo> data = new[] {
                new Foo {
                    Bar = "baz", Baz = "a"
                },
                new Foo {
                    Bar = "aa", Baz = "b"
                },
                new Foo {
                    Bar = "zz", Baz = "b"
                }
            }.AsQueryable().OrderBy(x => x.Baz);

            ISchema schema = SchemaBuilder.New()
                             .AddQueryType(ctx =>
            {
                ctx.Field("foo")
                .Resolver(data)
                .Type <NonNullType <ListType <NonNullType <ObjectType <Foo> > > > >()
                .UseSorting();
            })
                             .Create();

            IReadOnlyQueryRequest request =
                QueryRequestBuilder.New()
                .SetQuery("{ foo(order_by: { bar: DESC }) { bar } }")
                .Create();

            // act
            IExecutionResult result = schema.MakeExecutable().Execute(request);

            // assert
            result.MatchSnapshot();
        }
예제 #12
0
    protected static async Task <IBatchQueryResult> ExecuteBatchAsync(
        HttpContext context,
        IRequestExecutor requestExecutor,
        IHttpRequestInterceptor requestInterceptor,
        IServerDiagnosticEvents diagnosticEvents,
        IReadOnlyList <GraphQLRequest> requests)
    {
        diagnosticEvents.StartBatchRequest(context, requests);

        var requestBatch = new IReadOnlyQueryRequest[requests.Count];

        for (var i = 0; i < requests.Count; i++)
        {
            QueryRequestBuilder requestBuilder = QueryRequestBuilder.From(requests[i]);

            await requestInterceptor.OnCreateAsync(
                context, requestExecutor, requestBuilder, context.RequestAborted);

            requestBatch[i] = requestBuilder.Create();
        }

        return(await requestExecutor.ExecuteBatchAsync(
                   requestBatch, cancellationToken : context.RequestAborted));
    }
예제 #13
0
        public async Task ParseQueryMiddleware_ValidQuery_DocumentIsSet()
        {
            // arrange
            Schema schema = CreateSchema();

            IReadOnlyQueryRequest request =
                QueryRequestBuilder.New()
                .SetQuery("{ a }")
                .Create();

            var context = new QueryContext
                          (
                schema,
                MiddlewareTools.CreateEmptyRequestServiceScope(),
                request,
                (f, s) => f.Middleware
                          );

            var diagnostics = new QueryExecutionDiagnostics(
                new DiagnosticListener("Foo"),
                new IDiagnosticObserver[0]);

            var middleware = new ParseQueryMiddleware(
                c => Task.CompletedTask,
                new DefaultQueryParser(),
                new Cache <ICachedQuery>(10),
                diagnostics,
                null);

            // act
            await middleware.InvokeAsync(context);

            // assert
            Assert.NotNull(context.Document);
            context.Document.MatchSnapshot();
        }
        public async Task DispatchMultipleQueriesWithVariables()
        {
            // arrange
            IReadOnlyQueryRequest mergedRequest = null;
            int count = 0;

            var result = QueryResultBuilder.New();
            var data   = new OrderedDictionary();

            data["__0__a"] = "a";
            data["__1__a"] = "b";
            data["__1__b"] = "c";
            result.SetData(data);

            var schema = SchemaBuilder.New()
                         .AddDocumentFromString("type Query { foo: String }")
                         .AddResolver("Query", "foo", c => "bar")
                         .Create();

            var executor = new Mock <IQueryExecutor>();

            executor.Setup(t => t.ExecuteAsync(
                               It.IsAny <IReadOnlyQueryRequest>(),
                               It.IsAny <CancellationToken>()))
            .Returns(new Func <IReadOnlyQueryRequest,
                               CancellationToken, Task <IExecutionResult> >((r, ct) =>
            {
                count++;
                mergedRequest = r;
                return(Task.FromResult <IExecutionResult>(result.Create()));
            }));
            executor.Setup(t => t.Schema).Returns(schema);

            var request_a = QueryRequestBuilder.New()
                            .SetQuery("query a($a: String) { a(b: $a) }")
                            .SetVariableValue("a", "foo")
                            .Create();

            var request_b = QueryRequestBuilder.Create(
                "query b { a b }");

            var client = new RemoteQueryClient(
                new EmptyServiceProvider(),
                executor.Object);

            // act
            Task <IExecutionResult> task_a = client.ExecuteAsync(request_a);
            Task <IExecutionResult> task_b = client.ExecuteAsync(request_b);
            await client.DispatchAsync(CancellationToken.None);

            // assert
            await task_a;
            await task_b;

            Assert.Equal(1, count);
            new
            {
                Query         = mergedRequest.Query.ToString(),
                QueryName     = mergedRequest.QueryName,
                QueryHash     = mergedRequest.QueryHash,
                OperationName = mergedRequest.OperationName,
                Varables      = mergedRequest.VariableValues,
                Extensions    = mergedRequest.Extensions,
            }.MatchSnapshot();
        }
예제 #15
0
 public Task <QueryResult> FetchAsync(
     IReadOnlyQueryRequest request,
     HttpClient httpClient,
     IEnumerable <IHttpQueryRequestInterceptor> interceptors) =>
 FetchAsync(CreateRemoteRequest(request), httpClient, interceptors);
예제 #16
0
        public async Task ConnectionLost()
        {
            // arrange
            var connections = new Dictionary <string, HttpClient>();
            IHttpClientFactory clientFactory = CreateRemoteSchemas(connections);

            var serviceCollection = new ServiceCollection();

            serviceCollection.AddSingleton(clientFactory);
            serviceCollection.AddStitchedSchema(builder =>
                                                builder.AddSchemaFromHttp("contract")
                                                .AddSchemaFromHttp("customer")
                                                .RenameType("CreateCustomerInput", "CreateCustomerInput2")
                                                .AddExtensionsFromString(
                                                    FileResource.Open("StitchingExtensions.graphql"))
                                                .AddSchemaConfiguration(c =>
                                                                        c.RegisterType <PaginationAmountType>())
                                                .AddExecutionConfiguration(b =>
            {
                b.AddErrorFilter(error =>
                {
                    if (error.Exception is Exception ex)
                    {
                        return(ErrorBuilder.FromError(error)
                               .ClearExtensions()
                               .SetMessage(ex.GetType().FullName)
                               .SetException(null)
                               .Build());
                    }
                    ;
                    return(error);
                });
            }));

            IServiceProvider services =
                serviceCollection.BuildServiceProvider();

            IQueryExecutor executor = services
                                      .GetRequiredService <IQueryExecutor>();
            IExecutionResult result = null;

            using (IServiceScope scope = services.CreateScope())
            {
                IReadOnlyQueryRequest request =
                    QueryRequestBuilder.New()
                    .SetQuery(@"
                            mutation {
                                createCustomer(input: { name: ""a"" })
                                {
                                    customer {
                                        name
                                        contracts {
                                            id
                                        }
                                    }
                                }
                            }")
                    .SetServices(scope.ServiceProvider)
                    .Create();

                result = await executor.ExecuteAsync(request);
            }

            var client = new HttpClient
            {
                BaseAddress = new Uri("http://127.0.0.1")
            };;

            connections["contract"] = client;
            connections["customer"] = client;

            // act
            using (IServiceScope scope = services.CreateScope())
            {
                IReadOnlyQueryRequest request =
                    QueryRequestBuilder.New()
                    .SetQuery(@"
                            mutation {
                                createCustomer(input: { name: ""a"" })
                                {
                                    customer {
                                        name
                                        contracts {
                                            id
                                        }
                                    }
                                }
                            }")
                    .SetServices(scope.ServiceProvider)
                    .Create();

                result = await executor.ExecuteAsync(request);
            }

            // assert
            result.MatchSnapshot();
        }
예제 #17
0
        public async Task GetItems_ObjectEqualsFilter_FirstItems_Is_Returned()
        {
            // arrange
            var serviceCollection     = new ServiceCollection();
            IServiceProvider services = new ServiceCollection()
                                        .AddSingleton <IMongoCollection <Model> >(sp =>
            {
                IMongoDatabase database = _mongoResource.CreateDatabase();

                IMongoCollection <Model> collection = database.GetCollection <Model>("col");
                collection.InsertMany(new[]
                {
                    new Model
                    {
                        Nested = null
                    },
                    new Model
                    {
                        Nested = new Model
                        {
                            Nested = new Model
                            {
                                Foo = "abc",
                                Bar = 1,
                                Baz = true
                            }
                        }
                    },
                    new Model
                    {
                        Nested = new Model
                        {
                            Nested = new Model
                            {
                                Foo = "def",
                                Bar = 2,
                                Baz = false
                            }
                        }
                    },
                });
                return(collection);
            })
                                        .AddGraphQL()
                                        .AddQueryType <QueryType>()
                                        .Services
                                        .BuildServiceProvider();

            IRequestExecutor executor =
                await services.GetRequiredService <IRequestExecutorResolver>()
                .GetRequestExecutorAsync();

            IReadOnlyQueryRequest request = QueryRequestBuilder.New()
                                            .SetQuery(
                "{ items(where: { nested:{ nested: { foo: \"abc\" " +
                "} } }) { nested { nested { foo } } } }")
                                            .Create();

            // act
            IExecutionResult result = await executor.ExecuteAsync(request);

            // assert
            result.MatchSnapshot();
        }
        public async ValueTask InvokeAsync(IRequestContext context)
        {
            IReadOnlyQueryRequest request = context.Request;

            if (context.Document is null &&
                context.Request.Query is { })
예제 #19
0
        public async Task ExecuteStitchedQueryBuilderWithLocalSchema()
        {
            // arrange
            IHttpClientFactory clientFactory = CreateRemoteSchemas();

            var serviceCollection = new ServiceCollection();

            serviceCollection.AddSingleton(clientFactory);
            serviceCollection.AddStitchedSchema(builder =>
                                                builder.AddSchemaFromHttp("contract")
                                                .AddSchemaFromHttp("customer")
                                                .AddSchema("hello",
                                                           Schema.Create(
                                                               "type Query { hello: String! }",
                                                               c => c.BindResolver(ctx => "Hello World")
                                                               .To("Query", "hello")))
                                                .RenameField("customer",
                                                             new FieldReference("Customer", "name"), "foo")
                                                .RenameType("SomeOtherContract", "Other")
                                                .RenameType("LifeInsuranceContract", "Life")
                                                .AddExtensionsFromString(
                                                    FileResource.Open("StitchingExtensions.graphql"))
                                                .AddSchemaConfiguration(c =>
                                                                        c.RegisterType <PaginationAmountType>()));

            IServiceProvider services =
                serviceCollection.BuildServiceProvider();

            IQueryExecutor executor = services
                                      .GetRequiredService <IQueryExecutor>();
            IExecutionResult result = null;

            // act
            using (IServiceScope scope = services.CreateScope())
            {
                IReadOnlyQueryRequest request =
                    QueryRequestBuilder.New()
                    .SetQuery(@"
                            query a($id: ID!) {
                                a: customer2(customerId: $id) {
                                    bar: foo
                                    contracts {
                                        id
                                        ... life
                                        ... on Other {
                                            expiryDate
                                        }
                                    }
                                }
                                hello
                            }

                            fragment life on Life
                            {
                                premium
                            }

                            ")
                    .SetVariableValue("id", "Q3VzdG9tZXIKZDE=")
                    .SetServices(scope.ServiceProvider)
                    .Create();

                result = await executor.ExecuteAsync(request);
            }

            // assert
            Snapshot.Match(result);
        }
        public async ValueTask <bool> MoveNextAsync()
        {
            if (_index >= _batch.Count)
            {
                Current = null;
                return(false);
            }

            try
            {
                IReadOnlyQueryRequest request = _batch[_index++];

                DocumentNode document = request.Query is QueryDocument d
                    ? d.Document
                    : Utf8GraphQLParser.Parse(request.Query.ToSpan());

                OperationDefinitionNode operation =
                    document.GetOperation(request.OperationName);

                if (document != _previous)
                {
                    _fragments = document.GetFragments();
                    _visitationMap.Initialize(_fragments);
                }

                operation.Accept(
                    _visitor,
                    _visitationMap,
                    n => VisitorAction.Continue);

                _previous = document;
                document  = RewriteDocument(operation);
                operation = (OperationDefinitionNode)document.Definitions[0];
                IReadOnlyDictionary <string, object> variableValues =
                    MergeVariables(request.VariableValues, operation);

                request = QueryRequestBuilder.From(request)
                          .SetQuery(document)
                          .SetVariableValues(variableValues)
                          .AddExportedVariables(_exportedVariables)
                          .SetQueryName(null) // TODO ... should we create a name here?
                          .SetQueryHash(null)
                          .Create();

                Current =
                    (IReadOnlyQueryResult)await _executor.ExecuteAsync(
                        request, _cancellationToken)
                    .ConfigureAwait(false);

                IsCompleted = false;
            }
            catch (QueryException ex)
            {
                IsCompleted = true;
                Current     = QueryResult.CreateError(ex.Errors);
            }
            catch (Exception ex)
            {
                IsCompleted = true;
                Current     = QueryResult.CreateError(
                    _errorHandler.Handle(
                        _errorHandler.CreateUnexpectedError(ex).Build()));
            }

            return(!IsCompleted);
        }
예제 #21
0
 private static async Task <IExecutionResult> OneRequest(
     IQueryExecutor executer,
     IReadOnlyQueryRequest request)
 {
     return(await executer.ExecuteAsync(request));
 }
        public async Task ExecuteOperationMiddleware_Mutation_ExecutedSerially()
        {
            // arrange
            var state = 0;

            var schema = Schema.Create(
                FileResource.Open("MutationExecutionSchema.graphql"),
                cnf =>
            {
                cnf.BindResolver(() => state)
                .To("Query", "state");
                cnf.BindResolver(() => state)
                .To("CurrentState", "theNumber");
                cnf.BindResolver(
                    ctx => state = ctx.ArgumentValue <int>("newNumber"))
                .To("Mutation", "changeTheNumber");
            });

            DocumentNode query = Utf8GraphQLParser.Parse(
                FileResource.Open("MutationExecutionQuery.graphql"));

            OperationDefinitionNode operationNode = query.Definitions
                                                    .OfType <OperationDefinitionNode>()
                                                    .FirstOrDefault();

            var operation = new Operation
                            (
                query,
                operationNode,
                new VariableValueBuilder(
                    schema,
                    operationNode)
                .CreateValues(new Dictionary <string, object>()),
                schema.MutationType,
                null
                            );

            IReadOnlyQueryRequest request =
                QueryRequestBuilder.New()
                .SetQuery("{ a }")
                .Create();

            var observable = new DiagnosticListener("Foo");

            var services = new DictionaryServiceProvider(
                new KeyValuePair <Type, object>(
                    typeof(IErrorHandler),
                    ErrorHandler.Default),
                new KeyValuePair <Type, object>(
                    typeof(DiagnosticListener),
                    observable),
                new KeyValuePair <Type, object>(
                    typeof(DiagnosticSource),
                    observable));

            var context = new QueryContext
                          (
                schema,
                services.CreateRequestServiceScope(),
                request,
                (f, s) => f.Middleware
                          )
            {
                CachedQuery = new CachedQuery("{ a }", query),
                Document    = query,
                QueryKey    = "foo",
                Operation   = operation
            };

            var options          = new QueryExecutionOptions();
            var strategyResolver = new ExecutionStrategyResolver(options);

            var diagnostics = new QueryExecutionDiagnostics(
                new DiagnosticListener("Foo"),
                new IDiagnosticObserver[0]);

            var middleware = new ExecuteOperationMiddleware(
                c => Task.CompletedTask,
                strategyResolver,
                new Cache <DirectiveMiddlewareCompiler>(10),
                diagnostics);

            // act
            await middleware.InvokeAsync(context);

            // assert
            context.Result.MatchSnapshot();
        }
예제 #23
0
        public async Task Array_Filter_On_Scalar_Types()
        {
            // arrange
            IServiceProvider services = new ServiceCollection()
                                        .AddSingleton <IMongoCollection <Foo> >(sp =>
            {
                IMongoDatabase database = _mongoResource.CreateDatabase();
                return(database.GetCollection <Foo>("col"));
            })
                                        .AddGraphQL()
                                        .AddQueryType <QueryType>()
                                        .BindRuntimeType <ObjectId, IdType>()
                                        .Services
                                        .BuildServiceProvider();

            IRequestExecutor executor =
                await services.GetRequiredService <IRequestExecutorResolver>()
                .GetRequestExecutorAsync();

            IMongoCollection <Foo> collection = services.GetRequiredService <IMongoCollection <Foo> >();

            await collection.InsertOneAsync(new Foo
            {
                BarCollection = new List <string> {
                    "a", "b", "c"
                },
                BazCollection = new List <Baz> {
                    new Baz {
                        Quux = "a"
                    }, new Baz {
                        Quux = "b"
                    }
                },
                Bars = new[] { "d", "e", "f" },
                Bazs = new[] { new Baz {
                                   Quux = "c"
                               }, new Baz {
                                   Quux = "d"
                               } },
                Quux = "abc"
            });

            ISchema schema = SchemaBuilder.New()
                             .AddQueryType <QueryType>()
                             .AddServices(services)
                             .BindClrType <ObjectId, IdType>()
                             .Create();

            IReadOnlyQueryRequest request = QueryRequestBuilder.New()
                                            .SetQuery(
                "{" +
                "foos(where: { bars_some: { element: \"e\" } }) { bars } " +
                "}")
                                            .Create();

            // act
            IExecutionResult result = await executor.ExecuteAsync(request);

            // assert
            result.MatchSnapshot();
        }
        public async Task ValidateMaxComplexityWithMiddlewareWithObjectsAndVar(
            int count, bool valid)
        {
            // arrange
            var schema = Schema.Create(
                @"
                type Query {
                    foo(i: FooInput): String
                        @cost(complexity: 5 multipliers: [""i.index""])
                }

                input FooInput {
                    index : Int
                }
                ",
                c =>
            {
                c.BindResolver(() => "Hello")
                .To("Query", "foo");
            });

            var options = new Mock <IValidateQueryOptionsAccessor>();

            options.SetupGet(t => t.MaxOperationComplexity).Returns(20);
            options.SetupGet(t => t.UseComplexityMultipliers).Returns(true);

            DocumentNode query = Utf8GraphQLParser.Parse(
                "query f($i:Int) { foo(i: { index:$i }) }");

            OperationDefinitionNode operationNode = query.Definitions
                                                    .OfType <OperationDefinitionNode>()
                                                    .FirstOrDefault();

            var operation = new Operation
                            (
                query,
                operationNode,
                new VariableValueBuilder(
                    schema,
                    operationNode)
                .CreateValues(new Dictionary <string, object>
            {
                { "i", count }
            }),
                schema.QueryType,
                null
                            );

            IReadOnlyQueryRequest request =
                QueryRequestBuilder.New()
                .SetQuery("{ a }")
                .Create();

            var services = new DictionaryServiceProvider(
                new KeyValuePair <Type, object>(
                    typeof(IErrorHandler),
                    ErrorHandler.Default));

            var context = new QueryContext
                          (
                schema,
                services.CreateRequestServiceScope(),
                request,
                (f, s) => f.Middleware
                          )
            {
                Document  = query,
                Operation = operation
            };

            var middleware = new MaxComplexityMiddleware(
                c => Task.CompletedTask,
                options.Object,
                null);

            // act
            await middleware.InvokeAsync(context);

            // assert
            if (valid)
            {
                Assert.Null(context.Result);
            }
            else
            {
                context.Result.MatchSnapshot(
                    new SnapshotNameExtension("complexity", count));
            }
        }
        public async Task AddMetadataQuery()
        {
            //Arrange
            //Connect to database
            IServiceProvider serviceProvider =
                new ServiceCollection()
                .AddSingleton <IMetadataRepository, MetadataRepository>()
                .AddSingleton <IDatabaseConfig>(sp =>
                                                new DatabaseConfig()
            {
                DatabaseConnectionString = dbConnectionString
            }
                                                )
                .BuildServiceProvider();

            IQueryExecutor executor = Schema.Create(c =>
            {
                c.RegisterQueryType(new ObjectType <MetadataMutation>(d => d.Name("Mutation")));
                c.RegisterType <List <MetadataType> >();
            })
                                      .MakeExecutable();
            var input = new MetadataInput()
            {
                SensorID               = 5,
                Name                   = "Jasmine",
                Number                 = "55T77",
                Coordinate             = "Moholt",
                Altitude               = 55,
                LocationDescription    = "samsy like always",
                Company                = "kundestyrt and co",
                ServicePartner         = "kundestyrt and co",
                Department             = "IDI",
                OwnerID                = "33333",
                SerialNumber           = "55yh3kk3-4443-455ddw2",
                Tag1                   = "nada",
                Tag2                   = "tag222222",
                Tag3                   = "im tagged boi",
                Identificator          = "nothing special here",
                PurchaseDate           = DateTime.Parse("2002-12-25T00:00:00.000Z"),
                WarrantyDate           = DateTime.Parse("2007-12-25T00:00:00.000Z"),
                NextService            = DateTime.Parse("2003-12-25T00:00:00.000Z"),
                PlannedDisposal        = DateTime.Parse("2022-12-25T00:00:00.000Z"),
                ActualDisposal         = DateTime.Parse("2022-12-25T00:00:00.000Z"),
                ModelNumber            = "jjhj445",
                Picture                = "Some picture link or svg?",
                Signal                 = "Wireless",
                MeasureArea            = "550 550",
                Website                = "www.sanderkk.com",
                InspectionRound        = "same like the others",
                Lending                = true,
                Timeless               = false,
                CheckOnInspectionRound = false,
                Tollerance             = true,
                LendingPrice           = 9000,
                CableLength            = 125,
                Voltage                = "24volt"
            };
            IReadOnlyQueryRequest request =
                QueryRequestBuilder.New()
                .SetQuery(@"mutation addMetadata($someMetadata : MetadataInput!)
                            { addMetadata(newMetadata:$someMetadata)
                            {sensorID,locationID,name,serialNumber,number, modelNumber,department,company, ownerID,
                            purchaseDate,lending,lendingPrice,cableLength,checkOnInspectionRound,inspectionRound, company, servicePartner,voltage,coordinate, 
                            altitude, locationDescription, cableLength, identificator, measureArea, picture,
                            plannedDisposal, actualDisposal, warrantyDate, voltage, signal, tag1, tag2, tag3, timeless, tollerance
                           , outdatedFrom}}")
                .SetServices(serviceProvider)
                .AddVariableValue("someMetadata", input)
                .Create();
            // act
            IExecutionResult result = await executor.ExecuteAsync(request);

            //Assert
            Snapshot.Match(result);
        }
예제 #26
0
 public Task <QueryResult> FetchAsync(
     IReadOnlyQueryRequest request, HttpClient httpClient) =>
 FetchAsync(CreateRemoteRequest(request), httpClient);
예제 #27
0
 public Task <IExecutionResult> ExecuteAsync(
     IReadOnlyQueryRequest request,
     CancellationToken cancellationToken)
 {
     return(InnerExecutor.ExecuteAsync(request, cancellationToken));
 }