diff --git a/play_tester.py b/play_tester.py index 9e2aecf48..6928c964b 100644 --- a/play_tester.py +++ b/play_tester.py @@ -9,16 +9,16 @@ pp = pprint.PrettyPrinter(indent=4) # play testing section -print("\n-----Wave 01 test data-----") -pp.pprint(HORROR_1) -pp.pprint(FANTASY_1) -pp.pprint(FANTASY_2) +# print("\n-----Wave 01 test data-----") +# pp.pprint(HORROR_1) +# pp.pprint(FANTASY_1) +# pp.pprint(FANTASY_2) # print("\n-----Wave 02 user_data-----") # pp.pprint(clean_wave_2_data()) -#print("\n-----Wave 03 user_data-----") -#pp.pprint(clean_wave_3_data()) +print("\n-----Wave 03 user_data-----") +pp.pprint(clean_wave_3_data()) # Wave 04 user data #print("\n-----Wave 04 user_data-----") diff --git a/tests/test_wave_01.py b/tests/test_wave_01.py index 669efee6a..c79361ea6 100644 --- a/tests/test_wave_01.py +++ b/tests/test_wave_01.py @@ -4,7 +4,7 @@ from viewing_party.party import * from tests.test_constants import * -@pytest.mark.skip() +# @pytest.mark.skip() test 1 def test_create_successful_movie(): # Arrange movie_title = MOVIE_TITLE_1 @@ -19,7 +19,7 @@ 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 @@ -32,7 +32,7 @@ def test_create_no_title_movie(): # Assert assert new_movie is None -@pytest.mark.skip() +# @pytest.mark.skip() test 3 def test_create_no_genre_movie(): # Arrange movie_title = "Title A" @@ -45,7 +45,7 @@ def test_create_no_genre_movie(): # Assert assert new_movie is None -@pytest.mark.skip() +# @pytest.mark.skip() test 4 def test_create_no_rating_movie(): # Arrange movie_title = "Title A" @@ -58,7 +58,7 @@ def test_create_no_rating_movie(): # Assert assert new_movie is None -@pytest.mark.skip() +# @pytest.mark.skip() test 5 def test_adds_movie_to_user_watched(): # Arrange movie = { @@ -79,7 +79,7 @@ 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() +# @pytest.mark.skip() test 6 def test_adds_movie_to_non_empty_user_watched(): # Arrange movie = { @@ -99,7 +99,7 @@ def test_adds_movie_to_non_empty_user_watched(): assert movie in updated_data["watched"] assert FANTASY_2 in updated_data["watched"] -@pytest.mark.skip() +# @pytest.mark.skip() test 7 def test_adds_movie_to_user_watchlist(): # Arrange movie = { @@ -120,7 +120,7 @@ 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() +# @pytest.mark.skip() test 8 def test_adds_movie_to_non_empty_user_watchlist(): # Arrange movie = { @@ -140,7 +140,7 @@ def test_adds_movie_to_non_empty_user_watchlist(): assert movie in updated_data["watchlist"] assert FANTASY_2 in updated_data["watchlist"] -@pytest.mark.skip() +# @pytest.mark.skip() test 9 def test_moves_movie_from_watchlist_to_empty_watched(): # Arrange janes_data = { @@ -159,12 +159,13 @@ def test_moves_movie_from_watchlist_to_empty_watched(): assert len(updated_data["watchlist"]) == 0 assert len(updated_data["watched"]) == 1 - raise Exception("Test needs to be completed.") + # raise Exception("Test needs to be completed.") + assert MOVIE_TITLE_1 == updated_data["watched"][0]["title"] # ******************************************************************************************* # ****** Add assertions here to test that the correct movie was added to "watched" ********** # ******************************************************************************************* -@pytest.mark.skip() +# @pytest.mark.skip() test 10 def test_moves_movie_from_watchlist_to_watched(): # Arrange movie_to_watch = HORROR_1 @@ -183,12 +184,13 @@ def test_moves_movie_from_watchlist_to_watched(): assert len(updated_data["watchlist"]) == 1 assert len(updated_data["watched"]) == 2 - raise Exception("Test needs to be completed.") + # raise Exception("Test needs to be completed.") + assert movie_to_watch["title"] not in updated_data["watchlist"] # ******************************************************************************************* # ****** Add assertions here to test that the correct movie was added to "watched" ********** # ******************************************************************************************* -@pytest.mark.skip() +# @pytest.mark.skip() test 11 def test_does_nothing_if_movie_not_in_watchlist(): # Arrange movie_to_watch = HORROR_1 @@ -205,3 +207,4 @@ def test_does_nothing_if_movie_not_in_watchlist(): assert len(updated_data["watched"]) == 1 assert movie_to_watch not in updated_data["watchlist"] assert movie_to_watch not in updated_data["watched"] + diff --git a/tests/test_wave_02.py b/tests/test_wave_02.py index 19f045c79..89cb8cfdf 100644 --- a/tests/test_wave_02.py +++ b/tests/test_wave_02.py @@ -2,7 +2,7 @@ from viewing_party.party import * from tests.test_constants import * -@pytest.mark.skip() +# @pytest.mark.skip() def test_calculates_watched_average_rating(): # Arrange janes_data = clean_wave_2_data() @@ -14,7 +14,7 @@ def test_calculates_watched_average_rating(): assert average == pytest.approx(3.58333) assert janes_data == clean_wave_2_data() -@pytest.mark.skip() +# @pytest.mark.skip() def test_empty_watched_average_rating_is_zero(): # Arrange janes_data = { @@ -27,7 +27,7 @@ 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() @@ -39,7 +39,7 @@ def test_most_watched_genre(): assert popular_genre == "Fantasy" assert janes_data == clean_wave_2_data() -@pytest.mark.skip() + def test_most_watched_genre_order_mixed(): # Arrange janes_data = clean_wave_2b_data() @@ -51,7 +51,7 @@ def test_most_watched_genre_order_mixed(): assert popular_genre == "Fantasy" assert janes_data == clean_wave_2b_data() -@pytest.mark.skip() + def test_genre_is_None_if_empty_watched(): # Arrange janes_data = { diff --git a/tests/test_wave_03.py b/tests/test_wave_03.py index 046429360..105cb8174 100644 --- a/tests/test_wave_03.py +++ b/tests/test_wave_03.py @@ -2,7 +2,8 @@ from viewing_party.party import * from tests.test_constants import * -@pytest.mark.skip() + +#@pytest.mark.skip() def test_my_unique_movies(): # Arrange amandas_data = clean_wave_3_data() @@ -16,7 +17,8 @@ def test_my_unique_movies(): assert INTRIGUE_2 in amandas_unique_movies assert amandas_data == clean_wave_3_data() -@pytest.mark.skip() +#@pytest.mark.skip() + def test_my_not_unique_movies(): # Arrange amandas_data = clean_wave_3_data() @@ -28,7 +30,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() @@ -43,7 +45,7 @@ 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() @@ -54,13 +56,17 @@ def test_friends_unique_movies_not_duplicated(): # Assert assert len(friends_unique_movies) == 3 - - raise Exception("Test needs to be completed.") + assert FANTASY_4 in friends_unique_movies + assert HORROR_1 in friends_unique_movies + assert INTRIGUE_3 in friends_unique_movies + + + #raise Exception("Test needs to be completed.") # ************************************************************************************************* # ****** Add assertions here to test that the correct movies are in friends_unique_movies ********** # ************************************************************************************************** -@pytest.mark.skip() +#@pytest.mark.skip() def test_friends_not_unique_movies(): # Arrange amandas_data = { diff --git a/tests/test_wave_04.py b/tests/test_wave_04.py index 499669077..79ab18ff7 100644 --- a/tests/test_wave_04.py +++ b/tests/test_wave_04.py @@ -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() @@ -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 = { @@ -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 = { diff --git a/tests/test_wave_05.py b/tests/test_wave_05.py index b2ba9ad33..eeab32419 100644 --- a/tests/test_wave_05.py +++ b/tests/test_wave_05.py @@ -2,7 +2,7 @@ from viewing_party.party import * from tests.test_constants import * -@pytest.mark.skip() +#@pytest.mark.skip() def test_new_genre_rec(): # Arrange sonyas_data = clean_wave_5_data() @@ -17,7 +17,7 @@ def test_new_genre_rec(): assert FANTASY_4b in recommendations assert sonyas_data == clean_wave_5_data() -@pytest.mark.skip() +#@pytest.mark.skip() def test_new_genre_rec_from_empty_watched(): # Arrange sonyas_data = { @@ -38,7 +38,7 @@ def test_new_genre_rec_from_empty_watched(): # Assert assert len(recommendations) == 0 -@pytest.mark.skip() +#@pytest.mark.skip() def test_new_genre_rec_from_empty_friends(): # Arrange sonyas_data = { @@ -52,13 +52,17 @@ def test_new_genre_rec_from_empty_friends(): } ] } + # Act + recommended_movies = get_new_rec_by_genre(sonyas_data) - raise Exception("Test needs to be completed.") + # Assert + assert len(recommended_movies) == 0 + # raise Exception("Test needs to be completed.") # ********************************************************************* # ****** Complete the Act and Assert Portions of these tests ********** # ********************************************************************* -@pytest.mark.skip() +#@pytest.mark.skip() def test_unique_rec_from_favorites(): # Arrange sonyas_data = clean_wave_5_data() @@ -72,7 +76,7 @@ def test_unique_rec_from_favorites(): assert INTRIGUE_2b in recommendations assert sonyas_data == clean_wave_5_data() -@pytest.mark.skip() +#@pytest.mark.skip() def test_unique_from_empty_favorites(): # Arrange sonyas_data = { @@ -94,7 +98,7 @@ def test_unique_from_empty_favorites(): # Assert assert len(recommendations) == 0 -@pytest.mark.skip() +#@pytest.mark.skip() def test_new_rec_from_empty_friends(): # Arrange sonyas_data = { diff --git a/viewing_party/party.py b/viewing_party/party.py index 6d34a6b5f..3add948f2 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -1,23 +1,178 @@ -# ------------- WAVE 1 -------------------- - +# 1st function in Wave 1 def create_movie(title, genre, rating): - pass -# ----------------------------------------- -# ------------- WAVE 2 -------------------- -# ----------------------------------------- + if title is None or genre is None or rating is None: + return None + + new_movie = {"title": title, "genre": genre, "rating": rating} + + if isinstance(title, str) or isinstance(genre, str) or isinstance(rating, int): + return { + "title": title, + "genre": genre, + "rating": rating + } + else: + return None + + +# 2nd function in Wave 1 +def add_to_watched(user_data, movie): + + (user_data["watched"]).append(movie) + return user_data + + +# 3rd function in Wave 1 +def add_to_watchlist(user_data, movie): + + watchlist = user_data.get("watchlist", []) + + watchlist.append(movie) + user_data["watchlist"] = watchlist + + return user_data + + +# 4th function in Wave 1 +def watch_movie(user_data, title): + + move_movie = False + index = 0 + movie = None + + for index in range(len(user_data["watchlist"])): + if title == user_data["watchlist"][index]["title"]: + move_movie = True + movie_index = index + movie = user_data["watchlist"][index] + print(user_data["watchlist"][index]) + if move_movie: + (user_data["watched"]).append(movie) + del user_data["watchlist"][movie_index] + return user_data + + +# 1st function in Wave 2 +def get_watched_avg_rating(user_data): + + movie_count = 0 + ratings_sum = 0 + ratings_avg = 0 + + if user_data["watched"]: + + for index in range(len(user_data["watched"])): + + movie_count += 1 + ratings_sum += user_data["watched"][index]["rating"] + ratings_avg = ratings_sum/movie_count + return ratings_avg + + +# 2nd function in Wave 2 +def get_most_watched_genre(user_data): + + most_watched_genre = user_data.get("watched",[]) + + if not most_watched_genre: + return None + + genres = {} + for movie in most_watched_genre: + genre = movie.get("genre") + if genre in genres: + genres[genre] += 1 + else: + genres[genre] = 1 + + most_watched_genre = max(genres, key=genres.get) + + return most_watched_genre + + +# 1st function in Wave 3 +def get_unique_watched(user_data): + + friends_watched_list = [] + friends_watched_set = None + friends_list = [] + + for friend in user_data["friends"]: + for movie in friend["watched"]: + friends_watched_list.append(movie["title"]) + friends_watched_set = set(friends_watched_list) + + for movie in user_data["watched"]: + if movie["title"] not in friends_watched_set and movie not in friends_list: + friends_list.append(movie) + + return friends_list + + +# 2nd function in Wave 3 +def get_friends_unique_watched(user_data): + + user_watched = set([movie["title"] for movie in user_data["watched"]]) + friends_list = [] + + for friend in user_data["friends"]: + for movie in friend["watched"]: + if movie["title"] not in user_watched and movie not in friends_list: + friends_list.append(movie) + + return friends_list + + +# 1st function in Wave 4 +def get_available_recs(user_data): + + unseen_by_user = get_friends_unique_watched(user_data) + user_subscriptions = user_data["subscriptions"] + available_recs = [] + + for movie in unseen_by_user: + if movie["host"] in user_subscriptions: + available_recs.append(movie) + return available_recs + + +#1st function Wave 5 +def get_new_rec_by_genre(user_data): + + user_watched = set([movie["title"] for movie in user_data["watched"]]) + friends_unique_watched = get_friends_unique_watched(user_data) + + genre_count = {} + for movie in user_data["watched"]: + genre = movie["genre"] + genre_count[genre] = genre_count.get(genre, 0) + 1 + best_genre = None + best_genre_count = 0 + for genre, count in genre_count.items(): + if count > best_genre_count: + best_genre = genre + best_genre_count = count + recommended_movies = [] + for movie in friends_unique_watched: + if movie["title"] not in user_watched and movie["genre"] == best_genre: + recommended_movies.append(movie) -# ----------------------------------------- -# ------------- WAVE 3 -------------------- -# ----------------------------------------- + return recommended_movies - -# ----------------------------------------- -# ------------- WAVE 4 -------------------- -# ----------------------------------------- -# ----------------------------------------- -# ------------- WAVE 5 -------------------- -# ----------------------------------------- +# 2ND function in Wave 5 +def get_rec_from_favorites(user_data): + + user_favorites = user_data["favorites"] + recommended_movies = [] + if user_data["friends"] == []: + return user_favorites + else: + unseen_by_friends = get_unique_watched(user_data) + for movie in unseen_by_friends: + if movie in user_favorites: + recommended_movies.append(movie) + return recommended_movies \ No newline at end of file