public JsonWrapperTests()
 {
     QueryExprSerializer.ConfigureRules(rules =>
                                        rules.RuleForType <QueryExprSerializerTests>()
                                        .RuleForType <TestableThing>()
                                        .RuleForType(typeof(Tuple)));
 }
 private void Reset()
 {
     ServiceHost.GetService <IMemberAdapter>().Reset();
     QueryExprSerializer.ConfigureRules(
         rules => rules.RuleForType <QueryExprSerializerTests>()
         .RuleForType <TestableThing>()
         .RuleForType <BinarySerializerTests>()
         .RuleForType(typeof(KeyValuePair))
         .RuleForType(typeof(Tuple)));
 }
        public void HandlesElementInits()
        {
            Expression <Func <DataHost> > elemInit = () => new DataHost {
                Elems = { new DataElem() }
            };
            var root             = QueryExprSerializer.Serialize(elemInit, config => config.CompressExpressionTree(false));
            var json             = wrapper.FromSerializationRoot(root);
            var deserializedRoot = wrapper.ToSerializationRoot(json);

            QueryExprSerializer.ConfigureRules(rules => rules.RuleForType <DataHost>()
                                               .RuleForType <DataElem>());
            var deserializedExpr = QueryExprSerializer.Deserialize <LambdaExpression>(deserializedRoot);

            Assert.True(elemInit.IsEquivalentTo(deserializedExpr));
        }
        public void GivenRulesPassedWhenMapPowerToolsEFCoreBaseCalledThenShouldConfigureRules()
        {
            IEndpointRouteBuilder builder = null;

            CreateSimpleServer(config => builder = config);

            builder.MapPowerToolsEFCore(
                routePattern,
                defaultTypes,
                rules => rules.RuleForType <MiddlewareExtensionsTests>());

            var engine = ServiceHost.GetService <IRulesEngine>();

            Assert.True(engine.MemberIsAllowed(typeof(MiddlewareExtensionsTests)));

            // reset rules
            QueryExprSerializer.ConfigureRules();
        }
        public void AlternateSelectManyWorks()
        {
            QueryExprSerializer.ConfigureRules(
                rules => rules.RuleForType <RelatedThing>());

            var db = typeof(JsonWrapperTests).Assembly.GetTypes()
                     .Select(t => new MockType
            {
                Id      = t.ToString(),
                Name    = t.FullName,
                Methods = t.GetMethods().Select(
                    m => new MockMethod
                {
                    Id         = m.ToString(),
                    Name       = m.Name,
                    Parameters = m.GetParameters()
                                 .Select(p => new MockParameter
                    {
                        Id   = $"{p.Position}-{p.ParameterType}",
                        Name = p.Name,
                    }).ToList()
                }).ToList()
            });

            Func <IQueryable <MockType>, IQueryable <RelatedThing> > makeQuery = q =>
                                                                                 q
                                                                                 .Where(t => t.Name != null)
                                                                                 .SelectMany(
                t =>
                t.Methods, (t, m) =>
                new
            {
                t.Name,
                MethodName = m.Name,
                m.Parameters,
            })
                                                                                 .SelectMany(
                tm => tm.Parameters,
                (tm, p) =>
                new RelatedThing
            {
                TypeName      = tm.Name,
                MethodName    = tm.MethodName,
                ParameterName = p.Name,
            })
                                                                                 .OrderBy(r => r.TypeName)
                                                                                 .ThenBy(r => r.MethodName)
                                                                                 .ThenBy(r => r.ParameterName);

            var queryToSerialize = makeQuery(new List <MockType>().AsQueryable());

            var root = QueryExprSerializer.Serialize(queryToSerialize);
            var json = wrapper.FromSerializationRoot(root);

            var deserializedRoot = wrapper.ToSerializationRoot(json);
            var newQuery         = QueryExprSerializer.DeserializeQuery <RelatedThing>(deserializedRoot, db.AsQueryable());

            var result   = makeQuery(db.AsQueryable());
            var expected = result.ToList();
            var actual   = newQuery.ToList();

            Assert.NotNull(actual);
            Assert.Equal(expected.Count(), actual.Count());
        }
        /// <summary>
        /// Main configuration method for Power Tools EF Core middleware.
        /// </summary>
        /// <param name="endpointRouteBuilder">The <see cref="IEndpointRouteBuilder"/>.</param>
        /// <param name="pattern">The pattern for the route (defaults to <c>/efcore</c>).</param>
        /// <param name="dbContextTypes">The list of <c>DbContext</c> types to support.</param>
        /// <param name="rules">The <see cref="IRulesConfiguration"/> to configure serialization rules.</param>
        /// <param name="noDefaultRules">Determines whether the default rule set should be applied.</param>
        /// <param name="options">The <see cref="IConfigurationBuilder"/> to configure options.</param>
        /// <returns>The <see cref="IEndpointConventionBuilder"/>.</returns>
        public static IEndpointConventionBuilder MapPowerToolsEFCore(
            this IEndpointRouteBuilder endpointRouteBuilder,
            RoutePattern pattern,
            Type[] dbContextTypes,
            Action <IRulesConfiguration> rules = null,
            bool noDefaultRules = false,
            Action <IConfigurationBuilder> options = null)
        {
            Ensure.NotNull(() => endpointRouteBuilder);
            Ensure.NotNull(() => pattern);
            Ensure.NotNull(() => dbContextTypes);

            if (pattern.Parameters.Count != 2)
            {
                throw new ArgumentException(
                          $"{DefaultPattern}<~>{pattern.RawText}",
                          nameof(pattern));
            }

            if (!pattern.Parameters.Any(p => p.Name == Context))
            {
                throw new ArgumentException(Context, nameof(pattern));
            }

            if (!pattern.Parameters.Any(p => p.Name == Collection))
            {
                throw new ArgumentException(Collection, nameof(pattern));
            }

            if (dbContextTypes.Length == 0)
            {
                throw new ArgumentException(
                          $"{nameof(dbContextTypes)}.Length = 0",
                          nameof(dbContextTypes));
            }

            var badType = dbContextTypes.FirstOrDefault(
                t => !typeof(DbContext).IsAssignableFrom(t));

            if (badType != null)
            {
                throw new ArgumentException(
                          $"{badType} != {typeof(DbContext)}",
                          nameof(dbContextTypes));
            }

            // passed tests, check configuration
            if (options != null)
            {
                QueryExprSerializer.ConfigureDefaults(options);
            }

            if (rules != null || noDefaultRules == true)
            {
                QueryExprSerializer.ConfigureRules(rules, noDefaultRules);
            }

            var appBuilder = endpointRouteBuilder.CreateApplicationBuilder();

            appBuilder.UseMiddleware <ExpressionPowerToolsEFCoreMiddleware>(
                pattern.RawText,
                dbContextTypes);
            return(endpointRouteBuilder.Map(pattern, appBuilder.Build())
                   .WithDisplayName($"Expression Power Tools Serialization Pipeline"));
        }
 public BinarySerializerTests()
 {
     QueryExprSerializer.ConfigureRules(config => config.RuleForType <BinarySerializerTests>());
 }