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

1"""Tests for the course routes.""" 

2 

3# pylint: disable=redefined-outer-name 

4# flake8: noqa: F811 

5 

6import os 

7import sys 

8import uuid 

9from passlib.hash import pbkdf2_sha512 

10import pytest 

11from dotenv import load_dotenv 

12 

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) 

17 

18from core import shared 

19from core.database_mongo_manager import DatabaseMongoManager 

20 

21os.environ["IS_TEST"] = "True" 

22 

23load_dotenv() 

24 

25 

26@pytest.fixture() 

27def client(): 

28 """Fixture to create a test client.""" 

29 from ...app import app # pylint: disable=import-outside-toplevel 

30 

31 app.config["TESTING"] = True 

32 return app.test_client() 

33 

34 

35@pytest.fixture() 

36def database(): 

37 """Fixture to create a test database.""" 

38 

39 database = DatabaseMongoManager( 

40 shared.getenv("MONGO_URI"), shared.getenv("MONGO_DB_TEST", "cs3528_testing") 

41 ) 

42 

43 yield database 

44 

45 # Cleanup code 

46 database.delete_all_by_field("courses", "course_id", "CS101") 

47 database.delete_all_by_field("courses", "course_id", "CS102") 

48 

49 database.connection.close() 

50 

51 

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") 

57 

58 user = { 

59 "_id": uuid.uuid4().hex, 

60 "name": "dummy", 

61 "email": "dummy@dummy.com", 

62 "password": pbkdf2_sha512.hash("dummy"), 

63 } 

64 

65 database.insert("users", user) 

66 

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 ) 

76 

77 yield client 

78 

79 # Cleanup code 

80 database.delete_all_by_field("users", "email", "dummy@dummy.com") 

81 

82 

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 

87 

88 

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" 

105 

106 database.delete_all_by_field("courses", "course_id", "CS101") 

107 

108 

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 

124 

125 database.delete_all_by_field("courses", "course_id", "CS101") 

126 

127 

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) 

137 

138 # Ensure the course is in the database 

139 assert database.get_one_by_id("courses", course["_id"]) is not None 

140 

141 response = user_logged_in_client.get("/courses/search") 

142 assert response.status_code == 200 

143 

144 database.delete_all_by_field("courses", "course_id", "CS101") 

145 

146 

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 

158 

159 database.delete_all_by_field("courses", "course_id", "CS101") 

160 

161 

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"])