public void ExecuteChangeSetAsync_ReturnsSingleErrorResponse() { MockHttpServer server = new MockHttpServer(request => { if (request.Method == HttpMethod.Post) { return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.BadRequest))); } return(Task.FromResult(new HttpResponseMessage())); }); UnbufferedODataBatchHandler batchHandler = new UnbufferedODataBatchHandler(server); HttpRequestMessage batchRequest = new HttpRequestMessage(HttpMethod.Post, "http://example.com/$batch") { Content = new MultipartContent("mixed") { new MultipartContent("mixed") // ChangeSet { ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Put, "http://example.com/values")), ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Post, "http://example.com/values")), ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Delete, "http://example.com/values")), } } }; ODataMessageReader reader = batchRequest.Content.GetODataMessageReaderAsync(new ODataMessageReaderSettings { BaseUri = new Uri("http://example.com") }).Result; ODataBatchReader batchReader = reader.CreateODataBatchReader(); var response = batchHandler.ExecuteChangeSetAsync(batchReader, Guid.NewGuid(), batchRequest, CancellationToken.None).Result; var changesetResponse = Assert.IsType <ChangeSetResponseItem>(response); Assert.Equal(1, changesetResponse.Responses.Count()); Assert.Equal(HttpStatusCode.BadRequest, changesetResponse.Responses.First().StatusCode); }
public async Task ExecuteChangeSet_Throws_IfReaderIsNull() { UnbufferedODataBatchHandler batchHandler = new UnbufferedODataBatchHandler(new HttpServer()); await ExceptionAssert.ThrowsArgumentNullAsync( () => batchHandler.ExecuteChangeSetAsync(null, Guid.NewGuid(), new HttpRequestMessage(), CancellationToken.None), "batchReader"); }
public async Task ExecuteChangeSetAsync_CopiesPropertiesFromRequest_WithoutExcludedProperties() { // Arrange RequestDelegate handler = context => { context.Features[typeof(UnbufferedODataBatchHandlerTest)] = "bar"; return(Task.FromResult(context.Response)); }; UnbufferedODataBatchHandler batchHandler = new UnbufferedODataBatchHandler(); string batchRequest = @"--cb7bb9ee-dce2-4c94-bf11-b742b2bc6072 Content-Type: multipart/mixed; boundary=""09f27d33-41ea-4334-8ace-1738bd2793a9"" --09f27d33-41ea-4334-8ace-1738bd2793a9 Content-Type: application/http Content-Transfer-Encoding: binary Content-ID: 1328966982 POST /values HTTP/1.1 Host: example.com Content-Type: text/plain; charset=utf-8 foo --09f27d33-41ea-4334-8ace-1738bd2793a9-- --cb7bb9ee-dce2-4c94-bf11-b742b2bc6072-- "; HttpRequest request = RequestFactory.Create("Post", "http://example.com/$batch", opt => opt.AddModel(EdmCoreModel.Instance)); HttpContext httpContext = request.HttpContext; byte[] requestBytes = Encoding.UTF8.GetBytes(batchRequest); request.Body = new MemoryStream(requestBytes); request.ContentType = "multipart/mixed;boundary=\"09f27d33-41ea-4334-8ace-1738bd2793a9\""; request.ContentLength = 431; httpContext.ODataFeature().PrefixName = ""; IServiceProvider sp = request.GetSubServiceProvider(); IODataRequestMessage oDataRequestMessage = ODataMessageWrapperHelper.Create(request.Body, request.Headers, sp); ODataMessageReader oDataMessageReader = new ODataMessageReader(oDataRequestMessage, new ODataMessageReaderSettings { BaseUri = new Uri("http://example.com") }); ODataBatchReader batchReader = await oDataMessageReader.CreateODataBatchReaderAsync(); List <ODataBatchResponseItem> responses = new List <ODataBatchResponseItem>(); // Act var response = await batchHandler.ExecuteChangeSetAsync(batchReader, Guid.NewGuid(), request, handler); // Arrange ChangeSetResponseItem changeSetResponseItem = Assert.IsType <ChangeSetResponseItem>(response); HttpContext changeSetContext = Assert.Single(changeSetResponseItem.Contexts); Assert.Equal("bar", changeSetContext.Features[typeof(UnbufferedODataBatchHandlerTest)]); }
public async Task ExecuteChangeSet_Throws_IfReaderIsNull() { // Arrange UnbufferedODataBatchHandler batchHandler = new UnbufferedODataBatchHandler(); HttpContext httpContext = new DefaultHttpContext(); // Act & Assert await ExceptionAssert.ThrowsArgumentNullAsync(() => batchHandler.ExecuteChangeSetAsync(null, Guid.NewGuid(), httpContext.Request, null), "batchReader"); }
public void ExecuteChangeSet_Throws_IfRequestIsNull() { var httpContent = new StringContent(String.Empty, Encoding.UTF8, "multipart/mixed"); httpContent.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("boundary", Guid.NewGuid().ToString())); var reader = httpContent.GetODataMessageReaderAsync(new ODataMessageReaderSettings(), CancellationToken.None).Result; UnbufferedODataBatchHandler batchHandler = new UnbufferedODataBatchHandler(new HttpServer()); Assert.ThrowsArgumentNull( () => batchHandler.ExecuteChangeSetAsync(reader.CreateODataBatchReader(), Guid.NewGuid(), null, CancellationToken.None).Wait(), "originalRequest"); }
public void ExecuteChangeSetAsync_CopiesPropertiesFromRequest_WithoutExcludedProperties() { MockHttpServer server = new MockHttpServer(request => { return(new HttpResponseMessage { RequestMessage = request }); }); UnbufferedODataBatchHandler batchHandler = new UnbufferedODataBatchHandler(server); HttpRequestMessage batchRequest = new HttpRequestMessage(HttpMethod.Post, "http://example.com/$batch") { Content = new MultipartContent("mixed") { new MultipartContent("mixed") // ChangeSet { ODataBatchRequestHelper.CreateODataRequestContent(new HttpRequestMessage(HttpMethod.Post, "http://example.com/values") { Content = new StringContent("foo") }) } } }; batchRequest.Properties.Add("foo", "bar"); batchRequest.SetRouteData(new HttpRouteData(new HttpRoute())); batchRequest.RegisterForDispose(new StringContent(String.Empty)); ODataMessageReader reader = batchRequest.Content .GetODataMessageReaderAsync(new ODataMessageReaderSettings { BaseUri = new Uri("http://example.com") }, CancellationToken.None) .Result; ODataBatchReader batchReader = reader.CreateODataBatchReader(); List <ODataBatchResponseItem> responses = new List <ODataBatchResponseItem>(); Guid batchId = Guid.NewGuid(); batchReader.Read(); var response = batchHandler.ExecuteChangeSetAsync(batchReader, Guid.NewGuid(), batchRequest, CancellationToken.None).Result; var changeSetResponses = ((ChangeSetResponseItem)response).Responses; foreach (var changeSetResponse in changeSetResponses) { var changeSetRequest = changeSetResponse.RequestMessage; Assert.Equal("bar", changeSetRequest.Properties["foo"]); Assert.Null(changeSetRequest.GetRouteData()); Assert.Same(changeSetRequest, changeSetRequest.GetUrlHelper().Request); Assert.Empty(changeSetRequest.GetResourcesForDisposal()); } }
public async Task ExecuteChangeSet_Throws_IfRequestIsNull() { // Arrange ODataMessageInfo messageInfo = new ODataMessageInfo(); ODataMessageReaderSettings settings = new ODataMessageReaderSettings(); Mock <ODataInputContext> inputContext = new Mock <ODataInputContext>(ODataFormat.Batch, messageInfo, settings); Mock <ODataBatchReader> batchReader = new Mock <ODataBatchReader>(inputContext.Object, false); UnbufferedODataBatchHandler batchHandler = new UnbufferedODataBatchHandler(); // Act & Assert await ExceptionAssert.ThrowsArgumentNullAsync( () => batchHandler.ExecuteChangeSetAsync(batchReader.Object, Guid.NewGuid(), null, null), "originalRequest"); }
public async Task ExecuteChangeSetAsync_ReturnsSingleErrorResponse() { // Arrange RequestDelegate handler = context => { if (context.Request.Method.ToUpperInvariant() == "POST") { context.Response.StatusCode = StatusCodes.Status400BadRequest; return(Task.FromResult(context.Response)); } return(Task.FromResult(context.Response)); }; UnbufferedODataBatchHandler batchHandler = new UnbufferedODataBatchHandler(); string batchRequest = @"--86aef3eb-4af6-4750-a66d-df65e3f31ab0 Content-Type: multipart/mixed; boundary=""7a61b8c1-a80e-4e6b-bac7-2f65564e3fd6"" --7a61b8c1-a80e-4e6b-bac7-2f65564e3fd6 Content-Type: application/http Content-Transfer-Encoding: binary Content-ID: -1233709575 PUT /values HTTP/1.1 Host: example.com --7a61b8c1-a80e-4e6b-bac7-2f65564e3fd6 Content-Type: application/http Content-Transfer-Encoding: binary Content-ID: -1854117385 POST /values HTTP/1.1 Host: example.com --7a61b8c1-a80e-4e6b-bac7-2f65564e3fd6 Content-Type: application/http Content-Transfer-Encoding: binary Content-ID: -1665098746 DELETE /values HTTP/1.1 Host: example.com --7a61b8c1-a80e-4e6b-bac7-2f65564e3fd6-- --86aef3eb-4af6-4750-a66d-df65e3f31ab0--"; IEdmModel model = new EdmModel(); HttpRequest request = RequestFactory.Create("Post", "http://example.com/$batch", opt => opt.AddModel(model)); HttpContext httpContext = request.HttpContext; byte[] requestBytes = Encoding.UTF8.GetBytes(batchRequest); httpContext.Request.Body = new MemoryStream(requestBytes); httpContext.Request.ContentType = "multipart/mixed;boundary=\"86aef3eb-4af6-4750-a66d-df65e3f31ab0\""; httpContext.Request.ContentLength = 431; httpContext.ODataFeature().PrefixName = ""; IServiceProvider sp = request.GetSubServiceProvider(); IODataRequestMessage oDataRequestMessage = ODataMessageWrapperHelper.Create(httpContext.Request.Body, request.Headers, sp); ODataMessageReader oDataMessageReader = new ODataMessageReader(oDataRequestMessage, new ODataMessageReaderSettings { BaseUri = new Uri("http://example.com") }); ODataBatchReader batchReader = await oDataMessageReader.CreateODataBatchReaderAsync(); // Act var response = await batchHandler.ExecuteChangeSetAsync(batchReader, Guid.NewGuid(), httpContext.Request, handler); // Assert var changesetResponse = Assert.IsType <ChangeSetResponseItem>(response); var returnContext = Assert.Single(changesetResponse.Contexts); Assert.Equal(StatusCodes.Status400BadRequest, returnContext.Response.StatusCode); }