public void GetNews_ReturnsOkAndAllNews()
        {
            // Arange
            var mockRepository = new Mock<INewsData>();
            News[] news = 
            {
                new News {Title = "News number 1", Content = "Content of first news", PublishDate = DateTime.Now},
                new News {Title = "News number 2", Content = "Content of second news", PublishDate = DateTime.Now},
                new News {Title = "News number 3", Content = "Content of third news", PublishDate = DateTime.Now},
            };

            mockRepository.Setup(rep => rep.News.All()).Returns(news.AsQueryable());

            var controller = new NewsController(mockRepository.Object);

            // Act
            IHttpActionResult result = controller.GetAll();
            var contentResult = result as OkNegotiatedContentResult<List<News>>;

            // Assert
            Assert.IsNotNull(contentResult);
            Assert.IsInstanceOfType(result, typeof(OkNegotiatedContentResult<List<News>>));
            Assert.IsNotNull(contentResult.Content);
            Assert.AreEqual(3, contentResult.Content.Count);
        }
        public void CreateNews_WithInvalidNews_ReturnsBadRequest()
        {
            // Arange
            var mockRepository = new Mock<INewsData>();
            var controller = new NewsController(mockRepository.Object);

            // Act
            IHttpActionResult result = controller.Post(new News { });

            // Assert
            Assert.IsInstanceOfType(result, typeof(BadRequestResult));
        }
        public void CreateNews_WithValidNews_ReturnsCreatedAndLocation()
        {
            // Arange
            var mockRepository = new Mock<INewsData>();
            List<News> news = new List<News>();

            mockRepository.Setup(rep => rep.News.Add(It.IsAny<News>())).Callback((News n) => news.Add(n));

            var controller = new NewsController(mockRepository.Object);

            // Act
            IHttpActionResult result = controller.Post(new News { Id = 100, Title = "News number 1", Content = "Content of first news", PublishDate = DateTime.Now });
            var createdResult = result as CreatedAtRouteNegotiatedContentResult<News>;

            // Assert
            Assert.IsNotNull(createdResult);
            Assert.AreEqual("DefaultApi", createdResult.RouteName);
            Assert.AreEqual(100, createdResult.RouteValues["id"]);
            Assert.IsInstanceOfType(result, typeof(CreatedAtRouteNegotiatedContentResult<News>));
            Assert.IsNotNull(createdResult.Content);
        }
        public void UpdateNews_WithValidNews_ReturnsOKAndModifiedNews()
        {
            // Arange
            var mockRepository = new Mock<INewsData>();
            News[] news = 
            {
                new News { Id = 100, Title = "News number 1", Content = "Content of first news", PublishDate = DateTime.Now }
            };

            mockRepository.Setup(rep => rep.News.Update(It.IsAny<News>())).Verifiable();
            mockRepository.Setup(rep => rep.News.Find(It.IsAny<int>())).Returns(news.First());
            var modifiedNewsItem = new News { Id = 100, Title = "Modified title", Content = "Content of first news", PublishDate = DateTime.Now };

            var controller = new NewsController(mockRepository.Object);

            // Act
            IHttpActionResult result = controller.Put(modifiedNewsItem);
            var updatedResult = result as NegotiatedContentResult<News>;

            // Assert
            Assert.IsNotNull(updatedResult);
            Assert.AreEqual("Modified title", updatedResult.Content.Title);
            Assert.IsInstanceOfType(result, typeof(NegotiatedContentResult<News>));
            Assert.IsNotNull(updatedResult.Content);
        }
        public void DeleteNews_NonExisitingNews_ReturnsBadRequest()
        {
            // Arange
            var mockRepository = new Mock<INewsData>();
            mockRepository.Setup(rep => rep.News.Delete(It.IsAny<int>())).Verifiable();
            var controller = new NewsController(mockRepository.Object);

            // Act
            IHttpActionResult result = controller.Delete(7);

            // Assert
            Assert.IsInstanceOfType(result, typeof(BadRequestResult));
        }
        public void DeleteNews_ExisitngNews_ReturnsOKAndModifiedNews()
        {
            // Arange
            var mockRepository = new Mock<INewsData>();
            var newsItem = new News
            {
                Id = 100,
                Title = "News number 1",
                Content = "Content of first news",
                PublishDate = DateTime.Now
            };

            var news = new List<News> 
            {
                newsItem
            };

            mockRepository.Setup(rep => rep.News.Delete(It.IsAny<int>())).Callback(()=>news.Remove(newsItem));
            mockRepository.Setup(rep => rep.News.Find(It.IsAny<int>())).Returns(news.First());

            var controller = new NewsController(mockRepository.Object);

            // Act
            IHttpActionResult result = controller.Delete(100);

            // Assert
            Assert.IsInstanceOfType(result, typeof(OkResult));
            Assert.AreEqual(0, news.Count);
        }
        public void UpdateNews_WithNonExisitngNewsNews_ReturnsBadRequest()
        {
            // Arange
            var mockRepository = new Mock<INewsData>();
            News[] news = 
            {
                new News { Id = 100, Title = "News number 1", Content = "Content of first news", PublishDate = DateTime.Now }
            };

            mockRepository.Setup(rep => rep.News.Update(It.IsAny<News>())).Verifiable();
            mockRepository.Setup(rep => rep.News.Find(It.IsAny<int>())).Returns(news.First());
            var modifiedNewsItem = new News { Id = 1000, Title = "Modified title", Content = "Content of first news", PublishDate = DateTime.Now };

            var controller = new NewsController(mockRepository.Object);

            // Act
            IHttpActionResult result = controller.Put(modifiedNewsItem);

            // Assert
            Assert.IsInstanceOfType(result, typeof(BadRequestResult));
        }