public async Task When_Updating_Customer_And_Correct_Etag_Is_Passed_Then_NewEtag_Is_Returned()
        {
            // ARRANGE
            var customer = new Customer
            {
                FirstName = "loki"
            };
            var server = CreateServer();
            var client = server.CreateClient();
            var insertRequestMessage = new HttpRequestMessage
            {
                Method = HttpMethod.Post,
                RequestUri = new Uri("http://localhost/customers"),
                Content = new StringContent(JsonConvert.SerializeObject(customer), Encoding.UTF8, "application/json")
            };
            var response = await client.SendAsync(insertRequestMessage);
            var newCustomer = JsonConvert.DeserializeObject<Customer>(await response.Content.ReadAsStringAsync());
            var etag = response.Headers.GetEtag();
            var updateRequestMessage = new HttpRequestMessage
            {
                Method = HttpMethod.Put,
                RequestUri = new Uri("http://localhost/customers"),
                Content = new StringContent(JsonConvert.SerializeObject(newCustomer), Encoding.UTF8, "application/json")
            };
            updateRequestMessage.Headers.IfMatch.Add(new EntityTagHeaderValue(etag));

            // ARRANGE
            var updateResponse = await client.SendAsync(updateRequestMessage);

            // ASSERTS
            Assert.NotEmpty(updateResponse.Headers.GetEtag());
            Assert.True(updateResponse.Headers.GetEtag() != etag);
        }
        public async Task When_Customer_Is_Created_Then_Etag_Is_Returned()
        {
            // ARRANGE
            var customer = new Customer
            {
                FirstName = "loki"
            };
            var server = CreateServer();
            var client = server.CreateClient();
            var requestMessage = new HttpRequestMessage
            {
                Method = HttpMethod.Post,
                RequestUri = new Uri("http://localhost/customers"),
                Content = new StringContent(JsonConvert.SerializeObject(customer), Encoding.UTF8, "application/json")
            };

            // ACT
            var response = await client.SendAsync(requestMessage);

            // ASSERT
            Assert.NotEmpty(response.Headers.GetEtag());
        }
        public async Task When_Getting_Customer_For_An_Existing_Representation_Then_304_Is_Returned()
        {
            // ARRANGE
            var customer = new Customer
            {
                FirstName = "loki"
            };
            var server = CreateServer();
            var client = server.CreateClient();
            var insertRequestMessage = new HttpRequestMessage
            {
                Method = HttpMethod.Post,
                RequestUri = new Uri("http://localhost/customers"),
                Content = new StringContent(JsonConvert.SerializeObject(customer), Encoding.UTF8, "application/json")
            };
            var response = await client.SendAsync(insertRequestMessage);
            var newCustomer = JsonConvert.DeserializeObject<Customer>(await response.Content.ReadAsStringAsync());
            var etag = response.Headers.GetEtag();
            var getRequestMessage = new HttpRequestMessage
            {
                Method = HttpMethod.Get,
                RequestUri = new Uri($"http://localhost/customers/{newCustomer.CustomerId}")
            };
            getRequestMessage.Headers.IfNoneMatch.Add(new EntityTagHeaderValue(etag));

            // ARRANGE
            var updateResponse = await client.SendAsync(getRequestMessage);

            // ASSERTS
            Assert.True(updateResponse.StatusCode == HttpStatusCode.NotModified);
        }
        public async Task When_Getting_Customer_Add_Passing_Old_ModifiedSinceDateTime_Then_New_Representation_Is_Returned()
        {
            // ARRANGE
            var customer = new Customer
            {
                FirstName = "loki"
            };
            var server = CreateServer();
            var client = server.CreateClient();
            var insertRequestMessage = new HttpRequestMessage
            {
                Method = HttpMethod.Post,
                RequestUri = new Uri("http://localhost/customers"),
                Content = new StringContent(JsonConvert.SerializeObject(customer), Encoding.UTF8, "application/json")
            };
            var response = await client.SendAsync(insertRequestMessage);
            var newCustomer = JsonConvert.DeserializeObject<Customer>(await response.Content.ReadAsStringAsync());
            var etag = response.Headers.GetEtag();
            var getRequestMessage = new HttpRequestMessage
            {
                Method = HttpMethod.Get,
                RequestUri = new Uri($"http://localhost/customers/{newCustomer.CustomerId}")
            };
            getRequestMessage.Headers.IfNoneMatch.Add(EntityTagHeaderValue.Any);
            getRequestMessage.Headers.IfModifiedSince = DateTime.UtcNow.AddDays(-2).ToUniversalTime();

            // ARRANGE
            var getResponse = await client.SendAsync(getRequestMessage);

            // ASSERTS
            Assert.NotEmpty(getResponse.Headers.GetEtag());
        }
        public async Task When_Updating_Customer_And_Passed_Too_Old_UnModifiedDate_Is_Passed_Then_Error_412_Is_Returned()
        {
            // ARRANGE
            var customer = new Customer
            {
                FirstName = "loki"
            };
            var server = CreateServer();
            var client = server.CreateClient();
            var insertRequestMessage = new HttpRequestMessage
            {
                Method = HttpMethod.Post,
                RequestUri = new Uri("http://localhost/customers"),
                Content = new StringContent(JsonConvert.SerializeObject(customer), Encoding.UTF8, "application/json")
            };
            var response = await client.SendAsync(insertRequestMessage);
            var newCustomer = JsonConvert.DeserializeObject<Customer>(await response.Content.ReadAsStringAsync());
            var etag = response.Headers.GetEtag();
            var updateRequestMessage = new HttpRequestMessage
            {
                Method = HttpMethod.Put,
                RequestUri = new Uri("http://localhost/customers"),
                Content = new StringContent(JsonConvert.SerializeObject(newCustomer), Encoding.UTF8, "application/json")
            };
            updateRequestMessage.Headers.IfMatch.Add(EntityTagHeaderValue.Any);
            updateRequestMessage.Headers.IfUnmodifiedSince = DateTime.UtcNow.AddDays(-2).ToUniversalTime();

            // ARRANGE
            var updateResponse = await client.SendAsync(updateRequestMessage);

            // ASSERTS
            Assert.True(updateResponse.StatusCode == HttpStatusCode.PreconditionFailed);
        }