Coverage for tests/core_tests/test_handlers.py: 100%

98 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-05-05 14:02 +0000

1import pytest 

2from flask import session 

3 

4import os 

5import sys 

6 

7# flake8: noqa: F811 

8 

9sys.path.append( 

10 os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 

11) 

12from core import handlers 

13 

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

15 

16 

17@pytest.fixture() 

18def app(): 

19 from app import app 

20 

21 yield app 

22 

23 with app.test_client() as client: 

24 with client.session_transaction() as sess: 

25 sess.clear() 

26 

27 

28@pytest.fixture() 

29def client(app): 

30 yield app.test_client() 

31 

32 

33def test_allowed_file(): 

34 """Test allowed_file function.""" 

35 

36 assert handlers.allowed_file("document.pdf", {"pdf", "txt"}) is True 

37 assert handlers.allowed_file("image.jpeg", {"png", "jpg"}) is False 

38 assert handlers.allowed_file("no_extension", {"pdf", "txt"}) is False 

39 

40 

41def test_login_required_redirect(client): 

42 """Test login_required decorator redirects when not logged in.""" 

43 response = client.get("/user/home") 

44 assert response.status_code == 302 

45 assert response.headers["Location"] == "/" 

46 

47 

48def test_student_login_required_redirect(client): 

49 """Test student_login_required decorator redirects when student is not logged in.""" 

50 response = client.get("/students/details/12345678") 

51 assert response.status_code == 302 

52 assert response.headers["Location"] == "/" 

53 

54 

55def test_employers_login_required_redirect(client): 

56 """Test employers_login_required decorator redirects when employer is not logged in.""" 

57 response = client.get("/employers/home") 

58 assert response.status_code == 302 

59 assert response.headers["Location"] == "/employers/login" 

60 

61 

62def test_admin_or_employers_required_redirect(client): 

63 """Test admin_or_employers_required decorator redirects when neither admin nor employer is logged in.""" 

64 response = client.get("/opportunities/search") 

65 assert response.status_code == 302 

66 assert response.headers["Location"] == "/" 

67 

68 

69def test_get_user_type(app): 

70 """Test get_user_type function with different session states.""" 

71 with app.app_context(): 

72 with app.test_request_context(): 

73 session["user"] = {"name": "AdminUser"} 

74 assert handlers.get_user_type() == "admin" 

75 session.clear() 

76 

77 session["employer"] = {"company_name": "TechCorp"} 

78 assert handlers.get_user_type() == "employer" 

79 session.clear() 

80 

81 session["student"] = "student_id" 

82 assert handlers.get_user_type() == "student" 

83 session.clear() 

84 

85 assert handlers.get_user_type() is None 

86 

87 

88def test_index_route(client): 

89 """Test home page route.""" 

90 response = client.get("/") 

91 assert response.status_code == 200 

92 

93 

94def test_get_session(client): 

95 """Test /api/session route for different users.""" 

96 with client.session_transaction() as sess: 

97 sess["user"] = {"name": "AdminUser"} 

98 sess["logged_in"] = True 

99 

100 response = client.get("/api/session") 

101 assert response.status_code == 200 

102 assert response.json == {"user_type": "adminuser"} 

103 

104 with client.session_transaction() as sess: 

105 sess.clear() 

106 sess["employer"] = {"company_name": "TechCorp"} 

107 sess["employer_logged_in"] = True 

108 

109 response = client.get("/api/session") 

110 assert response.status_code == 200 

111 assert response.json == {"user_type": "TechCorp"} 

112 

113 with client.session_transaction() as sess: 

114 sess.clear() 

115 sess["logged_in"] = True 

116 

117 response = client.get("/api/session") 

118 assert response.status_code == 200 

119 assert response.json == {"user_type": None} 

120 

121 

122def test_privacy_policy(client): 

123 """Test privacy policy page route.""" 

124 response = client.get("/privacy_policy") 

125 assert response.status_code == 200 

126 

127 

128def test_robots_txt(client): 

129 """Test robots.txt route.""" 

130 response = client.get("/robots.txt") 

131 assert response.status_code == 200 

132 assert response.content_type == "text/plain; charset=utf-8" 

133 

134 

135def test_favicon(client): 

136 """Test favicon route.""" 

137 response = client.get("/favicon.ico") 

138 assert response.status_code == 200 

139 assert response.content_type in [ 

140 "image/vnd.microsoft.icon", 

141 "image/x-icon", 

142 "image/png", 

143 ] 

144 

145 

146def test_signout(client): 

147 """Test signout clears session and redirects.""" 

148 with client.session_transaction() as sess: 

149 sess["logged_in"] = True 

150 

151 response = client.get("/signout") 

152 assert response.status_code == 302 

153 assert response.headers["Location"] == "/" 

154 

155 with client.session_transaction() as sess: 

156 assert "logged_in" not in sess 

157 

158 

159def test_404_page(client): 

160 """Test custom 404 error page.""" 

161 response = client.get("/404") 

162 assert response.status_code == 404 

163 

164 

165def test_500_page(client): 

166 """Test custom 500 error page.""" 

167 response = client.get("/500") 

168 assert response.status_code == 500