import json import sqlite3 from pathlib import Path import pytest import retrieval_utils from retrieval_utils import get_recommendations # Setup Test DB def _setup_test_db(db_path: str): # Setup the DB Connection connection = sqlite3.connect(db_path) cursor = connection.cursor() # Create Test Anime Table cursor.execute( """ CREATE TABLE Anime ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, score REAL NOT NULL, synopsis TEXT ); """ ) # Create Test Genre Table cursor.execute( """ CREATE TABLE Genre ( id INTEGER PRIMARY KEY, genre_name TEXT NOT NULL ); """ ) # Create Test AnimeGenre Table cursor.execute( """ CREATE TABLE AnimeGenre ( anime_id INTEGER NOT NULL, genre_id INTEGER NOT NULL ); """ ) # Define new values to be inserted in the Anime Table anime_rows = [ (1, "Alpha", 9.1, "Alpha synopsis"), (2, "Beta", 8.7, "Beta synopsis"), (3, "Gamma", 8.9, "Gamma synopsis"), (4, "Delta", 7.5, "Delta synopsis"), ] # Define new values to be inserted in the Genre Table genre_rows = [ (1, "Action"), (2, "Drama"), (3, "Comedy"), ] # Define new values to be inserted in the AnimeGenre Table anime_genre_rows = [ (1, 1), (1, 2), # Alpha: Action, Drama (2 matches) (2, 1), # Beta: Action (1 match) (3, 2), # Gamma: Drama (1 match) (4, 3), # Delta: Comedy (0 matches for Action/Drama) ] # Insert into all Tables the defined new values above cursor.executemany("INSERT INTO Anime VALUES (?, ?, ?, ?);", anime_rows) cursor.executemany("INSERT INTO Genre VALUES (?, ?);", genre_rows) cursor.executemany("INSERT INTO AnimeGenre VALUES (?, ?);", anime_genre_rows) # Commit all the writes to the DB file connection.commit() # Close the cursor and the connection cursor.close() connection.close() def test_get_recommendations_orders_by_match_count_then_score(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): # Setup Test Data and Mocks # Construct a temporary path for the Test DB db_path = tmp_path / "test.db" # Setup the test db _setup_test_db(str(db_path)) # Monkeypatch the DB_PATH variable of retrieval_utils file monkeypatch.setattr(retrieval_utils, "DB_PATH", str(db_path)) # Execute the Method under Test result_json = get_recommendations(["Action", "Drama"], limit=3) result = json.loads(result_json) # Assert on the results assert [item["name"] for item in result] == ["Alpha", "Gamma", "Beta"] assert result[0]["score"] == 9.1 assert "description" in result[0] def test_get_recommendations_respects_limit(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): # Setup Test Data and Mocks # Construct a temporary path for the Test DB db_path = tmp_path / "test.db" # Setup the test db _setup_test_db(str(db_path)) # Monkeypatch the DB_PATH variable of retrieval_utils file monkeypatch.setattr(retrieval_utils, "DB_PATH", str(db_path)) # Execute the Method under Test result_json = get_recommendations(["Action", "Drama"], limit=1) result = json.loads(result_json) # Assert on the results assert len(result) == 1 assert result[0]["name"] == "Alpha" def test_get_recommendations_single_genre(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): # Setup Test Data and Mocks # Construct a temporary path for the Test DB db_path = tmp_path / "test.db" # Setup the test db _setup_test_db(db_path) # Monkeypatch the DB_PATH variable of retrieval_utils file monkeypatch.setattr(retrieval_utils, "DB_PATH", str(db_path)) # Execute the Method under Test result_json = get_recommendations(["Drama"], limit=5) result = json.loads(result_json) # Assert on the results assert [item["name"] for item in result] == ["Alpha", "Gamma"] assert all("description" in item for item in result) def test_get_recommendations_no_genre(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): # Setup Test Data and Mocks # Construct a temporary path for the Test DB db_path = tmp_path / "test.db" # Setup the test db _setup_test_db(db_path) # Monkeypatch the DB_PATH variable of retrieval_utils file monkeypatch.setattr(retrieval_utils, "DB_PATH", str(db_path)) # Execute the Method under Test result_json = get_recommendations([], limit=5) result = json.loads(result_json) # Assert on the results assert len(result) == 0