public void ShouldAddFormsAsChildrenOfShopElement()
        {
            var shop = new ShopBuilder(new Uri("http://localhost"))
                .AddForm(new Form("request-for-quote", new Uri("/quotes", UriKind.Relative), "post", RestbucksMediaType.Value, new Uri("http://schemas.restbucks.com/shop")))
                .AddForm(new Form("order", new Uri("/orders", UriKind.Relative), "put", RestbucksMediaType.Value, new ShopBuilder(new Uri("http://localhost"))
                                                                                                                                      .Build()))
                .Build();

            var output = new XmlOutput(new ShopFormatter(shop).CreateXml());

            Assert.AreEqual(2, output.GetNodeCount("r:shop/x:model"));

            Assert.AreEqual("http://schemas.restbucks.com/shop", output.GetNodeValue("r:shop/x:model[1]/@schema"));
            Assert.AreEqual("request-for-quote", output.GetNodeValue("r:shop/x:model[1]/@id"));
            Assert.AreEqual("/quotes", output.GetNodeValue("r:shop/x:model[1]/x:submission/@resource"));
            Assert.AreEqual("post", output.GetNodeValue("r:shop/x:model[1]/x:submission/@method"));
            Assert.AreEqual(RestbucksMediaType.Value, output.GetNodeValue("r:shop/x:model[1]/x:submission/@mediatype"));
            Assert.AreEqual(string.Empty, output.GetNodeValue("r:shop/x:model[1]/x:instance"));

            Assert.IsNull(output.GetNode("r:shop/x:model[2]/@schema"));
            Assert.AreEqual("order", output.GetNodeValue("r:shop/x:model[2]/@id"));
            Assert.AreEqual("/orders", output.GetNodeValue("r:shop/x:model[2]/x:submission/@resource"));
            Assert.AreEqual("put", output.GetNodeValue("r:shop/x:model[2]/x:submission/@method"));
            Assert.AreEqual(RestbucksMediaType.Value, output.GetNodeValue("r:shop/x:model[2]/x:submission/@mediatype"));
            Assert.AreEqual(string.Empty, output.GetNodeValue("r:shop/x:model[2]/x:instance/r:shop"));
        }
Exemple #2
0
        public HttpResponseMessage<Shop> Get(string id, HttpRequestMessage request)
        {
            Quotation quotation;
            try
            {
                quotation = quotationEngine.GetQuote(new Guid(id));
            }
            catch (KeyNotFoundException)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }

            var baseUri = uriFactory.CreateBaseUri<Quote>(request.RequestUri);

            var body = new ShopBuilder(baseUri)
                .AddItems(quotation.LineItems.Select(li => new LineItemToItem(li).Adapt()))
                .AddLink(new Link(uriFactory.CreateRelativeUri<Quote>(quotation.Id), RestbucksMediaType.Value, LinkRelations.Self))
                .AddLink(new Link(uriFactory.CreateRelativeUri<OrderForm>(quotation.Id), RestbucksMediaType.Value, LinkRelations.OrderForm))
                .Build();

            var response = new HttpResponseMessage<Shop>(body) {StatusCode = HttpStatusCode.OK};

            response.Headers.CacheControl = new CacheControlHeaderValue {Public = true};
            response.Content.Headers.Expires = quotation.CreatedDateTime.AddDays(7.0);

            return response;
        }
Exemple #3
0
        public HttpResponseMessage<Shop> Post(Shop shop, HttpRequestMessage<Shop> request)
        {
            if (shop == null)
            {
                var errorResponse = new HttpResponseMessage {StatusCode = HttpStatusCode.BadRequest};

                errorResponse.Headers.CacheControl = new CacheControlHeaderValue {NoCache = true, NoStore = true};
                errorResponse.Content = new StringContent("Bad request: empty or malformed data.");
                errorResponse.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain");

                throw new HttpResponseException(errorResponse);
            }

            var quote = quotationEngine.CreateQuote(new QuotationRequest(shop.Items.Select(i => new QuotationRequestItem(i.Description, new Quantity(i.Amount.Measure, i.Amount.Value)))));
            var baseUri = uriFactory.CreateBaseUri<Quotes>(request.RequestUri);

            var body = new ShopBuilder(baseUri)
                .AddItems(quote.LineItems.Select(li => new LineItemToItem(li).Adapt()))
                .AddLink(new Link(uriFactory.CreateRelativeUri<Quote>(quote.Id), RestbucksMediaType.Value, LinkRelations.Self))
                .AddLink(new Link(uriFactory.CreateRelativeUri<OrderForm>(quote.Id), RestbucksMediaType.Value, LinkRelations.OrderForm))
                .Build();

            var response = new HttpResponseMessage<Shop>(body, HttpStatusCode.Created);

            response.Headers.Location = uriFactory.CreateAbsoluteUri<Quote>(baseUri, quote.Id);
            response.Headers.CacheControl = new CacheControlHeaderValue {NoCache = true, NoStore = true};

            return response;
        }
Exemple #4
0
        public HttpResponseMessage<Shop> Get(HttpRequestMessage request)
        {
            var body = new ShopBuilder(uriFactory.CreateBaseUri<EntryPoint>(request.RequestUri))
                .AddLink(new Link(uriFactory.CreateRelativeUri<RequestForQuote>(), RestbucksMediaType.Value, LinkRelations.Rfq, LinkRelations.Prefetch))
                .Build();

            var response = new HttpResponseMessage<Shop>(body);
            response.Headers.CacheControl = new CacheControlHeaderValue {Public = true, MaxAge = new TimeSpan(24, 0, 0)};

            return response;
        }
        public static HttpResponseMessage CreateResponse()
        {
            var entityBody = new ShopBuilder(BaseUri)
                .AddLink(Link)
                .AddForm(EmptyForm)
                .AddForm(PrepopulatedForm)
                .Build();

            var content = new ObjectContent<Shop>(entityBody, new[] {RestbucksMediaType.Formatter});
            content.Headers.ContentType = new MediaTypeHeaderValue(RestbucksMediaType.Value);

            return new HttpResponseMessage {Content = content};
        }
        public HttpResponseMessage<Shop> Get(HttpRequestMessage request)
        {
            var body = new ShopBuilder(uriFactory.CreateBaseUri<RequestForQuote>(request.RequestUri))
                .AddForm(new Form(FormSemantics.Rfq,
                                  uriFactory.CreateRelativeUri<Quotes>(),
                                  "post", RestbucksMediaType.Value,
                                  new Uri("http://schemas.restbucks.com/shop")))
                .Build();

            var response = new HttpResponseMessage<Shop>(body);
            response.Headers.CacheControl = new CacheControlHeaderValue {Public = true, MaxAge = new TimeSpan(24, 0, 0)};

            return response;
        }
        public void ShouldAddCompactUriLinkRelationNamespacesToRootShopElement()
        {
            const string ns1 = "http://restbucks/relations/";
            const string ns2 = "http://thoughtworks/relations/";

            var rel1 = new CompactUriLinkRelation("rb", new Uri(ns1, UriKind.Absolute), "rel1");
            var rel2 = new CompactUriLinkRelation("tw", new Uri(ns2, UriKind.Absolute), "rel2");

            var shop = new ShopBuilder(new Uri("http://locahost/"))
                .AddLink(new Link(new Uri("/quotes", UriKind.Relative), RestbucksMediaType.Value, rel1, rel2))
                .Build();

            var xml = new XmlOutput(new ShopFormatter(shop).CreateXml());

            Assert.AreEqual(ns1, xml.GetNamespaceValue("rb"));
            Assert.AreEqual(ns2, xml.GetNamespaceValue("tw"));
        }
        public void ShouldWriteShopToStream()
        {
            const string expectedXml = @"<?xml version=""1.0"" encoding=""utf-8""?><shop xml:base=""http://restbucks.com/"" xmlns=""http://schemas.restbucks.com/shop"" />";

            var shop = new ShopBuilder(new Uri("http://restbucks.com/")).Build();
            var stream = new MemoryStream();

            var processor = RestbucksMediaType.Formatter;
            processor.WriteToStream(typeof (Shop), shop, stream, null, null);

            stream.Seek(0, SeekOrigin.Begin);

            var xml = new XmlDocument();
            xml.Load(stream);

            Assert.AreEqual(expectedXml, xml.OuterXml);
        }
        public void ShouldAddItemElementsAsChildrenOfItems()
        {
            var shop = new ShopBuilder(new Uri("http://localhost/"))
                .AddItem(new Item("item1", new Amount("g", 250)))
                .AddItem(new Item("item2", new Amount("g", 500), new Cost("GBP", 5.50)))
                .Build();

            var xml = new XmlOutput(new ShopFormatter(shop).CreateXml());

            Assert.AreEqual(2, xml.GetNodeCount("r:shop/r:items/r:item"));

            Assert.AreEqual("item1", xml.GetNodeValue("r:shop/r:items/r:item[1]/r:description"));
            Assert.AreEqual("g", xml.GetNodeValue("r:shop/r:items/r:item[1]/r:amount/@measure"));
            Assert.AreEqual("250", xml.GetNodeValue("r:shop/r:items/r:item[1]/r:amount"));
            Assert.IsNull(xml.GetNode("r:shop/r:items/r:item[1]/r:price"));

            Assert.AreEqual("item2", xml.GetNodeValue("r:shop/r:items/r:item[2]/r:description"));
            Assert.AreEqual("g", xml.GetNodeValue("r:shop/r:items/r:item[2]/r:amount/@measure"));
            Assert.AreEqual("500", xml.GetNodeValue("r:shop/r:items/r:item[2]/r:amount"));
            Assert.AreEqual("GBP", xml.GetNodeValue("r:shop/r:items/r:item[2]/r:price/@currency"));
            Assert.AreEqual("5.50", xml.GetNodeValue("r:shop/r:items/r:item[2]/r:price"));
        }
Exemple #10
0
        private static void Main(string[] args)
        {
            XmlConfigurator.Configure();

            var items = new ShopBuilder(null).AddItem(new Item("coffee", new Amount("g", 125))).Build();
            var variables = new ApplicationStateVariables(
                new KeyValuePair<IKey, object>(new StringKey("home-page-uri"), new Uri("http://localhost:8080/restbucks/shop")),
                new KeyValuePair<IKey, object>(new EntityBodyKey("request-for-quote", new MediaTypeHeaderValue(RestbucksMediaType.Value), new Uri("http://schemas.restbucks.com/shop")), items));

            var state = new Uninitialized(variables);
            Console.WriteLine(state.GetType().Name);
            var nextState = state.NextState(ClientCapabilities.Instance);
            Console.WriteLine(nextState.GetType().Name);

            while (!nextState.IsTerminalState)
            {
                nextState = nextState.NextState(ClientCapabilities.Instance);
                Console.WriteLine(nextState.GetType().Name);
            }

            Console.WriteLine("Finished");
            Console.ReadLine();
        }
        public void ShouldCreateLinksAsChildrenOfShopElement()
        {
            var shop = new ShopBuilder(new Uri("http://localhost/"))
                .AddLink(new Link(new Uri("/quotes", UriKind.Relative), RestbucksMediaType.Value, LinkRelations.Rfq, LinkRelations.Prefetch))
                .AddLink(new Link(new Uri("/order-forms/1234", UriKind.Relative), "application/xml", LinkRelations.OrderForm))
                .Build();

            var xml = new XmlOutput(new ShopFormatter(shop).CreateXml());

            Assert.AreEqual(2, xml.GetNodeCount("r:shop/r:link"));

            Assert.AreEqual("rb:rfq prefetch", xml.GetNodeValue("r:shop/r:link[1]/@rel"));
            Assert.AreEqual("/quotes", xml.GetNodeValue("r:shop/r:link[1]/@href"));
            Assert.AreEqual(RestbucksMediaType.Value, xml.GetNodeValue("r:shop/r:link[1]/@type"));

            Assert.AreEqual("rb:order-form", xml.GetNodeValue("r:shop/r:link[2]/@rel"));
            Assert.AreEqual("application/xml", xml.GetNodeValue("r:shop/r:link[2]/@type"));
            Assert.AreEqual("/order-forms/1234", xml.GetNodeValue("r:shop/r:link[2]/@href"));
        }
 public void ShouldNotAddItemsElementIfThereAreNoItemsInShop()
 {
     var shop = new ShopBuilder(new Uri("http://localhost")).Build();
     var xml = new XmlOutput(new ShopFormatter(shop).CreateXml());
     Assert.IsNull(xml.GetNode("r:shop/r:items"));
 }
Exemple #13
0
 public void ShouldUseSuppliedUriAsBaseUri()
 {
     var shop = new ShopBuilder(new Uri("http://localhost:8080/virtual-directory")).Build();
     Assert.AreEqual(new Uri("http://localhost:8080/virtual-directory"), shop.BaseUri);
 }
        public void ThrowsExceptionWhenGettingDataStrategyForFormWithNullFormDataButNoSchema()
        {
            var entityBody = new ShopBuilder(new Uri("http://localhost"))
                .AddForm(new Form("invalid-form", new Uri("http://localhost/orders"), "post", RestbucksMediaType.Value, null as Shop))
                .Build();

            var content = new ObjectContent<Shop>(entityBody, new[] { RestbucksMediaType.Formatter });
            content.Headers.ContentType = new MediaTypeHeaderValue(RestbucksMediaType.Value);

            var response = new HttpResponseMessage {Content = content};

            var form = RestbucksForm.WithId("invalid-form");
            form.GetFormDataStrategy(response);
        }
Exemple #15
0
        public void ShouldReturnNewQuoteFromQuoteEngine()
        {
            var mockQuoteEngine = MockRepository.GenerateMock<IQuotationEngine>();

            var shop = new ShopBuilder(new Uri("http://localhost/"))
                .AddItem(new Item("item1", new Amount("g", 250)))
                .AddItem(new Item("item2", new Amount("kg", 2)))
                .Build();

            var quote = new Quotation(
                Guid.Empty,
                DateTime.Now,
                new[]
                    {
                        new LineItem("item1", new Quantity("g", 250), new Money("GBP", 2.50)),
                        new LineItem("item2", new Quantity("kg", 2), new Money("GBP", 2.00))
                    });

            mockQuoteEngine.Expect(q => q.CreateQuote(null))
                .Constraints(Is.Matching<QuotationRequest>(qr => Matching.QuoteRequestItemsMatchItems(qr.Items, shop.Items)))
                .Return(quote);

            var quotes = new Quotes(DefaultUriFactory.Instance, mockQuoteEngine);
            var response = quotes.Post(shop, new HttpRequestMessage<Shop>{ RequestUri = new Uri("http://localhost:8080/quotes") });

            var entityBody = response.Content.ReadAsOrDefault();

            Assert.True(entityBody.HasItems);
            Assert.True(Matching.LineItemsMatchItems(quote.LineItems, entityBody.Items));

            mockQuoteEngine.VerifyAllExpectations();
        }