コード例 #1
0
        public async Task SendRequestAsync_ReturnsSingleErrorResponse()
        {
            // Arrange
            HttpContext[] contexts = new HttpContext[]
            {
                HttpContextHelper.Create("Get", "http://example.com"),
                HttpContextHelper.Create("Post", "http://example.com"),
                HttpContextHelper.Create("Put", "http://example.com")
            };
            ChangeSetRequestItem requestItem = new ChangeSetRequestItem(contexts);

            RequestDelegate handler = context =>
            {
                if (context.Request.Method == "Post")
                {
                    context.Response.StatusCode = StatusCodes.Status400BadRequest;
                }

                return(Task.FromResult(context.Response));
            };

            // Act
            ODataBatchResponseItem response = await requestItem.SendRequestAsync(handler);

            // Assert
            ChangeSetResponseItem changesetResponse = Assert.IsType <ChangeSetResponseItem>(response);
            HttpContext           responseContext   = Assert.Single(changesetResponse.Contexts);

            Assert.Equal(StatusCodes.Status400BadRequest, responseContext.Response.StatusCode);
        }
コード例 #2
0
        public void SendRequestAsync_ReturnsSingleErrorResponse()
        {
            HttpRequestMessage[] requests = new HttpRequestMessage[]
            {
                new HttpRequestMessage(HttpMethod.Get, "http://example.com"),
                new HttpRequestMessage(HttpMethod.Post, "http://example.com"),
                new HttpRequestMessage(HttpMethod.Put, "http://example.com")
            };
            ChangeSetRequestItem requestItem = new ChangeSetRequestItem(requests);

            Mock <HttpMessageInvoker> invoker = new Mock <HttpMessageInvoker>(new HttpServer());

            invoker.Setup(i => i.SendAsync(It.IsAny <HttpRequestMessage>(), CancellationToken.None))
            .Returns <HttpRequestMessage, CancellationToken>((req, c) =>
            {
                if (req.Method == HttpMethod.Post)
                {
                    return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.BadRequest)));
                }
                return(Task.FromResult(new HttpResponseMessage()));
            });

            var response = requestItem.SendRequestAsync(invoker.Object, CancellationToken.None).Result;

            var changesetResponse = Assert.IsType <ChangeSetResponseItem>(response);

            Assert.Equal(1, changesetResponse.Responses.Count());
            Assert.Equal(HttpStatusCode.BadRequest, changesetResponse.Responses.First().StatusCode);
        }
コード例 #3
0
        public async Task SendRequestAsync_DisposesResponseInCaseOfException()
        {
            // Arrange
            HttpContext[] contexts = new HttpContext[]
            {
                HttpContextHelper.Create("Get", "http://example.com"),
                HttpContextHelper.Create("Post", "http://example.com"),
                HttpContextHelper.Create("Put", "http://example.com")
            };
            ChangeSetRequestItem requestItem = new ChangeSetRequestItem(contexts);

            List <HttpResponse> responses = new List <HttpResponse>();
            RequestDelegate     handler   = context =>
            {
                if (context.Request.Method == "Put")
                {
                    throw new InvalidOperationException();
                }

                responses.Add(context.Response);
                return(Task.FromResult(context.Response));
            };

            // Act
            ODataBatchResponseItem response = await requestItem.SendRequestAsync(handler);

            // Assert
            ChangeSetResponseItem changesetResponse = Assert.IsType <ChangeSetResponseItem>(response);
            HttpContext           responseContext   = Assert.Single(changesetResponse.Contexts);

            Assert.Equal(StatusCodes.Status500InternalServerError, responseContext.Response.StatusCode);

            Assert.Equal(2, responses.Count);
        }
コード例 #4
0
        public void SendRequestAsync_DisposesResponseInCaseOfException()
        {
            List <MockHttpResponseMessage> responses   = new List <MockHttpResponseMessage>();
            ChangeSetRequestItem           requestItem = new ChangeSetRequestItem(new HttpRequestMessage[]
            {
                new HttpRequestMessage(HttpMethod.Get, "http://example.com"),
                new HttpRequestMessage(HttpMethod.Post, "http://example.com"),
                new HttpRequestMessage(HttpMethod.Put, "http://example.com")
            });
            Mock <HttpMessageInvoker> invoker = new Mock <HttpMessageInvoker>(new HttpServer());

            invoker.Setup(i => i.SendAsync(It.IsAny <HttpRequestMessage>(), CancellationToken.None))
            .Returns <HttpRequestMessage, CancellationToken>((req, cancel) =>
            {
                if (req.Method == HttpMethod.Put)
                {
                    throw new InvalidOperationException();
                }
                var response = new MockHttpResponseMessage();
                responses.Add(response);
                return(Task.FromResult <HttpResponseMessage>(response));
            });

            Assert.Throws <InvalidOperationException>(
                () => requestItem.SendRequestAsync(invoker.Object, CancellationToken.None).Result);

            Assert.Equal(2, responses.Count);
            foreach (var response in responses)
            {
                Assert.True(response.IsDisposed);
            }
        }
        private async Task ExecuteChangeSet(ChangeSetRequestItem changeSet, IList <ODataBatchResponseItem> responses, CancellationToken cancellation)
        {
            ChangeSetResponseItem changeSetResponse;

            using (var context = new SqliteContext())
            {
                foreach (HttpRequestMessage request in changeSet.Requests)
                {
                    request.SetContext(context);
                }

                using (DbContextTransaction transaction = context.Database.BeginTransaction())
                {
                    changeSetResponse = (ChangeSetResponseItem)await changeSet.SendRequestAsync(Invoker, cancellation);

                    responses.Add(changeSetResponse);

                    if (changeSetResponse.Responses.All(r => r.IsSuccessStatusCode))
                    {
                        transaction.Commit();
                    }
                    else
                    {
                        transaction.Rollback();
                    }
                }
            }
        }
コード例 #6
0
        private async Task ExecuteChangeSet(
            ChangeSetRequestItem changeSet,
            IList <ODataBatchResponseItem> responses,
            CancellationToken cancellation)
        {
            ChangeSetResponseItem changeSetResponse;

            // Create a new ShoppingContext instance, associate it with each of the requests, start a new
            // transaction, execute the changeset and then commit or rollback the transaction depending on
            // whether the responses were all successful or not.
            using (ShoppingContext context = new ShoppingContext())
            {
                foreach (HttpRequestMessage request in changeSet.Requests)
                {
                    request.SetContext(context);
                }

                using (DbContextTransaction transaction = context.Database.BeginTransaction())
                {
                    changeSetResponse = (ChangeSetResponseItem)await changeSet.SendRequestAsync(Invoker, cancellation);

                    responses.Add(changeSetResponse);

                    if (changeSetResponse.Responses.All(r => r.IsSuccessStatusCode))
                    {
                        transaction.Commit();
                    }
                    else
                    {
                        transaction.Rollback();
                    }
                }
            }
        }
コード例 #7
0
        public void SendRequestAsync_NullInvoker_Throws()
        {
            ChangeSetRequestItem requestItem = new ChangeSetRequestItem(new HttpRequestMessage[0]);

            Assert.ThrowsArgumentNull(
                () => requestItem.SendRequestAsync(null, CancellationToken.None).Wait(),
                "invoker");
        }
コード例 #8
0
        public async Task SendRequestAsync_NullInvoker_Throws()
        {
            ChangeSetRequestItem requestItem = new ChangeSetRequestItem(new HttpRequestMessage[0]);

            await ExceptionAssert.ThrowsArgumentNullAsync(
                () => requestItem.SendRequestAsync(null, CancellationToken.None),
                "invoker");
        }
コード例 #9
0
        public async Task SendRequestAsync_NullHandler_Throws()
        {
            // Arrange
            HttpContext[]        contexts    = Array.Empty <HttpContext>();
            ChangeSetRequestItem requestItem = new ChangeSetRequestItem(contexts);

            // Act & Assert
            await ExceptionAssert.ThrowsArgumentNullAsync(() => requestItem.SendRequestAsync(null), "handler");
        }
コード例 #10
0
        public override async Task <ODataBatchResponseItem> SendRequestAsync(RequestDelegate handler)
        {
            using (var transaction = await _dbContext.Database.BeginTransactionAsync()) {
                var response = await _changeSetRequestItem.SendRequestAsync(handler) as ChangeSetResponseItem;

                if (response.Contexts.All(c => c.Response.IsSuccessStatusCode()))
                {
                    transaction.Commit();
                }
                else
                {
                    transaction.Rollback();
                }
                return(response);
            }
        }
コード例 #11
0
        public async Task SendRequestAsync_ReturnsChangeSetResponse()
        {
            // Arrange
            HttpContext[] contexts = new HttpContext[]
            {
                HttpContextHelper.Create("Get", "http://example.com"),
                HttpContextHelper.Create("Post", "http://example.com")
            };
            ChangeSetRequestItem requestItem = new ChangeSetRequestItem(contexts);

            RequestDelegate handler = context => Task.FromResult(context.Response);

            // Act
            ODataBatchResponseItem response = await requestItem.SendRequestAsync(handler);

            // Assert
            ChangeSetResponseItem changesetResponse = Assert.IsType <ChangeSetResponseItem>(response);

            Assert.Equal(2, changesetResponse.Contexts.Count());
        }
コード例 #12
0
        public void SendRequestAsync_ReturnsChangeSetResponse()
        {
            HttpRequestMessage[] requests = new HttpRequestMessage[]
            {
                new HttpRequestMessage(HttpMethod.Get, "http://example.com"),
                new HttpRequestMessage(HttpMethod.Post, "http://example.com")
            };
            ChangeSetRequestItem requestItem = new ChangeSetRequestItem(requests);

            Mock <HttpMessageInvoker> invoker = new Mock <HttpMessageInvoker>(new HttpServer());

            invoker.Setup(i => i.SendAsync(It.IsAny <HttpRequestMessage>(), CancellationToken.None))
            .Returns(() =>
            {
                return(Task.FromResult(new HttpResponseMessage()));
            });

            var response = requestItem.SendRequestAsync(invoker.Object, CancellationToken.None).Result;

            var changesetResponse = Assert.IsType <ChangeSetResponseItem>(response);

            Assert.Equal(2, changesetResponse.Responses.Count());
        }