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
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-05 14:02 +0000
1import pytest
2from flask import session
4import os
5import sys
7# flake8: noqa: F811
9sys.path.append(
10 os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
11)
12from core import handlers
14os.environ["IS_TEST"] = "True"
17@pytest.fixture()
18def app():
19 from app import app
21 yield app
23 with app.test_client() as client:
24 with client.session_transaction() as sess:
25 sess.clear()
28@pytest.fixture()
29def client(app):
30 yield app.test_client()
33def test_allowed_file():
34 """Test allowed_file function."""
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
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"] == "/"
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"] == "/"
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"
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"] == "/"
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()
77 session["employer"] = {"company_name": "TechCorp"}
78 assert handlers.get_user_type() == "employer"
79 session.clear()
81 session["student"] = "student_id"
82 assert handlers.get_user_type() == "student"
83 session.clear()
85 assert handlers.get_user_type() is None
88def test_index_route(client):
89 """Test home page route."""
90 response = client.get("/")
91 assert response.status_code == 200
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
100 response = client.get("/api/session")
101 assert response.status_code == 200
102 assert response.json == {"user_type": "adminuser"}
104 with client.session_transaction() as sess:
105 sess.clear()
106 sess["employer"] = {"company_name": "TechCorp"}
107 sess["employer_logged_in"] = True
109 response = client.get("/api/session")
110 assert response.status_code == 200
111 assert response.json == {"user_type": "TechCorp"}
113 with client.session_transaction() as sess:
114 sess.clear()
115 sess["logged_in"] = True
117 response = client.get("/api/session")
118 assert response.status_code == 200
119 assert response.json == {"user_type": None}
122def test_privacy_policy(client):
123 """Test privacy policy page route."""
124 response = client.get("/privacy_policy")
125 assert response.status_code == 200
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"
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 ]
146def test_signout(client):
147 """Test signout clears session and redirects."""
148 with client.session_transaction() as sess:
149 sess["logged_in"] = True
151 response = client.get("/signout")
152 assert response.status_code == 302
153 assert response.headers["Location"] == "/"
155 with client.session_transaction() as sess:
156 assert "logged_in" not in sess
159def test_404_page(client):
160 """Test custom 404 error page."""
161 response = client.get("/404")
162 assert response.status_code == 404
165def test_500_page(client):
166 """Test custom 500 error page."""
167 response = client.get("/500")
168 assert response.status_code == 500