docbow/tests/sso/test_profile.py

140 lines
4.6 KiB
Python

from django.contrib.auth.models import User
import mellon.models
import mock
import pytest
import requests
from docbow_project.docbow.models import Delegation, DocbowProfile
def find_delegate_form(forms):
for form in forms.values():
if 'delegate-create' in form.fields:
return form
@pytest.fixture
def a2settings(settings):
settings.AUTHENTIC_URL = 'https://a2-url/'
settings.AUTHENTIC_USER = 'user'
settings.AUTHENTIC_PASSWORD = 'pass'
return settings
@pytest.fixture
def user():
user = User.objects.create(username='user', email='user@example.com')
user.set_password('password')
user.save()
return user
class MockResp(object):
def __init__(self, json=None, excp=None):
self._json = json
self._excp = excp
def json(self):
return self._json
def raise_for_status(self):
if self._excp:
raise self._excp
@pytest.mark.django_db
def test_create_delegate_sso(a2settings, app, monkeypatch, users):
a2settings.AUTHENTIC_ROLE = 'roleuuid'
import docbow_project.docbow.utils
import mellon
mellon.models.Issuer.objects.create(entity_id=a2settings.AUTHENTIC_URL + 'idp/saml2/metadata')
mock_resp1 = MockResp(json={'uuid': '1234'})
mock_resp2 = MockResp()
mock_post = mock.Mock(side_effect=[mock_resp1, mock_resp2])
monkeypatch.setattr(docbow_project.docbow.utils.requests, 'post', mock_post)
user = User.objects.get(username='user-1')
app.login(username='user-1')
resp = app.get('/profile/')
delegate_form = find_delegate_form(resp.forms)
delegate_form['delegate-first_name'] = 'some'
delegate_form['delegate-last_name'] = 'delegate'
delegate_form['delegate-email'] = 'delagate@exemple.com'
resp = delegate_form.submit('delegate-create')
assert resp.status_code == 302
assert user.delegations_to.count()
delegate = user.delegations_to.first().to
assert delegate.first_name == 'some'
assert delegate.last_name == 'delegate'
assert delegate.email == 'delagate@exemple.com'
assert delegate.saml_identifiers.count() == 1
saml_id = delegate.saml_identifiers.first()
assert saml_id.issuer.entity_id == a2settings.AUTHENTIC_URL + 'idp/saml2/metadata'
assert saml_id.user == delegate
assert saml_id.name_id == '1234'
call_args = mock_post.call_args_list[0][1]
json = call_args['json']
assert json['first_name'] == delegate.first_name
assert json['last_name'] == delegate.last_name
assert json['email'] == delegate.email
assert json['send_registration_email']
assert json['send_registration_email_next_url'] == 'http://testserver/'
call_args = mock_post.call_args_list[1][1]
url = call_args['url']
assert url == 'https://a2-url/api/roles/roleuuid/members/1234/'
@pytest.mark.django_db
def test_create_delegate_a2_failed(a2settings, app, monkeypatch, users):
import docbow_project.docbow.utils
mock_resp = MockResp(json={'errors': {'some': ['a2 error']}}, excp=requests.exceptions.RequestException())
mock_post = mock.Mock(return_value=mock_resp)
monkeypatch.setattr(docbow_project.docbow.utils.requests, 'post', mock_post)
user = User.objects.get(username='user-1')
app.login(username='user-1')
resp = app.get('/profile/')
delegate_form = find_delegate_form(resp.forms)
delegate_form['delegate-first_name'] = 'some'
delegate_form['delegate-last_name'] = 'delegate'
delegate_form['delegate-email'] = 'delagate@exemple.com'
resp = delegate_form.submit('delegate-create')
assert 'a2 error' in resp.text
assert not user.delegations_to.count()
@pytest.mark.django_db
def test_delete_delegate_sso(a2settings, client, monkeypatch, user):
import docbow_project.docbow.profile_views
mock_resp = MockResp(json={})
mock_delete = mock.Mock(return_value=mock_resp)
monkeypatch.setattr(docbow_project.docbow.profile_views.requests, 'delete', mock_delete)
delegate = User.objects.create(
first_name='john', last_name='doe', username='john.doe-1', email='john@localhost'
)
DocbowProfile.objects.create(user=delegate, is_guest=True)
Delegation.objects.get_or_create(by=user, to=delegate)
issuer = mellon.models.Issuer.objects.create(entity_id=a2settings.AUTHENTIC_URL + 'idp/saml2/metadata')
mellon.models.UserSAMLIdentifier.objects.create(name_id='1234', issuer=issuer, user=delegate)
client.login(username='user', password='password')
client.post(
'/profile/',
{
'delegate-delete-john.doe-1.x': True,
},
)
assert not user.delegations_to.count()
call_args = mock_delete.call_args[1]
assert call_args['url'] == 'https://a2-url/api/users/1234'