def test_repository_can_retrieve_movie_by_index(session_factory):
    repo = SqlAlchemyRepository(session_factory)
    movie = repo.get_movie_by_index(1)

    # Check that the movie has expected attributes
    assert movie.title == "Guardians of the Galaxy"
    assert movie.release_year == 2014
    assert movie.description == "A group of intergalactic criminals are forced to work together to stop a fanatical warrior from taking control of the universe."
    assert movie.director == Director("James Gunn")
    assert movie.runtime_minutes == 121
    actors = iter(movie.actors)
    assert next(actors) == Actor("Chris Pratt")
    assert next(actors) == Actor("Vin Diesel")
    assert next(actors) == Actor("Bradley Cooper")
    assert next(actors) == Actor("Zoe Saldana")

    # Check that the movie has the expected genre(s)
    assert movie.is_classified_as(Genre("Action"))
    assert movie.is_classified_as(Genre("Adventure"))
    assert movie.is_classified_as(Genre("Sci-Fi"))

    # Check that the movie has the correct reviews
    assert movie.number_of_reviews == 3

    review_1 = [review for review in movie.reviews if review.review_text == "This movie is great!"][0]
    review_2 = [review for review in movie.reviews if review.review_text == "This movie is awesome"][0]
    assert review_1.review_author.username == "fmercury"
    assert review_2.review_author.username == "thorke"
def test_repository_can_suggest_desired_movies_to_a_user(session_factory):
    repo = SqlAlchemyRepository(session_factory)
    username = "******"
    suggestions = repo.get_suggestion_for_user(username=username)

    assert len(suggestions) == 1
    assert repo.get_movie_by_index(1) in suggestions
def test_repository_can_get_expected_movie_genres(session_factory):
    repo = SqlAlchemyRepository(session_factory)
    movie_genres = iter(repo.get_movie_genres(repo.get_movie_by_index(10)))
    assert next(movie_genres) == Genre("Adventure")
    assert next(movie_genres) == Genre("Drama")
    assert next(movie_genres) == Genre("Romance")
    with pytest.raises(StopIteration):
        assert repr(next(movie_genres)) == StopIteration
def test_repository_can_get_reviews_from_a_movie(session_factory):
    repo = SqlAlchemyRepository(session_factory)
    movie_reviews = iter(repo.get_movie_reviews(repo.get_movie_by_index(1)))

    assert next(movie_reviews).review_text == "This movie is great!"
    assert next(movie_reviews).review_text == "This movie is awesome"
    assert next(movie_reviews).review_text == "Love it!"
    with pytest.raises(StopIteration):
        assert repr(next(movie_reviews).review_text) == StopIteration
def test_repository_can_get_a_list_of_genres_based_on_a_users_reviewed_movies(session_factory):
    repo = SqlAlchemyRepository(session_factory)
    guardian_of_the_galaxy = repo.get_movie_by_index(1)
    reviewed_movies = [guardian_of_the_galaxy]
    genre_list = repo.get_user_interested_genre_from_reviewed_movies(reviewed_movies)

    assert len(genre_list) == 3
    assert genre_list[0].genre_name == "Action"
    assert genre_list[1].genre_name == "Adventure"
    assert genre_list[2].genre_name == "Sci-Fi"
def test_repository_can_get_a_list_of_actors_of_a_movie(session_factory):
    repo = SqlAlchemyRepository(session_factory)
    movie = repo.get_movie_by_index(1)
    list_of_actors = list(repo.get_movie_actors(movie))

    assert Actor('Chris Pratt') in list_of_actors
    assert Actor('Vin Diesel') in list_of_actors
    assert Actor('Bradley Cooper') in list_of_actors
    assert Actor('Zoe Saldana') in list_of_actors
    assert Actor('Fake Actor') not in list_of_actors
def test_repository_can_add_a_review(session_factory):
    repo = SqlAlchemyRepository(session_factory)
    user = repo.get_user('thorke')
    movie = repo.get_movie_by_index(10)
    review = Review(user=user,
                    movie=movie,
                    review_text='Great!',
                    rating=10,
                    timestamp=date.today())
    assert repo.get_total_number_of_reviews() == 4
    assert review in repo.get_movie_reviews(movie)
    assert review in repo.get_user_reviews(user)
def test_repository_does_not_add_a_review_without_a_movie_properly_attached(session_factory):
    repo = SqlAlchemyRepository(session_factory)
    user = repo.get_user('thorke')
    movie = repo.get_movie_by_index(1)
    review = Review(user=user,
                    movie=None,
                    review_text="Awesome!",
                    rating=10,
                    timestamp=date.today())

    with pytest.raises(RepositoryException):
        # Exception expected because the Review doesn't refer to the Movie
        repo.add_review(review)
def test_repository_does_not_add_a_review_without_a_user(session_factory):
    repo = SqlAlchemyRepository(session_factory)
    movie = repo.get_movie_by_index(3)
    review = Review(user=None, movie=movie, review_text="testing", rating=6, timestamp=date.today())
    with pytest.raises(RepositoryException):
        repo.add_review(review)
def test_repository_can_get_the_release_year_of_a_movie(session_factory):
    repo = SqlAlchemyRepository(session_factory)
    movie = repo.get_movie_by_index(10)
    assert 2016 == repo.get_movie_release_year(movie)
def test_repository_returns_none_when_there_are_no_next_movies(session_factory):
    repo = SqlAlchemyRepository(session_factory)
    movie = repo.get_movie_by_index(3)
    next_year = repo.get_release_year_of_next_movie(movie)
    assert next_year is None
def test_repository_returns_release_year_of_next_movie(session_factory):
    repo = SqlAlchemyRepository(session_factory)
    movie = repo.get_movie_by_index(1)
    next_year = repo.get_release_year_of_next_movie(movie)
    assert next_year == 2016 # 2015 if using the full 1000 movies
def test_repository_returns_release_year_of_previous_movie(session_factory):
    repo = SqlAlchemyRepository(session_factory)
    movie = repo.get_movie_by_index(1)
    previous_year = repo.get_release_year_of_previous_movie(movie)

    assert previous_year == 2012  # 2013 for 1000 movies