public void ProcessBatchAsync_CallsRegisterForDispose() { // Arrange List<IDisposable> expectedResourcesForDisposal = new List<IDisposable>(); MockHttpServer server = new MockHttpServer(request => { var tmpContent = new StringContent(String.Empty); request.RegisterForDispose(tmpContent); expectedResourcesForDisposal.Add(tmpContent); return new HttpResponseMessage { Content = new StringContent(request.RequestUri.AbsoluteUri) }; }); UnbufferedODataBatchHandler batchHandler = new UnbufferedODataBatchHandler(server); HttpRequestMessage batchRequest = new HttpRequestMessage(HttpMethod.Post, "http://example.com/$batch") { Content = new MultipartContent("mixed") { ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Get, "http://example.com/")), new MultipartContent("mixed") // ChangeSet { ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Post, "http://example.com/")) } } }; batchRequest.SetConfiguration(new HttpConfiguration()); // Act var response = batchHandler.ProcessBatchAsync(batchRequest, CancellationToken.None).Result; var resourcesForDisposal = batchRequest.GetResourcesForDisposal(); // Assert foreach (var expectedResource in expectedResourcesForDisposal) { Assert.Contains(expectedResource, resourcesForDisposal); } }
public void ProcessBatchAsync_Throws_IfRequestIsNull() { UnbufferedODataBatchHandler batchHandler = new UnbufferedODataBatchHandler(new HttpServer()); Assert.ThrowsArgumentNull( () => batchHandler.ProcessBatchAsync(null, CancellationToken.None).Wait(), "request"); }
public void ProcessBatchAsync_CallsInvokerForEachRequest() { // Arrange MockHttpServer server = new MockHttpServer(request => { string responseContent = request.RequestUri.AbsoluteUri; if (request.Content != null) { string content = request.Content.ReadAsStringAsync().Result; if (!String.IsNullOrEmpty(content)) { responseContent += "," + content; } } return new HttpResponseMessage { Content = new StringContent(responseContent) }; }); UnbufferedODataBatchHandler batchHandler = new UnbufferedODataBatchHandler(server); HttpRequestMessage batchRequest = new HttpRequestMessage(HttpMethod.Post, "http://example.com/$batch") { Content = new MultipartContent("mixed") { ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Get, "http://example.com/")), new MultipartContent("mixed") // ChangeSet { ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Post, "http://example.com/values") { Content = new StringContent("foo") }) } } }; batchRequest.SetConfiguration(new HttpConfiguration()); // Act var response = batchHandler.ProcessBatchAsync(batchRequest, CancellationToken.None).Result; // Assert var batchContent = Assert.IsType<ODataBatchContent>(response.Content); var batchResponses = batchContent.Responses.ToArray(); Assert.Equal(2, batchResponses.Length); Assert.Equal("http://example.com/", ((OperationResponseItem)batchResponses[0]).Response.Content.ReadAsStringAsync().Result); Assert.Equal("http://example.com/values,foo", ((ChangeSetResponseItem)batchResponses[1]).Responses.First().Content.ReadAsStringAsync().Result); }
public void ProcessBatchAsync_ContinueOnError(bool enableContinueOnError) { // Arrange MockHttpServer server = new MockHttpServer(request => { string responseContent = request.RequestUri.AbsoluteUri; string content = ""; if (request.Content != null) { content = request.Content.ReadAsStringAsync().Result; if (!String.IsNullOrEmpty(content)) { responseContent += "," + content; } } HttpResponseMessage responseMessage = new HttpResponseMessage { Content = new StringContent(responseContent) }; if (content.Equals("foo")) { responseMessage.StatusCode = HttpStatusCode.BadRequest; } return responseMessage; }); UnbufferedODataBatchHandler batchHandler = new UnbufferedODataBatchHandler(server); HttpRequestMessage batchRequest = new HttpRequestMessage(HttpMethod.Post, "http://example.com/$batch") { Content = new MultipartContent("mixed") { ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Get, "http://example.com/")), new MultipartContent("mixed") // ChangeSet { ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Post, "http://example.com/values") { Content = new StringContent("foo") }) }, ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Post, "http://example.com/values") { Content = new StringContent("bar") }), } }; var enableContinueOnErrorconfig = new HttpConfiguration(); enableContinueOnErrorconfig.EnableContinueOnErrorHeader(); batchRequest.SetConfiguration(enableContinueOnErrorconfig); HttpRequestMessage batchRequestWithPrefContinueOnError = new HttpRequestMessage(HttpMethod.Post, "http://example.com/$batch") { Content = new MultipartContent("mixed") { ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Get, "http://example.com/")), new MultipartContent("mixed") // ChangeSet { ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Post, "http://example.com/values") { Content = new StringContent("foo") }) }, ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Post, "http://example.com/values") { Content = new StringContent("bar") }), } }; if (enableContinueOnError) { batchRequestWithPrefContinueOnError.SetConfiguration(enableContinueOnErrorconfig); batchRequestWithPrefContinueOnError.Headers.Add("prefer", "odata.continue-on-error"); } else { batchRequestWithPrefContinueOnError.SetConfiguration(new HttpConfiguration()); } // Act var response = batchHandler.ProcessBatchAsync(batchRequest, CancellationToken.None).Result; var batchContent = Assert.IsType<ODataBatchContent>(response.Content); var batchResponses = batchContent.Responses.ToArray(); var responseWithPrefContinueOnError = batchHandler.ProcessBatchAsync(batchRequestWithPrefContinueOnError, CancellationToken.None).Result; var batchContentWithPrefContinueOnError = Assert.IsType<ODataBatchContent>(responseWithPrefContinueOnError.Content); var batchResponsesWithPrefContinueOnError = batchContentWithPrefContinueOnError.Responses.ToArray(); // Assert Assert.Equal(2, batchResponses.Length); Assert.Equal(3, batchResponsesWithPrefContinueOnError.Length); }
public void ProcessBatchAsync_DisposesResponseInCaseOfException() { // Arrange List<MockHttpResponseMessage> responses = new List<MockHttpResponseMessage>(); MockHttpServer server = new MockHttpServer(request => { if (request.Method == HttpMethod.Put) { throw new InvalidOperationException(); } var response = new MockHttpResponseMessage(); responses.Add(response); return response; }); UnbufferedODataBatchHandler batchHandler = new UnbufferedODataBatchHandler(server); HttpRequestMessage batchRequest = new HttpRequestMessage(HttpMethod.Post, "http://example.com/$batch") { Content = new MultipartContent("mixed") { ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Get, "http://example.com/")), new MultipartContent("mixed") // ChangeSet { ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Post, "http://example.com/values")), ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Put, "http://example.com/values")) } } }; batchRequest.SetConfiguration(new HttpConfiguration()); // Act & Assert Assert.Throws<InvalidOperationException>( () => batchHandler.ProcessBatchAsync(batchRequest, CancellationToken.None).Result); Assert.Equal(2, responses.Count); foreach (var response in responses) { Assert.True(response.IsDisposed); } }