Coverage for tests/route_tests/test_course.py: 100%
77 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 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 # pylint: disable=import-outside-toplevel
31 app.config["TESTING"] = True
32 return app.test_client()
35@pytest.fixture()
36def database():
37 """Fixture to create a test database."""
39 database = DatabaseMongoManager(
40 shared.getenv("MONGO_URI"), shared.getenv("MONGO_DB_TEST", "cs3528_testing")
41 )
43 yield database
45 # Cleanup code
46 database.delete_all_by_field("courses", "course_id", "CS101")
47 database.delete_all_by_field("courses", "course_id", "CS102")
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")
83def test_add_course_get(user_logged_in_client):
84 """Test GET request to add course route."""
85 response = user_logged_in_client.get("/courses/add_course")
86 assert response.status_code == 200
89def test_add_course_post(user_logged_in_client, database):
90 """Test POST request to add course route."""
91 course_data = {
92 "course_id": "CS101",
93 "course_name": "Introduction to Computer Science",
94 "course_description": "Basic concepts of computer science.",
95 }
96 response = user_logged_in_client.post(
97 "/courses/add_course",
98 data=course_data,
99 content_type="application/x-www-form-urlencoded",
100 )
101 assert response.status_code == 200
102 course = database.get_one_by_field("courses", "course_id", "CS101")
103 assert course is not None
104 assert course["course_name"] == "Introduction to Computer Science"
106 database.delete_all_by_field("courses", "course_id", "CS101")
109def test_delete_course(user_logged_in_client, database):
110 """Test POST request to delete course route."""
111 database.delete_all_by_field("courses", "course_id", "CS101")
112 course = {
113 "_id": uuid.uuid4().hex,
114 "course_id": "CS101",
115 "course_name": "Introduction to Computer Science",
116 "course_description": "Basic concepts of computer science.",
117 }
118 database.insert("courses", course)
119 url = f"/courses/delete?uuid={course['_id']}"
120 response = user_logged_in_client.delete(url)
121 assert response.status_code == 200
122 deleted_course = database.get_one_by_id("courses", course["_id"])
123 assert deleted_course is None
125 database.delete_all_by_field("courses", "course_id", "CS101")
128def test_search_course(user_logged_in_client, database):
129 """Test GET request to search course route."""
130 course = {
131 "_id": uuid.uuid4().hex,
132 "course_id": "CS101",
133 "course_name": "Introduction to Computer Science",
134 "course_description": "Basic concepts of computer science.",
135 }
136 database.insert("courses", course)
138 # Ensure the course is in the database
139 assert database.get_one_by_id("courses", course["_id"]) is not None
141 response = user_logged_in_client.get("/courses/search")
142 assert response.status_code == 200
144 database.delete_all_by_field("courses", "course_id", "CS101")
147def test_update_course_get(user_logged_in_client, database):
148 """Test GET request to update course route."""
149 course = {
150 "_id": uuid.uuid4().hex,
151 "course_id": "CS101",
152 "course_name": "Introduction to Computer Science",
153 "course_description": "Basic concepts of computer science.",
154 }
155 database.insert("courses", course)
156 response = user_logged_in_client.get(f"/courses/update?uuid={course['_id']}")
157 assert response.status_code == 200
159 database.delete_all_by_field("courses", "course_id", "CS101")
162def test_update_course_post(user_logged_in_client, database):
163 """Test POST request to update course route."""
164 course = {
165 "_id": uuid.uuid4().hex,
166 "course_id": "CS101",
167 "course_name": "Introduction to Computer Science",
168 "course_description": "Basic concepts of computer science.",
169 }
170 database.insert("courses", course)
171 updated_course_data = {
172 "course_id": "CS102",
173 "course_name": "Advanced Computer Science",
174 "course_description": "Advanced concepts of computer science.",
175 }
176 response = user_logged_in_client.post(
177 f"/courses/update?uuid={course['_id']}",
178 data=updated_course_data,
179 content_type="application/x-www-form-urlencoded",
180 )
181 assert response.status_code == 200
182 updated_course = database.get_one_by_id("courses", course["_id"])
183 assert updated_course["course_id"] == "CS102"
184 assert updated_course["course_name"] == "Advanced Computer Science"
185 database.delete_by_id("courses", course["_id"])