public async Task RedirectWhenUpdateAsAdmin()
        {
            // Assign
            var oldNewsItem     = GetFakeNews().First();
            var newNewsItem     = GetFakeNews().First();
            var dateTimeFactory = new DateTimeFactory();
            var fileServiceMock = new Mock <IFileStorageService>();
            var user            = new ClaimsPrincipalFake(new Claim(ClaimTypes.Role, "Admin"));

            newNewsItem.UserId = "anne.the.admin";

            DbContextFake.SeedDb <IntranetApiContext>(c => c.News.AddRange(oldNewsItem), ensureDeleted: true);

            using (var context = DbContextFake.GetDbContext <IntranetApiContext>())
            {
                var newsController = ControllerFake.GetController <NewsController>(context, dateTimeFactory, fileServiceMock.Object);
                newsController.ControllerContext.HttpContext.User = user;

                // Act
                var result = await newsController.Edit(1, new NewsViewModel(newNewsItem));

                // Assert
                Assert.True(result.ValidateActionRedirect("Details"));
            }
        }
        public async Task CheckNewsItemWasCorrectlyPosted()
        {
            // Assign
            var newsItem        = GetFakeNews().First();
            var dateTimeFactory = new DateTimeFactory();
            var fileServiceMock = new Mock <IFileStorageService>();
            var username        = "******";
            var displayName     = "Test User";
            var user            = new ClaimsPrincipalFake(new[] {
                new Claim(ClaimTypes.NameIdentifier, username),
                new Claim(ClaimTypes.Name, displayName),
            });

            using (var context = DbContextFake.GetDbContext <IntranetApiContext>())
            {
                var newsController = ControllerFake.GetController <NewsController>(context, dateTimeFactory, fileServiceMock.Object);
                newsController.ControllerContext.HttpContext.User = user;

                // Act
                await newsController.Create(new NewsViewModel(newsItem));
            }

            using (var context = DbContextFake.GetDbContext <IntranetApiContext>())
            {
                var news = context.News.Include(m => m.User).First();

                // Assert
                Assert.NotNull(news);
                Assert.True(news.Text == newsItem.Text);
                Assert.True(news.Title == newsItem.Title);
                Assert.True(news.UserId == username);
                Assert.True(news.User.Username == username);
                Assert.True(news.User.DisplayName == displayName);
            }
        }
        public async Task SetPublishDateWhenCreatingNews()
        {
            // Assign
            var dateTimeOffsetCreated = new DateTimeOffset(2017, 7, 18, 0, 0, 0, TimeSpan.Zero);
            var newsItem = GetFakeNews(dateTimeOffsetCreated).First();
            var dateTimeFactoryCreatedMock = new Mock <IDateTimeFactory>();
            var fileServiceMock            = new Mock <IFileStorageService>();

            dateTimeFactoryCreatedMock.SetupGet(d => d.DateTimeOffsetUtc).Returns(dateTimeOffsetCreated);

            var user = new ClaimsPrincipalFake(new Claim(ClaimTypes.NameIdentifier, "anne.the.admin"));

            newsItem.UserId    = "anne.the.admin";
            newsItem.Published = true;

            DbContextFake.SeedDb <IntranetApiContext>(c => c.News.AddRange(newsItem), ensureDeleted: true);

            using (var context = DbContextFake.GetDbContext <IntranetApiContext>())
            {
                var newsController = ControllerFake.GetController <NewsController>(context, dateTimeFactoryCreatedMock.Object, fileServiceMock.Object);
                newsController.ControllerContext.HttpContext.User = user;

                // Act
                var result = await newsController.Create(new NewsViewModel(newsItem));
            }

            using (var context = DbContextFake.GetDbContext <IntranetApiContext>())
            {
                // Assert
                Assert.Equal(context.News.First().Created, dateTimeOffsetCreated);
                Assert.Equal(context.News.First().Updated, dateTimeOffsetCreated);
                Assert.True(context.News.First().Published);
                Assert.True(context.News.First().HasEverBeenPublished);
            }
        }
        public void CheckNewsItemWasCorrectlyPosted()
        {
            // Assign
            var newsItem        = GetFakeNews().First();
            var dateTimeFactory = new DateTimeFactory();
            var username        = "******";
            var displayName     = "Test User";
            var user            = new ClaimsPrincipalFake(new[] {
                new Claim("username", username),
                new Claim("displayName", displayName),
            });

            using (var context = DbContextFake.GetDbContext <IntranetApiContext>())
            {
                var newsController = ControllerFake.GetController <NewsController>(context, dateTimeFactory);
                newsController.ControllerContext.HttpContext.User = user;

                // Act
                newsController.Post(new NewsViewModel(newsItem));
            }

            using (var context = DbContextFake.GetDbContext <IntranetApiContext>())
            {
                var news = context.News.Include(m => m.User).First();

                // Assert
                Assert.NotNull(news);
                Assert.True(news.Text == newsItem.Text);
                Assert.True(news.Title == newsItem.Title);
                Assert.True(news.UserId == username);
                Assert.True(news.User.Username == username);
                Assert.True(news.User.DisplayName == displayName);
            }
        }
        public void ReturnOkResultWhenDeleteAsAdmin()
        {
            // Assign
            var news            = GetFakeNews().First();
            var user            = new ClaimsPrincipalFake(new Claim("role", "admin"));
            var dateTimeFactory = new DateTimeFactory();

            DbContextFake.SeedDb <IntranetApiContext>(c => c.News.AddRange(news), ensureDeleted: true);

            using (var context = DbContextFake.GetDbContext <IntranetApiContext>())
            {
                var newsController = ControllerFake.GetController <NewsController>(context, dateTimeFactory);
                newsController.ControllerContext.HttpContext.User = user;

                // Act
                var result = newsController.Delete(1);

                // Assert
                Assert.IsType <OkResult>(result);
            }
        }
        public void ReturnOkResultWhenPosting()
        {
            // Assign
            var newsItem        = GetFakeNews().First();
            var newsItemVM      = new NewsViewModel(newsItem);
            var username        = "******";
            var user            = new ClaimsPrincipalFake(new Claim("username", username));
            var dateTimeFactory = new DateTimeFactory();

            using (var context = DbContextFake.GetDbContext <IntranetApiContext>())
            {
                var newsController = ControllerFake.GetController <NewsController>(context, dateTimeFactory);
                newsController.ControllerContext.HttpContext.User = user;

                // Act
                var result = newsController.Post(newsItemVM);

                // Assert
                Assert.IsType <OkObjectResult>(result);
            }
        }
        public async Task ValidModelStateWhenPosting()
        {
            // Assign
            var newsItem        = GetFakeNews().First();
            var newsItemVM      = new NewsViewModel(newsItem);
            var username        = "******";
            var user            = new ClaimsPrincipalFake(new Claim(ClaimTypes.NameIdentifier, username));
            var dateTimeFactory = new DateTimeFactory();
            var fileServiceMock = new Mock <IFileStorageService>();

            using (var context = DbContextFake.GetDbContext <IntranetApiContext>())
            {
                var newsController = ControllerFake.GetController <NewsController>(context, dateTimeFactory, fileServiceMock.Object);
                newsController.ControllerContext.HttpContext.User = user;

                // Act
                var result = await newsController.Create(newsItemVM);

                // Assert
                Assert.True(result.ValidateActionRedirect("Details"));
            }
        }
        public async Task RedirectWhenDeleteAsAdmin()
        {
            // Assign
            var news            = GetFakeNews().First();
            var user            = new ClaimsPrincipalFake(new Claim(ClaimTypes.Role, "Admin"));
            var dateTimeFactory = new DateTimeFactory();
            var fileServiceMock = new Mock <IFileStorageService>();

            DbContextFake.SeedDb <IntranetApiContext>(c => c.News.AddRange(news), ensureDeleted: true);

            using (var context = DbContextFake.GetDbContext <IntranetApiContext>())
            {
                var newsController = ControllerFake.GetController <NewsController>(context, dateTimeFactory, fileServiceMock.Object);
                newsController.ControllerContext.HttpContext.User = user;

                // Act
                var result = await newsController.DeleteConfirmed(1);

                // Assert
                Assert.True(result.ValidateActionRedirect("Index"));
            }
        }
        public async Task ValidModelStateWhenDeleteOwnNews()
        {
            // Assign
            var news            = GetFakeNews().First();
            var user            = new ClaimsPrincipalFake(new Claim(ClaimTypes.NameIdentifier, "anne.the.admin"));
            var dateTimeFactory = new DateTimeFactory();
            var fileServiceMock = new Mock <IFileStorageService>();

            DbContextFake.SeedDb <IntranetApiContext>(c => c.News.AddRange(news), ensureDeleted: true);

            using (var context = DbContextFake.GetDbContext <IntranetApiContext>())
            {
                var newsController = ControllerFake.GetController <NewsController>(context, dateTimeFactory, fileServiceMock.Object);
                newsController.ControllerContext.HttpContext.User = user;

                // Act
                var result = await newsController.Delete(1);

                // Assert
                Assert.IsType <ViewResult>(result);
                Assert.True(result.ModelStateIsValid());
            }
        }
        public void SetPublishDateWhenUpdateNews()
        {
            // Assign
            var dateTimeOffsetCreated      = new DateTimeOffset(2017, 7, 18, 0, 0, 0, TimeSpan.Zero);
            var dateTimeOffsetUpdated      = new DateTimeOffset(2017, 7, 19, 0, 0, 0, TimeSpan.Zero);
            var oldNewsItem                = GetFakeNews(dateTimeOffsetCreated).First();
            var newNewsItem                = GetFakeNews(dateTimeOffsetCreated).First();
            var dateTimeFactoryCreatedMock = new Mock <IDateTimeFactory>();
            var dateTimeFactoryUpdatedMock = new Mock <IDateTimeFactory>();

            dateTimeFactoryUpdatedMock.SetupGet(d => d.DateTimeOffsetUtc).Returns(dateTimeOffsetUpdated);

            var user = new ClaimsPrincipalFake(new Claim("username", "anne.the.admin"));

            oldNewsItem.Published = true;

            newNewsItem.UserId    = "anne.the.admin";
            newNewsItem.Published = true;

            DbContextFake.SeedDb <IntranetApiContext>(c => c.News.AddRange(oldNewsItem), ensureDeleted: true);

            using (var context = DbContextFake.GetDbContext <IntranetApiContext>())
            {
                var newsController = ControllerFake.GetController <NewsController>(context, dateTimeFactoryUpdatedMock.Object);
                newsController.ControllerContext.HttpContext.User = user;

                // Act
                var result = newsController.Put(oldNewsItem.Id, new NewsViewModel(newNewsItem));
            }

            using (var context = DbContextFake.GetDbContext <IntranetApiContext>())
            {
                // Assert
                Assert.Equal(context.News.First().Created, dateTimeOffsetCreated);
                Assert.Equal(context.News.First().Updated, dateTimeOffsetUpdated);
            }
        }
        public void ReturnOkResultWhenUpdateAsAdmin()
        {
            // Assign
            var oldNewsItem     = GetFakeNews().First();
            var newNewsItem     = GetFakeNews().First();
            var dateTimeFactory = new DateTimeFactory();
            var user            = new ClaimsPrincipalFake(new Claim("role", "admin"));

            newNewsItem.UserId = "anne.the.admin";

            DbContextFake.SeedDb <IntranetApiContext>(c => c.News.AddRange(oldNewsItem), ensureDeleted: true);

            using (var context = DbContextFake.GetDbContext <IntranetApiContext>())
            {
                var newsController = ControllerFake.GetController <NewsController>(context, dateTimeFactory);
                newsController.ControllerContext.HttpContext.User = user;

                // Act
                var result = newsController.Put(1, new NewsViewModel(newNewsItem));

                // Assert
                Assert.IsType <OkObjectResult>(result);
            }
        }