public void ThrowException_WhenNullOrEmptyFilmIsPassed(string film)
        {
            //Arrange
            var databaseMock = new Mock <IDatabase>();
            var sut          = new GetFilmScore(databaseMock.Object);

            //Act & Assert
            Assert.Throws <ArgumentNullException>(() => sut.GetAvgFilmScore(film));
        }
        public void ThrowException_WhenFilmNotFound()
        {
            //Arrange
            var validFilmName = "validFilmName";

            var databaseMock = new Mock <IDatabase>();

            databaseMock.Setup(x => x.Films.SingleOrDefault(y => y.Name == validFilmName)).Returns <Film>(null);

            var sut = new GetFilmScore(databaseMock.Object);

            //Act & Assert
            Assert.Throws <ArgumentException>(() => sut.GetAvgFilmScore(validFilmName));
        }
        public void ShouldReturn_AverageFilmScoreFromAllReviews()
        {
            //Arrange
            var validFilmName = "validFilmName";

            var filmMock = new Mock <Film>();

            filmMock.Object.Id   = 1;
            filmMock.Object.Name = validFilmName;

            var review1Mock = new Mock <Review>();

            review1Mock.SetupGet(x => x.Film).Returns(filmMock.Object);
            review1Mock.Object.Rating = 3.5;

            var review2Mock = new Mock <Review>();

            review2Mock.SetupGet(x => x.Film).Returns(filmMock.Object);
            review2Mock.Object.Rating = 7.5;

            var review3Mock = new Mock <Review>();

            review3Mock.SetupGet(x => x.Film).Returns(filmMock.Object);
            review3Mock.Object.Rating = 4.0;

            var reviewCollection = new HashSet <Review>();

            reviewCollection.Add(review1Mock.Object);
            reviewCollection.Add(review2Mock.Object);
            reviewCollection.Add(review3Mock.Object);

            var reviewRepository = new Mock <IReviewRepository>();

            reviewRepository.Setup(x => x.GetAll()).Returns(reviewCollection);

            var databaseMock = new Mock <IDatabase>();

            databaseMock.SetupGet(x => x.Reviews).Returns(reviewRepository.Object);

            databaseMock.Setup(x => x.Films.SingleOrDefault(It.IsAny <Expression <Func <Film, bool> > >())).Returns(filmMock.Object);

            var sut = new GetFilmScore(databaseMock.Object);

            //Act
            var result = sut.GetAvgFilmScore(validFilmName);

            //Assert
            Assert.AreEqual(5.0, result);
        }