コード例 #1
0
        public async Task InvalidDelete()
        {
            // Arrange
            Moq.Mock <IBloggingRepository> mock       = MockBloggingRepository();
            IBloggingRepository            repository = mock.Object;
            var logger = LoggerFactory.CreateLogger <BlogsController>();

            //1st add one object
            await repository.AddAsync(new Blog
            {
                BlogId = 99999,
                Post   = null,
                Url    = "http://www.99999.com",
            });

            await repository.SaveAsync();

            using (IBlogsController controller = new BlogsController(repository, logger, Configuration, DataProtectionProvider))
            {
                var model = new DecoratedBlog
                {
                    BlogId      = 99999,
                    Post        = null,
                    Url         = "bad_url_but_no_matter",
                    ProtectedID = "giberish"
                };

                // Act
                var result = await controller.BlogAction(model, true, BlogActionEnum.Delete);

                // Assert
                Assert.IsType <NotFoundResult>(result);
                Assert.Equal(404, ((NotFoundResult)result).StatusCode);
            }
        }
コード例 #2
0
        public async Task <ActionResult> BlogAction(DecoratedBlog blog, bool ajax, BlogActionEnum operation = BlogActionEnum.Unknown)
        {
            if (operation == BlogActionEnum.Delete)
            {
                ModelState.Remove(nameof(blog.Url));
            }

            if (!ModelState.IsValid)
            {
                if (ajax)
                {
                    return(Json("error"));
                }
                else
                {
                    IEnumerable <DecoratedBlog> lst = await GetBlogs();

                    lst = lst.Where(l => l.ProtectedID != blog.ProtectedID).Union(new[] { blog });
                    return(View(nameof(Index), lst));
                }
            }

            ActionResult result;

            switch (operation)
            {
            case BlogActionEnum.Edit:
                result = await EditBlog(blog.BlogId, blog.Url, ajax);

                break;

            case BlogActionEnum.Delete:
                result = await DeleteBlog(blog.BlogId, ajax);

                break;

            case BlogActionEnum.Unknown:
            default:
                throw new NotSupportedException($"Unknown {nameof(operation)} {operation}");
            }
            if (ajax)
            {
                return(result);
            }
            else
            {
                var appRootPath     = _configuration.AppRootPath();
                var destination_url = appRootPath + ASPX;
                return(Redirect(destination_url));
            }
        }
コード例 #3
0
        public async Task InvalidEdit()
        {
            // Arrange
            Moq.Mock <IBloggingRepository> mock       = MockBloggingRepository();
            IBloggingRepository            repository = mock.Object;
            var logger = LoggerFactory.CreateLogger <BlogsController>();

            //1st add one object
            await repository.AddAsync(new Blog
            {
                BlogId = -99999,
                Post   = null,
                Url    = "http://www.999999.com",
            });

            await repository.SaveAsync();

            using (IBlogsController controller = new BlogsController(repository, logger, Configuration, DataProtectionProvider))
            {
                var model = new DecoratedBlog
                {
                    BlogId      = -99999,
                    Post        = null,
                    Url         = "http://www.minus999999.com",
                    ProtectedID = "giberish"
                };

                // Act
                ((Controller)controller).ModelState.AddModelError(nameof(Blog.Url), "bad id");

                var result = await controller.BlogAction(model, true, BlogActionEnum.Edit);

                // Assert
                Assert.IsType <JsonResult>(result);
                Assert.IsType <string>(((JsonResult)result).Value);
                Assert.Equal("error", ((JsonResult)result).Value.ToString());
            }
        }
コード例 #4
0
        public async Task Edit()
        {
            // Arrange
            Moq.Mock <IBloggingRepository> mock       = MockBloggingRepository();
            IBloggingRepository            repository = mock.Object;
            var logger = LoggerFactory.CreateLogger <BlogsController>();

            //1st add one object
            await repository.AddAsync(new Blog
            {
                BlogId = 2,
                Post   = null,
                Url    = "http://www.internet.com",
            });

            await repository.SaveAsync();

            using (IBlogsController controller = new BlogsController(repository, logger, Configuration, DataProtectionProvider))
            {
                var model = new DecoratedBlog
                {
                    BlogId      = 2,
                    Post        = null,
                    Url         = "http://www.changed-internet.com",
                    ProtectedID = "giberish"
                };

                // Act
                var result = await controller.BlogAction(model, true, BlogActionEnum.Edit);

                // Assert
                Assert.IsType <JsonResult>(result);
                Assert.IsType <Blog>(((JsonResult)result).Value);
                Assert.Equal(2, ((Blog)((JsonResult)result).Value).BlogId);
                Assert.Contains("changed", ((Blog)((JsonResult)result).Value).Url);
            }
        }
コード例 #5
0
        public async Task Delete()
        {
            // Arrange
            Moq.Mock <IBloggingRepository> mock       = MockBloggingRepository();
            IBloggingRepository            repository = mock.Object;
            var logger = LoggerFactory.CreateLogger <BlogsController>();

            //1st add one object
            await repository.AddAsync(new Blog
            {
                BlogId = 2,
                Post   = null,
                Url    = "http://www.internet.com",
            });

            await repository.SaveAsync();

            using (IBlogsController controller = new BlogsController(repository, logger, Configuration, DataProtectionProvider))
            {
                var model = new DecoratedBlog
                {
                    BlogId      = 2,
                    Post        = null,
                    Url         = "bad_url_but_no_matter",
                    ProtectedID = "giberish"
                };

                // Act
                var result = await controller.ItemAction(model, true, BlogActionEnum.Delete);

                // Assert
                Assert.IsType <JsonResult>(result);
                Assert.IsType <string>(((JsonResult)result).Value);
                Assert.Equal("deleted", ((JsonResult)result).Value.ToString());
            }
        }
コード例 #6
0
        public async Task Blog_CRUD_Test()
        {
            if (_fixture.DOTNET_RUNNING_IN_CONTAINER)
            {
                return;                                                  //pass on fake DB with no data
            }
            // Arrange
            string antiforgery_token;
            List <KeyValuePair <string, string> > data;

            using (var create_get_response = await _client.GetAsync($"{_fixture.AppRootPath}{BlogsController.ASPX}/{nameof(BlogsController.Create)}/",
                                                                    HttpCompletionOption.ResponseContentRead))
            {
                // Assert
                create_get_response.EnsureSuccessStatusCode();
                antiforgery_token = await PostRequestHelper.ExtractAntiForgeryToken(create_get_response);

                // Arrange
                var now = DateTime.Now;
                data = new Blog
                {
                    BlogId = 0,
                    Post   = new[] { new Post {
                                         Content = $"aaaa {now}", Title = "titla"
                                     } },
                    Url = $"http://www.inernetAt-{now.Year}-{now.Month}-{now.Day}.com/Content{now.Hour}-{now.Minute}-{now.Second}"
                }.ToDictionary().ToList();
                data.Add(new KeyValuePair <string, string>("__RequestVerificationToken", antiforgery_token));

                using (var formPostBodyData = new FormUrlEncodedContent(data))
                {
                    PostRequestHelper.CreateFormUrlEncodedContentWithCookiesFromResponse(formPostBodyData.Headers, create_get_response);
                    // Act
                    using (var redirect = await _client.PostAsync($"{_fixture.AppRootPath}{BlogsController.ASPX}/{nameof(BlogsController.Create)}/", formPostBodyData))
                    {
                        // Assert
                        Assert.NotNull(redirect);
                        Assert.Equal(HttpStatusCode.Redirect, redirect.StatusCode);
                        Assert.Contains($"{_fixture.AppRootPath}{BlogsController.ASPX}", redirect.Headers.GetValues("Location").FirstOrDefault());
                    }
                }


                int    last_inserted_id;
                string last_inserted_ProtectedID;
                using (var index_response = await _client.GetAsync($"{_fixture.AppRootPath}{BlogsController.ASPX}/", HttpCompletionOption.ResponseContentRead))
                {
                    var responseString = await index_response.Content.ReadAsStringAsync();

                    MatchCollection matches = Regex.Matches(responseString, @"\<form method=""post"" class=""blogForm"" data-id=""([0-9].*)""\>");
                    Assert.NotEmpty(matches);
                    var ids = new List <int>(matches.Count);
                    foreach (Match m in matches)
                    {
                        var match_count = m.Success ? m.Groups[1].Captures.Count : 0;
                        Assert.True(match_count > 0);
                        var id = int.Parse(m.Groups[1].Captures[match_count - 1].Value);
                        ids.Add(id);
                    }
                    last_inserted_id = ids.OrderByDescending(_ => _).First();
                    Match match = Regex.Match(responseString, $@"\<input type=""hidden"" id=""ProtectedID_{last_inserted_id}"" name=""ProtectedID"" value=""([^""]+)"" \/\>");
                    Assert.True(match.Success && match.Groups[1].Captures.Count > 0);
                    last_inserted_ProtectedID = match.Groups[1].Captures[0].Value;
                }

                data = new DecoratedBlog
                {
                    BlogId      = last_inserted_id,
                    ProtectedID = last_inserted_ProtectedID,
                    Url         = $"http://www.changed-{now.Year + 1}-{now.Month}-{now.Day}.com/NewContent{now.Hour}-{now.Minute}-{now.Second}"
                }.ToDictionary().ToList();
                data.Add(new KeyValuePair <string, string>("__RequestVerificationToken", antiforgery_token));

                using (var formPostBodyData = new FormUrlEncodedContent(data))
                {
                    PostRequestHelper.CreateFormUrlEncodedContentWithCookiesFromResponse(formPostBodyData.Headers, create_get_response);
                    using (var response = await _client.PostAsync($"{_fixture.AppRootPath}{BlogsController.ASPX}/{nameof(BlogActionEnum.Edit)}/{last_inserted_id}/true",
                                                                  formPostBodyData))
                    {
                        Assert.NotNull(response);
                        response.EnsureSuccessStatusCode();
                        Assert.Contains("application/json", response.Content.Headers.GetValues("Content-Type").FirstOrDefault());
                        Assert.Contains("{\"blogId\":" + last_inserted_id + ",\"url\":\"" + $"http://www.changed-{now.Year + 1}-{now.Month}-{now.Day}.com/NewContent{now.Hour}-{now.Minute}-{now.Second}",
                                        await response.Content.ReadAsStringAsync());
                    }
                }

                data = new DecoratedBlog
                {
                    BlogId      = last_inserted_id,
                    ProtectedID = last_inserted_ProtectedID,
                }.ToDictionary().ToList();
                data.Add(new KeyValuePair <string, string>("__RequestVerificationToken", antiforgery_token));

                using (var formPostBodyData = new FormUrlEncodedContent(data))
                {
                    PostRequestHelper.CreateFormUrlEncodedContentWithCookiesFromResponse(formPostBodyData.Headers, create_get_response);
                    using (var response = await _client.PostAsync($"{_fixture.AppRootPath}{BlogsController.ASPX}/{nameof(BlogActionEnum.Delete)}/{last_inserted_id}/true",
                                                                  formPostBodyData))
                    {
                        Assert.NotNull(response);
                        response.EnsureSuccessStatusCode();
                        Assert.Contains("application/json", response.Content.Headers.GetValues("Content-Type").FirstOrDefault());
                        Assert.Equal("\"deleted\"", await response.Content.ReadAsStringAsync());
                    }
                }
            }            //end using (var create_get_response
        }