public async Task EditPost_WhenIdEqualsSeasonIdAndModelStateIsValidAndDbUpdateConcurrencyExceptionIsCaughtAndSeasonWithIdExists_ShouldRethrowException()
        {
            // Arrange
            var seasonsIndexViewModel   = A.Fake <ISeasonsIndexViewModel>();
            var seasonsDetailsViewModel = A.Fake <ISeasonsDetailsViewModel>();

            var seasonRepository = A.Fake <ISeasonRepository>();

            A.CallTo(() => seasonRepository.Update(A <Season> .Ignored)).Throws <DbUpdateConcurrencyException>();
            A.CallTo(() => seasonRepository.SeasonExists(A <int> .Ignored)).Returns(true);

            var sharedRepository = A.Fake <ISharedRepository>();
            var testController   = new SeasonsController(seasonsIndexViewModel, seasonsDetailsViewModel,
                                                         seasonRepository, sharedRepository);

            int id     = 1;
            var season = new Season
            {
                ID = 1
            };

            // Act
            var func = new Func <Task <IActionResult> >(async() => await testController.Edit(id, season));

            // Assert
            await func.ShouldThrowAsync <DbUpdateConcurrencyException>();
        }
        public async Task EditPost_WhenIdEqualsSeasonIdAndModelStateIsNotValid_ShouldReturnSeasonEditView()
        {
            // Arrange
            var seasonsIndexViewModel   = A.Fake <ISeasonsIndexViewModel>();
            var seasonsDetailsViewModel = A.Fake <ISeasonsDetailsViewModel>();
            var seasonRepository        = A.Fake <ISeasonRepository>();
            var sharedRepository        = A.Fake <ISharedRepository>();
            var testController          = new SeasonsController(seasonsIndexViewModel, seasonsDetailsViewModel,
                                                                seasonRepository, sharedRepository);

            int id     = 1;
            var season = new Season
            {
                ID = 1
            };

            testController.ModelState.AddModelError("LongName", "Please enter a long name.");

            // Act
            var result = await testController.Edit(id, season);

            // Assert
            A.CallTo(() => seasonRepository.Update(A <Season> .Ignored)).MustNotHaveHappened();
            A.CallTo(() => sharedRepository.SaveChangesAsync()).MustNotHaveHappened();
            result.ShouldBeOfType <ViewResult>();
            ((ViewResult)result).Model.ShouldBe(season);
        }
        public async Task EditPost_WhenIdEqualsSeasonIdAndModelStateIsValidAndDbUpdateConcurrencyExceptionIsCaughtAndSeasonWithIdDoesNotExist_ShouldReturnNotFound()
        {
            // Arrange
            var seasonsIndexViewModel   = A.Fake <ISeasonsIndexViewModel>();
            var seasonsDetailsViewModel = A.Fake <ISeasonsDetailsViewModel>();

            var seasonRepository = A.Fake <ISeasonRepository>();

            A.CallTo(() => seasonRepository.Update(A <Season> .Ignored)).Throws <DbUpdateConcurrencyException>();
            A.CallTo(() => seasonRepository.SeasonExists(A <int> .Ignored)).Returns(false);

            var sharedRepository = A.Fake <ISharedRepository>();
            var testController   = new SeasonsController(seasonsIndexViewModel, seasonsDetailsViewModel,
                                                         seasonRepository, sharedRepository);

            int id     = 1;
            var season = new Season
            {
                ID = 1
            };

            // Act
            var result = await testController.Edit(id, season);

            // Assert
            result.ShouldBeOfType <NotFoundResult>();
        }
        public async Task EditPost_WhenIdEqualsSeasonIdAndModelStateIsValidAndDbUpdateConcurrencyExceptionIsNotCaught_ShouldUpdateSeasonInDataStoreAndRedirectToIndexView()
        {
            // Arrange
            var seasonsIndexViewModel   = A.Fake <ISeasonsIndexViewModel>();
            var seasonsDetailsViewModel = A.Fake <ISeasonsDetailsViewModel>();
            var seasonRepository        = A.Fake <ISeasonRepository>();
            var sharedRepository        = A.Fake <ISharedRepository>();
            var testController          = new SeasonsController(seasonsIndexViewModel, seasonsDetailsViewModel,
                                                                seasonRepository, sharedRepository);

            int id     = 1;
            var season = new Season
            {
                ID = 1
            };

            // Act
            var result = await testController.Edit(id, season);

            // Assert
            A.CallTo(() => seasonRepository.Update(season)).MustHaveHappenedOnceExactly();
            A.CallTo(() => sharedRepository.SaveChangesAsync()).MustHaveHappenedOnceExactly();
            result.ShouldBeOfType <RedirectToActionResult>();
            ((RedirectToActionResult)result).ActionName.ShouldBe <string>(nameof(testController.Index));
        }
        public async Task EditGet_WhenIdIsNotNullAndSeasonFound_ShouldReturnSeasonEditView()
        {
            // Arrange
            var seasonsIndexViewModel   = A.Fake <ISeasonsIndexViewModel>();
            var seasonsDetailsViewModel = A.Fake <ISeasonsDetailsViewModel>();

            var    seasonRepository = A.Fake <ISeasonRepository>();
            Season?season           = new Season();

            A.CallTo(() => seasonRepository.GetSeasonAsync(A <int> .Ignored)).Returns(season);

            var sharedRepository = A.Fake <ISharedRepository>();
            var testController   = new SeasonsController(seasonsIndexViewModel, seasonsDetailsViewModel,
                                                         seasonRepository, sharedRepository);

            int?id = 0;

            // Act
            var result = await testController.Edit(id);

            // Assert
            A.CallTo(() => seasonRepository.GetSeasonAsync(id.Value)).MustHaveHappenedOnceExactly();
            result.ShouldBeOfType <ViewResult>();
            ((ViewResult)result).Model.ShouldBe(season);
        }
        public async void 年度を登録する()
        {
            // Arrange
            var id        = 100000;
            var viewModel = new EditViewModel(
                id,
                "2020年度",
                new DateTime(2020, 4, 1),
                new DateTime(2021, 3, 31),
                new DateTime(2020, 3, 31),
                5000,
                500,
                200);

            var season = new Season(
                "2020年度",
                new DateTime(2020, 4, 1),
                new DateTime(2021, 3, 31),
                new DateTime(2020, 3, 31),
                new TeamRegistrationFee(5000),
                new PlayerRegistrationFee(500),
                new PlayerTradeFee(200))
            {
                Id = id
            };

            var mockUseCase = new Mock <ISeasonUseCase>();

            mockUseCase.Setup(m => m.UpdateSeason(id, new DateTime(2020, 4, 1), new DateTime(2021, 3, 31), new DateTime(2020, 3, 31), 5000, 500, 200))
            .ReturnsAsync(season)
            .Verifiable();
            var controller = new SeasonsController(mockUseCase.Object);

            // Act
            var result = await controller.Edit(viewModel);

            // Assert
            mockUseCase.Verify();
            var viewResulut = Assert.IsType <ViewResult>(result);

            Assert.Null(viewResulut.ViewName);
            var model = Assert.IsType <EditViewModel>(viewResulut.Model);

            Assert.Equal(id, model.SeasonId);
            Assert.Equal(viewModel.SeasonName, model.SeasonName);
            Assert.Equal(viewModel.FromDate, model.FromDate);
            Assert.Equal(viewModel.ToDate, model.ToDate);
            Assert.Equal(viewModel.RegistrationFromDate, model.RegistrationFromDate);
            Assert.Equal(viewModel.TeamRegistrationFee, model.TeamRegistrationFee);
            Assert.Equal(viewModel.PlayerRegistrationFee, model.PlayerRegistrationFee);
            Assert.Equal(viewModel.PlayerTradeFee, model.PlayerTradeFee);
        }
        public async Task EditGet_WhenIdIsNull_ShouldReturnNotFound()
        {
            // Arrange
            var seasonsIndexViewModel   = A.Fake <ISeasonsIndexViewModel>();
            var seasonsDetailsViewModel = A.Fake <ISeasonsDetailsViewModel>();
            var seasonRepository        = A.Fake <ISeasonRepository>();
            var sharedRepository        = A.Fake <ISharedRepository>();
            var testController          = new SeasonsController(seasonsIndexViewModel, seasonsDetailsViewModel,
                                                                seasonRepository, sharedRepository);

            int?id = null;

            // Act
            var result = await testController.Edit(id);

            // Assert
            result.ShouldBeOfType <NotFoundResult>();
        }
        public async Task EditPost_WhenIdDoesNotEqualSeasonId_ShouldReturnNotFound()
        {
            // Arrange
            var seasonsIndexViewModel   = A.Fake <ISeasonsIndexViewModel>();
            var seasonsDetailsViewModel = A.Fake <ISeasonsDetailsViewModel>();
            var seasonRepository        = A.Fake <ISeasonRepository>();
            var sharedRepository        = A.Fake <ISharedRepository>();
            var testController          = new SeasonsController(seasonsIndexViewModel, seasonsDetailsViewModel,
                                                                seasonRepository, sharedRepository);

            int id     = 0;
            var season = new Season
            {
                ID = 1
            };

            // Act
            var result = await testController.Edit(id, season);

            // Assert
            result.ShouldBeOfType <NotFoundResult>();
        }
        public async void 年度更新時無効な値の場合再表示する()
        {
            // Arrange
            var viewModel = new EditViewModel(
                100000,
                "2020年度",
                new DateTime(2020, 4, 1),
                new DateTime(2021, 3, 31),
                new DateTime(2020, 3, 31),
                5000,
                500,
                200);

            var mockUseCase = new Mock <ISeasonUseCase>();
            var controller  = new SeasonsController(mockUseCase.Object);

            controller.ModelState.AddModelError("error", "some error");

            // Act
            var result = await controller.Edit(viewModel);

            // Arrange
            var viewResult = Assert.IsType <ViewResult>(result);

            Assert.Null(viewResult.ViewName);
            var model = Assert.IsType <EditViewModel>(viewResult.ViewData.Model);

            Assert.Equal(viewModel.SeasonId, model.SeasonId);
            Assert.Equal(viewModel.SeasonName, model.SeasonName);
            Assert.Equal(viewModel.FromDate, model.FromDate);
            Assert.Equal(viewModel.ToDate, model.ToDate);
            Assert.Equal(viewModel.RegistrationFromDate, model.RegistrationFromDate);
            Assert.Equal(viewModel.TeamRegistrationFee, model.TeamRegistrationFee);
            Assert.Equal(viewModel.PlayerRegistrationFee, model.PlayerRegistrationFee);
            Assert.Equal(viewModel.PlayerTradeFee, model.PlayerTradeFee);
        }