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!
1 file
+ 0
1
Compare changes
  • Side-by-side
  • Inline
+ 126
2
import datetime
import datetime
import logging
import time
 
import logging
import pytest
import pytest
from django.contrib.auth import get_user_model
from django.contrib.auth import get_user_model
from django.utils.timezone import make_aware
from django.utils.timezone import make_aware
from rest_framework.authtoken.admin import User
from rest_framework.authtoken.admin import User
@@ -19,12 +19,107 @@ from greg.models import (
@@ -19,12 +19,107 @@ from greg.models import (
RoleType,
RoleType,
Sponsor,
Sponsor,
)
)
 
from gregui.models import GregUserProfile
from gregui.models import GregUserProfile
# faker spams the logs with localisation warnings
# faker spams the logs with localisation warnings
# see https://github.com/joke2k/faker/issues/753
# see https://github.com/joke2k/faker/issues/753
logging.getLogger("faker").setLevel(logging.ERROR)
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
@pytest.fixture
def client() -> APIClient:
def client() -> APIClient:
@@ -133,3 +228,32 @@ def invitation_link_expired(invitation, invitation_expired_date) -> InvitationLi
@@ -133,3 +228,32 @@ def invitation_link_expired(invitation, invitation_expired_date) -> InvitationLi
invitation=invitation, expire=invitation_expired_date
invitation=invitation, expire=invitation_expired_date
)
)
return InvitationLink.objects.get(id=il.id)
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