public void Find_FormatterList_Does_Not_Ignores_Types()
        {
            var resolver1 = TypeFormatterResolverCache.Find(new DateTime_Iso8601_Formatter());
            var resolver2 = TypeFormatterResolverCache.Find(new DateTimeOffset_Iso8601_Formatter());

            Assert.AreNotSame(resolver1, resolver2);
        }
        public void Find_FormatterList_Accepts_Null()
        {
            var resolver1 = TypeFormatterResolverCache.Find((ITypeFormatter[])null);
            var resolver2 = TypeFormatterResolverCache.Find((ITypeFormatter[])null);

            Assert.IsNotNull(resolver1);
            Assert.AreSame(resolver1, resolver2);
        }
        public void Find_FormatterList_Ignores_Order_Of_Types()
        {
            var resolver1 = TypeFormatterResolverCache.Find(new DateTime_Iso8601_Formatter(), new DateTimeOffset_JavaScriptTicks_Formatter());
            var resolver2 = TypeFormatterResolverCache.Find(new DateTimeOffset_JavaScriptTicks_Formatter(), new DateTime_Iso8601_Formatter());

            Assert.IsNotNull(resolver1);
            Assert.AreSame(resolver1, resolver2);
        }
        public void Find_FormatterList_Returns_Existing_Resolver()
        {
            var resolver1 = TypeFormatterResolverCache.Find(new DateTime_Iso8601_Formatter());
            var resolver2 = TypeFormatterResolverCache.Find(new DateTime_Iso8601_Formatter());

            Assert.IsNotNull(resolver1);
            Assert.AreSame(resolver1, resolver2);
        }
        public void Clear_Empties_Cache()
        {
            var resolver1 = TypeFormatterResolverCache.Find(new DateTime_Iso8601_Formatter());

            TypeFormatterResolverCache.Clear();
            var resolver2 = TypeFormatterResolverCache.Find(new DateTime_Iso8601_Formatter());

            Assert.AreNotSame(resolver1, resolver2);
        }
예제 #6
0
        /// <summary>
        /// Returns a <see cref="TypeParserResolver"/> filled with the parsers from the <see cref="UseParserAttribute"/> attribute.
        /// </summary>
        /// <param name="useFormatter"></param>
        /// <param name="defaultResolver"></param>
        /// <returns></returns>
        public static TypeFormatterResolver ToTypeFormatterResolver(UseFormatterAttribute useFormatter, TypeFormatterResolver defaultResolver)
        {
            var result = defaultResolver;

            if (useFormatter?.IsValid ?? false)
            {
                result = result == null
                    ? TypeFormatterResolverCache.Find(useFormatter.Formatters)
                    : TypeFormatterResolverCache.Find(result.GetAugmentedFormatters(useFormatter.Formatters));
            }

            return(result);
        }
예제 #7
0
        public void ReturnJsonObject_Uses_Formatter_From_Route()
        {
            var resolver = TypeFormatterResolverCache.Find(new Guid_UpperNoHyphens_Formatter());
            var route    = Route_Tests.CreateRoute <Controller>(nameof(Controller.IntMethod), formatterResolver: resolver);

            _Environment.Environment[WebApiEnvironmentKey.Route] = route;
            var guid = Guid.Parse("c151f1a8-d235-4f28-8c0d-5521a768be9e");

            _Responder.ReturnJsonObject(_Environment.Environment, guid);

            var actual = _Environment.ResponseBodyText;

            Assert.AreEqual("\"C151F1A8D2354F288C0D5521A768BE9E\"", actual);
        }
예제 #8
0
        public void ReturnJsonObject_FullControlVersion_Uses_Formatter_In_Preference_To_Route_Formatter()
        {
            var routeResolver = TypeFormatterResolverCache.Find(new Guid_UpperNoHyphens_Formatter());
            var usedResolver  = TypeFormatterResolverCache.Find(new Guid_LowerNoHyphens_Formatter());
            var route         = Route_Tests.CreateRoute <Controller>(nameof(Controller.IntMethod), formatterResolver: routeResolver);

            _Environment.Environment[WebApiEnvironmentKey.Route] = route;
            var guid = Guid.Parse("c151f1a8-d235-4f28-8c0d-5521a768be9e");

            _Responder.ReturnJsonObject(_Environment.Environment, guid, usedResolver, Encoding.UTF8, null);

            var actual = _Environment.ResponseBodyText;

            Assert.AreEqual("\"c151f1a8d2354f288c0d5521a768be9e\"", actual);
        }
예제 #9
0
        /// <summary>
        /// See interface docs.
        /// </summary>
        /// <param name="next"></param>
        /// <returns></returns>
        public AppFunc AppFuncBuilder(AppFunc next)
        {
            var controllerFinder = Factory.Resolve <IControllerFinder>();

            controllerFinder.DefaultTypeParserResolver    = TypeParserResolverCache.Find(DefaultParsers.ToArray());
            controllerFinder.DefaultTypeFormatterResolver = TypeFormatterResolverCache.Find(DefaultFormatters.ToArray());
            var controllerTypes = controllerFinder.DiscoverControllers();

            var routeFinder = Factory.Resolve <IRouteFinder>();
            var routes      = routeFinder.DiscoverRoutes(controllerTypes);

            var routeMapper = Factory.Resolve <IRouteMapper>();

            routeMapper.AreFormNamesCaseSensitive        = AreFormNamesCaseSensitive;
            routeMapper.AreQueryStringNamesCaseSensitive = AreQueryStringNamesCaseSensitive;
            routeMapper.Initialise(routes);

            var routeFilter = Factory.Resolve <IRouteFilter>();
            var routeCaller = Factory.Resolve <IRouteCaller>();
            var responder   = Factory.Resolve <IWebApiResponder>();

            return(async(IDictionary <string, object> environment) =>
            {
                var route = routeMapper.FindRouteForRequest(environment);
                if (route == null)
                {
                    await next(environment);
                }
                else
                {
                    environment[WebApiEnvironmentKey.Route] = route;
                    if (routeFilter.CanCallRoute(route, environment))
                    {
                        var parameters = routeMapper.BuildRouteParameters(route, environment);
                        if (!parameters.IsValid)
                        {
                            environment[EnvironmentKey.ResponseStatusCode] = 400;
                        }
                        else
                        {
                            var result = routeCaller.CallRoute(environment, route, parameters);
                            if (!route.IsVoidMethod)
                            {
                                if (result == null && (route.RouteAttribute?.NullStatusCode ?? 0) != 0)
                                {
                                    environment[EnvironmentKey.ResponseStatusCode] = route.RouteAttribute.NullStatusCode;
                                }
                                else
                                {
                                    responder.ReturnJsonObject(environment, result);
                                }
                            }
                        }

                        if (!environment.ContainsKey(EnvironmentKey.ResponseStatusCode))
                        {
                            environment[EnvironmentKey.ResponseStatusCode] = 200;
                        }
                    }
                }
            });
        }