Exemple #1
0
        public void IntrospectedUnion_PropertyCheck()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <SodaFountainController>()
                                .Build();

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

            schema.Rebuild();

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

            spected.Initialize(schema);

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

            Assert.IsNull(spected.Fields);
            Assert.IsNull(spected.Interfaces);
            Assert.IsNull(spected.EnumValues);
            Assert.IsNull(spected.InputFields);
            Assert.IsNull(spected.OfType);
        }
Exemple #2
0
        public void Introspected_ListType_NotNullType_NotNullList_PropertyCheck()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <string>()
                                .Build();

            var schema = new IntrospectedSchema(server.Schema);

            schema.Rebuild();

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

            var spected = schema.FindIntrospectedType(scalar);

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

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

            var unwrappedList = wrapped.OfType;

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

            var unwrappedItemType = unwrappedList.OfType;

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

            var itemType = unwrappedItemType.OfType;

            Assert.AreEqual(spected, itemType);
        }
Exemple #3
0
        public void IntrospectedScalar_PropertyCheck()
        {
            var serverBuilder = new TestServerBuilder();

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

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

            var spected = new IntrospectedType(scalar);

            spected.Initialize(schema);

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

            Assert.IsNull(spected.Fields);
            Assert.IsNull(spected.Interfaces);
            Assert.IsNull(spected.PossibleTypes);
            Assert.IsNull(spected.EnumValues);
            Assert.IsNull(spected.InputFields);
            Assert.IsNull(spected.OfType);
        }
Exemple #4
0
        public void Introspected_ListType_PropertyCheck()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <string>()
                                .Build();

            var schema = new IntrospectedSchema(server.Schema);

            schema.Rebuild();

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

            var spected = schema.FindIntrospectedType(scalar);

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

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

            Assert.IsNull(wrapped.Fields);
            Assert.IsNull(wrapped.Interfaces);
            Assert.IsNull(wrapped.PossibleTypes);
            Assert.IsNull(wrapped.EnumValues);
            Assert.IsNull(wrapped.InputFields);
            Assert.IsNull(wrapped.Name);
            Assert.IsNull(wrapped.Description);
            Assert.AreEqual(spected, wrapped.OfType);
        }
Exemple #5
0
        /// <summary>
        /// Adds the internal introspection fields to the query operation type if and only if the contained schema allows
        /// it through its internal configuration. This method is idempotent.
        /// </summary>
        public void AddIntrospectionFields()
        {
            if (this.Schema.Configuration.DeclarationOptions.DisableIntrospection)
            {
                return;
            }

            this.EnsureGraphOperationType(GraphCollection.Query);
            var queryField = this.Schema.OperationTypes[GraphCollection.Query];

            // Note: introspection fields are defined by the graphql spec, no custom name or item formatting is allowed
            // for Type and field name formatting.
            // spec: https://graphql.github.io/graphql-spec/June2018/#sec-Schema-Introspection
            if (!queryField.Fields.ContainsKey(Constants.ReservedNames.SCHEMA_FIELD))
            {
                var introspectedSchema = new IntrospectedSchema(this.Schema);
                queryField.Extend(new Introspection_SchemaField(introspectedSchema));
                queryField.Extend(new Introspection_TypeGraphField(introspectedSchema));

                this.EnsureGraphType(typeof(string));
                this.EnsureGraphType(typeof(bool));
                this.Schema.KnownTypes.EnsureGraphType(Introspection_DirectiveLocationType.Instance, typeof(DirectiveLocation));
                this.Schema.KnownTypes.EnsureGraphType(Introspection_DirectiveType.Instance, typeof(IntrospectedDirective));
                this.Schema.KnownTypes.EnsureGraphType(Introspection_EnumValueType.Instance, typeof(IntrospectedEnumValue));
                this.Schema.KnownTypes.EnsureGraphType(Introspection_FieldType.Instance, typeof(IntrospectedField));
                this.Schema.KnownTypes.EnsureGraphType(Introspection_InputValueType.Instance, typeof(IntrospectedInputValueType));
                this.Schema.KnownTypes.EnsureGraphType(Introspection_SchemaType.Instance, typeof(IntrospectedSchema));
                this.Schema.KnownTypes.EnsureGraphType(Introspection_TypeKindType.Instance, typeof(TypeKind));
                this.Schema.KnownTypes.EnsureGraphType(Introspection_TypeType.Instance, typeof(IntrospectedType));
            }
        }
Exemple #6
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Introspection_SchemaField"/> class.
 /// </summary>
 /// <param name="schema">The schema.</param>
 public Introspection_SchemaField(IntrospectedSchema schema)
     : base(
         Constants.ReservedNames.SCHEMA_FIELD,
         new GraphTypeExpression(Constants.ReservedNames.SCHEMA_TYPE),
         FIELD_PATH,
         resolver: new GraphDataValueResolver <object, IntrospectedSchema>((x) => schema.AsCompletedTask()))
 {
     this.IntrospectedSchema = Validation.ThrowIfNullOrReturn(schema, nameof(schema));
 }
Exemple #7
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Introspection_TypeGraphField"/> class.
 /// </summary>
 /// <param name="schema">The schema.</param>
 public Introspection_TypeGraphField(IntrospectedSchema schema)
     : base(
         Constants.ReservedNames.TYPE_FIELD,
         new GraphTypeExpression(Constants.ReservedNames.TYPE_TYPE),
         FIELD_PATH,
         FieldResolutionMode.PerSourceItem,
         resolver: new Schema_TypeFieldResolver(schema))
 {
     this.Arguments.AddArgument(
         "name",
         "name",
         new GraphTypeExpression(Constants.ScalarNames.STRING, MetaGraphTypes.IsNotNull),
         typeof(string));
 }
Exemple #8
0
        public void IntrospectedVirtualType_HasATypeNameMetaField()
        {
            var serverBuilder = new TestServerBuilder(TestOptions.UseCodeDeclaredNames)
                                .AddGraphType <SodaCanBuildingController>();

            var server = serverBuilder.Build();
            var schema = new IntrospectedSchema(server.Schema);

            schema.Rebuild();

            var graphType = schema.FindGraphType("Query_buildings") as IObjectGraphType;

            var typeNameField = graphType.Fields.FirstOrDefault(x => x.Name == Constants.ReservedNames.TYPENAME_FIELD);

            Assert.IsNotNull(typeNameField);
        }
Exemple #9
0
        public void IntrospectedEnum_PropertyCheck()
        {
            var serverBuilder = new TestServerBuilder(TestOptions.UseCodeDeclaredNames);
            var server        = serverBuilder
                                .AddGraphType <IntrospectableEnum>()
                                .Build();

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

            schema.Rebuild();

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

            Assert.IsNotNull(enumGraphType);

            var spected = schema.FindIntrospectedType(enumGraphType);

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

            Assert.IsNotNull(spected.EnumValues);

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

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

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

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

            Assert.IsNull(spected.Fields);
            Assert.IsNull(spected.Interfaces);
            Assert.IsNull(spected.PossibleTypes);
            Assert.IsNull(spected.InputFields);
            Assert.IsNull(spected.OfType);
        }
Exemple #10
0
        public void Introspected_NotNullType_WhenSuppliedANotNullType_ThrowsException()
        {
            var serverBuilder = new TestServerBuilder();
            var server        = serverBuilder.AddGraphType <string>()
                                .Build();

            var schema = new IntrospectedSchema(server.Schema);

            schema.Rebuild();

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

            var spected = schema.FindIntrospectedType(scalar);

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

            Assert.Throws <GraphTypeDeclarationException>(() =>
            {
                var _ = new IntrospectedType(wrapped, TypeKind.NON_NULL);
            });
        }
Exemple #11
0
        public void IntrospectedSchema_PropertyCheck()
        {
            var serverBuilder = new TestServerBuilder();

            serverBuilder.AddGraphType <string>();

            var server = serverBuilder.Build();

            var schema = new IntrospectedSchema(server.Schema);

            schema.Rebuild();

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

            Assert.IsNotNull(schema.QueryType);
            Assert.IsNull(schema.MutationType);
            Assert.IsNull(schema.SubscriptionType);
            Assert.IsNotNull(schema.Directives);
            Assert.AreEqual(2, schema.Directives.Count()); // skip , include
        }
Exemple #12
0
 /// <summary>
 /// When overridden in a child class,populates this introspected type using its parent schema to fill in any details about
 /// other references in this instance.
 /// </summary>
 /// <param name="schema">The schema.</param>
 public virtual void Initialize(IntrospectedSchema schema)
 {
 }
Exemple #13
0
        public void IntrospectedInputValueType_PropertyCheck()
        {
            var serverBuilder = new TestServerBuilder(TestOptions.UseCodeDeclaredNames)
                                .AddGraphType <SodaCanBuildingController>();

            var server = serverBuilder.Build();
            var schema = new IntrospectedSchema(server.Schema);

            schema.Rebuild();

            var graphType = schema.FindGraphType("Query_buildings") as IObjectGraphType;
            var spected   = schema.FindIntrospectedType("Query_buildings");

            Assert.IsNotNull(graphType);
            Assert.AreEqual(graphType.Name, spected.Name);
            Assert.AreEqual(graphType.Description, spected.Description);
            Assert.AreEqual(graphType.Kind, spected.Kind);

            Assert.AreEqual(1, spected.Fields.Count);

            var expectedField = graphType.Fields[nameof(SodaCanBuildingController.AddNewBuilding)];
            var field         = spected.Fields[0];

            Assert.AreEqual(expectedField.Name, field.Name);
            Assert.AreEqual(1, field.Arguments.Count);

            var expectedArg = expectedField.Arguments["building"];
            var arg1        = field.Arguments[0];

            Assert.IsNotNull(arg1);
            Assert.AreEqual(expectedArg.Name, arg1.Name);
            Assert.AreEqual(expectedArg.Description, arg1.Description);
            Assert.AreEqual(expectedArg.DefaultValue, arg1.DefaultValue);

            // the type SodaCanBuildingData is used as input type "BuildngInput" for arg1
            var introspectedInputType = schema.FindIntrospectedType("BuildingInput");

            Assert.IsNotNull(introspectedInputType);
            Assert.AreEqual(introspectedInputType, arg1.IntrospectedGraphType);
            Assert.AreEqual(TypeKind.INPUT_OBJECT, introspectedInputType.Kind);

            Assert.AreEqual(3, introspectedInputType.InputFields.Count);

            var inputField1 = introspectedInputType.InputFields.Single(x => x.Name == "Name");

            Assert.AreEqual(null, inputField1.Description);
            Assert.AreEqual(null, inputField1.DefaultValue);
            Assert.AreEqual(TypeKind.SCALAR, inputField1.IntrospectedGraphType.Kind);

            var inputField2 = introspectedInputType.InputFields.Single(x => x.Name == "Address");

            Assert.AreEqual(null, inputField2.Description);
            Assert.AreEqual(null, inputField2.DefaultValue);
            Assert.AreEqual(TypeKind.SCALAR, inputField2.IntrospectedGraphType.Kind);

            var inputField3 = introspectedInputType.InputFields.Single(x => x.Name == "Capacity");

            Assert.AreEqual(null, inputField3.Description);
            Assert.AreEqual(null, inputField3.DefaultValue);

            Assert.AreEqual(TypeKind.NON_NULL, inputField3.IntrospectedGraphType.Kind);
            Assert.AreEqual(TypeKind.ENUM, inputField3.IntrospectedGraphType.OfType.Kind);
        }
Exemple #14
0
        public void IntrospectedObject_PropertyCheck()
        {
            var serverBuilder = new TestServerBuilder(TestOptions.UseCodeDeclaredNames);
            var server        = serverBuilder
                                .AddGraphType <IntrospectableObject>()
                                .Build();

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

            var schema = new IntrospectedSchema(server.Schema);

            schema.Rebuild();

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

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

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

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

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

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

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

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

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

            Assert.AreEqual(expectedDefault, arg1.DefaultValue);

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

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

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

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

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

            Assert.IsNull(spected.EnumValues);
            Assert.IsNull(spected.PossibleTypes);
            Assert.IsNull(spected.InputFields);
            Assert.IsNull(spected.OfType);
        }
Exemple #15
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Schema_TypeFieldResolver"/> class.
 /// </summary>
 /// <param name="schema">The schema.</param>
 public Schema_TypeFieldResolver(IntrospectedSchema schema)
 {
     _schema = Validation.ThrowIfNullOrReturn(schema, nameof(schema));
 }