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

1"""Tests for the course modules 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 

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 database = DatabaseMongoManager( 

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

40 ) 

41 

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) 

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 

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

93 

94 

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 

109 

110 

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 

117 

118 

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 

126 

127 

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" 

145 

146 

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" 

151 

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 ) 

158 

159 assert response.status_code == 400 

160 assert response.json["error"] == "Invalid file type" 

161 

162 

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 

168 

169 

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 

179 

180 # Restore the students and opportunities 

181 database.delete_all("students") 

182 if students: 

183 database.insert_many("students", students) 

184 

185 database.delete_all("opportunities") 

186 if opportunities: 

187 database.insert_many("opportunities", opportunities) 

188 

189 

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