public void Read_SubscriptionType()
        {
            /* Given */
            var subscription = new __Type
            {
                Kind = __TypeKind.OBJECT,
                Name = "S"
            };

            var schema = new __Schema
            {
                SubscriptionType = subscription,
                Types            = new List <__Type>
                {
                    subscription
                }
            };

            var builder = new SchemaBuilder();
            var reader  = new IntrospectionSchemaReader(
                builder,
                new IntrospectionResult
            {
                Schema = schema
            });

            /* When */
            reader.Read();

            /* Then */
            builder.TryGetType <ObjectType>("Subscription", out var subscriptionType);
            Assert.NotNull(subscriptionType);
        }
        public void Read_Scalars()
        {
            /* Given */
            var types = ScalarType.Standard
                        .Select(s => s.Type)
                        .Select(scalar => new __Type
            {
                Kind = __TypeKind.SCALAR,
                Name = scalar.Name
            }).ToList();

            var schema = new __Schema
            {
                Types = types
            };

            var builder = new SchemaBuilder();
            var reader  = new IntrospectionSchemaReader(
                builder,
                new IntrospectionResult
            {
                Schema = schema
            });

            /* When */
            reader.Read();

            /* Then */
            foreach (var scalarType in ScalarType.Standard
                     .Select(s => s.Type))
            {
                Assert.True(builder.TryGetType <ScalarType>(scalarType.Name, out _));
            }
        }
        public void Read_QueryType()
        {
            /* Given */
            var query = new __Type
            {
                Kind = __TypeKind.OBJECT,
                Name = "Q"
            };

            var schema = new __Schema
            {
                QueryType = query,
                Types     = new List <__Type>
                {
                    query
                }
            };

            var builder = new SchemaBuilder();
            var reader  = new IntrospectionSchemaReader(
                builder,
                new IntrospectionResult
            {
                Schema = schema
            });

            /* When */
            reader.Read();

            /* Then */
            builder.TryGetType <ObjectType>("Query", out var queryType);
            Assert.NotNull(queryType);
        }
        public void Read_UnionType()
        {
            /* Given */
            var object1 = new __Type
            {
                Kind = __TypeKind.OBJECT,
                Name = "object1"
            };
            var object2 = new __Type
            {
                Kind = __TypeKind.OBJECT,
                Name = "object2"
            };
            var introspectedType = new __Type
            {
                Kind          = __TypeKind.UNION,
                Name          = "U",
                PossibleTypes = new List <__Type>
                {
                    object1,
                    object2
                }
            };

            var schema = new __Schema
            {
                Types = new List <__Type>
                {
                    object1,
                    introspectedType,
                    object2
                }
            };

            var builder = new SchemaBuilder();
            var reader  = new IntrospectionSchemaReader(
                builder,
                new IntrospectionResult
            {
                Schema = schema
            });

            /* When */
            reader.Read();

            /* Then */
            Assert.True(builder.TryGetType <UnionType>(introspectedType.Name, out var type));
            Assert.Single(type.PossibleTypes, possibleType => possibleType.Key == "object1");
            Assert.Single(type.PossibleTypes, possibleType => possibleType.Key == "object2");
        }
        public void Read_InputObjectType_with_field()
        {
            /* Given */
            var type = new __Type
            {
                Kind        = __TypeKind.INPUT_OBJECT,
                Name        = "object",
                InputFields = new List <__InputValue>
                {
                    new __InputValue
                    {
                        Name = "field1",
                        Type = new __Type
                        {
                            Kind = __TypeKind.SCALAR,
                            Name = "Int"
                        }
                    }
                }
            };

            var schema = new __Schema
            {
                Types = new List <__Type>
                {
                    type
                }
            };

            var builder = new SchemaBuilder();
            var reader  = new IntrospectionSchemaReader(
                builder,
                new IntrospectionResult
            {
                Schema = schema
            });

            /* When */
            reader.Read();

            /* Then */
            builder.TryGetType <InputObjectType>(type.Name, out var inputObjectType);
            Assert.NotNull(inputObjectType);
            builder.Connections(connections =>
            {
                Assert.True(connections.TryGetInputField(inputObjectType, "field1", out var field1));
                Assert.Equal(ScalarType.Int, field1.Type);
            });
        }
        public void Read_Enum_with_values()
        {
            /* Given */
            var introspectedType = new __Type
            {
                Kind       = __TypeKind.ENUM,
                Name       = "T",
                EnumValues = new List <__EnumValue>
                {
                    new __EnumValue
                    {
                        Name        = "VALUE1",
                        Description = "description"
                    }
                }
            };

            var schema = new __Schema
            {
                Types = new List <__Type>
                {
                    introspectedType
                }
            };

            var builder = new SchemaBuilder();
            var reader  = new IntrospectionSchemaReader(
                builder,
                new IntrospectionResult
            {
                Schema = schema
            });

            /* When */
            reader.Read();

            /* Then */
            Assert.True(builder.TryGetType <EnumType>(introspectedType.Name, out var type));
            Assert.Single(type.Values, value => value.Key == "VALUE1");
        }
        public void Read_ObjectType_with_field()
        {
            /* Given */
            var type = new __Type
            {
                Kind   = __TypeKind.OBJECT,
                Name   = "object",
                Fields = new List <__Field>
                {
                    new __Field
                    {
                        Name = "field1",
                        Type = new __Type
                        {
                            Kind = __TypeKind.SCALAR,
                            Name = "Int"
                        },
                        Args = new List <__InputValue>
                        {
                            new __InputValue
                            {
                                Name = "arg1",
                                Type = new __Type
                                {
                                    Kind = __TypeKind.SCALAR,
                                    Name = "String"
                                }
                            }
                        }
                    }
                }
            };

            var schema = new __Schema
            {
                Types = new List <__Type>
                {
                    type
                }
            };

            var builder = new SchemaBuilder();
            var reader  = new IntrospectionSchemaReader(
                builder,
                new IntrospectionResult
            {
                Schema = schema
            });

            /* When */
            reader.Read();

            /* Then */
            builder.TryGetType <ObjectType>(type.Name, out var objectType);
            Assert.NotNull(objectType);
            builder.Connections(connections =>
            {
                Assert.True(connections.TryGetField(objectType, "field1", out var field1));
                Assert.Equal(ScalarType.Int, field1.Type);
                Assert.Single(field1.Arguments, arg => arg.Key == "arg1" &&
                              ScalarType.String.Equals(arg.Value.Type));
            });
        }