Coverage for tests/route_tests/test_course_modules.py: 97%
94 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 routes."""
3# pylint: disable=redefined-outer-name
4# flake8: noqa: F811
6import os
7import sys
8import uuid
9from passlib.hash import pbkdf2_sha512
10import pytest
11from dotenv import load_dotenv
13# Add the root directory to the Python path
14sys.path.append(
15 os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
16)
18from core import shared
19from core.database_mongo_manager import DatabaseMongoManager
21os.environ["IS_TEST"] = "True"
23load_dotenv()
26@pytest.fixture()
27def client():
28 """Fixture to create a test client."""
29 from ...app import app
31 app.config["TESTING"] = True
32 return app.test_client()
35@pytest.fixture()
36def database():
37 """Fixture to create a test database."""
38 database = DatabaseMongoManager(
39 shared.getenv("MONGO_URI"), shared.getenv("MONGO_DB_TEST", "cs3528_testing")
40 )
42 modules = database.get_all("modules")
43 database.delete_all("modules")
44 yield database
45 database.delete_all("modules")
46 if modules:
47 database.insert_many("modules", modules)
49 database.connection.close()
52@pytest.fixture()
53def user_logged_in_client(client, database: DatabaseMongoManager):
54 """Fixture to login a user."""
55 database.add_table("users")
56 database.delete_all_by_field("users", "email", "dummy@dummy.com")
58 user = {
59 "_id": uuid.uuid4().hex,
60 "name": "dummy",
61 "email": "dummy@dummy.com",
62 "password": pbkdf2_sha512.hash("dummy"),
63 }
65 database.insert("users", user)
67 url = "/user/login"
68 client.post(
69 url,
70 data={
71 "email": "dummy@dummy.com",
72 "password": "dummy",
73 },
74 content_type="application/x-www-form-urlencoded",
75 )
77 yield client
79 # Cleanup code
80 database.delete_all_by_field("users", "email", "dummy@dummy.com")
83@pytest.fixture()
84def sample_module(database):
85 """Fixture to create a sample module."""
86 yield {
87 "_id": "123",
88 "module_id": "CS101",
89 "module_name": "Intro to CS",
90 "module_description": "Basic programming concepts",
91 }
92 database.delete_all_by_field("modules", "module_id", "CS101")
95def test_add_module(user_logged_in_client, database, sample_module):
96 """Test adding a module."""
97 url = "/course_modules/add_module"
98 response = user_logged_in_client.post(
99 url,
100 data={
101 "module_id": sample_module["module_id"],
102 "module_name": sample_module["module_name"],
103 "module_description": sample_module["module_description"],
104 },
105 content_type="application/x-www-form-urlencoded",
106 )
107 assert response.status_code == 200
108 assert database.get_one_by_field("modules", "module_id", "CS101") is not None
111def test_search_modules(user_logged_in_client, database, sample_module):
112 """Test searching modules."""
113 database.insert("modules", sample_module)
114 url = "/course_modules/search"
115 response = user_logged_in_client.get(url)
116 assert response.status_code == 200
119def test_delete_module(user_logged_in_client, database, sample_module):
120 """Test deleting a module."""
121 database.insert("modules", sample_module)
122 url = f"/course_modules/delete?uuid={sample_module['_id']}"
123 response = user_logged_in_client.delete(url)
124 assert response.status_code == 200
125 assert database.get_one_by_id("modules", sample_module["_id"]) is None
128def test_update_module(user_logged_in_client, database, sample_module):
129 """Test updating a module."""
130 database.insert("modules", sample_module)
131 url = f"/course_modules/update?uuid={sample_module['_id']}"
132 response = user_logged_in_client.post(
133 url,
134 data={
135 "module_id": "CS102",
136 "module_name": "Intro to Programming",
137 "module_description": "Updated description",
138 },
139 content_type="application/x-www-form-urlencoded",
140 )
141 assert response.status_code == 200
142 updated_module = database.get_one_by_id("modules", sample_module["_id"])
143 assert updated_module["module_id"] == "CS102"
144 assert updated_module["module_name"] == "Intro to Programming"
147def test_upload_invalid_file(user_logged_in_client):
148 """Test uploading an invalid file type."""
149 url = "/course_modules/upload"
150 file_path = "tests/data/invalid_course_modules.txt"
152 with open(file_path, "rb") as file:
153 response = user_logged_in_client.post(
154 url,
155 data={"file": (file, "invalid_course_modules.txt")},
156 content_type="multipart/form-data",
157 )
159 assert response.status_code == 400
160 assert response.json["error"] == "Invalid file type"
163def test_download_template(user_logged_in_client):
164 """Test downloading the course module template."""
165 url = "/course_modules/download_template"
166 response = user_logged_in_client.get(url)
167 assert response.status_code == 200
170def test_delete_all_modules(user_logged_in_client, database, sample_module):
171 """Test deleting all modules."""
172 database.insert("modules", sample_module)
173 students = database.get_all("students")
174 opportunities = database.get_all("opportunities")
175 url = "/course_modules/delete_all"
176 response = user_logged_in_client.delete(url)
177 assert response.status_code == 200
178 assert len(database.get_all("modules")) == 0
180 # Restore the students and opportunities
181 database.delete_all("students")
182 if students:
183 database.insert_many("students", students)
185 database.delete_all("opportunities")
186 if opportunities:
187 database.insert_many("opportunities", opportunities)
190def test_download_all_modules(user_logged_in_client, database, sample_module):
191 """Test downloading all modules."""
192 database.insert("modules", sample_module)
193 url = "/course_modules/download_all"
194 response = user_logged_in_client.get(url)
195 assert response.status_code == 200