Skip to content
Open
23 changes: 4 additions & 19 deletions tests/test_wave_01.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from viewing_party.party import *
from tests.test_constants import *

@pytest.mark.skip()
def test_create_successful_movie():
# Arrange
movie_title = MOVIE_TITLE_1
Expand All @@ -19,7 +18,6 @@ def test_create_successful_movie():
assert new_movie["genre"] == GENRE_1
assert new_movie["rating"] == pytest.approx(RATING_1)

@pytest.mark.skip()
def test_create_no_title_movie():
# Arrange
movie_title = None
Expand All @@ -32,7 +30,6 @@ def test_create_no_title_movie():
# Assert
assert new_movie is None

@pytest.mark.skip()
def test_create_no_genre_movie():
# Arrange
movie_title = "Title A"
Expand All @@ -45,7 +42,6 @@ def test_create_no_genre_movie():
# Assert
assert new_movie is None

@pytest.mark.skip()
def test_create_no_rating_movie():
# Arrange
movie_title = "Title A"
Expand All @@ -58,7 +54,6 @@ def test_create_no_rating_movie():
# Assert
assert new_movie is None

@pytest.mark.skip()
def test_adds_movie_to_user_watched():
# Arrange
movie = {
Expand All @@ -79,7 +74,6 @@ def test_adds_movie_to_user_watched():
assert updated_data["watched"][0]["genre"] == GENRE_1
assert updated_data["watched"][0]["rating"] == RATING_1

@pytest.mark.skip()
def test_adds_movie_to_user_watchlist():
# Arrange
movie = {
Expand All @@ -100,7 +94,6 @@ def test_adds_movie_to_user_watchlist():
assert updated_data["watchlist"][0]["genre"] == GENRE_1
assert updated_data["watchlist"][0]["rating"] == RATING_1

@pytest.mark.skip()
def test_moves_movie_from_watchlist_to_empty_watched():
# Arrange
janes_data = {
Expand All @@ -118,13 +111,10 @@ def test_moves_movie_from_watchlist_to_empty_watched():
# Assert
assert len(updated_data["watchlist"]) == 0
assert len(updated_data["watched"]) == 1
assert updated_data["watched"][0]["title"] == MOVIE_TITLE_1
assert updated_data["watched"][0]["genre"] == GENRE_1
assert updated_data["watched"][0]["rating"] == RATING_1
Comment on lines +114 to +116

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice checks for all the movie's data!


raise Exception("Test needs to be completed.")
# *******************************************************************************************
# ****** Add assertions here to test that the correct movie was added to "watched" **********
# *******************************************************************************************

@pytest.mark.skip()
def test_moves_movie_from_watchlist_to_watched():
# Arrange
movie_to_watch = HORROR_1
Expand All @@ -142,13 +132,8 @@ def test_moves_movie_from_watchlist_to_watched():
# Assert
assert len(updated_data["watchlist"]) == 1
assert len(updated_data["watched"]) == 2
assert movie_to_watch in updated_data["watched"]

raise Exception("Test needs to be completed.")
# *******************************************************************************************
# ****** Add assertions here to test that the correct movie was added to "watched" **********
# *******************************************************************************************

@pytest.mark.skip()
def test_does_nothing_if_movie_not_in_watchlist():
# Arrange
movie_to_watch = HORROR_1
Expand Down
4 changes: 0 additions & 4 deletions tests/test_wave_02.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from viewing_party.party import *
from tests.test_constants import *

@pytest.mark.skip()
def test_calculates_watched_average_rating():
# Arrange
janes_data = clean_wave_2_data()
Expand All @@ -14,7 +13,6 @@ def test_calculates_watched_average_rating():
assert average == pytest.approx(3.58333)
assert janes_data == clean_wave_2_data()

@pytest.mark.skip()
def test_empty_watched_average_rating_is_zero():
# Arrange
janes_data = {
Expand All @@ -27,7 +25,6 @@ def test_empty_watched_average_rating_is_zero():
# Assert
assert average == pytest.approx(0.0)

@pytest.mark.skip()
def test_most_watched_genre():
# Arrange
janes_data = clean_wave_2_data()
Expand All @@ -39,7 +36,6 @@ def test_most_watched_genre():
assert popular_genre == "Fantasy"
assert janes_data == clean_wave_2_data()

@pytest.mark.skip()
def test_genre_is_None_if_empty_watched():
# Arrange
janes_data = {
Expand Down
22 changes: 10 additions & 12 deletions tests/test_wave_03.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from viewing_party.party import *
from tests.test_constants import *

@pytest.mark.skip()

def test_my_unique_movies():
# Arrange
amandas_data = clean_wave_3_data()
Expand All @@ -16,7 +16,7 @@ def test_my_unique_movies():
assert INTRIGUE_2 in amandas_unique_movies
assert amandas_data == clean_wave_3_data()

@pytest.mark.skip()

def test_my_not_unique_movies():
# Arrange
amandas_data = clean_wave_3_data()
Expand All @@ -28,7 +28,7 @@ def test_my_not_unique_movies():
# Assert
assert len(amandas_unique_movies) == 0

@pytest.mark.skip()

def test_friends_unique_movies():
# Arrange
amandas_data = clean_wave_3_data()
Expand All @@ -43,24 +43,22 @@ def test_friends_unique_movies():
assert FANTASY_4 in friends_unique_movies
assert amandas_data == clean_wave_3_data()

@pytest.mark.skip()

def test_friends_unique_movies_not_duplicated():
# Arrange
amandas_data = clean_wave_3_data()
amandas_data["friends"][0]["watched"].append(INTRIGUE_3)

# Act
friends_unique_movies = get_friends_unique_watched(amandas_data)

# Assert
assert len(friends_unique_movies) == 3

raise Exception("Test needs to be completed.")
# *************************************************************************************************
# ****** Add assertions here to test that the correct movies are in friends_unique_movies **********
# **************************************************************************************************

@pytest.mark.skip()
assert INTRIGUE_3 in friends_unique_movies
assert HORROR_1 in friends_unique_movies
assert FANTASY_4 in friends_unique_movies


def test_friends_not_unique_movies():
# Arrange
amandas_data = {
Expand Down
6 changes: 3 additions & 3 deletions tests/test_wave_04.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from viewing_party.party import *
from tests.test_constants import *

@pytest.mark.skip()
#@pytest.mark.skip()
def test_get_available_friend_rec():
# Arrange
amandas_data = clean_wave_4_data()
Expand All @@ -16,7 +16,7 @@ def test_get_available_friend_rec():
assert FANTASY_4b in recommendations
assert amandas_data == clean_wave_4_data()

@pytest.mark.skip()
#@pytest.mark.skip()
def test_no_available_friend_recs():
# Arrange
amandas_data = {
Expand All @@ -38,7 +38,7 @@ def test_no_available_friend_recs():
# Assert
assert len(recommendations) == 0

@pytest.mark.skip()
#@pytest.mark.skip()
def test_no_available_friend_recs_watched_all():
# Arrange
amandas_data = {
Expand Down
23 changes: 12 additions & 11 deletions tests/test_wave_05.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from viewing_party.party import *
from tests.test_constants import *

@pytest.mark.skip()

def test_new_genre_rec():
# Arrange
sonyas_data = clean_wave_5_data()
Expand All @@ -17,7 +17,7 @@ def test_new_genre_rec():
assert FANTASY_4b in recommendations
assert sonyas_data == clean_wave_5_data()

@pytest.mark.skip()

def test_new_genre_rec_from_empty_watched():
# Arrange
sonyas_data = {
Expand All @@ -38,7 +38,7 @@ def test_new_genre_rec_from_empty_watched():
# Assert
assert len(recommendations) == 0

@pytest.mark.skip()

def test_new_genre_rec_from_empty_friends():
# Arrange
sonyas_data = {
Expand All @@ -52,13 +52,14 @@ def test_new_genre_rec_from_empty_friends():
}
]
}

# Act
recommendations = get_new_rec_by_genre(sonyas_data)

# Assert
assert len(recommendations) == 0


raise Exception("Test needs to be completed.")
# *********************************************************************
# ****** Complete the Act and Assert Portions of theis tests **********
# *********************************************************************

@pytest.mark.skip()
def test_unique_rec_from_favorites():
# Arrange
sonyas_data = clean_wave_5_data()
Expand All @@ -72,7 +73,7 @@ def test_unique_rec_from_favorites():
assert INTRIGUE_2b in recommendations
assert sonyas_data == clean_wave_5_data()

@pytest.mark.skip()

def test_unique_from_empty_favorites():
# Arrange
sonyas_data = {
Expand All @@ -94,7 +95,7 @@ def test_unique_from_empty_favorites():
# Assert
assert len(recommendations) == 0

@pytest.mark.skip()

def test_new_rec_from_empty_friends():
# Arrange
sonyas_data = {
Expand Down
103 changes: 98 additions & 5 deletions viewing_party/party.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,116 @@
# ------------- WAVE 1 --------------------
import statistics

def create_movie(title, genre, rating):
pass
if not title or not genre or not rating:
return None
new_movie = dict()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd suggest moving the new_movie declaration under the invalid data check so that we don't allocate space for new_movie unless we know it will be used.

new_movie["title"] = title
new_movie["genre"] = genre
new_movie["rating"] = rating
return new_movie

def add_to_watched(user_data, movie):
user_data["watched"].append(movie)
return user_data

def add_to_watchlist(user_data, movie):
user_data["watchlist"].append(movie)
return user_data

def watch_movie(user_data, title):
if not title or not user_data["watchlist"]:
return user_data
for i in range(len(user_data["watchlist"])):
movie = user_data["watchlist"][i]
if movie["title"] == title:
user_data["watched"].append(movie)
user_data["watchlist"].remove(movie)
return user_data
Comment on lines +24 to +29

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're still running into an antipattern of continuing to loop after removing an element of the list we're looping over. I would recommend keeping the for-in loop syntax and moving the return inside the if-statement something like:

for movie in user_data["watchlist"]:
    if movie["title"] == title:
        user_data["watched"].append(movie)
        user_data["watchlist"].remove(movie)
        return user_data

# -----------------------------------------
# ------------- WAVE 2 --------------------
# -----------------------------------------
def get_watched_avg_rating(user_data):
avg_rating = 0.0
sum_ratings = 0
if len(user_data["watched"]) == 0:
return 0.0
for element in user_data["watched"]:
sum_ratings += element["rating"]
avg_rating = sum_ratings/len(user_data["watched"])
return avg_rating


def get_most_watched_genre(user_data):
if len(user_data["watched"]) == 0:
return None
Comment on lines +44 to +45

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The more pythonic way to check if our variables have content is to use the truthy/falsy value which lets us check for an empty list or None all in one:

if not user_data["watched"]:
    return None

most_watched_genre = ""
list_of_genre = list()
for movie in user_data["watched"]:
list_of_genre.append(movie["genre"])
most_watched_genre = statistics.mode(list_of_genre)
return most_watched_genre
# -----------------------------------------
# ------------- WAVE 3 --------------------
# -----------------------------------------


def get_unique_watched(user_data):
if not user_data["watched"]:
return []
friends_movie_set = set()
unique_movies = list()
for friend in user_data["friends"]:
for movie in friend["watched"]:
friends_movie_set.add(movie["title"])
for user_movie in user_data["watched"]:
if user_movie["title"] not in friends_movie_set:
unique_movies.append(user_movie)
return unique_movies

def get_friends_unique_watched(user_data):
if not user_data["watched"]:
return []
friends_unique_movies = list()
for friend in user_data["friends"]:
for movie in friend["watched"]:
if ( movie not in user_data["watched"] and
movie not in friends_unique_movies):
friends_unique_movies.append(movie)
return friends_unique_movies
# -----------------------------------------
# ------------- WAVE 4 --------------------
# -----------------------------------------

def get_available_recs(user_data):
unique_friends_movie = get_friends_unique_watched(user_data)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great code reuse!

if ( not user_data["watched"] or
not unique_friends_movie or
not user_data["subscriptions"]):
return []
list_of_recommended_movies = list()
for movie in unique_friends_movie:
if movie["host"] in user_data["subscriptions"]:
list_of_recommended_movies.append(movie)
return list_of_recommended_movies
# -----------------------------------------
# ------------- WAVE 5 --------------------
# -----------------------------------------
def get_new_rec_by_genre(user_data):
if not user_data["watched"]:
return []
list_of_genre = get_most_watched_genre(user_data)
list_of_movies = get_friends_unique_watched(user_data)
if not list_of_movies or not list_of_genre:
return []
recommended_movies = list()
for movie in list_of_movies:
if movie["genre"] == list_of_genre:
recommended_movies.append(movie)
return recommended_movies

def get_rec_from_favorites(user_data):
if not user_data["watched"]:
return []
recommended_movies = list()
unique_movies = get_unique_watched(user_data)
for movie in unique_movies:
if movie in user_data["favorites"]:
recommended_movies.append(movie)
return recommended_movies