public void Initialize()
        {
            this.mocks = new MockContainer();
            this.mocks.PrepareMocks();

            this.mockContext = new Mock<IUnitOfWorkData>();
            this.mockContext.Setup(c => c.News).Returns(this.mocks.NewsRepositoryMock.Object);

            this.controller = new NewsController(this.mockContext.Object);
            this.controller.Request = new HttpRequestMessage
                {
                    RequestUri = new Uri("http://localhost")
                };
            this.controller.Configuration = new HttpConfiguration();
            this.controller.Configuration.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional });

            this.newsItem = new NewsBindingModel
                {
                    Title = "New News", 
                    Content = "New News Content", 
                    PublishDate = DateTime.Now
                };

            this.fakeNewsCountBefore = this.mockContext.Object.News.GetAll().Count();
        }
        public IHttpActionResult EditNewsById(int id, NewsBindingModel newsBindingModel)
        {
            var news = this.Data.News.GetAll().FirstOrDefault(n => n.Id == id);
            if (news == null)
            {
                return this.NotFound();
            }

            if (newsBindingModel == null)
            {
                return this.BadRequest("News data is missing");
            }

            if (!this.ModelState.IsValid)
            {
                return this.BadRequest(this.ModelState);
            }

            news.Title = newsBindingModel.Title;
            news.Content = newsBindingModel.Content;
            news.PublishDate = newsBindingModel.PublishDate;

            this.Data.SaveChanges();

            var newsView = this.Data.News.GetAll()
                .Where(n => n.Id == news.Id)
                .Select(NewsViewModel.Create())
                .FirstOrDefault();

            return this.Ok(newsView);
        }
        public IHttpActionResult UpdateNews(int id, NewsBindingModel newsModel)
        {
            var newsToUpdate = this.NewsData.Find(id);
            if (newsToUpdate == null)
            {
                return this.BadRequest("There is no such news.");
            }

            if (newsToUpdate.UserId != this.UserIdProvider.GetUserId())
            {
                return this.Unauthorized();
            }

            if (newsModel == null || !this.ModelState.IsValid)
            {
                return this.BadRequest("The news title and content are required.");
            }

            newsToUpdate.Title = newsModel.Title;
            newsToUpdate.Content = newsModel.Content;
            if (newsModel.PublishDate != null)
            {
                newsToUpdate.PublishDate = newsModel.PublishDate.Value;
            }

            this.NewsData.Update(newsToUpdate);
            this.NewsData.SaveChanges();

            return this.Ok(newsToUpdate);
        }
        public void Create_News_With_Correct_Data_Should_Return_201Created_Add_News_In_Repo_And_Return_News()
        {
            // Arrange
            var newNews = new NewsBindingModel
            {
                Title = "Title 10",
                Content = "Content 1010101010",
                PublishDate = new DateTime(2015, 9, 1)
            };

            var mockContext = new Mock<INewsData>();
            mockContext.Setup(c => c.News)
                .Returns(this.mock.NewsRepositoryMock.Object);

            var newsController = new NewsController(mockContext.Object);
            this.SetupController(newsController);

            // Act
            var response = newsController.PostNews(newNews)
                .ExecuteAsync(CancellationToken.None).Result;

            // Assert
            var fakeNews = this.mock.NewsRepositoryMock.Object.All().ToList();
            Assert.AreEqual(HttpStatusCode.Created, response.StatusCode);
            mockContext.Verify(c => c.SaveChanges(), Times.Once);
            Assert.AreEqual(6, fakeNews.Count);
            Assert.AreEqual(newNews.Title, fakeNews[5].Title);
            Assert.AreEqual(newNews.Content, fakeNews[5].Content);
            Assert.AreEqual(newNews.PublishDate, fakeNews[5].PublishDate);
        }
        public IHttpActionResult EditNews(int id, NewsBindingModel newsDto)
        {
            if (!this.ModelState.IsValid)
            {
                return this.BadRequest(this.ModelState);
            }

            if (newsDto == null)
            {
                return this.BadRequest(this.ModelState);
            }

            var news = this.Data.Find(id);

            if (news == null)
            {
                return this.NotFound();
            }

            news.Title = newsDto.Title;
            news.Content = newsDto.Content;
            news.PublishedDate = newsDto.PublishedDate;
            this.Data.SaveChanges();

            return this.Ok(new NewsViewModel(news));
        }
        public IHttpActionResult PostNewsItem(NewsBindingModel newsBindingModel)
        {
            if (newsBindingModel == null)
            {
                return this.BadRequest("News data is missing");
            }

            if (!this.ModelState.IsValid)
            {
                return this.BadRequest(this.ModelState);
            }

            var newNews = new NewsItem
                {
                    Title = newsBindingModel.Title, 
                    Content = newsBindingModel.Content, 
                    PublishDate = newsBindingModel.PublishDate
                };

            this.Data.News.Add(newNews);
            this.Data.SaveChanges();

            var newsView = this.Data.News.GetAll()
                .Where(n => n.Id == newNews.Id)
                .Select(NewsViewModel.Create())
                .FirstOrDefault();

            var uriLocation = new
                {
                    controller = "news",
                    id = newNews.Id
                };

            return this.CreatedAtRoute("DefaultApi", uriLocation, newsView);
        }
        public void CreateNewsWithWrongBindingModelShouldReturnBadRequest()
        {
            var controller = new NewsController(this.mock.NewsRepositoryMock.Object);
            this.SetupController(controller);
            var newsBind = new NewsBindingModel();

            controller.ModelState.AddModelError("BadRequest", "Content can't be empty.");
            var response = controller.CreateNews(newsBind).ExecuteAsync(CancellationToken.None).Result;

            Assert.IsNotNull(response);
            Assert.AreEqual(response.StatusCode, HttpStatusCode.BadRequest);
        }
        public void TestAddInvalidNews()
        {
            var controller = new NewsController(repoMock.Object);
            SetupController(controller, "News");

            var invalidNews = new NewsBindingModel { Title = "No content" };

            // it's not the controller's job to validate - there is a validator
            controller.ModelState.AddModelError("Content", "Required");
            var result = controller.AddNews(invalidNews).ExecuteAsync(new CancellationToken()).Result;
            Assert.AreEqual(HttpStatusCode.BadRequest, result.StatusCode);
        }
        public void CreateNewsAddToRepositoryShouldReturnCreated()
        {
            var controller = new NewsController(this.mock.NewsRepositoryMock.Object);
            this.SetupController(controller);
            var newsBind = new NewsBindingModel
                               {
                                   Title = "Some new news", 
                                   Content = "Content", 
                                   PublishedDate = DateTime.Now
                               };

            var response = controller.CreateNews(newsBind).ExecuteAsync(CancellationToken.None).Result;

            Assert.IsNotNull(response);
            Assert.AreEqual(response.StatusCode, HttpStatusCode.Created);
        }
        public IHttpActionResult AddNews(NewsBindingModel newsModel)
        {
            if (newsModel == null || !this.ModelState.IsValid)
            {
                return this.BadRequest("The news title and content are required.");
            }

            var newsToAdd = new News
            {
                Title = newsModel.Title,
                Content = newsModel.Content,
                PublishDate = newsModel.PublishDate ?? DateTime.Now,
                UserId = this.UserIdProvider.GetUserId()
            };

            this.NewsData.Add(newsToAdd);
            this.NewsData.SaveChanges();

            return this.CreatedAtRoute("DefaultApi", new { id = newsToAdd.Id }, newsToAdd);
        }
        public void TestAddValidNews()
        {
            var controller = new NewsController(repoMock.Object);
            SetupController(controller, "News");

            var news = new List<News>
            {
                new News { Title = "Zaglavie", Content = "dadadada" },
                new News { Title = "Asdjoqwe", Content = "asodojk" }
            };

            repoMock.Setup(repo => repo.Add(It.IsAny<News>())).Callback((News n) => news.Add(n));

            var newNews = new NewsBindingModel { Title = "Teadsad", Content = "koko6ki" };
            var result = controller.AddNews(newNews).ExecuteAsync(new CancellationToken()).Result;

            Assert.AreEqual(HttpStatusCode.Created, result.StatusCode);
            Assert.AreEqual(newNews.Title, news.Last().Title);
            Assert.AreEqual(newNews.Content, news.Last().Content);
            Assert.IsNotNull(news.Last().PublishDate);
        }
        public void Initialize()
        {
            // Start OWIN testing HTTP server with Web API support
            this.testServer = TestServer.Create(appBuilder =>
                {
                    var config = new HttpConfiguration();
                    WebApiConfig.Register(config);

                    var startup = new Startup();
                    startup.Configuration(appBuilder);

                    appBuilder.UseWebApi(config);
                });

            this.client = this.testServer.HttpClient;

            this.newsItemOne = new NewsBindingModel
                {
                    Title = "News One", 
                    Content = "News One Content", 
                    PublishDate = new DateTime(2015, 09, 11)
                };

            this.newsItemTwo = new NewsBindingModel
            {
                Title = "News Two",
                Content = "News Two Content",
                PublishDate = new DateTime(2015, 09, 10)
            };

            this.invalidNewsItem = new NewsBindingModel
                {
                    Title = null, 
                    Content = "Modified Content", 
                    PublishDate = new DateTime(2015, 09, 09)
                };

            this.PopulateDatabase();
        }
        public IHttpActionResult CreateNews(NewsBindingModel newsDto)
        {
            if (!this.ModelState.IsValid)
            {
                return this.BadRequest(this.ModelState);
            }

            if (newsDto == null)
            {
                return this.BadRequest(this.ModelState);
            }

            var news = new News
                           {
                               Title = newsDto.Title, 
                               Content = newsDto.Content, 
                               PublishedDate = newsDto.PublishedDate ?? DateTime.Now
                           };
            this.Data.Add(news);
            this.Data.SaveChanges();

            return this.CreatedAtRoute("DefaultApi", new { id = news.Id }, news);
        }
        public IHttpActionResult PostNews(NewsBindingModel model)
        {
            if (model == null)
            {
                return this.BadRequest("No news to post.");
            }

            if (!this.ModelState.IsValid)
            {
                return this.BadRequest(this.ModelState);
            }

            var newNews = new News
            {
                Title = model.Title,
                Content = model.Content,
                PublishDate = model.PublishDate
            };

            this.Data.News.Add(newNews);
            this.Data.SaveChanges();

            return this.Created("api/news/" + newNews.Id, newNews);
        }
        public void TestModifyValidNews()
        {
            var controller = new NewsController(repoMock.Object);
            SetupController(controller, "News");

            var news = new News { Id = 18, Title = "Zaglavie", Content = "dadadada" };
            repoMock.Setup(repo => repo.Find(It.IsAny<object>())).Returns(news);

            var updatedNews = new NewsBindingModel { Title = "Zaglavie", Content = "Changed content" };
            var result = controller.UpdateNews(18, updatedNews).ExecuteAsync(new CancellationToken()).Result;
            Assert.AreEqual(HttpStatusCode.OK, result.StatusCode);
            var returnedNews = result.Content.ReadAsAsync<News>().Result;
            Assert.AreEqual(updatedNews.Title, returnedNews.Title);
            Assert.AreEqual(updatedNews.Content, returnedNews.Content);
            Assert.AreEqual(news.Title, returnedNews.Title);
        }
        public void Modify_NonExisting_News_Should_Return_400BadRequest()
        {
            // Arrange
            int id = this.GenerateNonExistingId();

            var newNews = new NewsBindingModel
            {
                Title = "Modified title",
                Content = "Modified content",
                PublishDate = new DateTime(2013, 12, 12)
            };

            var mockContext = new Mock<INewsData>();
            mockContext.Setup(c => c.News)
                .Returns(this.mock.NewsRepositoryMock.Object);

            var newsController = new NewsController(mockContext.Object);
            this.SetupController(newsController);

            // Act
            var response = newsController.ChangeNews(id, newNews)
                .ExecuteAsync(CancellationToken.None).Result;

            // Assert
            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
            mockContext.Verify(c => c.SaveChanges(), Times.Never);
        }
 private FormUrlEncodedContent GenerateBodyData(NewsBindingModel news)
 {
     var newsBody = new FormUrlEncodedContent(new[]
         {
             new KeyValuePair<string, string>("title", news.Title), 
             new KeyValuePair<string, string>("content", news.Content), 
             new KeyValuePair<string, string>("publishDate", news.PublishDate.ToString(CultureInfo.InvariantCulture))
         });
     return newsBody;
 }
        public void Create_News_With_InCorrect_Data_Should_Return_400BadRequest()
        {
            // Arrange
            var newNews = new NewsBindingModel
            {
                Title = "T", // invalid MinLength
                Content = "Content 1010101010",
                PublishDate = new DateTime(2015, 9, 1)
            };

            var mockContext = new Mock<INewsData>();
            mockContext.Setup(c => c.News)
                .Returns(this.mock.NewsRepositoryMock.Object);

            var newsController = new NewsController(mockContext.Object);
            this.SetupController(newsController);
            newsController.ModelState.AddModelError("Title", "Title MinLength is 5.");

            // Act
            var response = newsController.PostNews(newNews)
                .ExecuteAsync(CancellationToken.None).Result;

            // Assert
            var fakeNews = this.mock.NewsRepositoryMock.Object.All().ToList();
            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
            mockContext.Verify(c => c.SaveChanges(), Times.Never);
            Assert.AreEqual(5, fakeNews.Count);
        }
        public void TestModifyInvalidNews()
        {
            var controller = new NewsController(repoMock.Object);
            SetupController(controller, "News");

            var news = new News { Id = 18, Title = "Zaglavie", Content = "dadadada" };
            repoMock.Setup(repo => repo.Find(It.IsAny<object>())).Returns(news);

            var invalidNews = new NewsBindingModel { Content = "No title" };

            // it's not the controller's job to validate - there is a validator
            controller.ModelState.AddModelError("Title", "Required");
            var result = controller.UpdateNews(18, invalidNews).ExecuteAsync(new CancellationToken()).Result;
            Assert.AreEqual(HttpStatusCode.BadRequest, result.StatusCode);
        }
        public void Modify_Existing_News_With_InCorrect_Data_Should_Return_400BadRequest()
        {
            // Arrange
            var fakeNewsToModify = this.mock.NewsRepositoryMock.Object.All().FirstOrDefault();

            var newNews = new NewsBindingModel
            {
                Title = "T", // invalid MinLength
                Content = "Modified content",
                PublishDate = new DateTime(2013, 12, 12)
            };

            var mockContext = new Mock<INewsData>();
            mockContext.Setup(c => c.News)
                .Returns(this.mock.NewsRepositoryMock.Object);

            var newsController = new NewsController(mockContext.Object);
            this.SetupController(newsController);
            newsController.ModelState.AddModelError("Title", "Title MinLength is 5.");

            // Act
            var response = newsController.ChangeNews(fakeNewsToModify.Id, newNews)
                .ExecuteAsync(CancellationToken.None).Result;

            // Assert
            var fakeNews = this.mock.NewsRepositoryMock.Object.All().ToList();
            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
            mockContext.Verify(c => c.SaveChanges(), Times.Never);
            Assert.AreEqual(fakeNewsToModify.Title, fakeNews[0].Title);
            Assert.AreEqual(fakeNewsToModify.Content, fakeNews[0].Content);
            Assert.AreEqual(fakeNewsToModify.PublishDate, fakeNews[0].PublishDate);
        }
        public void TestModifyUnexistingNews()
        {
            var controller = new NewsController(repoMock.Object);
            SetupController(controller, "News");

            repoMock.Setup(repo => repo.Find(It.IsAny<object>())).Returns(null as News);

            var updatedNews = new NewsBindingModel { Title = "Zaglavie", Content = "Changed content" };
            var result = controller.UpdateNews(18, updatedNews).ExecuteAsync(new CancellationToken()).Result;
            Assert.AreEqual(HttpStatusCode.BadRequest, result.StatusCode);
        }
        public void ModifyExistingNewsShouldReturnOk()
        {
            var controller = new NewsController(this.mock.NewsRepositoryMock.Object);
            this.SetupController(controller);
            var newsBind = new NewsBindingModel { Title = "Edit", Content = "Edit", PublishedDate = DateTime.Now };

            var response = controller.EditNews(1, newsBind).ExecuteAsync(CancellationToken.None).Result;

            var editedNews = this.mock.NewsRepositoryMock.Object.Find(1);

            Assert.AreEqual(editedNews.Title, "Edit");
            Assert.AreEqual(editedNews.Content, "Edit");
            Assert.AreEqual(response.StatusCode, HttpStatusCode.OK);
        }
        public void Modify_Existing_News_With_Correct_Data_Should_Return_200OK_And_Modify_News_In_Repository()
        {
            // Arrange
            var fakeNewsToModify = this.mock.NewsRepositoryMock.Object.All().FirstOrDefault();

            var newNews = new NewsBindingModel
            {
                Title = "Modified Title",
                Content = "Modified content",
                PublishDate = new DateTime(2013, 12, 12)
            };
            
            var mockContext = new Mock<INewsData>();
            mockContext.Setup(c => c.News)
                .Returns(this.mock.NewsRepositoryMock.Object);

            var newsController = new NewsController(mockContext.Object);
            this.SetupController(newsController);

            // Act
            var response = newsController.ChangeNews(fakeNewsToModify.Id, newNews)
                .ExecuteAsync(CancellationToken.None).Result;

            // Assert
            var fakeNews = this.mock.NewsRepositoryMock.Object.All().ToList();
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            mockContext.Verify(c => c.SaveChanges(), Times.Once);
            Assert.AreEqual(newNews.Title, fakeNews[4].Title);
            Assert.AreEqual(newNews.Content, fakeNews[4].Content);
            Assert.AreEqual(newNews.PublishDate, fakeNews[4].PublishDate);
        }