master
py 233 lines 8.79 KB
Raw
1 import pytest
2
3 from datamanager.sqlite_data_manager import SQliteDataManager
4 from data_models import User, Movie
5
6 TEST_DB_URL = "sqlite:///:memory:"
7
8 # Fixture for creating a new data manager for each test
9 @pytest.fixture(scope="function")
10 def data_manager():
11 """
12 Fixture to create an SQliteDataManager instance for each test. Uses an in-memory database.
13 """
14 return SQliteDataManager(TEST_DB_URL)
15
16
17 def test_user_model(data_manager: SQliteDataManager):
18 """Test creating a User object."""
19 user = User(name="Test User")
20 with data_manager.SessionFactory() as session:
21 session.add(user)
22 session.commit()
23 retrieved_user = session.query(User).filter_by(name="Test User").first()
24 assert retrieved_user == user
25
26
27 def test_movie_model(data_manager: SQliteDataManager):
28 """Test creating a Movie object."""
29 movie = Movie(name="Test Movie", director="Test Director", year=2024, poster="test.jpg", rating=7.5)
30 with data_manager.SessionFactory() as session:
31 session.add(movie)
32 session.commit()
33 retrieved_movie = session.query(Movie).filter_by(name="Test Movie").first()
34 assert retrieved_movie == movie
35
36
37 def test_user_movie_model(data_manager: SQliteDataManager):
38 """Test the association between User and Movie."""
39 user = User(name="User 1")
40 movie = Movie(name="Movie 1", director="Director A", year=2020, poster="m1.jpg", rating=8.0)
41 with data_manager.SessionFactory() as session:
42 session.add_all([user, movie])
43 session.commit()
44 user.movies.append(movie)
45 session.commit()
46 assert movie in user.movies
47 assert user in movie.users
48
49
50 def test_get_users(data_manager: SQliteDataManager):
51 """Test getting users from the database using the getter."""
52 with data_manager.SessionFactory() as session:
53 # Initially, there should be no users
54 users_from_getter = data_manager.users # This might return objects from a different session
55 assert len(users_from_getter) == 0
56
57 # Add some users directly to the database within the current session
58 user_1 = User(name="User 1")
59 user_2 = User(name="User 2")
60 session.add_all([user_1, user_2])
61 session.commit()
62
63 # Now, retrieve the users using a query within the *same* session
64 users_from_query = session.query(User).all()
65 assert len(users_from_query) == 2
66
67 # Check attributes of the queried users
68 retrieved_user_names = [user.name for user in users_from_query]
69 assert "User 1" in retrieved_user_names
70 assert "User 2" in retrieved_user_names
71
72 retrieved_user_ids = {user.id for user in users_from_query if user.id is not None}
73 assert user_1.id in retrieved_user_ids
74 assert user_2.id in retrieved_user_ids
75
76
77 def test_set_user(data_manager: SQliteDataManager):
78 """Test setting (adding) a user to the database."""
79 user = User(name="New User")
80 with data_manager.SessionFactory() as session:
81 session.add(user)
82 session.commit()
83 retrieved_user = session.query(User).filter_by(name="New User").first()
84 assert retrieved_user.name == "New User"
85
86
87
88 def test_get_user_movies(data_manager: SQliteDataManager):
89 """Test getting movies for a specific user."""
90 user = User(name="Test User")
91 movie1 = Movie(name="Movie 1", director="Director A", year=2020, poster="m1.jpg", rating=8.0)
92 movie2 = Movie(name="Movie 2", director="Director B", year=2022, poster="m2.jpg", rating=7.0)
93 with data_manager.SessionFactory() as session:
94 session.add_all([user, movie1, movie2])
95 session.commit()
96 data_manager.set_user_movies(user.id, movie1.id, 9.0)
97 data_manager.set_user_movies(user.id, movie2.id, 8.5)
98
99 session.commit()
100
101 #user_movies = data_manager.get_user_movies(user.id)
102
103 user_movies = data_manager.get_user_movies(user.id) #Adapt this
104 assert len(user_movies) == 2
105 assert user_movies[0]['name'] == 'Movie 1'
106 assert user_movies[0]['rating'] == 9.0
107 assert user_movies[1]['name'] == 'Movie 2'
108 assert user_movies[1]['rating'] == 8.5
109
110
111
112 def test_set_user_movies(data_manager: SQliteDataManager):
113 """Test setting (adding) a movie to a user's list."""
114 user = User(name="Test User")
115 movie = Movie(name="Test Movie", director="Test Director", year=2024, poster="test.jpg", rating=7.5)
116 with data_manager.SessionFactory() as session:
117 session.add_all([user, movie])
118 session.commit()
119 data_manager.set_user_movies(user.id, movie.id, 5.0) # Adapt this
120 user_movies = data_manager.get_user_movies(user.id) # Adapt this
121 assert len(user_movies) == 1
122 assert user_movies[0]['name'] == 'Test Movie'
123 assert user_movies[0]['rating'] == 5.0
124
125
126
127 def test_get_movies(data_manager: SQliteDataManager):
128 """Test getting all movies."""
129 movie1 = Movie(name="Movie A", director="Director X", year=2019, poster="a.jpg", rating=6.5)
130 movie2 = Movie(name="Movie B", director="Director Y", year=2021, poster="b.jpg", rating=8.5)
131 with data_manager.SessionFactory() as session:
132 session.add_all([movie1, movie2])
133 session.commit()
134 movies = session.query(Movie).all()
135 assert len(movies) == 2
136 assert movie1 in movies
137 assert movie2 in movies
138
139
140
141 def test_set_movie(data_manager: SQliteDataManager):
142 """Test setting (adding) a movie."""
143 movie = Movie(name="New Movie", director="New Director", year=2023, poster="new.jpg", rating=9.0)
144 with data_manager.SessionFactory() as session:
145 session.add(movie)
146 session.commit()
147 retrieved_movies = session.query(Movie).filter_by(name="New Movie").all()
148 assert len(retrieved_movies) == 1
149 assert retrieved_movies[0].name == "New Movie"
150
151
152
153 def test_update_movie(data_manager: SQliteDataManager):
154 """Test updating an existing movie."""
155 movie = Movie(name="Old Movie", director="Old Director", year=2000, poster="old.jpg", rating=5.0)
156 with data_manager.SessionFactory() as session:
157 session.add(movie)
158 session.commit()
159 movie_to_update = session.query(Movie).get(movie.id)
160
161 updated_movie_data = {
162 "name": "Updated Movie",
163 "director": "Updated Director",
164 "year": 2022,
165 "poster": "updated.jpg",
166 "rating": 8.0,
167 }
168 for key, value in updated_movie_data.items():
169 setattr(movie_to_update, key, value)
170 session.commit()
171
172 updated_movie = session.query(Movie).get(movie.id)
173 assert updated_movie is not None
174 assert updated_movie.name == "Updated Movie"
175 assert updated_movie.director == "Updated Director"
176 assert updated_movie.year == 2022
177 assert updated_movie.poster == "updated.jpg"
178 assert updated_movie.rating == 8.0
179
180
181
182 def test_update_movie_partial(data_manager: SQliteDataManager):
183 """Test updating a movie with partial data."""
184 movie = Movie(name="Original Movie", director="Original Director", year=2000, poster="original.jpg", rating=5.0)
185 with data_manager.SessionFactory() as session:
186 session.add(movie)
187 session.commit()
188 movie_to_update = session.query(Movie).get(movie.id)
189
190 updated_data = {"rating": 9.5, "name": "Partially Updated"}
191 for key, value in updated_data.items():
192 setattr(movie_to_update, key, value)
193 session.commit()
194
195 updated_movie = session.query(Movie).get(movie.id)
196 assert updated_movie is not None
197 assert updated_movie.name == "Partially Updated"
198 assert updated_movie.rating == 9.5
199 assert updated_movie.director == "Original Director" # Unchanged
200 assert updated_movie.year == 2000 # Unchanged
201 assert updated_movie.poster == "original.jpg" #Unchanged
202
203
204
205 def test_update_movie_not_found(data_manager: SQliteDataManager):
206 """Test updating a non-existent movie."""
207 updated_data = {"name": "Nonexistent Movie"}
208 with data_manager.SessionFactory() as session:
209 result = session.query(Movie).get(999)
210 assert result is None
211
212
213
214 def test_delete_movie(data_manager: SQliteDataManager):
215 """Test deleting a movie."""
216 movie = Movie(name="Movie to Delete", director="Delete Director", year=2023, poster="delete.jpg", rating=9.0)
217 with data_manager.SessionFactory() as session:
218 session.add(movie)
219 session.commit()
220 movie_to_delete = session.query(Movie).get(movie.id)
221 session.delete(movie_to_delete)
222 session.commit()
223 retrieved_movie = session.query(Movie).get(movie.id)
224 assert retrieved_movie is None
225
226
227
228 def test_delete_movie_not_found(data_manager: SQliteDataManager):
229 """Test deleting a non-existent movie."""
230 with data_manager.SessionFactory() as session:
231 deleted = data_manager.delete_movie(999)
232 assert deleted is False
233