示例#1
0
        public void WhenOrderIsOk_ThenResponseHasStatus201AndLocation()
        {
            var orderRepository = new Mock <IRepository <Order> >();

            orderRepository
            .Setup(or => or.MakePersistent(It.IsAny <Order[]>()))
            .Callback <Order[]>(o => o.First().Id = 123);
            var appProxy = CreateAppProxy(orderRepository.Object);

            var expectedUriToTheNewOrder =
                new ResourceLinker(Container.Resolve <IRouteCacheProvider>()).BuildUriString(appProxy.Get("/orders").Context, "ReadOrder", new { orderId = "123" });

            var orderRepresentation = new OrderRepresentation()
            {
                Items = { new OrderItemRepresentation()
                          {
                              Name = "latte", Quantity = 1
                          } }
            };
            // act
            var result = appProxy.Post("/orders/",
                                       with =>
            {
                with.Header("Content-Type", "application/xml");
                with.Body(orderRepresentation.ToXmlString());
            });


            result.StatusCode.Should().Be.EqualTo(HttpStatusCode.Created);
            result.Headers["Location"].Should().Be.EqualTo(expectedUriToTheNewOrder);
        }
 public HalResourceWithPeopleTest()
 {
     resource = new OrganisationRepresentation(1, "Org Name");
     var linker = new ResourceLinker();
     linker.AddLinker(new OrganisationWithPeopleLinker());
     linker.CreateLinks(resource);
 }
 public static OrderRepresentation Map(Order order, ResourceLinker resourceLinker, NancyContext context)
 {
     return(new OrderRepresentation(order)
     {
         Links = GetLinks(order, resourceLinker, context).ToList()
     });
 }
 public static OrderRepresentation Map(Order order, ResourceLinker resourceLinker, NancyContext context)
 {
     return new OrderRepresentation(order)
       {
     Links = GetLinks(order, resourceLinker, context).ToList()
       };
 }
示例#5
0
        public void Link_generated_is_correct_when_base_uri_has_trailing_slash()
        {
            var resourceLinker = new ResourceLinker("http://localhost/");

            var uriString = resourceLinker.BuildUriString("/foo", "", new {});

            Assert.That(uriString, Is.EqualTo("http://localhost/foo"));
        }
示例#6
0
        public void Link_generated_is_correct_with_bound_parameter()
        {
            var resourceLinker = new ResourceLinker("http://localhost");

            var uriString = resourceLinker.BuildUriString("/foo", "/bar/{id}", new { id = 123 });

            Assert.That(uriString, Is.EqualTo("http://localhost/foo/bar/123"));
        }
示例#7
0
        public void Link_generated_is_correct_with_simple_template()
        {
            var resourceLinker = new ResourceLinker("http://localhost");

            var uriString = resourceLinker.BuildUriString("/foo", "/bar", new {});

            Assert.That(uriString, Is.EqualTo("http://localhost/foo/bar"));
        }
示例#8
0
        public TrashModule(IRepository<Order> orderRepository, ResourceLinker linker)
            : base(path)
        {
            this.orderRepository = orderRepository;
              this.linker = linker;
              this.routeCacheProvider = routeCacheProvider;

              Get["ReadCancelledOrder", GetCancelledPath] = parameters => GetCanceled((int) parameters.orderId);
        }
示例#9
0
        public OrdersResourceModule(IRepository <Product> productRepository, IRepository <Order> orderRepository, ResourceLinker linker)
            : base("/orders")
        {
            this.productRepository = productRepository;
            this.orderRepository   = orderRepository;
            this.linker            = linker;

            Post["/"] = _ => HandlePost(this.Bind <OrderRepresentation>());
        }
        public OrdersResourceModule(IRepository<Product> productRepository, IRepository<Order> orderRepository, ResourceLinker linker)
            : base("/orders")
        {
            this.productRepository = productRepository;
              this.orderRepository = orderRepository;
              this.linker = linker;

              Post["/"] = _ => HandlePost(this.Bind<OrderRepresentation>());
        }
示例#11
0
        public TrashModule(IRepository <Order> orderRepository, ResourceLinker linker)
            : base(path)
        {
            this.orderRepository    = orderRepository;
            this.linker             = linker;
            this.routeCacheProvider = routeCacheProvider;

            Get["ReadCancelledOrder", GetCancelledPath] = parameters => GetCanceled((int)parameters.orderId);
        }
        private Response Created(Order order)
        {
            var uri = new ResourceLinker(Request.BaseUri()).BuildUriString(
                OrderResourceModule.Path,
                OrderResourceModule.SlashOrderId,
                new { orderId = order.Id });

            return(Response.Created(uri));
        }
        private Response Created(Order order)
        {
            var uri = new ResourceLinker(Request.BaseUri()).BuildUriString(
            OrderResourceModule.Path,
            OrderResourceModule.SlashOrderId,
            new {orderId = order.Id});

              return Response.Created(uri);
        }
        private static IEnumerable<Link> GetLinks(Order order, string baseAddress)
        {
            var baseUri = new UriSegment(baseAddress);
              var linker = new ResourceLinker(baseAddress);

              var get = new Link(linker.BuildUriString(OrderResourceHandler.Path,
                                               OrderResourceHandler.SlashOrderId,
                                               new {orderId = order.Id}),
                         baseUri + "docs/order-get.htm",
                         MediaTypes.Default);

              var update = new Link(linker.BuildUriString(OrderResourceHandler.Path,
                                                  OrderResourceHandler.SlashOrderId,
                                                  new {orderId = order.Id}),
                            baseUri + "docs/order-update.htm",
                            MediaTypes.Default);

              var cancel = new Link(linker.BuildUriString(OrderResourceHandler.Path,
                                                  OrderResourceHandler.SlashOrderId,
                                                  new {orderId = order.Id}),
                            baseUri + "docs/order-cancel.htm",
                            MediaTypes.Default);

              var pay = new Link(linker.BuildUriString(OrderResourceHandler.Path,
                                               OrderResourceHandler.PaymentPath,
                                               new {orderId = order.Id}),
                         baseUri + "docs/order-pay.htm",
                         MediaTypes.Default);

              var receipt = new Link(linker.BuildUriString(OrderResourceHandler.Path,
                                                   OrderResourceHandler.ReceiptPath,
                                                   new {orderId = order.Id}),
                             baseUri + "docs/receipt-coffee.htm",
                             MediaTypes.Default);

              switch (order.Status)
              {
            case OrderStatus.Unpaid:
              yield return get;
              yield return update;
              yield return cancel;
              yield return pay;
              break;
            case OrderStatus.Paid:
            case OrderStatus.Delivered:
              yield return get;
              break;
            case OrderStatus.Ready:
              yield return receipt;
              break;
            case OrderStatus.Canceled:
              yield break;
            default:
              yield break;
              }
        }
示例#15
0
        public void Argument_exception_is_thrown_if_parameter_from_template_cannot_be_bound()
        {
            var resourceLinker = new ResourceLinker("http://localhost");

            var exception = Assert.Throws <ArgumentException>(() => resourceLinker.BuildUriString("/foo", "/bar/{id}", new {}));

            Assert.That(exception.Message,
                        Is.EqualTo(
                            "The path variable 'ID' in the UriTemplate must be bound to a non-empty string value.\r\nParameter name: parameters"));
        }
        public OrderResourceModule(IRepository <Order> orderRepository, ResourceLinker linker)
            : base(Path)
        {
            this.orderRepository = orderRepository;
            this.linker          = linker;

            Get["ReadOrder", SlashOrderId]      = parameters => GetHandler((int)parameters.orderId);
            Put["UpdateOrder", SlashOrderId]    = parameters => Update((int)parameters.orderId, this.Bind <OrderRepresentation>());
            Delete["CancelOrder", SlashOrderId] = parameters => Cancel((int)parameters.orderId);
            Post["PayOrder", PaymentPath]       = parameters => Pay((int)parameters.orderId, FromXmlStream <PaymentRepresentation>(Request.Body));
        }
示例#17
0
        public void PrepareLinker()
        {
            var mock = new Mock <IResourceGraph>();

            mock.Setup(g => g.Get(It.IsAny <long>())).Returns <long>(id => _graph.ContainsKey(id) ? _graph[id].Target : null);

            _linker = new ResourceLinker
            {
                Graph  = mock.Object,
                Logger = new DummyLogger()
            };
        }
示例#18
0
 public HalResourceListTests()
 {
     resourceLinker = new ResourceLinker();
     resourceLinker.AddLinker(new OrganisationListLinker());
     resourceLinker.AddLinker(new OrganisationLinker());
     resource = new ResourceList<OrganisationRepresentation>(
         new List<OrganisationRepresentation>
                {
                    new OrganisationRepresentation(1, "Org1"),
                    new OrganisationRepresentation(2, "Org2")
                });
     resourceLinker.CreateLinks(resource);
 }
        private static IEnumerable <Link> GetLinks(Order order, ResourceLinker linker, NancyContext context)
        {
            var get = new Link(
                linker.BuildUriString(context, "ReadOrder", new { orderId = order.Id }),
                context.Request.BaseUri() + "/docs/order-get.htm",
                MediaTypes.Default);

            var update = new Link(
                linker.BuildUriString(context, "UpdateOrder", new { orderId = order.Id }),
                context.Request.BaseUri() + "/docs/order-update.htm",
                MediaTypes.Default);

            var cancel = new Link(
                linker.BuildUriString(context, "CancelOrder", new { orderId = order.Id }),
                context.Request.BaseUri() + "/docs/order-cancel.htm",
                MediaTypes.Default);

            var pay = new Link(linker.BuildUriString(context, "PayOrder", new { orderId = order.Id }),
                               context.Request.BaseUri() + "/docs/order-pay.htm",
                               MediaTypes.Default);

            switch (order.Status)
            {
            case OrderStatus.Unpaid:
                yield return(get);

                yield return(update);

                yield return(cancel);

                yield return(pay);

                break;

            case OrderStatus.Paid:
            case OrderStatus.Delivered:
                yield return(get);

                break;

            case OrderStatus.Ready:
                break;

            case OrderStatus.Canceled:
                yield break;

            default:
                yield break;
            }
        }
示例#20
0
        public void throws_meaningful_exception_when_cannot_find_linker()
        {
            // arrange
            var resourceLinker = new ResourceLinker();
            Exception exception = null;

            // act
            try
            {
                resourceLinker.CreateLinks(new List<Resource>());
            }
            catch (ArgumentException ex)
            {
                exception = ex;
            }

            // assert
            Approvals.Verify(exception.Message);
        }
        private static IEnumerable<Link> GetLinks(Order order, ResourceLinker linker, NancyContext context)
        {
            var get = new Link(
            linker.BuildUriString(context, "ReadOrder", new {orderId = order.Id}),
            context.Request.BaseUri() + "/docs/order-get.htm",
            MediaTypes.Default);

              var update = new Link(
            linker.BuildUriString(context, "UpdateOrder", new { orderId = order.Id}),
            context.Request.BaseUri() + "/docs/order-update.htm",
            MediaTypes.Default);

              var cancel = new Link(
            linker.BuildUriString(context, "CancelOrder", new { orderId = order.Id}),
            context.Request.BaseUri() + "/docs/order-cancel.htm",
            MediaTypes.Default);

              var pay = new Link(linker.BuildUriString(context, "PayOrder", new {orderId = order.Id}),
            context.Request.BaseUri() + "/docs/order-pay.htm",
            MediaTypes.Default);

              switch (order.Status)
              {
            case OrderStatus.Unpaid:
              yield return get;
              yield return update;
              yield return cancel;
              yield return pay;
              break;
            case OrderStatus.Paid:
            case OrderStatus.Delivered:
              yield return get;
              break;
            case OrderStatus.Ready:
              break;
            case OrderStatus.Canceled:
              yield break;
            default:
              yield break;
              }
        }
示例#22
0
        private static IEnumerable <Link> GetLinks(Order order, string baseAddress)
        {
            var baseUri = new UriSegment(baseAddress);
            var linker  = new ResourceLinker(baseAddress);

            var get = new Link(linker.BuildUriString(OrderResourceHandler.Path,
                                                     OrderResourceHandler.SlashOrderId,
                                                     new { orderId = order.Id }),
                               baseUri + "docs/order-get.htm",
                               MediaTypes.Default);

            var update = new Link(linker.BuildUriString(OrderResourceHandler.Path,
                                                        OrderResourceHandler.SlashOrderId,
                                                        new { orderId = order.Id }),
                                  baseUri + "docs/order-update.htm",
                                  MediaTypes.Default);

            var cancel = new Link(linker.BuildUriString(OrderResourceHandler.Path,
                                                        OrderResourceHandler.SlashOrderId,
                                                        new { orderId = order.Id }),
                                  baseUri + "docs/order-cancel.htm",
                                  MediaTypes.Default);

            var pay = new Link(linker.BuildUriString(OrderResourceHandler.Path,
                                                     OrderResourceHandler.PaymentPath,
                                                     new { orderId = order.Id }),
                               baseUri + "docs/order-pay.htm",
                               MediaTypes.Default);

            var receipt = new Link(linker.BuildUriString(OrderResourceHandler.Path,
                                                         OrderResourceHandler.ReceiptPath,
                                                         new { orderId = order.Id }),
                                   baseUri + "docs/receipt-coffee.htm",
                                   MediaTypes.Default);

            switch (order.Status)
            {
            case OrderStatus.Unpaid:
                yield return(get);

                yield return(update);

                yield return(cancel);

                yield return(pay);

                break;

            case OrderStatus.Paid:
            case OrderStatus.Delivered:
                yield return(get);

                break;

            case OrderStatus.Ready:
                yield return(receipt);

                break;

            case OrderStatus.Canceled:
                yield break;

            default:
                yield break;
            }
        }
示例#23
0
        /// <summary>
        /// Binds the specified effect data to this instance.
        /// </summary>
        /// <param name="effectDataArg">The effect data arg.</param>
        /// <param name="cloneFromEffect">The clone from effect.</param>
        /// <exception cref="System.InvalidOperationException">If no techniques found in this effect.</exception>
        /// <exception cref="System.ArgumentException">If unable to find effect [effectName] from the EffectPool.</exception>
        internal void InitializeFrom(EffectData.Effect effectDataArg, Effect cloneFromEffect)
        {
            RawEffectData = effectDataArg;

            // Clean any previously allocated resources
            if (DisposeCollector != null)
            {
                DisposeCollector.DisposeAndClear();
            }
            ConstantBuffers.Clear();
            Parameters.Clear();
            Techniques.Clear();
            ResourceLinker = ToDispose(new EffectResourceLinker());
            if (effectConstantBuffersCache != null)
            {
                effectConstantBuffersCache.Clear();
            }

            // Copy data
            IsSupportingDynamicCompilation = RawEffectData.Arguments != null;
            ShareConstantBuffers           = RawEffectData.ShareConstantBuffers;

            // Create the local effect constant buffers cache
            if (!ShareConstantBuffers)
            {
                effectConstantBuffersCache = new Dictionary <EffectConstantBufferKey, EffectConstantBuffer>();
            }

            var        logger         = new Logger();
            int        techniqueIndex = 0;
            int        totalPassCount = 0;
            EffectPass parentPass     = null;

            foreach (var techniqueRaw in RawEffectData.Techniques)
            {
                var name = techniqueRaw.Name;
                if (string.IsNullOrEmpty(name))
                {
                    name = string.Format("${0}", techniqueIndex++);
                }

                var technique = new EffectTechnique(this, name);
                Techniques.Add(technique);

                int passIndex = 0;
                foreach (var passRaw in techniqueRaw.Passes)
                {
                    name = passRaw.Name;
                    if (string.IsNullOrEmpty(name))
                    {
                        name = string.Format("${0}", passIndex++);
                    }

                    var pass = new EffectPass(logger, this, technique, passRaw, name);

                    pass.Initialize(logger);

                    // If this is a subpass, add it to the parent pass
                    if (passRaw.IsSubPass)
                    {
                        if (parentPass == null)
                        {
                            logger.Error("Pass [{0}] is declared as a subpass but has no parent.");
                        }
                        else
                        {
                            parentPass.SubPasses.Add(pass);
                        }
                    }
                    else
                    {
                        technique.Passes.Add(pass);
                        parentPass = pass;
                    }
                }

                // Count the number of passes
                totalPassCount += technique.Passes.Count;
            }

            if (totalPassCount == 0)
            {
                throw new InvalidOperationException("No passes found in this effect.");
            }

            // Log all the exception in a single throw
            if (logger.HasErrors)
            {
                throw new InvalidOperationException(Utilities.Join("\n", logger.Messages));
            }

            // Initialize the resource linker when we are done with all pass/parameters
            ResourceLinker.Initialize();

            //// Sort all parameters by their resource types
            //// in order to achieve better local cache coherency in resource linker
            Parameters.Items.Sort((left, right) =>
            {
                // First, order first all value types, then resource type
                var comparison = left.IsValueType != right.IsValueType ? left.IsValueType ? -1 : 1 : 0;

                // If same type
                if (comparison == 0)
                {
                    // Order by resource type
                    comparison = ((int)left.ResourceType).CompareTo((int)right.ResourceType);

                    // If same, order by resource index
                    if (comparison == 0)
                    {
                        comparison = left.Offset.CompareTo(right.Offset);
                    }
                }
                return(comparison);
            });

            // Prelink constant buffers
            int resourceIndex = 0;

            foreach (var parameter in Parameters)
            {
                // Recalculate parameter resource index
                if (!parameter.IsValueType)
                {
                    parameter.Offset = resourceIndex;
                    resourceIndex   += parameter.ElementCount;
                }

                // Set the default values
                parameter.SetDefaultValue();

                if (parameter.ResourceType == EffectResourceType.ConstantBuffer)
                {
                    parameter.SetResource(ConstantBuffers[parameter.Name]);
                }
            }

            // Compute slot links
            foreach (var technique in Techniques)
            {
                foreach (var pass in technique.Passes)
                {
                    foreach (var subPass in pass.SubPasses)
                    {
                        subPass.ComputeSlotLinks();
                    }
                    pass.ComputeSlotLinks();
                }
            }

            // Setup the first Current Technique.
            CurrentTechnique = this.Techniques[0];

            // Initialize predefined parameters used by Model.Draw (to speedup things internally)
            DefaultParameters = new EffectDefaultParameters(this);

            // If this is a clone, we need to
            if (cloneFromEffect != null)
            {
                // Copy the content of the constant buffers to the new instance.
                for (int i = 0; i < ConstantBuffers.Count; i++)
                {
                    cloneFromEffect.ConstantBuffers[i].CopyTo(ConstantBuffers[i]);
                }

                // Copy back all bound resources except constant buffers
                // that are already initialized with InitializeFrom method.
                for (int i = 0; i < cloneFromEffect.ResourceLinker.Count; i++)
                {
                    if (cloneFromEffect.ResourceLinker.BoundResources[i] is EffectConstantBuffer)
                    {
                        continue;
                    }

                    ResourceLinker.BoundResources[i] = cloneFromEffect.ResourceLinker.BoundResources[i];
                    unsafe
                    {
                        ResourceLinker.Pointers[i] = cloneFromEffect.ResourceLinker.Pointers[i];
                    }
                }

                // If everything was fine, then we can register it into the pool
                Pool.AddEffect(this);
            }

            // Allow subclasses to complete initialization.
            Initialize();

            OnInitialized();
        }