|
|
|
''' Tests for ordr2.resources.account '''
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
|
|
|
from pyramid.testing import DummyRequest
|
|
|
|
|
|
|
|
from .. import app_config, dbsession, get_user
|
|
|
|
|
|
|
|
# helper function
|
|
|
|
|
|
|
|
def get_root_resource(role_name=None, **kwargs):
|
|
|
|
''' return a root resource '''
|
|
|
|
from ordr2.resources import RootResource
|
|
|
|
user = get_user(role_name) if role_name else None
|
|
|
|
request = DummyRequest(user=user, **kwargs)
|
|
|
|
return RootResource(request)
|
|
|
|
|
|
|
|
|
|
|
|
# tests for token resources
|
|
|
|
|
|
|
|
def test_registration_token_acl():
|
|
|
|
''' test the access controll list of the registration token resource '''
|
|
|
|
from pyramid.security import Allow, Authenticated, Deny, Everyone, DENY_ALL
|
|
|
|
from ordr2.resources.account import RegistrationToken
|
|
|
|
|
|
|
|
root = get_root_resource()
|
|
|
|
resource = RegistrationToken(None, root, None)
|
|
|
|
|
|
|
|
assert resource.__acl__() == [
|
|
|
|
(Deny, Authenticated, 'register'),
|
|
|
|
(Allow, Everyone, 'register'),
|
|
|
|
DENY_ALL
|
|
|
|
]
|
|
|
|
|
|
|
|
def test_email_verification_token_acl(app_config):
|
|
|
|
''' test the access controll list of the email token resource '''
|
|
|
|
from pyramid.security import Allow, Authenticated, Deny, Everyone, DENY_ALL
|
|
|
|
from ordr2.models.account import User, Token
|
|
|
|
from ordr2.resources.account import EmailVerificationToken
|
|
|
|
|
|
|
|
root = get_root_resource('user')
|
|
|
|
token = Token(owner=root.request.user)
|
|
|
|
resource = EmailVerificationToken(None, root, token)
|
|
|
|
|
|
|
|
assert resource.__acl__() == [(Allow, 'user:3', 'settings'), DENY_ALL]
|
|
|
|
|
|
|
|
def test_password_reset_token_acl():
|
|
|
|
''' test the access controll list of the password token resource '''
|
|
|
|
from pyramid.security import Allow, Everyone, DENY_ALL
|
|
|
|
from ordr2.resources.account import ForgottenPasswordToken
|
|
|
|
|
|
|
|
root = get_root_resource()
|
|
|
|
resource = ForgottenPasswordToken(None, root, None)
|
|
|
|
|
|
|
|
assert resource.__acl__() == [
|
|
|
|
(Allow, Everyone, 'reset password'),
|
|
|
|
DENY_ALL
|
|
|
|
]
|
|
|
|
|
|
|
|
def test_account_resource_init():
|
|
|
|
''' test __init__ function of base resource '''
|
|
|
|
from ordr2.resources.account import AccountResource
|
|
|
|
|
|
|
|
root = get_root_resource('user')
|
|
|
|
resource = AccountResource('resource name', root)
|
|
|
|
|
|
|
|
assert resource.__name__ == 'resource name'
|
|
|
|
assert resource.__parent__ == root
|
|
|
|
assert resource.request == root.request
|
|
|
|
assert resource.model == root.request.user
|
|
|
|
|
|
|
|
def test_account_resource_acl():
|
|
|
|
''' test the access controll list of the account resource '''
|
|
|
|
from pyramid.security import Allow, Authenticated, Deny, Everyone, DENY_ALL
|
|
|
|
from ordr2.resources.account import AccountResource
|
|
|
|
|
|
|
|
root = get_root_resource()
|
|
|
|
resource = AccountResource('resource name', root)
|
|
|
|
|
|
|
|
assert resource.__acl__() == [
|
|
|
|
(Allow, Everyone, 'login'),
|
|
|
|
(Allow, Everyone, 'logout'),
|
|
|
|
(Deny, Authenticated, 'register'),
|
|
|
|
(Allow, Everyone, 'register'),
|
|
|
|
(Allow, Everyone, 'reset password'),
|
|
|
|
(Allow, Authenticated, 'settings'),
|
|
|
|
DENY_ALL
|
|
|
|
]
|
|
|
|
|
|
|
|
def test_account_resource_getitem_token_ok(app_config, dbsession):
|
|
|
|
''' test __getitem__ method returns correct token '''
|
|
|
|
from ordr2.models.account import TokenSubject
|
|
|
|
from ordr2.resources.account import (
|
|
|
|
AccountResource,
|
|
|
|
EmailVerificationToken
|
|
|
|
)
|
|
|
|
|
|
|
|
root = get_root_resource('user', dbsession=dbsession)
|
|
|
|
user = root.request.user
|
|
|
|
dbsession.add(user)
|
|
|
|
hash = user.issue_token(root.request, TokenSubject.CHANGE_EMAIL)
|
|
|
|
account = AccountResource(None, root)
|
|
|
|
resource = account[hash]
|
|
|
|
|
|
|
|
assert isinstance(resource, EmailVerificationToken)
|
|
|
|
assert resource.__name__ == hash
|
|
|
|
assert resource.__parent__ == account
|
|
|
|
assert resource.model.hash == hash
|
|
|
|
assert resource.model.owner == root.request.user
|
|
|
|
|
|
|
|
|
|
|
|
def test_account_resource_getitem_token_not_found(dbsession):
|
|
|
|
''' test __getitem__ raises KeyError on unknown token hash '''
|
|
|
|
from ordr2.resources.account import AccountResource
|
|
|
|
|
|
|
|
root = get_root_resource('user', dbsession=dbsession)
|
|
|
|
account = AccountResource(None, root)
|
|
|
|
|
|
|
|
with pytest.raises(KeyError):
|
|
|
|
resource = account['unknown token hash']
|
|
|
|
|
|
|
|
|
|
|
|
def test_account_resource_getitem_token_expired(dbsession):
|
|
|
|
''' test __getitem__ raises KeyError on unknown token hash '''
|
|
|
|
from datetime import datetime
|
|
|
|
from ordr2.models.account import Token, TokenSubject
|
|
|
|
from ordr2.resources.account import (
|
|
|
|
AccountResource,
|
|
|
|
EmailVerificationToken
|
|
|
|
)
|
|
|
|
|
|
|
|
root = get_root_resource('user', dbsession=dbsession)
|
|
|
|
token = Token.issue(
|
|
|
|
root.request,
|
|
|
|
root.request.user,
|
|
|
|
TokenSubject.CHANGE_EMAIL
|
|
|
|
)
|
|
|
|
token.expires = datetime(year=2000, month=1, day=1)
|
|
|
|
dbsession.add(token)
|
|
|
|
account = AccountResource(None, root)
|
|
|
|
|
|
|
|
with pytest.raises(KeyError) as excinfo:
|
|
|
|
resource = account[token.hash]
|
|
|
|
assert f'Token {token.hash} has expired' in str(excinfo.value)
|