Skip to content

Commit ecbf497

Browse files
committed
test: add JWT authorization decorator test cases (#741)
1 parent bde92c2 commit ecbf497

File tree

1 file changed

+59
-1
lines changed

1 file changed

+59
-1
lines changed

tests/test_decorators.py

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"""REANA-Server decorators tests."""
99

1010
import json
11-
from unittest.mock import Mock, patch
11+
from unittest.mock import Mock, patch, MagicMock
1212

1313
from flask import jsonify
1414
from reana_db.models import User, UserToken
@@ -31,3 +31,61 @@ def test_signing_required_with_token(user0: User):
3131
mock_endpoint.assert_not_called()
3232
assert code == 401
3333
assert error["message"] == "User has no active tokens"
34+
35+
36+
def test_signin_required_with_jwt(user0: User):
37+
"""Test `signin_required` with JWT token authentication."""
38+
mock_endpoint = Mock(return_value=(jsonify(message="Success"), 200))
39+
mock_current_user = Mock()
40+
mock_current_user.is_authenticated = False
41+
mock_current_user.email = user0.email
42+
43+
mock_request = Mock()
44+
mock_request.headers = {"Authorization": "Bearer token123"}
45+
mock_request.args = {}
46+
mock_request_context = MagicMock()
47+
mock_request_context.__enter__.return_value = mock_request
48+
49+
with patch("reana_server.decorators._get_user_from_jwt", mock_current_user):
50+
with patch("reana_server.decorators.current_user", mock_current_user):
51+
with patch("reana_server.decorators.request", mock_request):
52+
decorated_endpoint = signin_required(include_jwt=True)(mock_endpoint)
53+
response, code = decorated_endpoint()
54+
55+
# Should call the endpoint since authentication succeeded
56+
mock_endpoint.assert_called_once()
57+
assert code == 200
58+
assert (
59+
json.loads(response.get_data(as_text=True))["message"] == "Success"
60+
)
61+
62+
63+
def test_signin_required_with_invalid_jwt(user0: User):
64+
"""Test `signin_required` with invalid JWT token."""
65+
mock_endpoint = Mock(return_value=(jsonify(message="Success"), 200))
66+
mock_current_user = Mock()
67+
mock_current_user.is_authenticated = False
68+
mock_current_user.email = user0.email
69+
70+
mock_request = Mock()
71+
mock_request.headers = {"Authorization": "Bearer invalid_token"}
72+
mock_request.args = {}
73+
mock_request_context = MagicMock()
74+
mock_request_context.__enter__.return_value = mock_request
75+
76+
with patch("reana_server.decorators.current_user", mock_current_user):
77+
with patch(
78+
"reana_server.decorators._get_user_from_jwt",
79+
side_effect=ValueError("Invalid token"),
80+
):
81+
with patch("reana_server.decorators.request", mock_request):
82+
decorated_endpoint = signin_required(include_jwt=True)(mock_endpoint)
83+
response, code = decorated_endpoint()
84+
85+
# Should not call the endpoint since authentication failed
86+
mock_endpoint.assert_not_called()
87+
assert code == 403
88+
assert (
89+
json.loads(response.get_data(as_text=True))["message"]
90+
== "Invalid token"
91+
)

0 commit comments

Comments
 (0)