public async Task Post_ReturnCryptoCurrencyRates()
        {
            var initResponse = await _client.GetAsync("/");

            var antiForgeryValues = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(initResponse);

            var postRequest = new HttpRequestMessage(HttpMethod.Post, "/");

            postRequest.Headers.Add("Cookie", new CookieHeaderValue(AntiForgeryTokenExtractor.AntiForgeryCookieName, antiForgeryValues.cookieValue).ToString());

            var formModel = new Dictionary <string, string>
            {
                {
                    AntiForgeryTokenExtractor.AntiForgeryFieldName,
                    antiForgeryValues.fieldValue
                },
                { "SelectedCryptoCurrency", "BTC" }
            };

            postRequest.Content = new FormUrlEncodedContent(formModel);
            var response = await _client.SendAsync(postRequest);

            response.EnsureSuccessStatusCode();
            var content = await HtmlHelpers.GetDocumentAsync(response);

            var rateCards = content.QuerySelectorAll("div.card");

            Assert.True(rateCards.Any());
        }
        public async Task Create_When_POST_Executed_Returns_To_Index_View_With_Create_Person()
        {
            var initResponse = await _client.GetAsync("/Persons/Create");

            var(fieldValue, cookieValue) = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(initResponse);

            var postRequest = new HttpRequestMessage(HttpMethod.Post, "/Persons/Create");

            postRequest.Headers.Add("Cookie", new CookieHeaderValue(AntiForgeryTokenExtractor.AntiForgeryCookieName, cookieValue).ToString());

            var formModel = new Dictionary <string, string>
            {
                { AntiForgeryTokenExtractor.AntiForgeryFieldName, fieldValue },
                { "Name", "New Person" },
                { "GroupId", "1" }
            };

            postRequest.Content = new FormUrlEncodedContent(formModel);

            var response = await _client.SendAsync(postRequest);

            response.EnsureSuccessStatusCode();

            var responseString = await response.Content.ReadAsStringAsync();

            Assert.Contains("New Person", responseString);
            Assert.Contains("GroupB", responseString);
        }
        public async Task Post_DeleteConfirmed_Returns_Redirect_To_Root()
        {
            // Arrange
            var initResponse = await _client.GetAsync("/Event/Delete/1");

            var(fieldValue, cookieValue) = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(initResponse);

            var postRequest = new HttpRequestMessage(HttpMethod.Post, "/Event/DeleteConfirmed/1");

            postRequest.Headers.Add("Cookie", new CookieHeaderValue(AntiForgeryTokenExtractor.AntiForgeryCookieName, cookieValue).ToString());
            var formModel = new Dictionary <string, string>
            {
                [AntiForgeryTokenExtractor.AntiForgeryFieldName] = fieldValue,
                ["Id"] = "1"
            };

            //Act
            postRequest.Content = new FormUrlEncodedContent(formModel);
            var response = await _client.SendAsync(postRequest);

            // Assert
            Assert.Equal(HttpStatusCode.OK, initResponse.StatusCode);
            Assert.Equal(HttpStatusCode.Redirect, response.StatusCode);
            Assert.Equal("/Event", response.Headers.Location.OriginalString);
        }
示例#4
0
        public async Task Should_Update_Movie_On_Edit()
        {
            // Arrange
            var terminatorMovie = new Movie()
            {
                Id = 1, Title = "Terminator 2", Genre = "Action"
            };
            var client = factory
                         .WithMoviesInDatabase(new List <Movie>()
            {
                terminatorMovie
            })
                         .CreateClient();

            terminatorMovie.Title = "Terminator 2: Judgment Day";
            var expected = System.Net.HttpStatusCode.OK;
            var response = await client.GetAsync($"movies/edit/{terminatorMovie.Id}");

            response.EnsureSuccessStatusCode();
            var(fieldValue, cookieValue) = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

            var postRequest = new HttpRequestMessage(HttpMethod.Post, $"movies/edit/{terminatorMovie.Id}");

            postRequest.Headers.Add("Cookie",
                                    new CookieHeaderValue(AntiForgeryTokenExtractor.AntiForgeryCookieName,
                                                          cookieValue).ToString());

            var formModel = new Dictionary <string, string>
            {
                { AntiForgeryTokenExtractor.AntiForgeryFieldName, fieldValue },
                { nameof(terminatorMovie.Title), terminatorMovie.Title },
                { nameof(terminatorMovie.Genre), terminatorMovie.Genre },
                { nameof(terminatorMovie.Price), terminatorMovie.Price.ToString() },
                { nameof(terminatorMovie.ReleaseDate), terminatorMovie.ReleaseDate.ToString() },
            };

            postRequest.Content = new FormUrlEncodedContent(formModel);


            // Act
            response = await client.SendAsync(postRequest);

            response.EnsureSuccessStatusCode();
            string content = await response.Content.ReadAsStringAsync();

            // Assert
            Assert.NotNull(response);
            Assert.Equal(response.StatusCode, expected);
            Assert.Contains(terminatorMovie.Title, content);
        }
        public async Task Post_Edit_Invalid_Returns_Edit()
        {
            var initResponse = await _client.GetAsync("/Event/Edit/1");

            var(fieldValue, cookieValue) = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(initResponse);

            var postRequest = new HttpRequestMessage(HttpMethod.Post, "/Event/Edit/1");

            postRequest.Headers.Add("Cookie", new CookieHeaderValue(AntiForgeryTokenExtractor.AntiForgeryCookieName, cookieValue).ToString());

            var formModel = new Dictionary <string, string>
            {
                [AntiForgeryTokenExtractor.AntiForgeryFieldName] = fieldValue,
                ["Id"]                          = "1",
                ["Title"]                       = "", // empty string title should cause invalid
                ["Description"]                 = "This is a test event description",
                ["StartDate"]                   = "07/01/3000 1:07 PM",
                ["EndDate"]                     = "07/02/3000 11:07 PM",
                ["EventTypeId"]                 = "1",
                ["EventSeriesId"]               = null,
                ["FundCenter"]                  = null,
                ["RegistrationOpenDate"]        = "06/21/3000 1:07 PM",
                ["RegistrationClosedDate"]      = "06/30/3000 1:07 PM",
                ["MinRegistrationCount"]        = "1",
                ["MaxRegistrationCount"]        = "10",
                ["MaxStandbyRegistrationCount"] = null,
                ["AddressLine1"]                = "123 Anywhere St.",
                ["AddressLine2"]                = null,
                ["City"]                        = "Yourtown",
                ["State"]                       = "MD",
                ["Zip"]                         = "12345",
                ["AllowStandby"]                = "false"
            };

            postRequest.Content = new FormUrlEncodedContent(formModel);

            var response = await _client.SendAsync(postRequest);


            var responseString = await response.Content.ReadAsStringAsync();

            // Assert
            Assert.Equal(HttpStatusCode.OK, initResponse.StatusCode);
            Assert.Contains("Edit Event: Error", responseString);
        }
        public async Task Post_Create_Returns_Redirect_To_Root()
        {
            // Arrange
            var initResponse = await _client.GetAsync("/Event/Create");

            var(fieldValue, cookieValue) = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(initResponse);

            var postRequest = new HttpRequestMessage(HttpMethod.Post, "/Event/Create");

            postRequest.Headers.Add("Cookie", new CookieHeaderValue(AntiForgeryTokenExtractor.AntiForgeryCookieName, cookieValue).ToString());

            var formModel = new Dictionary <string, string>
            {
                [AntiForgeryTokenExtractor.AntiForgeryFieldName] = fieldValue,
                ["Title"]                       = "Test Created Event",
                ["Description"]                 = "This is a test event description",
                ["StartDate"]                   = "07/01/3000 1:07 PM",
                ["EndDate"]                     = "07/02/3000 11:07 PM",
                ["EventTypeId"]                 = "1",
                ["EventSeriesId"]               = null,
                ["FundCenter"]                  = null,
                ["RegistrationOpenDate"]        = "06/21/3000 1:07 PM",
                ["RegistrationClosedDate"]      = "06/30/3000 1:07 PM",
                ["MinRegistrationCount"]        = "1",
                ["MaxRegistrationCount"]        = "10",
                ["MaxStandbyRegistrationCount"] = null,
                ["AddressLine1"]                = "123 Anywhere St.",
                ["AddressLine2"]                = null,
                ["City"]         = "Yourtown",
                ["State"]        = "MD",
                ["Zip"]          = "12345",
                ["AllowStandby"] = "false"
            };

            //Act
            postRequest.Content = new FormUrlEncodedContent(formModel);

            var response = await _client.SendAsync(postRequest);

            // Assert
            Assert.Equal(HttpStatusCode.OK, initResponse.StatusCode);
            Assert.Equal(HttpStatusCode.Redirect, response.StatusCode);
            Assert.Equal("/Event", response.Headers.Location.OriginalString);
        }
示例#7
0
        public async Task Should_Create_Movie_On_Create_Page()
        {
            // Arrange
            var gremlinsMovie = new Movie()
            {
                Id = GREMLINS_MOVIE_ID, Title = "Gremlins", Genre = "Action"
            };

            var expected = System.Net.HttpStatusCode.OK;
            var response = await client.GetAsync("movies/create");

            response.EnsureSuccessStatusCode();
            var(fieldValue, cookieValue) = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

            var postRequest = new HttpRequestMessage(HttpMethod.Post, "movies/create");

            postRequest.Headers.Add("Cookie",
                                    new CookieHeaderValue(AntiForgeryTokenExtractor.AntiForgeryCookieName,
                                                          cookieValue).ToString());

            var formModel = new Dictionary <string, string>
            {
                { AntiForgeryTokenExtractor.AntiForgeryFieldName, fieldValue },
                { nameof(gremlinsMovie.Title), gremlinsMovie.Title },
                { nameof(gremlinsMovie.Genre), gremlinsMovie.Genre },
                { nameof(gremlinsMovie.Price), gremlinsMovie.Price.ToString() },
                { nameof(gremlinsMovie.ReleaseDate), gremlinsMovie.ReleaseDate.ToString() },
            };

            postRequest.Content = new FormUrlEncodedContent(formModel);


            // Act
            response = await client.SendAsync(postRequest);

            response.EnsureSuccessStatusCode();
            string content = await response.Content.ReadAsStringAsync();

            // Assert
            Assert.NotNull(response);
            Assert.Equal(response.StatusCode, expected);
            Assert.Contains(gremlinsMovie.Title, content);
        }
        public async Task Get_Filter_By_Family_And_SubFamily_Return_All_Ok()
        {
            using (TestServer sharethingsServer = new ShareThingsScenarioBase().CreateServer())
            {
                HttpClient productClient = shareThingsScenarioBase.CreateHttpClientLender(sharethingsServer);
                HttpClient homeClient    = shareThingsScenarioBase.CreateHttpClientLender(sharethingsServer);

                string type    = "TestType";
                string subtype = "TestSubtype";
                int    productId;

                #region Create product
                HttpResponseMessage response = await productClient.GetAsync(ShareThingsScenarioBase.Product.Get.CreateProduct);

                var antiForgeryValues = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

                HttpRequestMessage postRequest = new HttpRequestMessageBuilder(
                    HttpMethod.Post, ShareThingsScenarioBase.Product.Post.CreateProduct, antiForgeryValues)
                                                 .Set("Name", "TestName")
                                                 .Set("Description", "TestDescriptionCreated")
                                                 .Set("Type", type)
                                                 .Set("Subtype", subtype)
                                                 .Set("Start", DateTime.Now.AddDays(-6).ToString("yyyy-MM-dd HH:mm:ss"))
                                                 .Set("End", DateTime.Now.AddDays(26).ToString("yyyy-MM-dd HH:mm:ss"))
                                                 .Build();

                response = await productClient.SendAsync(postRequest);

                Assert.Equal(HttpStatusCode.Found, response.StatusCode);
                Assert.EndsWith(ShareThingsScenarioBase.Product.Get.GetProducts, response.Headers.Location.OriginalString);

                // Get Id product
                response = await productClient.GetAsync(ShareThingsScenarioBase.Product.Get.GetProducts);

                string responseString = await response.Content.ReadAsStringAsync();

                string key   = "/Products/Edit/";
                int    index = responseString.IndexOf(key);
                productId = Convert.ToInt32(responseString.Substring(index + key.Length, 1));
                #endregion

                #region Home
                response = await homeClient.GetAsync(ShareThingsScenarioBase.Home.Get.GetHome);

                antiForgeryValues = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

                response.EnsureSuccessStatusCode();
                responseString = await response.Content.ReadAsStringAsync();

                key = string.Format("/Products/Details/{0}", productId);
                Assert.Contains(key, responseString);

                postRequest = new HttpRequestMessageBuilder(
                    HttpMethod.Get, ShareThingsScenarioBase.Home.Get.GetHome, antiForgeryValues)
                              .Set("Family", type)
                              .Set("SubFamily", subtype)
                              .Build();

                response = await homeClient.SendAsync(postRequest);

                Assert.Equal(HttpStatusCode.OK, response.StatusCode);
                #endregion
            }
        }
示例#9
0
        public async Task Post_Create_Update_ChangeStatus_Delete_Product_Return_All_Ok()
        {
            using (TestServer sharethingsServer = new ShareThingsScenarioBase().CreateServer())
            {
                HttpClient productClient = shareThingsScenarioBase.CreateHttpClientLender(sharethingsServer);

                #region Create product
                HttpResponseMessage response = await productClient.GetAsync(ShareThingsScenarioBase.Product.Get.CreateProduct);

                var antiForgeryValues = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

                HttpRequestMessage postRequest = new HttpRequestMessageBuilder(
                    HttpMethod.Post, ShareThingsScenarioBase.Product.Post.CreateProduct, antiForgeryValues)
                                                 .Set("Name", "TestName")
                                                 .Set("Description", "TestDescriptionCreated")
                                                 .Set("Type", "TestType")
                                                 .Set("Subtype", "TestSubtype")
                                                 .Set("Start", DateTime.Now.AddDays(-6).ToString("yyyy-MM-dd HH:mm:ss"))
                                                 .Set("End", DateTime.Now.AddDays(26).ToString("yyyy-MM-dd HH:mm:ss"))
                                                 .Build();

                response = await productClient.SendAsync(postRequest);

                Assert.Equal(HttpStatusCode.Found, response.StatusCode);
                Assert.EndsWith(ShareThingsScenarioBase.Product.Get.GetProducts, response.Headers.Location.OriginalString);

                // Get Id product
                response = await productClient.GetAsync(ShareThingsScenarioBase.Product.Get.GetProducts);

                string responseString = await response.Content.ReadAsStringAsync();

                string key       = "/Products/Edit/";
                int    index     = responseString.IndexOf(key);
                int    productId = Convert.ToInt32(responseString.Substring(index + key.Length, 1));
                #endregion

                #region Get detail productId
                response = await productClient.GetAsync(ShareThingsScenarioBase.Product.Get.GetDetails(productId));

                response.EnsureSuccessStatusCode();
                responseString = await response.Content.ReadAsStringAsync();

                Assert.Contains("TestDescriptionCreated", responseString);
                Assert.DoesNotContain("TestDescriptionUpdated", responseString);
                #endregion

                #region Edit product
                response = await productClient.GetAsync(ShareThingsScenarioBase.Product.Common.EditProduct(productId));

                antiForgeryValues = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

                postRequest = new HttpRequestMessageBuilder(
                    HttpMethod.Post, ShareThingsScenarioBase.Product.Common.EditProduct(productId), antiForgeryValues)
                              .Set("ProductId", productId.ToString())
                              .Set("Name", "TestName")
                              .Set("Description", "TestDescriptionUpdated")
                              .Set("Type", "TestType")
                              .Set("Subtype", "TestSubtype")
                              .Build();

                response = await productClient.SendAsync(postRequest);

                Assert.Equal(HttpStatusCode.Found, response.StatusCode);
                Assert.EndsWith(ShareThingsScenarioBase.Product.Get.GetProducts, response.Headers.Location.OriginalString);

                // Get detail productId
                response = await productClient.GetAsync(ShareThingsScenarioBase.Product.Get.GetDetails(productId));

                response.EnsureSuccessStatusCode();
                responseString = await response.Content.ReadAsStringAsync();

                Assert.DoesNotContain("TestDescriptionCreated", responseString);
                Assert.Contains("TestDescriptionUpdated", responseString);
                Assert.Contains("<a href=\"/Products/StatusShary/" + productId + "\">UnShary</a>", responseString);
                Assert.DoesNotContain("<a href=\"/Products/StatusShary/" + productId + "\">Shary</a>", responseString);
                #endregion

                #region Change status
                response = await productClient.GetAsync(ShareThingsScenarioBase.Product.Common.ChangeStatus(productId));

                antiForgeryValues = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

                postRequest = new HttpRequestMessageBuilder(
                    HttpMethod.Post, ShareThingsScenarioBase.Product.Common.ChangeStatus(productId), antiForgeryValues)
                              .Build();

                response = await productClient.SendAsync(postRequest);

                Assert.Equal(HttpStatusCode.Found, response.StatusCode);
                Assert.EndsWith(ShareThingsScenarioBase.Product.Get.GetProducts, response.Headers.Location.OriginalString);

                response = await productClient.GetAsync(ShareThingsScenarioBase.Product.Get.GetDetails(productId));

                response.EnsureSuccessStatusCode();
                responseString = await response.Content.ReadAsStringAsync();

                Assert.DoesNotContain("<a href=\"/Products/StatusShary/" + productId + "\">UnShary</a>", responseString);
                Assert.Contains("<a href=\"/Products/StatusShary/" + productId + "\">Shary</a>", responseString);
                #endregion

                #region Delete product
                response = await productClient.GetAsync(ShareThingsScenarioBase.Product.Common.DeleteProduct(productId));

                antiForgeryValues = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

                postRequest = new HttpRequestMessageBuilder(
                    HttpMethod.Post, ShareThingsScenarioBase.Product.Common.DeleteProduct(productId), antiForgeryValues)
                              .Build();

                response = await productClient.SendAsync(postRequest);

                Assert.Equal(HttpStatusCode.Found, response.StatusCode);
                Assert.EndsWith(ShareThingsScenarioBase.Product.Get.GetProducts, response.Headers.Location.OriginalString);

                Func <Task> act = async() =>
                {
                    await productClient.GetAsync(ShareThingsScenarioBase.Product.Get.GetDetails(productId));
                };
                act.Should().ThrowExactly <ArgumentException>().WithMessage("Product with Id 1 not exist (Parameter 'productId')");
                #endregion
            }
        }
示例#10
0
        public async Task Post_Create_Update_ChangeDuration_AddComment_Reject_Confirm_Return_All_Ok()
        {
            using (TestServer sharethingsServer = new ShareThingsScenarioBase().CreateServer())
            {
                HttpClient productClient = shareThingsScenarioBase.CreateHttpClientLender(sharethingsServer);

                #region Create product
                HttpResponseMessage response = await productClient.GetAsync(ShareThingsScenarioBase.Product.Get.CreateProduct);

                var antiForgeryValues = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

                DateTime productStartDate = DateTime.Now.AddDays(-6);
                DateTime productEndDate   = DateTime.Now.AddDays(26);

                HttpRequestMessage postRequest = new HttpRequestMessageBuilder(
                    HttpMethod.Post, ShareThingsScenarioBase.Product.Post.CreateProduct, antiForgeryValues)
                                                 .Set("Name", "TestName")
                                                 .Set("Description", "TestDescriptionCreated")
                                                 .Set("Type", "TestType")
                                                 .Set("Subtype", "TestSubtype")
                                                 .Set("Start", productStartDate.ToString("yyyy-MM-dd HH:mm:ss"))
                                                 .Set("End", productEndDate.ToString("yyyy-MM-dd HH:mm:ss"))
                                                 .Build();

                response = await productClient.SendAsync(postRequest);

                Assert.Equal(HttpStatusCode.Found, response.StatusCode);
                Assert.EndsWith(ShareThingsScenarioBase.Product.Get.GetProducts, response.Headers.Location.OriginalString);

                // Get Id product
                response = await productClient.GetAsync(ShareThingsScenarioBase.Product.Get.GetProducts);

                string responseString = await response.Content.ReadAsStringAsync();

                string key       = "/Products/Edit/";
                int    index     = responseString.IndexOf(key);
                int    productId = Convert.ToInt32(responseString.Substring(index + key.Length, 1));
                #endregion

                HttpClient borrowClient = shareThingsScenarioBase.CreateHttpClientBorrower(sharethingsServer);

                #region Create borrow 1
                response = await borrowClient.GetAsync(ShareThingsScenarioBase.Borrow.Get.CreateBorrow(productId));

                antiForgeryValues = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

                DateTime borrowDateStart = DateTime.Now.AddDays(-3);
                DateTime borrowDateEnd   = DateTime.Now.AddDays(23);

                postRequest = new HttpRequestMessageBuilder(
                    HttpMethod.Post, ShareThingsScenarioBase.Borrow.Post.CreateBorrow, antiForgeryValues)
                              .Set("Borrow.ProductId", productId.ToString())
                              .Set("Borrow.ProductStart", productStartDate.ToString("yyyy-MM-dd HH:mm:ss"))
                              .Set("Borrow.ProductEnd", productEndDate.ToString("yyyy-MM-dd HH:mm:ss"))
                              .Set("Borrow.Start", borrowDateStart.ToString("yyyy-MM-dd HH:mm:ss"))
                              .Set("Borrow.End", borrowDateEnd.ToString("yyyy-MM-dd HH:mm:ss"))
                              .Build();

                response = await borrowClient.SendAsync(postRequest);

                Assert.Equal(HttpStatusCode.Found, response.StatusCode);
                Assert.EndsWith(ShareThingsScenarioBase.Borrow.Get.GetBorrows, response.Headers.Location.OriginalString);

                // Get borrow Id
                response = await productClient.GetAsync(ShareThingsScenarioBase.Borrow.Get.GetBorrows);

                responseString = await response.Content.ReadAsStringAsync();

                key   = "/Borrows/Details/";
                index = responseString.IndexOf(key);
                int borrowId = Convert.ToInt32(responseString.Substring(index + key.Length, 1));
                #endregion

                #region Owner Product Details
                response = await productClient.GetAsync(ShareThingsScenarioBase.Borrow.Get.GetOwnerDetails(borrowId));

                response.EnsureSuccessStatusCode();
                #endregion

                #region Change duration borrow
                DateTime borrowDateStartUpdated = DateTime.Now.AddDays(-2);
                DateTime borrowDateEndUpdated   = DateTime.Now.AddDays(20);

                response = await borrowClient.GetAsync(ShareThingsScenarioBase.Borrow.Common.EditBorrow(borrowId));

                antiForgeryValues = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

                postRequest = new HttpRequestMessageBuilder(
                    HttpMethod.Post, ShareThingsScenarioBase.Borrow.Common.EditBorrow(borrowId), antiForgeryValues)
                              .Set("id", borrowId.ToString())
                              .Set("Borrow.BorrowId", borrowId.ToString())
                              .Set("Borrow.ProductId", productId.ToString())
                              .Set("Borrow.ProductStart", productStartDate.ToString("yyyy-MM-dd HH:mm:ss"))
                              .Set("Borrow.ProductEnd", productEndDate.ToString("yyyy-MM-dd HH:mm:ss"))
                              .Set("Borrow.Start", borrowDateStartUpdated.ToString("yyyy-MM-dd HH:mm:ss"))
                              .Set("Borrow.End", borrowDateEndUpdated.ToString("yyyy-MM-dd HH:mm:ss"))
                              .Build();

                response = await borrowClient.SendAsync(postRequest);

                Assert.Equal(HttpStatusCode.Found, response.StatusCode);
                Assert.EndsWith(ShareThingsScenarioBase.Borrow.Get.GetBorrows, response.Headers.Location.OriginalString);

                // Get detail borrowId
                response = await productClient.GetAsync(ShareThingsScenarioBase.Borrow.Get.GetDetails(borrowId));

                response.EnsureSuccessStatusCode();
                responseString = await response.Content.ReadAsStringAsync();

                Assert.DoesNotContain(borrowDateStart.ToString("yyyy-MM-dd"), responseString);
                Assert.DoesNotContain(borrowDateEnd.ToString("yyyy-MM-dd"), responseString);
                Assert.Contains(borrowDateStartUpdated.ToString("yyyy-MM-dd"), responseString);
                Assert.Contains(borrowDateEndUpdated.ToString("yyyy-MM-dd"), responseString);
                #endregion

                #region Add comment
                string comment = "New comment";

                response = await borrowClient.GetAsync(ShareThingsScenarioBase.Borrow.Common.AddComment(borrowId));

                antiForgeryValues = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

                postRequest = new HttpRequestMessageBuilder(
                    HttpMethod.Post, ShareThingsScenarioBase.Borrow.Common.AddComment(borrowId), antiForgeryValues)
                              .Set("id", borrowId.ToString())
                              .Set("Borrow.BorrowId", borrowId.ToString())
                              .Set("Comment.Text", comment)
                              .Build();

                response = await borrowClient.SendAsync(postRequest);

                Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                // Get detail borrowId
                response = await productClient.GetAsync(ShareThingsScenarioBase.Borrow.Get.GetDetails(borrowId));

                response.EnsureSuccessStatusCode();
                responseString = await response.Content.ReadAsStringAsync();

                Assert.Contains(comment, responseString);
                #endregion

                #region Set score
                int score = 5;

                response = await borrowClient.GetAsync(ShareThingsScenarioBase.Borrow.Common.Score(borrowId));

                antiForgeryValues = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

                postRequest = new HttpRequestMessageBuilder(
                    HttpMethod.Post, ShareThingsScenarioBase.Borrow.Common.Score(borrowId), antiForgeryValues)
                              .Set("id", borrowId.ToString())
                              .Set("Borrow.BorrowId", borrowId.ToString())
                              .Set("Borrow.Score", score.ToString())
                              .Build();

                response = await borrowClient.SendAsync(postRequest);

                Assert.Equal(HttpStatusCode.Found, response.StatusCode);

                // Get detail borrowId
                response = await productClient.GetAsync(ShareThingsScenarioBase.Borrow.Get.GetDetails(borrowId));

                response.EnsureSuccessStatusCode();
                responseString = await response.Content.ReadAsStringAsync();

                Assert.Contains("name=\"Borrow.Score\" value=\"" + score + "\"", responseString);
                #endregion

                #region Reject
                response = await borrowClient.GetAsync(ShareThingsScenarioBase.Borrow.Common.Reject(borrowId));

                antiForgeryValues = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

                postRequest = new HttpRequestMessageBuilder(
                    HttpMethod.Post, ShareThingsScenarioBase.Borrow.Common.Reject(borrowId), antiForgeryValues)
                              .Set("id", borrowId.ToString())
                              .Set("Borrow.BorrowId", borrowId.ToString())
                              .Build();

                response = await borrowClient.SendAsync(postRequest);

                Assert.Equal(HttpStatusCode.Found, response.StatusCode);

                // Get detail borrowId
                response = await productClient.GetAsync(ShareThingsScenarioBase.Borrow.Get.GetDetails(borrowId));

                response.EnsureSuccessStatusCode();
                responseString = await response.Content.ReadAsStringAsync();

                Assert.Contains("Rejected", responseString);
                #endregion

                #region Create borrow 2
                response = await borrowClient.GetAsync(ShareThingsScenarioBase.Borrow.Get.CreateBorrow(productId));

                antiForgeryValues = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

                postRequest = new HttpRequestMessageBuilder(
                    HttpMethod.Post, ShareThingsScenarioBase.Borrow.Post.CreateBorrow, antiForgeryValues)
                              .Set("Borrow.ProductId", productId.ToString())
                              .Set("Borrow.ProductStart", productStartDate.ToString("yyyy-MM-dd HH:mm:ss"))
                              .Set("Borrow.ProductEnd", productEndDate.ToString("yyyy-MM-dd HH:mm:ss"))
                              .Set("Borrow.Start", borrowDateStart.ToString("yyyy-MM-dd HH:mm:ss"))
                              .Set("Borrow.End", borrowDateEnd.ToString("yyyy-MM-dd HH:mm:ss"))
                              .Build();

                response = await borrowClient.SendAsync(postRequest);

                Assert.Equal(HttpStatusCode.Found, response.StatusCode);
                Assert.EndsWith(ShareThingsScenarioBase.Borrow.Get.GetBorrows, response.Headers.Location.OriginalString);

                // Get borrow Id
                response = await productClient.GetAsync(ShareThingsScenarioBase.Borrow.Get.GetBorrows);

                responseString = await response.Content.ReadAsStringAsync();

                key      = "/Borrows/Details/";
                index    = responseString.LastIndexOf(key);
                borrowId = Convert.ToInt32(responseString.Substring(index + key.Length, 1));
                #endregion

                #region Confirm
                response = await borrowClient.GetAsync(ShareThingsScenarioBase.Borrow.Common.Confirm(borrowId));

                antiForgeryValues = await AntiForgeryTokenExtractor.ExtractAntiForgeryValues(response);

                postRequest = new HttpRequestMessageBuilder(
                    HttpMethod.Post, ShareThingsScenarioBase.Borrow.Common.Confirm(borrowId), antiForgeryValues)
                              .Set("id", borrowId.ToString())
                              .Set("Borrow.BorrowId", borrowId.ToString())
                              .Build();

                response = await borrowClient.SendAsync(postRequest);

                Assert.Equal(HttpStatusCode.Found, response.StatusCode);

                // Get detail borrowId
                response = await productClient.GetAsync(ShareThingsScenarioBase.Borrow.Get.GetDetails(borrowId));

                response.EnsureSuccessStatusCode();
                responseString = await response.Content.ReadAsStringAsync();

                Assert.Contains("Accepted", responseString);
                #endregion
            }
        }