public async Task FindEntityAsync_ObjectNotFoundException_MethodAborts()
        {
            // Arrange
            var service = new SharedService(_dataMapper, _seasonRepository, _teamSeasonRepository);

            var teamName  = "Team";
            var seasonID  = 2017;
            var dbContext = A.Fake <ProFootballEntities>();

            var teamSeason = new TeamSeason();

            A.CallTo(() => _teamSeasonRepository.FindEntityAsync(dbContext, A <string> .Ignored, A <int> .Ignored))
            .Throws <ObjectNotFoundException>();

            var teamSeasonViewModel = new TeamSeasonViewModel();

            A.CallTo(() => _dataMapper.MapToTeamSeasonViewModel(A <TeamSeason> .Ignored)).Returns(teamSeasonViewModel);

            // Act
            var result = await service.FindEntityAsync(teamName, seasonID, dbContext);

            // Assert
            A.CallTo(() => _dataMapper.MapToTeamSeasonViewModel(teamSeason)).MustNotHaveHappened();
            Assert.IsNull(result);
        }
        public async Task FindEntityAsync_HappyPath()
        {
            // Arrange
            var service = new SharedService(_dataMapper, _seasonRepository, _teamSeasonRepository);

            var teamName  = "Team";
            var seasonID  = 2017;
            var dbContext = A.Fake <ProFootballEntities>();

            var teamSeason = new TeamSeason();

            A.CallTo(() => _teamSeasonRepository.FindEntityAsync(dbContext, A <string> .Ignored, A <int> .Ignored))
            .Returns(teamSeason);

            var teamSeasonViewModel = new TeamSeasonViewModel();

            A.CallTo(() => _dataMapper.MapToTeamSeasonViewModel(A <TeamSeason> .Ignored)).Returns(teamSeasonViewModel);

            // Act
            var result = await service.FindEntityAsync(teamName, seasonID, dbContext);

            // Assert
            A.CallTo(() => _teamSeasonRepository.FindEntityAsync(dbContext, teamName, seasonID))
            .MustHaveHappenedOnceExactly();
            A.CallTo(() => _dataMapper.MapToTeamSeasonViewModel(teamSeason)).MustHaveHappenedOnceExactly();
            Assert.AreSame(teamSeasonViewModel, result);
        }
        public async Task PredictGamePost_HappyPath()
        {
            // Arrange
            var controller = new GamePredictorController(_service, _sharedService);

            var guestName     = "Guest";
            var guestSeasonID = 2017;
            var hostName      = "Host";
            var hostSeasonID  = 2016;

            GamePredictorService.GuestSeasonID = guestSeasonID;
            GamePredictorService.HostSeasonID  = hostSeasonID;

            var matchup = new GamePredictionViewModel
            {
                GuestName     = guestName,
                GuestSeasonID = guestSeasonID,
                HostName      = hostName,
                HostSeasonID  = hostSeasonID
            };

            var seasons = new List <SeasonViewModel>();

            A.CallTo(() => _sharedService.GetSeasonsOrderedAsync(null)).Returns(seasons);

            var guestSeason = new TeamSeasonViewModel
            {
                TeamName = guestName,
                SeasonID = guestSeasonID
            };

            A.CallTo(() => _sharedService.FindEntityAsync(matchup.GuestName, matchup.GuestSeasonID, null))
            .Returns(guestSeason);

            var guestSeasons = new List <TeamSeasonViewModel>();

            A.CallTo(() => _service.GetEntities((int)GamePredictorService.GuestSeasonID, null))
            .Returns(guestSeasons);

            var hostSeason = new TeamSeasonViewModel
            {
                TeamName = hostName,
                SeasonID = hostSeasonID
            };

            A.CallTo(() => _sharedService.FindEntityAsync(matchup.HostName, matchup.HostSeasonID, null))
            .Returns(hostSeason);

            var hostSeasons = new List <TeamSeasonViewModel>();

            A.CallTo(() => _service.GetEntities((int)GamePredictorService.HostSeasonID, null))
            .Returns(hostSeasons);

            // Act
            var result = await controller.PredictGame(matchup);

            // Assert
            A.CallTo(() => _sharedService.GetSeasonsOrderedAsync(null)).MustHaveHappenedOnceExactly();

            Assert.IsInstanceOf <ViewResult>(result);
            var resultAsViewResult = result as ViewResult;

            var viewBag = resultAsViewResult.ViewBag;

            A.CallTo(() => _sharedService.FindEntityAsync(matchup.GuestName, matchup.GuestSeasonID, null))
            .MustHaveHappenedOnceExactly();

            var viewBagGuestSeasonID = viewBag.GuestSeasonID;

            Assert.IsInstanceOf <SelectList>(viewBagGuestSeasonID);
            Assert.AreSame(seasons, viewBagGuestSeasonID.Items);
            Assert.AreEqual("ID", viewBagGuestSeasonID.DataValueField);
            Assert.AreEqual("ID", viewBagGuestSeasonID.DataTextField);
            Assert.AreEqual(guestSeason.SeasonID, viewBagGuestSeasonID.SelectedValues[0]);

            A.CallTo(() => _service.GetEntities((int)GamePredictorService.GuestSeasonID, null))
            .MustHaveHappenedOnceExactly();

            var viewBagGuestName = viewBag.GuestName;

            Assert.IsInstanceOf <SelectList>(viewBagGuestName);
            Assert.AreSame(guestSeasons, viewBagGuestName.Items);
            Assert.AreEqual("TeamName", viewBagGuestName.DataValueField);
            Assert.AreEqual("TeamName", viewBagGuestName.DataTextField);
            Assert.AreEqual(guestSeason.TeamName, viewBagGuestName.SelectedValues[0]);

            A.CallTo(() => _sharedService.FindEntityAsync(matchup.HostName, matchup.HostSeasonID, null))
            .MustHaveHappenedOnceExactly();

            var viewBagHostSeasonID = viewBag.HostSeasonID;

            Assert.IsInstanceOf <SelectList>(viewBagHostSeasonID);
            Assert.AreSame(seasons, viewBagHostSeasonID.Items);
            Assert.AreEqual("ID", viewBagHostSeasonID.DataValueField);
            Assert.AreEqual("ID", viewBagHostSeasonID.DataTextField);
            Assert.AreEqual(hostSeason.SeasonID, viewBagHostSeasonID.SelectedValues[0]);

            A.CallTo(() => _service.GetEntities((int)GamePredictorService.HostSeasonID, null))
            .MustHaveHappenedOnceExactly();

            var viewBagHostName = viewBag.HostName;

            Assert.IsInstanceOf <SelectList>(viewBagHostName);
            Assert.AreSame(hostSeasons, viewBagHostName.Items);
            Assert.AreEqual("TeamName", viewBagHostName.DataValueField);
            Assert.AreEqual("TeamName", viewBagHostName.DataTextField);
            Assert.AreEqual(hostSeason.TeamName, viewBagHostName.SelectedValues[0]);

            Assert.AreSame(matchup, resultAsViewResult.Model);
        }