Skip to content
Snippets Groups Projects

Add some OIDC flow tests.

Merged Sivert Kronen Hatteberg requested to merge oidc-tests into master
All threads resolved!
3 files
+ 14
5
Compare changes
  • Side-by-side
  • Inline
Files
3
+ 126
2
import datetime
import logging
import time
import logging
import pytest
from django.contrib.auth import get_user_model
from django.utils.timezone import make_aware
from rest_framework.authtoken.admin import User
@@ -19,12 +19,107 @@ from greg.models import (
RoleType,
Sponsor,
)
from gregui.models import GregUserProfile
# faker spams the logs with localisation warnings
# see https://github.com/joke2k/faker/issues/753
logging.getLogger("faker").setLevel(logging.ERROR)
# OIDC stuff
@pytest.fixture
def claims():
return {
"sub": "subsub",
"connect-userid_sec": ["feide:frank_foreleser@spusers.feide.no"],
"dataporten-userid_sec": [
# "feide:frank_foreleser@spusers.feide.no"
],
"name": "Frank Foreleser Føllesen",
"email": "noreply@feide.no",
"email_verified": True,
"picture": "https://api.dataporten.no/userinfo/v1/user/media/p:2192dff7-6989-4244-83cc-ae5e78875bdd",
}
@pytest.fixture
def id_token_payload():
return {
"iss": "https://auth.dataporten.no",
"jti": "jtijti",
"aud": "lalalalala",
"sub": "subsub",
"iat": 1605174731,
"exp": 1605178331,
"auth_time": 1605174731,
"nonce": "noncenonce",
}
@pytest.fixture
def data():
return {
"User": {
"user1": {
"username": "user1",
"email": "user1@example.com",
},
"user2": {
"username": "user2",
"email": "user2@example.com",
},
"https://auth.dataporten.nosubsub": {
"username": "https://auth.dataporten.nosubsub",
},
},
"Identity": {
"person1": {
"type": "feide_id",
"value": "foo@example.com",
"person": {"last_name": "Baresen"},
},
},
"Person": {
"person1": {
"first_name": "Foo",
"last_name": "Baresen",
},
},
"Sponsor": {
"sponsor1": {
"first_name": "Bar",
"last_name": "Bazesen",
"feide_id": "bar@example.com",
},
},
}
def save_object(model, **kwargs):
obj = model(**kwargs)
obj.save()
return obj
# TODO add person and sponsor
OBJECT_MAPPING = {
"greg" "person": Person,
"sponsor": Sponsor,
"user": get_user_model(),
}
def create_objects(cls, data):
objects = {}
for obj_name, kwargs in data.items():
create_kwargs = kwargs.copy()
for name, selector in kwargs.items():
if name in OBJECT_MAPPING:
create_kwargs[name] = OBJECT_MAPPING[name].objects.get(**selector)
obj = save_object(cls, **create_kwargs)
objects[obj_name] = obj
return objects
@pytest.fixture
def client() -> APIClient:
@@ -133,3 +228,32 @@ def invitation_link_expired(invitation, invitation_expired_date) -> InvitationLi
invitation=invitation, expire=invitation_expired_date
)
return InvitationLink.objects.get(id=il.id)
@pytest.fixture
def greg_users(data):
return create_objects(get_user_model(), data["User"])
@pytest.fixture
def greg_persons(data):
return create_objects(get_user_model(), data["Person"])
@pytest.fixture
def greg_sponsors(data):
return create_objects(get_user_model(), data["Sponsor"])
@pytest.fixture
def log_in(client, greg_users):
def _log_in(username):
user = greg_users[username]
client.force_login(user=user)
# It seems like the session was not updated automatically this way
session = client.session
session["oidc_id_token_payload"] = {"iat": time.time()}
session.save()
return client
return _log_in
Loading