public async Task Command_properties_can_be_validated() { var order = new Order( Guid.NewGuid(), new Order.Fulfilled()); await order.SaveToEventStore(); Console.WriteLine(order.Id); var httpClient = new TestApi<Order>().GetClient(); var result = httpClient.PostAsync( string.Format("http://contoso.com/orders/{0}/additem/validate", order.Id), new JsonContent(new AddItem { Price = 1m, Quantity = 1, ProductName = "Widget" })).Result; result.ShouldSucceed(); var content = result.Content.ReadAsStringAsync().Result; Console.WriteLine(content); content.Should().Contain("\"Failures\":[{\"Message\":\"The order has already been fulfilled.\""); }
public async Task Posting_an_invalid_command_does_not_affect_the_aggregate_state() { var order = new Order(Guid.NewGuid(), new Order.CustomerInfoChanged { CustomerName = "Joe" }, new Order.Fulfilled()); await order.SaveToEventStore(); var json = new AddItem { Quantity = 5, Price = 19.99m, ProductName = "Bag o' Treats" }.ToJson(); var request = new HttpRequestMessage(HttpMethod.Post, string.Format("http://contoso.com/orders/{0}/additem", order.Id)) { Content = new StringContent(json, Encoding.UTF8, "application/json") }; var testApi = new TestApi<Order>(); var client = testApi.GetClient(); var response = client.SendAsync(request).Result; response.StatusCode.Should().Be(HttpStatusCode.BadRequest); var updatedOrder = await new SqlEventSourcedRepository<Order>().GetLatest(order.Id); updatedOrder.Items.Count().Should().Be(0); }
public async Task An_ETag_header_is_applied_to_the_command() { var order = new Order(Guid.NewGuid(), new Order.CustomerInfoChanged { CustomerName = "Joe" }); await order.SaveToEventStore(); var json = new AddItem { Quantity = 5, Price = 19.99m, ProductName = "Bag o' Treats" }.ToJson(); var etag = new EntityTagHeaderValue("\"" + Any.Guid() + "\""); Func<HttpRequestMessage> createRequest = () => { var request = new HttpRequestMessage(HttpMethod.Post, string.Format("http://contoso.com/orders/{0}/additem", order.Id)) { Content = new StringContent(json, Encoding.UTF8, "application/json"), }; request.Headers.IfNoneMatch.Add(etag); return request; }; var testApi = new TestApi<Order>(); var client = testApi.GetClient(); // act: send the request twice var response1 = await client.SendAsync(createRequest()); var response2 = await client.SendAsync(createRequest()); // assert response1.ShouldSucceed(HttpStatusCode.OK); response2.ShouldFailWith(HttpStatusCode.NotModified); var updatedOrder = await new SqlEventSourcedRepository<Order>().GetLatest(order.Id); updatedOrder.Items.Single().Quantity.Should().Be(5); }
public async Task Posting_unauthorized_command_JSON_returns_403_Forbidden() { var order = new Order(Guid.NewGuid(), new Order.CustomerInfoChanged { CustomerName = "Joe" }, new Order.Fulfilled()); await order.SaveToEventStore(); Command<Order>.AuthorizeDefault = (o, command) => false; var request = new HttpRequestMessage(HttpMethod.Post, string.Format("http://contoso.com/orders/{0}/cancel", order.Id)) { Content = new StringContent(new Cancel().ToJson(), Encoding.UTF8, "application/json") }; var client = new TestApi<Order>().GetClient(); var response = await client.SendAsync(request); response.StatusCode.Should().Be(HttpStatusCode.Forbidden); }