Skip to content

Commit 5d2fe28

Browse files
author
Rebecka Gulliksson
committed
Add test of OIDCFrontend.handle_authn_request.
1 parent 7045339 commit 5d2fe28

File tree

2 files changed

+28
-14
lines changed

2 files changed

+28
-14
lines changed

src/satosa/frontends/openid_connect.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,8 +275,7 @@ def handle_authn_request(self, context):
275275

276276
context.state[self.name] = {"oidc_request": request}
277277
hash_type = oidc_subject_type_to_hash_type(self.provider.cdb[client_id].get("subject_type", "pairwise"))
278-
internal_req = InternalRequest(hash_type, client_id,
279-
self.provider.cdb[client_id].get("client_name"))
278+
internal_req = InternalRequest(hash_type, client_id, self.provider.cdb[client_id].get("client_name"))
280279

281280
return self.auth_req_callback_func(context, internal_req)
282281

tests/satosa/frontends/test_openid_connect.py

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""
22
Tests for the SAML frontend module src/frontends/saml2.py.
33
"""
4+
import json
5+
from unittest.mock import Mock
46
from urllib.parse import urlparse
57

68
import pytest
@@ -19,6 +21,7 @@
1921
'attributes': {"mail": {"saml": ["email"], "openid": ["email"]}}
2022
}
2123
BASE_URL = "https://op.example.com"
24+
CLIENT_ID = "client1"
2225

2326

2427
class TestOpenIDConnectFrontend(object):
@@ -31,16 +34,21 @@ def setup(self, signing_key_path):
3134

3235
@pytest.fixture
3336
def authn_req(self):
34-
client_id = "client1"
3537
state = "my_state"
3638
nonce = "nonce"
3739
redirect_uri = "https://client.example.com"
3840
claims_req = ClaimsRequest(id_token=Claims(email=None))
39-
req = AuthorizationRequest(client_id=client_id, state=state, scope="openid",
41+
req = AuthorizationRequest(client_id=CLIENT_ID, state=state, scope="openid",
4042
response_type="id_token", redirect_uri=redirect_uri,
4143
nonce=nonce, claims=claims_req)
4244
return req
4345

46+
def insert_client_in_client_db(self, redirect_uri):
47+
self.instance.provider.cdb = {
48+
CLIENT_ID: {"response_types": ["id_token"],
49+
"redirect_uris": [(redirect_uri, None)],
50+
"client_salt": "salt"}}
51+
4452
def setup_for_authn_response(self, context, auth_req):
4553
context.state[self.instance.name] = {"oidc_request": auth_req.to_urlencoded()}
4654

@@ -49,11 +57,6 @@ def setup_for_authn_response(self, context, auth_req):
4957
internal_response.attributes = AttributeMapper(INTERNAL_ATTRIBUTES).to_internal("saml", USERS["testuser1"])
5058
internal_response.user_id = USERS["testuser1"]["eduPersonTargetedID"][0]
5159

52-
self.instance.cdb = {
53-
"client1": {"response_types": ["id_token"],
54-
"redirect_uris": [(auth_req["redirect_uri"], None)],
55-
"client_salt": "salt"}}
56-
5760
return internal_response
5861

5962
def test_handle_authn_response(self, context, authn_req):
@@ -72,12 +75,11 @@ def test_handle_authn_response(self, context, authn_req):
7275
assert self.instance.name not in context.state
7376

7477
def test_get_authn_response_query_encoded(self, context):
75-
client_id = "client1"
7678
state = "my_state"
7779
nonce = "nonce"
7880
redirect_uri = "https://client.example.com"
7981
claims_req = ClaimsRequest(id_token=Claims(email=None))
80-
req = AuthorizationRequest(client_id=client_id, state=state, scope="openid",
82+
req = AuthorizationRequest(client_id=CLIENT_ID, state=state, scope="openid",
8183
response_type="id_token",
8284
redirect_uri=redirect_uri,
8385
nonce=nonce,
@@ -95,10 +97,23 @@ def test_get_authn_response_query_encoded(self, context):
9597
assert id_token["sub"] == USERS["testuser1"]["eduPersonTargetedID"][0]
9698
assert id_token["email"] == USERS["testuser1"]["email"][0]
9799

100+
def test_handle_authn_request(self, context, authn_req):
101+
mock_callback = Mock()
102+
self.instance.auth_req_callback_func = mock_callback
103+
self.insert_client_in_client_db(authn_req["redirect_uri"])
104+
105+
context.request = authn_req.to_dict()
106+
context.request["claims"] = json.dumps(context.request["claims"])
107+
self.instance.handle_authn_request(context)
108+
109+
assert mock_callback.call_count == 1
110+
context, internal_req = mock_callback.call_args[0]
111+
assert internal_req.requester == authn_req["client_id"]
112+
assert internal_req.user_id_hash_type == UserIdHashType.pairwise
113+
98114
def test_handle_backend_error(self, context):
99-
client_id = "client1"
100115
redirect_uri = "https://client.example.com"
101-
areq = AuthorizationRequest(client_id=client_id, scope="openid", response_type="id_token",
116+
areq = AuthorizationRequest(client_id=CLIENT_ID, scope="openid", response_type="id_token",
102117
redirect_uri=redirect_uri)
103118
context.state[self.instance.name] = {"oidc_request": areq.to_urlencoded()}
104119

@@ -122,7 +137,7 @@ def test_register_client(self, context):
122137

123138
reg_resp = RegistrationResponse().deserialize(registration_response.message, "json")
124139
assert "client_id" in reg_resp
125-
assert reg_resp["client_id"] in self.instance.provider.cdb
140+
126141
# no need to issue client secret since to token endpoint is published
127142
assert "client_secret" not in reg_resp
128143
assert reg_resp["redirect_uris"] == [redirect_uri]

0 commit comments

Comments
 (0)