public async Task Create_NoAdminPrivileges_NotAddedToDatabase()
        {
            // Arrange
            var identity    = new GenericIdentity("Jack");
            var principal   = new Mock <ClaimsPrincipal>();
            var mockService = new Mock <IDifficultyService>();
            DifficultyController controller = new DifficultyController(mockService.Object);
            var controllerContext           = new Mock <ControllerContext>();

            principal.Setup(p => p.IsInRole("Administrator"))
            .Returns(false);
            principal.SetupGet(p => p.Identity.Name).Returns("Jack");
            controllerContext.SetupGet(c => c.HttpContext.User)
            .Returns(principal.Object);
            controller.ControllerContext = controllerContext.Object;

            var difficultyListViewModel = new DifficultyCreateViewModel {
                Name = "Red", Color = "#4286f4"
            };

            // Act
            var result = await controller.Create(difficultyListViewModel);

            // Assert
            var redirectToActionResult = Assert.IsType <RedirectToActionResult>(result);

            Assert.Equal("Difficulty", redirectToActionResult.ControllerName);
            Assert.Equal("Create", redirectToActionResult.ActionName);
            mockService.Verify(service => service.AddDifficulty(It.IsAny <string>(), It.IsAny <string>()), Times.Never); // checks that the sectionService.AddSection was called once.
        }
        public IActionResult Create()
        {
            DifficultyCreateViewModel model = new DifficultyCreateViewModel
            {
                Difficulties = _difficultyService.GetAllDifficulties()
            };

            return(View(model));
        }
        public async Task <IActionResult> Create(DifficultyCreateViewModel model)
        {
            if (!string.IsNullOrEmpty(model.Name) &&
                !string.IsNullOrEmpty(model.Color) &&
                IsHexColorString(model.Color))
            {
                _difficultyService.AddDifficulty(model.Name, model.Color);
            }

            return(RedirectToAction(nameof(Create), "Difficulty"));
        }
        [InlineData("Red", "#4286f45")] // Invalid Color
        public async Task Create_InputsAreInvalid_NotAddedToDatabaseAndRedirectsToListAction(string name, string color)
        {
            // Arrange
            var mockService = new Mock <IDifficultyService>();
            DifficultyController controller = new DifficultyController(mockService.Object);
            var difficultyListViewModel     = new DifficultyCreateViewModel {
                Name = name, Color = color
            };

            // Act
            var result = await controller.Create(difficultyListViewModel);

            // Assert
            var redirectToActionResult = Assert.IsType <RedirectToActionResult>(result);

            Assert.Equal("Difficulty", redirectToActionResult.ControllerName);
            Assert.Equal("Create", redirectToActionResult.ActionName);
            mockService.Verify(service => service.AddDifficulty(It.IsAny <string>(), It.IsAny <string>()), Times.Never); // checks that the sectionService.AddSection is never called.
        }
        public async Task Delete_IdValid_RemovedFromDatabaseAndRedirectsToListAction()
        {
            // Arrange
            var mockService = new Mock <IDifficultyService>();
            DifficultyController controller = new DifficultyController(mockService.Object);
            var difficultyListViewModel     = new DifficultyCreateViewModel {
                ID = 1
            };

            // Act
            var result = await controller.Delete(difficultyListViewModel);

            // Assert
            var redirectToActionResult = Assert.IsType <RedirectToActionResult>(result);

            Assert.Equal("Difficulty", redirectToActionResult.ControllerName);
            Assert.Equal("Create", redirectToActionResult.ActionName);
            mockService.Verify(service => service.RemoveDifficulty(It.Is <int?>(i => i == 1)), Times.Once);
        }
        public async Task <IActionResult> Delete(DifficultyCreateViewModel model)
        {
            _difficultyService.RemoveDifficulty(model.ID);

            return(RedirectToAction(nameof(Create), "Difficulty"));
        }