Coverage for tests/model_tests/test_course_modules.py: 98%
142 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-05 14:02 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-05 14:02 +0000
1"""Tests for the course modules model."""
3import os
4import sys
5import uuid
6import pytest
7from dotenv import load_dotenv
9# flake8: noqa: F811
11# Add the root directory to the Python path
12sys.path.append(
13 os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
14)
15from core import shared
16from core.database_mongo_manager import DatabaseMongoManager
18os.environ["IS_TEST"] = "True"
20load_dotenv()
23@pytest.fixture()
24def app():
25 """Fixture to create a test client."""
26 from ...app import app
28 return app
31@pytest.fixture()
32def database():
33 """Fixture to create a test database."""
34 database = DatabaseMongoManager(
35 shared.getenv("MONGO_URI"),
36 shared.getenv("MONGO_DB_TEST", "cs3528_testing"),
37 )
38 modules = database.get_all("modules")
39 database.delete_all("modules")
41 yield database
42 database.delete_all("modules")
43 if modules:
44 database.insert_many("modules", modules)
45 database.connection.close()
48@pytest.fixture()
49def module_model():
50 """Fixture to create a Module model instance."""
51 from course_modules.models import Module
53 return Module()
56@pytest.fixture()
57def sample_module(database):
58 """Fixture to create a sample module."""
59 yield {
60 "_id": uuid.uuid4().hex,
61 "module_id": "CS101",
62 "module_name": "Introduction to CS",
63 "module_description": "A basic CS course",
64 }
65 database.delete_all_by_field("modules", "module_id", "CS101")
68def test_add_module(database, module_model, app):
69 """Test add_module method."""
70 sample_module = {
71 "_id": uuid.uuid4().hex,
72 "module_id": "CS101",
73 "module_name": "Introduction to CS",
74 "module_description": "A basic CS course",
75 }
76 with app.app_context():
77 with app.test_request_context():
78 response = module_model.add_module(sample_module)[0]
79 assert response.status_code == 200
80 assert database.get_one_by_id("modules", sample_module["_id"]) is not None
81 database.delete_all_by_field("modules", "module_id", "CS101")
84def test_get_module_by_id(database, module_model, app, sample_module):
85 """Test get_module_by_id method."""
86 database.insert("modules", sample_module)
87 with app.app_context():
88 with app.test_request_context():
89 module = module_model.get_module_by_id(sample_module["module_id"])
90 assert module is not None
91 assert module["module_name"] == "Introduction to CS"
94def test_get_module_name_by_id(database, module_model, app, sample_module):
95 """Test get_module_name_by_id method."""
96 database.insert("modules", sample_module)
97 with app.app_context():
98 with app.test_request_context():
99 module_name = module_model.get_module_name_by_id(sample_module["module_id"])
100 assert module_name == "Introduction to CS"
103def test_update_module_by_uuid(database, module_model, app, sample_module):
104 """Test update_module_by_uuid method."""
105 database.insert("modules", sample_module)
106 with app.app_context():
107 with app.test_request_context():
108 response = module_model.update_module_by_uuid(
109 sample_module["_id"], "CS102", "Advanced CS", "Next level CS"
110 )[0]
111 assert response.status_code == 200
112 updated_module = database.get_one_by_id("modules", sample_module["_id"])
113 assert updated_module["module_name"] == "Advanced CS"
116def test_delete_all_modules(database, module_model, app, sample_module):
117 """Test delete_all_modules method."""
118 students = database.get_all("students")
119 opportunities = database.get_all("opportunities")
121 database.delete_all("students")
122 database.delete_all("opportunities")
124 database.insert("modules", sample_module)
126 student1 = {
127 "_id": uuid.uuid4().hex,
128 "student_id": "S101",
129 "student_name": "Alice",
130 "modules": ["CS101"],
131 }
132 opportunity1 = {
133 "_id": uuid.uuid4().hex,
134 "title": "Internship",
135 "employer_id": "E101",
136 "modules_required": ["CS101"],
137 }
139 database.insert("students", student1)
140 database.insert("opportunities", opportunity1)
142 with app.app_context():
143 with app.test_request_context():
144 response = module_model.delete_all_modules()[0]
145 assert response.status_code == 200
146 assert database.get_all("modules") == []
147 assert database.get_one_by_id("students", student1["_id"]) is not None
148 assert (
149 database.get_one_by_id("opportunities", opportunity1["_id"]) is not None
150 )
151 assert database.get_one_by_id("students", student1["_id"])["modules"] == []
152 assert (
153 database.get_one_by_id("opportunities", opportunity1["_id"])[
154 "modules_required"
155 ]
156 == []
157 )
159 database.delete_all("students")
160 if students:
161 database.insert_many("students", students)
162 database.delete_all("opportunities")
163 if opportunities:
164 database.insert_many("opportunities", opportunities)
167def test_download_all_modules(database, module_model, app):
168 """Test download_all_modules method."""
169 sample_module = {
170 "_id": uuid.uuid4().hex,
171 "module_id": "CS101",
172 "module_name": "Introduction to CS",
173 "module_description": "A basic CS course",
174 }
175 database.insert("modules", sample_module)
176 with app.app_context():
177 with app.test_request_context():
178 response = module_model.download_all_modules()
179 assert (
180 response.mimetype
181 == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
182 )
185def test_upload_course_modules(module_model, app, database):
186 """Test upload_course_modules method with the test spreadsheet."""
187 file_path = "tests/data/course_modules_test.xlsx"
188 assert database.get_all("modules") == []
190 with open(file_path, "rb") as file:
191 with app.app_context():
192 with app.test_request_context():
193 response = module_model.upload_course_modules(file)
194 json_response = response[0].get_json()
196 assert response[1] == 200
197 assert json_response["message"] == "Uploaded"
200def test_delete_module_by_id(database, module_model, app, sample_module):
201 """Test delete_module_by_id method."""
202 database.insert("modules", sample_module)
203 with app.app_context():
204 with app.test_request_context():
205 response = module_model.delete_module_by_id(sample_module["module_id"])[0]
206 assert response.status_code == 200
207 assert database.get_one_by_id("modules", sample_module["_id"]) is None
210def test_delete_module_by_uuid(database, module_model, app, sample_module):
211 """Test delete_module_by_uuid method."""
212 database.insert("modules", sample_module)
213 with app.app_context():
214 with app.test_request_context():
215 response = module_model.delete_module_by_uuid(sample_module["_id"])[0]
216 assert response.status_code == 200
217 assert database.get_one_by_id("modules", sample_module["_id"]) is None
220def test_get_module_by_uuid(database, module_model, app, sample_module):
221 """Test get_module_by_uuid method."""
222 database.insert("modules", sample_module)
223 with app.app_context():
224 with app.test_request_context():
225 module = module_model.get_module_by_uuid(sample_module["_id"])
226 assert module is not None
227 assert module["module_name"] == "Introduction to CS"
230def test_get_modules_map(database, module_model, app, sample_module):
231 """Test get_modules_map method."""
232 database.insert("modules", sample_module)
233 with app.app_context():
234 with app.test_request_context():
235 modules_map = module_model.get_modules_map()
236 assert sample_module["module_id"] in modules_map
237 assert (
238 modules_map[sample_module["module_id"]]["module_name"]
239 == "Introduction to CS"
240 )
243def test_reset_cache(database, module_model, app):
244 """Test reset_cache method."""
245 from course_modules.models import modules_cache
247 sample_module = {
248 "_id": uuid.uuid4().hex,
249 "module_id": "CS101",
250 "module_name": "Introduction to CS",
251 "module_description": "A basic CS course",
252 }
253 database.insert("modules", sample_module)
255 # Ensure the cache is reset
256 with app.app_context():
257 with app.test_request_context():
258 module_model.reset_cache()
259 assert modules_cache["data"] is not None
260 assert len(modules_cache["data"]) > 0
261 assert modules_cache["last_updated"] is not None
263 # Clean up the database
264 database.delete_all_by_field("modules", "module_id", "CS101")