From 7d76a6481090b060b2bbe6ccb767d463c73bd228 Mon Sep 17 00:00:00 2001 From: Bruno Baia Date: Thu, 12 Jan 2012 01:16:03 +0100 Subject: [PATCH] Added Testing Framework for RestTemplate based code (example) [SPRNETREST-20] --- .../Spring.TestingQuickStart.2010-NET40.sln | 28 ++++++ .../src/Spring.RestBucksClient/Api/Order.cs | 21 ++++ .../Spring.RestBucksClient/Api/OrderItem.cs | 14 +++ .../Api/RestBucksClient.cs | 49 ++++++++++ .../Spring.RestBucksClient.2010-NET40.csproj | 54 +++++++++++ .../Api/Order.xml | 17 ++++ .../Api/RestBucksClientTests.cs | 95 +++++++++++++++++++ ...ng.RestBucksClient.Tests.2010-NET40.csproj | 66 +++++++++++++ 8 files changed, 344 insertions(+) create mode 100644 examples/Spring.TestingQuickStart/Spring.TestingQuickStart.2010-NET40.sln create mode 100644 examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Api/Order.cs create mode 100644 examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Api/OrderItem.cs create mode 100644 examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Api/RestBucksClient.cs create mode 100644 examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Spring.RestBucksClient.2010-NET40.csproj create mode 100644 examples/Spring.TestingQuickStart/test/Spring.RestBucksClient.Tests/Api/Order.xml create mode 100644 examples/Spring.TestingQuickStart/test/Spring.RestBucksClient.Tests/Api/RestBucksClientTests.cs create mode 100644 examples/Spring.TestingQuickStart/test/Spring.RestBucksClient.Tests/Spring.RestBucksClient.Tests.2010-NET40.csproj diff --git a/examples/Spring.TestingQuickStart/Spring.TestingQuickStart.2010-NET40.sln b/examples/Spring.TestingQuickStart/Spring.TestingQuickStart.2010-NET40.sln new file mode 100644 index 0000000..aa470af --- /dev/null +++ b/examples/Spring.TestingQuickStart/Spring.TestingQuickStart.2010-NET40.sln @@ -0,0 +1,28 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.RestBucksClient", "src\Spring.RestBucksClient\Spring.RestBucksClient.2010-NET40.csproj", "{CC3E13DE-FF16-4659-A7D8-0BE9F5246A24}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.RestBucksClient.Tests", "test\Spring.RestBucksClient.Tests\Spring.RestBucksClient.Tests.2010-NET40.csproj", "{985A302C-4F1B-4D40-948E-3160C6B39C30}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CC3E13DE-FF16-4659-A7D8-0BE9F5246A24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CC3E13DE-FF16-4659-A7D8-0BE9F5246A24}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC3E13DE-FF16-4659-A7D8-0BE9F5246A24}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CC3E13DE-FF16-4659-A7D8-0BE9F5246A24}.Release|Any CPU.Build.0 = Release|Any CPU + {985A302C-4F1B-4D40-948E-3160C6B39C30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {985A302C-4F1B-4D40-948E-3160C6B39C30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {985A302C-4F1B-4D40-948E-3160C6B39C30}.Release|Any CPU.ActiveCfg = Release|Any CPU + {985A302C-4F1B-4D40-948E-3160C6B39C30}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + NAntAddinLastFileName = Spring.build + EndGlobalSection +EndGlobal diff --git a/examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Api/Order.cs b/examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Api/Order.cs new file mode 100644 index 0000000..a41ceae --- /dev/null +++ b/examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Api/Order.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace Spring.RestBucksClient.Api +{ + [DataContract(Name="order", Namespace="http://restbucks.com")] + public class Order + { + [DataMember(Name = "location", Order = 0)] + public string Location { get; set; } + + [DataMember(Name = "cost", EmitDefaultValue = false, Order = 1)] + public decimal Cost { get; set; } + + [DataMember(Name = "items", Order = 2)] + public List Items { get; set; } + + [DataMember(Name = "status", EmitDefaultValue = false, Order = 3)] + public string Status { get; set; } + } +} diff --git a/examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Api/OrderItem.cs b/examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Api/OrderItem.cs new file mode 100644 index 0000000..ce6e405 --- /dev/null +++ b/examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Api/OrderItem.cs @@ -0,0 +1,14 @@ +using System.Runtime.Serialization; + +namespace Spring.RestBucksClient.Api +{ + [DataContract(Name = "item", Namespace = "http://restbucks.com")] + public class OrderItem + { + [DataMember(Name = "name", Order = 0)] + public string Name { get; set; } + + [DataMember(Name = "quantity", Order = 1)] + public int Quantity { get; set; } + } +} diff --git a/examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Api/RestBucksClient.cs b/examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Api/RestBucksClient.cs new file mode 100644 index 0000000..bc355d2 --- /dev/null +++ b/examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Api/RestBucksClient.cs @@ -0,0 +1,49 @@ +using System; + +using Spring.Http; +using Spring.Http.Converters.Xml; +using Spring.Rest.Client; + +namespace Spring.RestBucksClient.Api +{ + /// + /// Basic REST Client for the example of the book "REST in practice": http://restinpractice.com/. + /// Uses http://restbuckson.net/ for the server side. + /// + public class RestBucksClient + { + private const string BaseUrl = "http://restbuckson.net/"; + + private RestTemplate restTemplate; + + /// + /// Gets a reference to the REST client backing this API binding and used to perform API calls. + /// + public RestTemplate RestTemplate + { + get { return this.restTemplate; } + } + + public RestBucksClient() + { + // Create and configure RestTemplate + restTemplate = new RestTemplate(BaseUrl); + DataContractHttpMessageConverter xmlConverter = new DataContractHttpMessageConverter(); + xmlConverter.SupportedMediaTypes = new MediaType[]{ new MediaType("application", "vnd.restbucks+xml") }; + restTemplate.MessageConverters.Add(xmlConverter); + } + + + // Methods + + public Uri CreateOrder(Order order) + { + return restTemplate.PostForLocation("orders", order); + } + + public Order GetOrder(Uri orderUri) + { + return restTemplate.GetForObject(orderUri); + } + } +} diff --git a/examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Spring.RestBucksClient.2010-NET40.csproj b/examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Spring.RestBucksClient.2010-NET40.csproj new file mode 100644 index 0000000..1724788 --- /dev/null +++ b/examples/Spring.TestingQuickStart/src/Spring.RestBucksClient/Spring.RestBucksClient.2010-NET40.csproj @@ -0,0 +1,54 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {CC3E13DE-FF16-4659-A7D8-0BE9F5246A24} + Library + Properties + Spring.RestBucksClient + Spring.RestBucksClient + v4.0 + 512 + Client + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\..\..\bin\net\4.0\Debug\Spring.Rest.dll + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/Spring.TestingQuickStart/test/Spring.RestBucksClient.Tests/Api/Order.xml b/examples/Spring.TestingQuickStart/test/Spring.RestBucksClient.Tests/Api/Order.xml new file mode 100644 index 0000000..4cc0cbd --- /dev/null +++ b/examples/Spring.TestingQuickStart/test/Spring.RestBucksClient.Tests/Api/Order.xml @@ -0,0 +1,17 @@ + + + + + + + + inShop + 7.60000 + + + Latte + 1 + + + unpaid + \ No newline at end of file diff --git a/examples/Spring.TestingQuickStart/test/Spring.RestBucksClient.Tests/Api/RestBucksClientTests.cs b/examples/Spring.TestingQuickStart/test/Spring.RestBucksClient.Tests/Api/RestBucksClientTests.cs new file mode 100644 index 0000000..38d529e --- /dev/null +++ b/examples/Spring.TestingQuickStart/test/Spring.RestBucksClient.Tests/Api/RestBucksClientTests.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; + +using NUnit.Framework; // Here we are using NUnit, but any other unit test framework will work as well. + +using Spring.IO; +using Spring.Http; +using Spring.Rest.Client.Testing; + +namespace Spring.RestBucksClient.Api +{ + /// + /// Unit tests for the RestBucksClient class. + /// + [TestFixture] + public sealed class RestBucksClientTests + { + private RestBucksClient restBucksClient; + private MockRestServiceServer mockServer; + private HttpHeaders responseHeaders; + + [SetUp] + public void Setup() + { + restBucksClient = new RestBucksClient(); + mockServer = MockRestServiceServer.CreateServer(this.restBucksClient.RestTemplate); + + responseHeaders = new HttpHeaders(); + responseHeaders.ContentType = new MediaType("application", "vnd.restbucks+xml"); + } + + [TearDown] + public void TearDown() + { + this.mockServer.Verify(); + } + + + // Test methods + + [Test] + public void CreateOrder() + { + responseHeaders.Location = new Uri("http://restbucks.com/order/123456"); + mockServer.ExpectNewRequest() + .AndExpectUri("http://restbuckson.net/orders") + .AndExpectMethod(HttpMethod.POST) + .AndExpectBody("inShopLatte1") + .AndRespondWith("", responseHeaders); + + Order order = new Order() + { + Location = "inShop", + Items = new List() + { + new OrderItem() + { + Name = "Latte", + Quantity = 1 + } + } + }; + Uri uri = restBucksClient.CreateOrder(order); + Assert.AreEqual(responseHeaders.Location, uri); + } + + [Test] + public void GetOrder() + { + Uri orderUri = new Uri("http://restbuckson.net/order/123456"); + mockServer.ExpectNewRequest() + .AndExpectUri(orderUri) + .AndExpectMethod(HttpMethod.GET) + .AndRespondWith(XmlResource("Order"), responseHeaders); + + Order order = restBucksClient.GetOrder(orderUri); + Assert.IsNotNull(order); + Assert.AreEqual("inShop", order.Location); + Assert.AreEqual(7.6, order.Cost); + Assert.AreEqual(1, order.Items.Count); + Assert.AreEqual("Latte", order.Items[0].Name); + Assert.AreEqual(1, order.Items[0].Quantity); + Assert.AreEqual("unpaid", order.Status); + } + + + // Helper methods + + private static IResource XmlResource(string filename) + { + // Note: Default namespace is 'Spring.RestBucksClient' + return new AssemblyResource("assembly://Spring.RestBucksClient.Tests/Spring.RestBucksClient.Api/" + filename + ".xml"); + } + } +} diff --git a/examples/Spring.TestingQuickStart/test/Spring.RestBucksClient.Tests/Spring.RestBucksClient.Tests.2010-NET40.csproj b/examples/Spring.TestingQuickStart/test/Spring.RestBucksClient.Tests/Spring.RestBucksClient.Tests.2010-NET40.csproj new file mode 100644 index 0000000..56e91d4 --- /dev/null +++ b/examples/Spring.TestingQuickStart/test/Spring.RestBucksClient.Tests/Spring.RestBucksClient.Tests.2010-NET40.csproj @@ -0,0 +1,66 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {985A302C-4F1B-4D40-948E-3160C6B39C30} + Library + Properties + Spring.RestBucksClient + Spring.RestBucksClient.Tests + v4.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\..\..\..\lib\net\2.0\nunit.framework.dll + + + ..\..\..\..\bin\net\4.0\Debug\Spring.Rest.dll + + + ..\..\..\..\bin\net\4.0\Debug\Spring.Rest.Testing.dll + + + + + + + + + {CC3E13DE-FF16-4659-A7D8-0BE9F5246A24} + Spring.RestBucksClient + + + + + + + + \ No newline at end of file