public void Select_ArrayOfString_AddsToQuery()
        {
            // Arrange
            var query = new Query <object>("something");

            string[] selects =
            {
                "id",
                "name"
            };

            // Act
            foreach (string field in selects)
            {
                query.AddField(field);
            }

            // Assert
            List <string> shouldEqual = new List <string>()
            {
                "id",
                "name"
            };

            Assert.Equal(shouldEqual, query.SelectList);
        }
Beispiel #2
0
        public MergedSchema(IServiceProvider provider)
        {
            ///////////////////////////////
            //IN CASE OF FIRE BREAK GLASS//
            ///////////////////////////////
            var assem          = Assembly.GetExecutingAssembly().GetExportedTypes();
            var queryFields    = new List <FieldType>();
            var mutationFields = new List <FieldType>();

            var queryTypes = assem.Where(t => (t.Namespace == ("E_gzamin.GraphQL.Queries")));

            foreach (var queryType in queryTypes)
            {
                var query = (IObjectGraphType)provider.GetRequiredService(queryType);
                queryFields.Concat(query.Fields);
                Query = query;
            }

            var mutationTypes = assem.Where(t => (t.Namespace == ("E_gzamin.GraphQL.Mutations")));

            foreach (var mutationType in mutationTypes)
            {
                var mutation = (IObjectGraphType)provider.GetRequiredService(mutationType);
                mutationFields.Concat(mutation.Fields);
                Mutation = mutation;
            }
            foreach (var field in queryFields)
            {
                Query.AddField(field);
            }
            foreach (var field in mutationFields)
            {
                Mutation.AddField(field);
            }
        }
        public void TestSubSelectWithCustomName()
        {
            var query = new Query <Truck>("truck");

            query.AddField(t => t.Load, sq => sq);

            Assert.Equal("load", (query.SelectList[0] as IQuery <Load>).Name);
        }
        public void TestSubSelect()
        {
            var query = new Query <Car>("car");

            query.AddField(c => c.Color, sq => sq);

            Assert.Equal(nameof(Car.Color), (query.SelectList[0] as IQuery <Color>).Name);
        }
        public void Select_ChainCombinationOfStringAndList_AddsToQuery()
        {
            // Arrange
            var query = new Query <object>("something");

            const string  select     = "id";
            List <string> selectList = new List <string>()
            {
                "name",
                "email"
            };

            string[] selectStrings =
            {
                "array",
                "cool"
            };

            // Act
            query.AddField(select);
            foreach (string field in selectList)
            {
                query.AddField(field);
            }
            query.AddField("some").AddField("thing").AddField("else");
            foreach (string field in selectStrings)
            {
                query.AddField(field);
            }

            // Assert
            List <string> shouldEqual = new List <string>()
            {
                "id",
                "name",
                "email",
                "some",
                "thing",
                "else",
                "array",
                "cool"
            };

            Assert.Equal(shouldEqual, query.SelectList);
        }
        public void TestSelect()
        {
            var query = new Query <Car>("car");

            query.AddField(c => c.Name);

            Assert.Equal(new List <string> {
                nameof(Car.Name)
            }, query.SelectList);
        }
        public void TestSelectWithCustomName()
        {
            var query = new Query <Truck>("truck");

            query.AddField(t => t.Name);

            Assert.Equal(new List <string> {
                "name"
            }, query.SelectList);
        }
        public void TestSubSelectWithCustomFormater()
        {
            var query = new Query <Car>("car", options: new QueryOptions
            {
                Formatter = QueryFormatters.CamelCaseFormatter
            });

            query.AddField(c => c.Color, sq => sq);

            Assert.Equal("color", (query.SelectList[0] as IQuery <Color>).Name);
        }
        public void Select_String_AddsToQuery()
        {
            // Arrange
            var query = new Query <object>("something");

            const string select = "id";

            // Act
            query.AddField(select);

            // Assert
            Assert.Equal(select, query.SelectList.First());
        }
        public void TestSelectWithCustomFormater()
        {
            var query = new Query <Car>("car", options: new QueryOptions
            {
                Formatter = QueryFormatters.CamelCaseFormatter
            });

            query.AddField(c => c.Name);

            Assert.Equal(new List <string> {
                "name"
            }, query.SelectList);
        }
        public void Select_DynamicArguments_AddsToQuery()
        {
            // Arrange
            var query = new Query <object>("something");

            // Act
            query.AddField("some").AddField("thing").AddField("else");

            // Assert
            List <string> shouldEqual = new List <string>()
            {
                "some",
                "thing",
                "else"
            };

            Assert.Equal(shouldEqual, query.SelectList);
        }
        public void Select_StringList_AddsToQuery()
        {
            // Arrange
            var query = new Query <object>("something");

            List <string> selectList = new List <string>()
            {
                "id",
                "name"
            };

            // Act
            foreach (string field in selectList)
            {
                query.AddField(field);
            }

            // Assert
            Assert.Equal(selectList, query.SelectList);
        }
Beispiel #13
0
        public void Where_ClearQueryString_EmptyQueryString()
        {
            // Arrange
            var query = new Query <object>("test1");

            List <object> objList = new List <object>(new object[] { "aa", "bb", "cc" });

            Dictionary <string, object> fromToMap = new Dictionary <string, object>
            {
                { "from", 444.45 },
                { "to", 555.45 },
            };

            Dictionary <string, object> nestedListMap = new Dictionary <string, object>
            {
                { "from", 123 },
                { "to", 454 },
                { "recurse", objList },
                { "map", fromToMap },
                { "name", TestEnum.HAYstack }
            };

            query
            .AddField("name")
            .AddArguments(nestedListMap);

            var queryString = new QueryStringBuilder();

            queryString.AddParams(query);

            // Act
            queryString.QueryString.Clear();

            // Assert
            Assert.True(string.IsNullOrEmpty(queryString.QueryString.ToString()));
        }
Beispiel #14
0
        public void Where_QueryString_ParseQueryString()
        {
            // Arrange
            Query <Car> query = new Query <Car>("test1");

            List <object> objList = new List <object>(new object[] { "aa", "bb", "cc" });

            Dictionary <string, object> fromToMap = new Dictionary <string, object>
            {
                { "from", 444.45 },
                { "to", 555.45 },
            };

            Dictionary <string, object> nestedListMap = new Dictionary <string, object>
            {
                { "from", 123 },
                { "to", 454 },
                { "recurse", objList },
                { "map", fromToMap },
                { "name", TestEnum.HAYstack }
            };

            query
            .AddField("name")
            .AddArguments(nestedListMap);

            QueryStringBuilder queryString = new QueryStringBuilder();

            // Act
            queryString.AddParams(query);

            string addParamStr = queryString.QueryString.ToString();

            // Assert
            Assert.Equal("from:123,to:454,recurse:[\"aa\",\"bb\",\"cc\"],map:{from:444.45,to:555.45},name:HAYstack", addParamStr);
        }
Beispiel #15
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="filters">Key=field name, Value=filter value</param>
        /// <param name="sortings">Key=field name, Value=(SortOrder, SortDirection)</param>
        /// <param name="maximumRows"></param>
        /// <param name="startRowIndex"></param>
        /// <returns></returns>
        public List <object> GetAll(
            Dictionary <string, string> filters,
            List <KeyValuePair <string, SortDirection> > sortings,
            int maximumRows,
            int startRowIndex)
        {
            var query = new Query <Empleado>();

            // Simple text and integer fields. The field names come from the select expression.
            query.AddField(x => x.Nombre).AddWhere(x => x.Apellido);                 // Field name = "Nombre"
            query.AddField(x => x.Apellido).AddWhere(x => x.Nombre).CaseSensitive(); // Field name = "Apellido" - case sensitive
            query.AddField(x => x.Dni);

            // A field that concatenates two properties.
            query.AddField("FullName").Select(x => x.Nombre + " " + x.Apellido);

            // Date filter with truncated time.
            query.AddField(x => x.FechaNacimiento).TruncateTime();

            // List filter targeting an enum
            query.AddField("EstadoCivil")
            .Select(x => x.EstadoCivil_Id)     // enums in EF5 for .NET 4.0
            // since the select targets an int we need the following to force a list filter instead of an integer filter.
            .FilterAsList()
            // Return constants for specific values of the target, not necesary but allows us to translates the enum values that will be shown.
            .SelectWhen(this.GetEstadoCivilTranslations(), string.Empty)
            .FilterWhen(10, x => x.EstadoCivil_Id.Equals((int)EstadoCivil.Casado) ||     // custom value filter
                        x.EstadoCivil_Id.Equals((int)EstadoCivil.Separado));

            query.AddField(x => x.Edad);
            query.AddField(x => x.Salario);
            query.AddField("AttachmentCount").Select(x => x.Attachment.Items.Count(item => !item.Deleted && item.Location_Id.Equals((int)AttachmentLocation.Creation)));
            query.AddField(x => x.Cuit);
            query.AddField(x => x.AverageHourlyWage);
            query.AddField("Dynamic").Select(x => x.FechaNacimiento).FilterAsList().FilterWhen(-1, empleado => empleado.Apellido.ToLower().StartsWith("dro"));

            using (var db = new SampleContext())
            {
                var empleados = (IQueryable <Empleado>)db.Set <Empleado>();

                // Filtering
                empleados = query.Filter(empleados, filters);

                // Sorting and pagination
                if (maximumRows > 0)
                {
                    empleados = query.OrderBy(empleados, sortings, x => x.Id); // x => x.Id acts as default sort when sortings is empty, required to use Skip and Take on EF
                    empleados = empleados.Skip(startRowIndex).Take(maximumRows);
                }

                // Projection. theResult is an untyped IQueryable. The ElementType is an annonymous type based in the defined fields
                var theResult = query.Project(empleados);

                // Calling ToList on the final IQueryable so the SQL query is performed by EF.
                return(Enumerable.Cast <object>(theResult).ToList());
            }
        }
Beispiel #16
0
        public virtual void RegisterQueries(IEnumerable <Type> queryHandlerTypes)
        {
            foreach (var queryHandlerType in queryHandlerTypes)
            {
                var genericType = queryHandlerType.GetInterfaces().Single(x => x.GetTypeInfo().IsAssignableToGenericType(typeof(IQueryHandler <,>)) ||
                                                                          x.GetTypeInfo().IsAssignableToGenericType(typeof(IAsyncQueryHandler <,>)));
                var genericArguments = genericType.GetGenericArguments();
                var queryType        = genericArguments[0];
                var queryResultType  = genericArguments[1];
                var resultType       = genericArguments[1];

                if (queryType.GetCustomAttribute <ExposeGraphQLAttribute>() == null)
                {
                    continue;
                }

                var isCollection = resultType != typeof(string) && typeof(IEnumerable).IsAssignableFrom(resultType);

                if (isCollection)
                {
                    resultType = resultType.GetGenericArguments()[0];
                }

                var descriptionAttribute = queryType.GetCustomAttribute <DescriptionAttribute>();
                var exposeAttribute      = queryType.GetCustomAttribute <ExposeGraphQLAttribute>();
                var authorizeAttribute   = queryType.GetCustomAttribute <AuthorizeAttribute>();

                if (exposeAttribute == null)
                {
                    continue;
                }

                var properties = queryType.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(x => !typeof(IResolveFieldContext).IsAssignableFrom(x.PropertyType));
                IInputObjectGraphType inputGqlType = null;

                if (properties.Any())
                {
                    var inputObjectType = typeof(AutoInputGraphType <>).MakeGenericType(queryType);
                    inputGqlType             = (IInputObjectGraphType)_container.GetInstance(inputObjectType);
                    inputGqlType.Description = descriptionAttribute?.Description;
                }

                IGraphType resultGqlType = null;

                if (!_typeCache.ContainsKey(queryResultType) && !BuiltInTypeMappings.Any(x => x.clrType == resultType) && !TypeMappings.Any(x => x.clrType == resultType))
                {
                    var resultTypeName   = GetTypeName(resultType);
                    var returnObjectType = typeof(AutoObjectGraphType <>).MakeGenericType(resultType);
                    resultGqlType      = (IGraphType)_container.GetInstance(returnObjectType);
                    resultGqlType.Name = resultTypeName;

                    //TODO: refactor
                    ListGraphType listGqlType = null;
                    if (isCollection)
                    {
                        var name = resultGqlType.Name;
                        listGqlType = (ListGraphType)Activator.CreateInstance(typeof(ListGraphType <>).MakeGenericType(returnObjectType), null);
                        listGqlType.ResolvedType = resultGqlType;
                        resultGqlType            = (IGraphType)listGqlType;
                        // resultGqlType.Name = "ListOf" + name;
                    }

                    RegisterTypeMapping(resultType, returnObjectType);
                    _typeCache.TryAdd(queryResultType, resultGqlType);
                }
                else if (_typeCache.ContainsKey(queryResultType))
                {
                    resultGqlType = _typeCache[queryResultType];
                }

                var arguments = new List <QueryArgument>();

                if (inputGqlType != null)
                {
                    var argument = AllowNullQuery ? new QueryArgument(inputGqlType) : new QueryArgument(new NonNullGraphType(inputGqlType));
                    argument.Name = "query";
                    arguments.Add(argument);
                }

                var queryName = exposeAttribute.IsFieldNameSet ? exposeAttribute.FieldName : _queryNamePrefixRegex.Replace(_queryNameSuffixRegex.Replace(queryType.Name, string.Empty), string.Empty);

                if (!Query.HasField(queryName))
                {
                    var type = new FieldType
                    {
                        Type = resultGqlType == null?BuiltInTypeMappings.Where(x => x.clrType == resultType).Select(x => x.graphType).SingleOrDefault() ?? TypeMappings.Where(x => x.clrType == resultType).Select(x => x.graphType).SingleOrDefault() : null,
                                   ResolvedType = resultGqlType,
                                   Resolver     = new QueryResolver(_container, queryHandlerType, queryType, resultType, GetJsonSerializerSettings()),
                                   Name         = GetNormalizedFieldName(queryName),
                                   Description  = descriptionAttribute?.Description,
                                   Arguments    = new QueryArguments(arguments),
                    };
                    type.Metadata[GraphQLExtensions.PermissionsKey] = authorizeAttribute?.Permissions?.ToList();

                    Query.AddField(type);
                }
            }
        }
Beispiel #17
0
        public virtual void RegisterQueries(IEnumerable <Type> queryHandlerTypes)
        {
            foreach (var queryHandlerType in queryHandlerTypes)
            {
                var genericType = queryHandlerType.GetInterfaces().Single(x => x.GetTypeInfo().IsAssignableToGenericType(typeof(IQueryHandler <,>)) ||
                                                                          x.GetTypeInfo().IsAssignableToGenericType(typeof(IAsyncQueryHandler <,>)));
                var genericArguments = genericType.GetGenericArguments();
                var queryType        = genericArguments[0];
                var resultType       = genericArguments[1];

                var descriptionAttribute = queryType.GetCustomAttribute <DescriptionAttribute>();
                var exposeAttribute      = queryType.GetCustomAttribute <ExposeGraphQLAttribute>();
                var authorizeAttribute   = queryType.GetCustomAttribute <AuthorizeAttribute>();

                if (exposeAttribute == null)
                {
                    continue;
                }

                var properties = queryType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
                IInputObjectGraphType?inputGqlType = null;

                if (properties.Any())
                {
                    var inputObjectType = typeof(InputObjectGraphType <>).MakeGenericType(queryType);
                    inputGqlType = (IInputObjectGraphType)Activator.CreateInstance(inputObjectType);

                    inputGqlType.Name        = queryType.Name;
                    inputGqlType.Description = descriptionAttribute?.Description;

                    var addFieldMethod = inputGqlType.GetType().GetMethod("AddField");

                    foreach (var propertyInfo in properties)
                    {
                        addFieldMethod.Invoke(inputGqlType, new[]
                        {
                            new FieldType()
                            {
                                Name        = GetNormalizedFieldName(propertyInfo.Name),
                                Type        = propertyInfo.PropertyType.GetGraphTypeFromType(),
                                Description = propertyInfo.GetCustomAttribute <DescriptionAttribute>()?.Description
                            }
                        });
                    }
                }

                IGraphType?resultGqlType = null;

                if (!GraphTypeTypeRegistry.Contains(resultType))
                {
                    var resultTypeName   = resultType.Name;
                    var returnObjectType = typeof(EntityGraphType <>).MakeGenericType(resultType);
                    resultGqlType      = (IGraphType)Activator.CreateInstance(returnObjectType, null);
                    resultGqlType.Name = resultTypeName;

                    if (authorizeAttribute != null)
                    {
                        var permissions = resultGqlType.GetMetadata <List <string> >(GraphQLExtensions.PermissionsKey);

                        if (permissions == null)
                        {
                            permissions = new List <string>();
                            resultGqlType.Metadata[GraphQLExtensions.PermissionsKey] = permissions;
                        }

                        if (!string.IsNullOrWhiteSpace(authorizeAttribute.Permission))
                        {
                            permissions.Add(authorizeAttribute.Permission);
                        }
                    }
                }

                var arguments = new List <QueryArgument>();

                if (inputGqlType != null)
                {
                    var argument = AllowNullQuery ? new QueryArgument(inputGqlType) : new QueryArgument(new NonNullGraphType(inputGqlType));
                    argument.Name = "query";
                    arguments.Add(argument);
                }

                var queryName = exposeAttribute.IsFieldNameSet ? exposeAttribute.FieldName : new Regex("Query").Replace(queryType.Name, "");

                if (!Query.HasField(queryName))
                {
                    var type = new FieldType
                    {
                        Type = resultGqlType == null?GraphTypeTypeRegistry.Get(resultType) : null,
                                   ResolvedType = resultGqlType,
                                   Resolver     = new QueryResolver(_container, queryHandlerType, queryType, GetJsonSerializerSettings()),
                                   Name         = GetNormalizedFieldName(queryName),
                                   Description  = descriptionAttribute?.Description,
                                   Arguments    = new QueryArguments(arguments)
                    };

                    Query.AddField(type);
                }
            }
        }