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")); }
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; }
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; }
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")); }
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")); }
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); }
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(); }