public void All_ShouldReturnCorrectDataWithValidInputAndParticularSearchTerm()
        {
            const string SearchTerm = "Test";

            //Arrange
            var controller = new AdminTownsController(this.townService.Object);

            this.townService.Setup(t => t.All(It.IsAny <int>(), It.IsAny <string>(), It.IsAny <int>()))
            .Returns(this.GetTowns());

            this.townService.Setup(t => t.TotalTowns(It.IsAny <string>()))
            .Returns(TotalTowns);

            //Act
            var result = controller.All(SearchTerm, MinPageSize);

            //Assert
            result.Should().BeOfType <ViewResult>();
            var model = result.As <ViewResult>().Model.As <AllTowns>();

            model.Towns.Should().HaveCount(TotalTowns);
            model.Pagination.SearchTerm.Should().Be(SearchTerm);
            model.Pagination.CurrentPage.Should().Be(MinPageSize);
            model.Pagination.NextPage.Should().Be(MaxPageSize);
            model.Pagination.PreviousPage.Should().Be(MinPageSize);
            model.Pagination.TotalElements.Should().Be(TotalTowns);
        }
        public void All_ValidPageAndNoTownsShouldReturnCountZero()
        {
            //Arrange
            var controller = new AdminTownsController(this.townService.Object);

            this.townService.Setup(t => t.All(It.IsAny <int>(), It.IsAny <string>(), It.IsAny <int>()))
            .Returns(new List <AdminTownListingServiceModel>());

            this.townService.Setup(t => t.TotalTowns(It.IsAny <string>()))
            .Returns(0);

            //Act
            var result = controller.All(string.Empty, MinPageSize);

            //Assert
            result.Should().BeOfType <ViewResult>();
            var model = result.As <ViewResult>().Model.As <AllTowns>();

            model.Towns.Should().HaveCount(0);
            model.Pagination.SearchTerm.Should().Be(string.Empty);
            model.Pagination.CurrentPage.Should().Be(MinPageSize);
            model.Pagination.NextPage.Should().Be(0);
            model.Pagination.PreviousPage.Should().Be(MinPageSize);
            model.Pagination.TotalElements.Should().Be(0);
        }
        public void All_PageGreaterThanTotalPagesShouldRedirectToAllTowns()
        {
            const int InvalidPageSize = 10;

            //Arrange
            var controller = new AdminTownsController(this.townService.Object);

            this.townService.Setup(t => t.All(It.IsAny <int>(), It.IsAny <string>(), It.IsAny <int>()))
            .Returns(this.GetTowns());

            this.townService.Setup(t => t.TotalTowns(It.IsAny <string>()))
            .Returns(TotalTowns);

            //Act
            var result = controller.All(string.Empty, InvalidPageSize);

            //Assert
            result.Should().BeOfType <RedirectToActionResult>();
            var model = result.As <RedirectToActionResult>();

            model.ActionName.Should().Be(WebConstants.Action.AdminAllTowns);
            model.RouteValues.Keys.Should().Contain(RouteValueKeyPage);
            model.RouteValues.Values.Should().Contain(MaxPageSize);
            model.RouteValues.Keys.Should().Contain(RouteValueKeySearchTerm);
            model.RouteValues.Values.Should().Contain(string.Empty);
        }
        public void ControllerShoulBeForAuthorizedUsersOnly()
        {
            //Arrange
            var controller = new AdminTownsController(null);

            //Act
            var attributes = controller.GetType().GetCustomAttributes(true);

            //Assert
            attributes.Any(a => a.GetType() == typeof(AuthorizeAttribute));
        }
        public void Get_AddTownShouldReturnAddTownForm()
        {
            //Arrange
            var controller = new AdminTownsController(this.townService.Object);

            //Act
            var result = controller.Add();

            //Assert
            result.Should().BeOfType <ViewResult>();
        }
        public void ControllerShoulBeForAdminsOnly()
        {
            //Arrange
            var controller = new AdminTownsController(null);

            //Act
            var attributes = controller.GetType().GetCustomAttributes(true);

            //Assert
            var authorizeAttribute = attributes.FirstOrDefault(a => a.GetType() == typeof(AuthorizeAttribute));

            authorizeAttribute.As <AuthorizeAttribute>().Roles.Should().Be(Role.Administrator.ToString());
        }
        public void ControllerShoulBeInAdminArea()
        {
            //Arrange
            var controller = new AdminTownsController(null);

            //Act
            var attributes = controller.GetType().GetCustomAttributes(true);

            //Assert
            attributes.Any(a => a.GetType() == typeof(AreaAttribute));
            var areaAttribute = attributes.FirstOrDefault(a => a.GetType() == typeof(AreaAttribute));

            areaAttribute.As <AreaAttribute>().RouteValue.Should().Be(WebConstants.Area.Admin);
        }
        public void All_WithPageLessOrEqualToZeroShouldRedirectToAllTowns(int page)
        {
            //Arrange
            var controller = new AdminTownsController(this.townService.Object);

            //Act
            var result = controller.All(string.Empty, page);

            //Assert
            result.Should().BeOfType <RedirectToActionResult>();
            var model = result.As <RedirectToActionResult>();

            model.ActionName.Should().Be(WebConstants.Action.AdminAllTowns);
            model.RouteValues.Keys.Should().Contain(RouteValueKeyPage);
            model.RouteValues.Values.Should().Contain(MinPageSize);
            model.RouteValues.Keys.Should().Contain(RouteValueKeySearchTerm);
            model.RouteValues.Values.Should().Contain(string.Empty);
        }
        public void Post_AddTownShouldRedirectToAllTownsWithCorrectData()
        {
            //Arrange
            var controller = new AdminTownsController(this.townService.Object);

            this.townService.Setup(t => t.TownExistsByName(It.IsAny <string>()))
            .Returns(false);

            this.PrepareTempData();

            controller.TempData = this.tempData.Object;

            //Act
            var result = controller.Add(this.GetAddTownForm());

            //Assert
            result.Should().BeOfType <RedirectToActionResult>();
            this.customMessage.Should().Be(string.Format(WebConstants.Message.TownAdded, TownName));
        }
        public void Post_AddTownShouldReturnAddTownFormForInvalidModelState()
        {
            //Arrange
            var controller = new AdminTownsController(this.townService.Object);

            controller.ModelState.AddModelError(string.Empty, "Error");

            //Act
            var result = controller.Add(this.GetAddTownForm());

            //Assert
            result.Should().BeOfType <ViewResult>();
            var model = result.As <ViewResult>().Model;

            model.Should().BeOfType <AddTownFormModel>();
            var form = model.As <AddTownFormModel>();

            form.Name.Should().Be(TownName);
        }
        public void TownStations_WithExistingTownAndNoStationsShouldReturnCountZero()
        {
            //Arrange
            var controller = new AdminTownsController(this.townService.Object);

            this.townService.Setup(t => t.TownExists(It.IsAny <int>()))
            .Returns(true);

            this.townService.Setup(t => t.TownStations(It.IsAny <int>()))
            .Returns(new List <AdminTownStationsServiceModel>());

            //Act
            var result = controller.TownStations(TownId);

            //Assert
            result.Should().BeOfType <JsonResult>();
            var model = result.As <JsonResult>().Value;

            model.As <IEnumerable <AdminTownStationsServiceModel> >().Should().HaveCount(0);
        }
        public void TownStations_ShouldRedirectToAllTownsForNonExistingTown()
        {
            //Arrange
            var controller = new AdminTownsController(this.townService.Object);

            this.townService.Setup(t => t.TownExists(It.IsAny <int>()))
            .Returns(false);

            this.PrepareTempData();

            controller.TempData = this.tempData.Object;

            //Act
            var result = controller.TownStations(TownId);

            //Assert
            result.Should().BeOfType <RedirectToActionResult>();
            var model = result.As <RedirectToActionResult>();

            model.ActionName.Should().Be(WebConstants.Action.AdminAllTowns);
            this.customMessage.Should().Be(string.Format(WebConstants.Message.NonExistingEntity, nameof(WebConstants.Entity.Town), TownId));
        }
        public void Post_AddTownShouldReturnAddTownFormForAlreadyExistingTown()
        {
            //Arrange
            var controller = new AdminTownsController(this.townService.Object);

            this.townService.Setup(t => t.TownExistsByName(It.IsAny <string>()))
            .Returns(true);

            //Act
            var result = controller.Add(this.GetAddTownForm());

            //Assert
            result.Should().BeOfType <ViewResult>();
            var errors = controller.ModelState.Root.Errors;

            errors.Any(e => e.ErrorMessage == string.Format(WebConstants.Message.EntityAlreadyExist, nameof(WebConstants.Entity.Town)));
            var model = result.As <ViewResult>().Model;

            model.Should().BeOfType <AddTownFormModel>();
            var form = model.As <AddTownFormModel>();

            form.Name.Should().Be(TownName);
        }