示例#1
0
        public async Task Test_Recieve_Multiple_Subscribers()
        {
            // Arrange
            var tokenSource = new CancellationTokenSource();

            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Create websocket GraphQL client
            var wsClient = _factory.Server.CreateWebSocketClient();

            wsClient.ConfigureRequest = request => request.Headers.Add("Sec-WebSocket-Protocol", "graphql-ws");

            var wsUri = new UriBuilder(_factory.Server.BaseAddress)
            {
                Scheme = "wss",
                Path   = "graphql"
            }.Uri;

            var websocket = await wsClient.ConnectAsync(wsUri, tokenSource.Token);

            var graphQLSubscriptionClient = new GraphQLSubscriptionClient(websocket, tokenSource.Token, new GraphQLFieldBuilder(), new GraphQLQueryGeneratorFromFields(), new GraphQLDeserilization());
            await graphQLSubscriptionClient.Initilize();

            // Act
            // Registrer operations
            var operationByUser = await graphQLSubscriptionClient.ExecuteOperation <MessageAddedByUserSubscription>(new GraphQLQueryArgument("fromId", "SAHB"));

            List <GraphQLDataResult <MessageAddedByUserSubscription> > recievedDataByUser = new List <GraphQLDataResult <MessageAddedByUserSubscription> >();

            operationByUser.DataRecieved += (sender, e) =>
            {
                recievedDataByUser.Add(e.ReceivedData);
            };

            var operation = await graphQLSubscriptionClient.ExecuteOperation <MessageAddedSubscription>();

            List <GraphQLDataResult <MessageAddedSubscription> > recievedData = new List <GraphQLDataResult <MessageAddedSubscription> >();

            operation.DataRecieved += (sender, e) =>
            {
                recievedData.Add(e.ReceivedData);
            };
            await Task.Delay(TimeSpan.FromSeconds(1));

            // Send 2 message from 2 users only one should be retrieved in subscription
            await graphQLClient.CreateMutation <SendMessageMutation>("http://localhost/graphql", arguments : new GraphQLQueryArgument("message", new MessageInputType
            {
                content = "Message 1",
                fromId  = "SAHB",
                sentAt  = DateTime.Now.AddDays(-1)
            })).Execute();

            await Task.Delay(TimeSpan.FromSeconds(1));

            // Assert
            Assert.Single(recievedDataByUser);
            Assert.Single(recievedData);
        }
示例#2
0
        public async Task ExampleGraphQL()
        {
            // TODO: Use dependency injection (services.AddGraphQLClient()) (IServiceCollection)
            var client = GraphQLHttpClient.Default();

            var response = await client.Query <Query>("https://mpjk0plp9.lp.gql.zone/graphql");

            Assert.Equal("R2-D2", response.Hero.Name);
        }
示例#3
0
        public async Task TestSimpleQuery()
        {
            // Arrange
            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Act
            var result = await graphQLClient.Execute <TestHelloQuery>(GraphQLOperationType.Query, "http://localhost/graphql");

            // Assert
            Assert.Equal("query", result.Hello);
        }
示例#4
0
        public async Task Can_Get_Result_With_Enummember()
        {
            // Arrange
            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Act
            var query = await graphQLClient.CreateQuery <EmQuery>("http://localhost/graphql", arguments : new GraphQLQueryArgument("fromSrc", RdSrcWithEnumMember.correctValue)).Execute();

            // Assert
            Assert.Single(query.QryRdByEm);
        }
        public async Task TestSimpleMutation()
        {
            // Arrange
            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Act
            var result = await graphQLClient.CreateMutation <TestHelloMutation>("http://localhost/graphql").Execute();

            // Assert
            Assert.Equal("mutation", result.Hello);
        }
        public async Task Test_IntrospectionResult_Does_Not_Contain_Errors()
        {
            // Arrange
            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Act
            var result = await graphQLClient.CreateQuery <GraphQLIntrospectionQuery>("http://localhost/graphql").ExecuteDetailed();

            // Assert
            Assert.False(result.ContainsErrors);
        }
示例#7
0
        public async Task Can_Get_Result_Without_Inline()
        {
            // Arrange
            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Act
            var query = await graphQLClient.CreateQuery <EmQueryWUInline>("http://localhost/graphql", arguments : new GraphQLQueryArgument("fromSrc", RdSrc.XB)).Execute();

            // Assert
            Assert.Single(query.QryRdByEm);
        }
示例#8
0
        public void Default_Creates_New_GraphQLClient()
        {
            // Arrange / Act
            var actual = GraphQLHttpClient.Default();

            // Assert
            Assert.NotNull(actual);
            Assert.NotNull(actual.FieldBuilder);
            Assert.NotNull(actual.HttpExecutor);
            Assert.NotNull(actual.QueryGenerator);
            Assert.NotNull(actual.Deserialization);
            Assert.NotNull(actual.FilterGenerator);
        }
        public async Task Validate_NonNullHello_Query_IsValid()
        {
            // Arrange
            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Act
            var introspectionQuery = await graphQLClient.CreateQuery <GraphQLIntrospectionQuery>("http://localhost/graphql").Execute();

            var validationOutput = introspectionQuery.ValidateGraphQLType <TestNonNullQuery>(GraphQLOperationType.Query);

            // Assert
            Assert.Empty(validationOutput);
        }
示例#10
0
        public async Task TestHelloQueryDirectiveNotInclude()
        {
            // Arrange
            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Act
            var result = await graphQLClient.Execute <TestHelloQueryDirective>(GraphQLOperationType.Query,
                                                                               "http://localhost/graphql",
                                                                               arguments : new GraphQLQueryDirectiveArgument("variableif", "include", false));

            // Assert
            Assert.Null(result.Hello);
        }
        public async Task Validate_Hello_Query_Argument_WrongType()
        {
            // Arrange
            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Act
            var introspectionQuery = await graphQLClient.CreateQuery <GraphQLIntrospectionQuery>("http://localhost/graphql").Execute();

            var validationOutput = introspectionQuery.ValidateGraphQLType <TestWrongTypeArgument>(GraphQLOperationType.Query);

            // Assert
            Assert.Single(validationOutput);
            Assert.Equal(ValidationType.Argument_Invalid_Type, validationOutput.First().ValidationType);
        }
示例#12
0
        public void Default_WithClient_Creates_New_GraphQLClient()
        {
            // Arrange
            var client = new HttpClient()
            {
                BaseAddress = new Uri("https://google.com/")
            };

            // Act
            var actual = GraphQLHttpClient.Default(client);

            // Assert
            Assert.Equal(client, actual.HttpExecutor.Client);
            Assert.Equal(client.BaseAddress.OriginalString, actual.HttpExecutor.Client.BaseAddress.OriginalString);
        }
示例#13
0
            public async Task Validate_Query_IsValid()
            {
                // Arrange
                var client        = _factory.CreateClient();
                var graphQLClient = GraphQLHttpClient.Default(client);

                // Act
                var introspectionQuery = await graphQLClient.CreateQuery <GraphQLIntrospectionQuery>("http://localhost/graphql").Execute();

                var validationOutput = introspectionQuery.ValidateGraphQLType <Issue91Query>(GraphQLOperationType.Query);

                // Assert
                Assert.Equal(2, validationOutput.Count());
                Assert.All(validationOutput, e => Assert.Equal(ValidationType.Field_Should_Be_NonNull, e.ValidationType));
            }
示例#14
0
        public async Task TestHello2()
        {
            // Arrange
            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Act
            var result = await graphQLClient.Execute <TestHelloQuery>(GraphQLOperationType.Query, "http://localhost/graphql", filter : e => new TestHelloQuery {
                Hello1 = e.Hello2
            });

            // Assert
            Assert.Equal("query", result.Hello2);
            Assert.Null(result.Hello1);
        }
示例#15
0
        public async Task Validate_Wrong_PossibleType()
        {
            // Arrange
            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Act
            var introspectionQuery = await graphQLClient.CreateQuery <GraphQLIntrospectionQuery>("http://localhost/graphql").Execute();

            var validationOutput = introspectionQuery.ValidateGraphQLType <TestHelloInterfaceWithWrongInterface>(GraphQLOperationType.Query);

            // Assert
            Assert.Single(validationOutput);
            Assert.Equal(ValidationType.PossibleType_Not_Found, validationOutput.First().ValidationType);
        }
示例#16
0
        public async Task Validate_Introspection_IsValid()
        {
            // Arrange
            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Act
            var introspectionQuery = await graphQLClient.CreateQuery <GraphQLIntrospectionQuery>("http://localhost/graphql").Execute();

            var validationOutput = introspectionQuery.ValidateGraphQLType <GraphQLIntrospectionQuery>(GraphQLOperationType.Query);

            // Assert
            // GraphQL has by an error set isDeprecated to a String! instead of a Boolean! and therefore this test should return one validationError
            // This is fixed in https://github.com/graphql-dotnet/graphql-dotnet/commit/abf351892dda7bc8cf3dd83aba1ce63ae1ce11fd#diff-d9710dc6d5945261ad8c70084443f0c2
            Assert.Single(validationOutput);
            Assert.Equal("__schema.types.enumValues.isDeprecated", validationOutput.FirstOrDefault().Path);
            Assert.Equal(ValidationType.Field_Invalid_Type, validationOutput.FirstOrDefault().ValidationType);
        }
        public async Task TestSimpleUnion()
        {
            // Arrange
            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Act
            var result = await graphQLClient.Execute <TestHelloUnion>(GraphQLOperationType.Query, "http://localhost/graphql");

            // Assert
            Assert.Equal(typeof(CatType), result.Cat.GetType());
            Assert.Equal(typeof(DogType), result.Dog.GetType());
            Assert.Equal("cat", ((CatType)result.Cat).Cat);
            Assert.Equal("dog", ((DogType)result.Dog).Dog);

            // Test number is different
            Assert.True(((CatType)result.Cat).Number != ((DogType)result.Dog).Number);
        }
        public async Task TestBatchMutation()
        {
            // Arrange
            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Act
            var batch  = graphQLClient.CreateBatch(GraphQLOperationType.Mutation, "http://localhost/graphql");
            var query1 = batch.Query <TestHelloMutation>();
            var query2 = batch.Query <TestHelloMutation>();

            var result1 = await query1.Execute();

            var result2 = await query2.Execute();

            // Assert
            Assert.Equal("mutation", result1.Hello);
            Assert.Equal("mutation", result2.Hello);
        }
示例#19
0
        public async Task Test_Complete()
        {
            // Arrange
            var tokenSource = new CancellationTokenSource();

            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Create websocket GraphQL client
            var wsClient = _factory.Server.CreateWebSocketClient();

            wsClient.ConfigureRequest = request => request.Headers.Add("Sec-WebSocket-Protocol", "graphql-ws");

            var wsUri = new UriBuilder(_factory.Server.BaseAddress)
            {
                Scheme = "wss",
                Path   = "graphql"
            }.Uri;

            var websocket = await wsClient.ConnectAsync(wsUri, tokenSource.Token);

            var graphQLSubscriptionClient = new GraphQLSubscriptionClient(websocket, tokenSource.Token, new GraphQLFieldBuilder(), new GraphQLQueryGeneratorFromFields(), new GraphQLDeserilization());
            await graphQLSubscriptionClient.Initilize();

            // Act
            List <bool> completedTimes = new List <bool>();

            // Registrer operations and stop it
            var operation = await graphQLSubscriptionClient.ExecuteOperation <MessageAddedSubscription>();

            operation.Completed += (sender, e) =>
            {
                completedTimes.Add(true);
            };
            await operation.Stop();

            await Task.Delay(TimeSpan.FromSeconds(2));

            // Assert
            Assert.Single(completedTimes);
        }
示例#20
0
        public void Client_Should_Throw_When_No_Matching_Argument_Found()
        {
            // Arrange
            var client = GraphQLHttpClient.Default();

            // Act / Assert
            var exception = Assert.Throws <GraphQLArgumentVariableNotFoundException>(() =>
            {
                // Get the query
                var query = client.CreateQuery <SampleQuery>("url", arguments:
                                                             new GraphQLQueryArgument("helloVariableName", "helloVariableValue"));
            });

            // Assert
            // Should contain one element
            Assert.Equal(1, exception.Arguments.Count());

            // Argument should contain helloArgument and value
            Assert.Equal("helloVariableName", exception.Arguments.First().VariableName);
            Assert.Equal("helloVariableValue", exception.Arguments.First().ArgumentValue);
        }
示例#21
0
        public async Task Validate_Hello_Query_IsDeprecated()
        {
            // Arrange
            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Act
            var introspectionQuery = await graphQLClient.CreateQuery <GraphQLIntrospectionQuery>(
                "http://localhost/graphql",
                arguments : new[]
            {
                new GraphQLQueryArgument("fieldsIncludeDeprecated", true),
                new GraphQLQueryArgument("enumValuesIncludeDeprecated", true)
            })
                                     .Execute();

            var validationOutput = introspectionQuery.ValidateGraphQLType <TestHelloQuery>(GraphQLOperationType.Query);

            // Assert
            Assert.Single(validationOutput);
            Assert.Equal(ValidationType.Field_Deprecated, validationOutput.First().ValidationType);
        }
        public async Task TestBatchUnion()
        {
            // Arrange
            var client        = _factory.CreateClient();
            var graphQLClient = GraphQLHttpClient.Default(client);

            // Act
            var batch  = graphQLClient.CreateBatch(GraphQLOperationType.Query, "http://localhost/graphql");
            var query1 = batch.Query <TestHelloUnion>();
            var query2 = batch.Query <TestHelloUnion>();

            var result1 = await query1.Execute();

            var result2 = await query2.Execute();

            // Assert
            Assert.Equal(typeof(CatType), result1.Cat.GetType());
            Assert.Equal(typeof(DogType), result1.Dog.GetType());
            Assert.Equal("cat", ((CatType)result1.Cat).Cat);
            Assert.Equal("dog", ((DogType)result1.Dog).Dog);

            Assert.Equal(typeof(CatType), result2.Cat.GetType());
            Assert.Equal(typeof(DogType), result2.Dog.GetType());
            Assert.Equal("cat", ((CatType)result2.Cat).Cat);
            Assert.Equal("dog", ((DogType)result2.Dog).Dog);

            // Test number is different
            var allNumbers = new List <int>
            {
                ((CatType)result1.Cat).Number,
                ((DogType)result1.Dog).Number,
                ((CatType)result2.Cat).Number,
                ((DogType)result2.Dog).Number
            };

            Assert.False(allNumbers.GroupBy(e => e).Where(e => e.Count() > 1).Any());
        }
示例#23
0
        static async Task Main(string[] args)
        {
            using (IGraphQLSubscriptionWebSocketClient wssClient = GraphQLSubscriptionWebSocketClient.Default())
            {
                // Connect
                var graphQLSubscriptionClient = await wssClient.Connect(new Uri("ws://localhost:60340/graphql"));

                if (!graphQLSubscriptionClient.IsConnected)
                {
                    Console.WriteLine("Could not connect!");
                    Console.ReadKey();

                    return;
                }

                // Initilize
                await graphQLSubscriptionClient.Initilize();

                if (!graphQLSubscriptionClient.IsInitilized)
                {
                    Console.WriteLine("Could not initilize!");
                    Console.ReadKey();

                    return;
                }

                var operation = await graphQLSubscriptionClient.ExecuteOperation <MessageSubscription>();

                operation.DataRecieved += (sender, e) =>
                {
                    Console.WriteLine("Opration 1: " + e.ReceivedData.Data.MessageAdded.From.Id + ": " + e.ReceivedData.Data.MessageAdded.Content);
                };

                var operation2 = await graphQLSubscriptionClient.ExecuteOperation <MessageSubscription>();

                operation2.DataRecieved += (sender, e) =>
                {
                    Console.WriteLine("Operation 2: " + e.ReceivedData.Data.MessageAdded.From.Id + ": " + e.ReceivedData.Data.MessageAdded.Content);
                };

                var operation3 = await graphQLSubscriptionClient.ExecuteOperation <MessageSubscription>();

                operation3.DataRecieved += (sender, e) =>
                {
                    Console.WriteLine("Operation 3: " + e.ReceivedData.Data.MessageAdded.From.Id + ": " + e.ReceivedData.Data.MessageAdded.Content);
                };

                // Send message
                var client = GraphQLHttpClient.Default();
                await client.CreateMutation <SendMessageMutation>("http://localhost:60340/graphql", arguments : new GraphQLQueryArgument("message", new MessageInputType
                {
                    content = "Message 1",
                    fromId  = "SAHB",
                    sentAt  = DateTime.Now.AddDays(-1)
                })).Execute();

                await operation.Stop();

                Console.ReadKey();

                await client.CreateMutation <SendMessageMutation>("http://localhost:60340/graphql", arguments : new GraphQLQueryArgument("message", new MessageInputType
                {
                    content = "Message 2",
                    fromId  = "SAHB"
                })).Execute();

                Console.ReadKey();

                await wssClient.Disconnect();

                Console.ReadKey();
            }
        }
示例#24
0
        static async Task Main(string[] args)
        {
            IGraphQLHttpClient client = GraphQLHttpClient.Default();

            // Get response from url using the HeroQuery object
            var response = await client.Query <HeroQuery>("https://mpjk0plp9.lp.gql.zone/graphql");

            Console.WriteLine(response.Hero.Name);

            // Get response from url using a generated object
            var query = client.CreateQuery(builder =>
                                           builder.Field("hero",
                                                         hero =>
                                                         hero
                                                         .Field("name")
                                                         .Field("friends",
                                                                friends =>
                                                                friends.Alias("MyFriends").Field("name"))),
                                           "https://mpjk0plp9.lp.gql.zone/graphql");
            var builderResponse = await query.Execute();

            Console.WriteLine(builderResponse["hero"]["name"].Value);
            foreach (var friend in builderResponse["hero"]["MyFriends"])
            {
                Console.WriteLine(friend["name"].Value);
            }

            // Get response from url using a generated object without alias
            query = client.CreateQuery(builder =>
                                       builder.Field("hero",
                                                     hero =>
                                                     hero
                                                     .Field("name")
                                                     .Field("friends",
                                                            friends =>
                                                            friends.Field("name"))),
                                       "https://mpjk0plp9.lp.gql.zone/graphql");
            builderResponse = await query.Execute();

            Console.WriteLine(builderResponse["hero"]["name"].Value);

            var character = await client.Query <CharacterQuery>("https://mpjk0plp9.lp.gql.zone/graphql", arguments : new GraphQLQueryArgument("characterID", "1000"));

            if (character.Character is Human human)
            {
                Console.WriteLine("Human!: " + human.Height);
            }

            // Create batch
            var batch = client.CreateBatch("https://mpjk0plp9.lp.gql.zone/graphql");

            // Create two requests in the batch
            var queryId1000 = batch.Query <CharacterQuery>(new GraphQLQueryArgument("characterID", "1000"));
            var queryId1001 = batch.Query <CharacterQuery>(new GraphQLQueryArgument("characterID", "1001"));

            // Execute the batch
            var queryId1000Result = await queryId1000.Execute();

            var queryId1001Result = await queryId1001.Execute();

            // Get result
            Console.WriteLine(queryId1000Result.Character.Name);
            Console.WriteLine(queryId1001Result.Character.Name);

            if (queryId1000Result.Character is Human human2)
            {
                Console.WriteLine("Human!: " + human2.Height);
            }
            else if (queryId1000Result.Character is Droid droid2)
            {
                Console.WriteLine("Droid!: " + droid2.PrimaryFunction);
            }

            // Create executor
            IGraphQLHttpExecutor executor = new GraphQLHttpExecutor();
            var result = await executor.ExecuteQuery(@"{""query"":""query{Hero:hero{Name:name Friends:friends{Name:name}}}""}",
                                                     "https://mpjk0plp9.lp.gql.zone/graphql", HttpMethod.Post);

            IGraphQLDeserialization graphQLDeserialization = new GraphQLDeserilization();

            var deserilizedResult = graphQLDeserialization.DeserializeResult <HeroQuery>(result.Response, null);

            Console.WriteLine(deserilizedResult.Data.Hero.Name);

            // Using dependency injection and console logging
            var serviceCollection = new ServiceCollection();

            serviceCollection
            .AddLogging(logging => logging.AddConsole().SetMinimumLevel(LogLevel.Information))
            .AddGraphQLHttpClient();
            var serviceProvider = serviceCollection.BuildServiceProvider();

            // Get client
            client = serviceProvider.GetRequiredService <IGraphQLHttpClient>();

            // Get response from url using the HeroQuery object
            response = await client.Query <HeroQuery>("https://mpjk0plp9.lp.gql.zone/graphql");

            Console.WriteLine(response.Hero.Name);

            // Swapi
            var swapiResponse = await client.Query <SwapiQuery>("https://swapi.apis.guru/");

            foreach (var movie in swapiResponse.AllFilms.Films)
            {
                Console.WriteLine(movie.Title);
            }

            var filmResponse = await client.Query <FilmQuery>("https://swapi.apis.guru/",
                                                              arguments : new GraphQLQueryArgument("filmIdVariable", "6"));

            Console.WriteLine(filmResponse.Film.Title);

            Console.ReadKey();
        }