140 lines
6.7 KiB
Python
140 lines
6.7 KiB
Python
import pytest
|
|
|
|
from combo.utils import (aes_hex_decrypt, aes_hex_encrypt, get_templated_url,
|
|
TemplateError)
|
|
from django.conf import settings
|
|
from django.test import override_settings
|
|
from django.template import Context
|
|
from django.test.client import RequestFactory
|
|
from django.contrib.auth.models import AnonymousUser
|
|
|
|
|
|
class MockSAMLUser(object):
|
|
name_id = 'r2&d2'
|
|
|
|
class MockUser(object):
|
|
email = 'foo=3@example.net'
|
|
def is_authenticated(self):
|
|
return True
|
|
|
|
def __init__(self, samlized=True):
|
|
class MockSAMLUsers(object):
|
|
def exists(self):
|
|
return True
|
|
def first(self):
|
|
return MockSAMLUser()
|
|
if samlized:
|
|
self.saml_identifiers = MockSAMLUsers()
|
|
|
|
|
|
def test_crypto_url():
|
|
invoice_id = '12-1234'
|
|
key = settings.SECRET_KEY
|
|
assert aes_hex_decrypt(key, aes_hex_encrypt(key, invoice_id)) == invoice_id
|
|
|
|
|
|
def test_templated_url():
|
|
assert get_templated_url('foobar') == 'foobar'
|
|
assert get_templated_url('foo[]bar') == 'foo[]bar'
|
|
assert get_templated_url('foo[bar') == 'foo[bar'
|
|
assert get_templated_url('foo]bar') == 'foo]bar'
|
|
assert get_templated_url('foo]bar[') == 'foo]bar['
|
|
assert get_templated_url('foo]bar]') == 'foo]bar]'
|
|
assert get_templated_url('foobar[[]') == 'foobar['
|
|
assert get_templated_url('foobar[[]]') == 'foobar[]'
|
|
assert get_templated_url('foobar[[]test]') == 'foobar[test]'
|
|
|
|
assert get_templated_url('{{ test_url }}') == ''
|
|
with pytest.raises(TemplateError, match='unknown variable test_url'):
|
|
get_templated_url('[test_url]')
|
|
|
|
with override_settings(TEMPLATE_VARS={'test_url': 'http://www.example.net'}):
|
|
assert get_templated_url('{{ test_url }}') == 'http://www.example.net'
|
|
assert get_templated_url('[test_url]') == 'http://www.example.net'
|
|
assert get_templated_url('{{ test_url }}/hello') == 'http://www.example.net/hello'
|
|
assert get_templated_url('[test_url]/hello') == 'http://www.example.net/hello'
|
|
|
|
# contexts without users
|
|
request = RequestFactory().get('/')
|
|
request.user = None
|
|
for context in (None, Context({}), Context({'request': None}),
|
|
Context({'request': request})):
|
|
assert get_templated_url('NameID={{ user_nameid }}', context=context) == 'NameID='
|
|
assert get_templated_url('email={{ user_email }}', context=context) == 'email='
|
|
if context is None:
|
|
with pytest.raises(TemplateError, match='unknown variable user_nameid'):
|
|
get_templated_url('NameID=[user_nameid]', context=context)
|
|
with pytest.raises(TemplateError, match='unknown variable user_email'):
|
|
get_templated_url('email=[user_email]', context=context)
|
|
else:
|
|
assert get_templated_url('NameID=[user_nameid]', context=context) == 'NameID='
|
|
assert get_templated_url('email=[user_email]', context=context) == 'email='
|
|
with pytest.raises(TemplateError, match='unknown variable bar'):
|
|
get_templated_url('foo=[bar]', context=context)
|
|
if context:
|
|
context['foobar'] = 'barfoo'
|
|
assert get_templated_url('{{foobar}}', context=context) == 'barfoo'
|
|
assert get_templated_url('[foobar]', context=context) == 'barfoo'
|
|
|
|
# contexts with users
|
|
request = RequestFactory().get('/')
|
|
request.user = MockUser(samlized=False)
|
|
context = Context({'request': request})
|
|
assert get_templated_url('email={{ user_email }}', context=context) == \
|
|
'email=foo%3D3%40example.net'
|
|
assert get_templated_url('email=[user_email]', context=context) == \
|
|
'email=foo%3D3%40example.net'
|
|
request.user = MockUser(samlized=True)
|
|
assert get_templated_url('email={{user_email}}&NameID={{user_nameid}}', context=context) == \
|
|
'email=foo%3D3%40example.net&NameID=r2%26d2'
|
|
assert get_templated_url('email=[user_email]&NameID=[user_nameid]', context=context) == \
|
|
'email=foo%3D3%40example.net&NameID=r2%26d2'
|
|
|
|
# mixed sources
|
|
request = RequestFactory().get('/')
|
|
request.user = MockUser(samlized=True)
|
|
context = Context({'request': request})
|
|
context['foobar'] = 'barfoo'
|
|
assert get_templated_url('{{ foobar }}/email={{ user_email }}&NameID={{ user_nameid }}',
|
|
context=context) == 'barfoo/email=foo%3D3%40example.net&NameID=r2%26d2'
|
|
assert get_templated_url('[foobar]/email=[user_email]&NameID=[user_nameid]',
|
|
context=context) == 'barfoo/email=foo%3D3%40example.net&NameID=r2%26d2'
|
|
with override_settings(TEMPLATE_VARS={'test_url': 'http://www.example.net'}):
|
|
request = RequestFactory().get('/')
|
|
request.user = MockUser(samlized=True)
|
|
context = Context({'foobar': 'barfoo', 'request': request})
|
|
assert get_templated_url('{{test_url}}/{{foobar}}/?NameID={{user_nameid}}&email={{user_email}}',
|
|
context=context) == \
|
|
'http://www.example.net/barfoo/?NameID=r2%26d2&email=foo%3D3%40example.net'
|
|
assert get_templated_url('[test_url]/[foobar]/?NameID=[user_nameid]&email=[user_email]',
|
|
context=context) == \
|
|
'http://www.example.net/barfoo/?NameID=r2%26d2&email=foo%3D3%40example.net'
|
|
|
|
# packed contexts
|
|
request = RequestFactory().get('/')
|
|
request.user = None
|
|
context = Context({'request': request})
|
|
context.update({'foo': 'bar'})
|
|
ctx = Context()
|
|
ctx.update(context)
|
|
assert get_templated_url('{{ foo }}', context=ctx) == 'bar'
|
|
assert get_templated_url('[foo]', context=ctx) == 'bar'
|
|
|
|
# accept django syntax
|
|
assert get_templated_url('{% if "foo" %}ok{% endif %}') == 'ok'
|
|
assert get_templated_url('{% if foo %}{{ foo }}{% endif %}') == ''
|
|
assert get_templated_url('{% if foo %}{{ foo }}{% endif %}', context={'foo': 'ok'}) == 'ok'
|
|
assert get_templated_url('{{ bar|default:"ok" }}') == 'ok'
|
|
assert get_templated_url('{{ foo|default:"ko" }}', context={'foo': 'ok'}) == 'ok'
|
|
assert get_templated_url('{nodjango}') == '{nodjango}'
|
|
assert get_templated_url('{{') == '{{'
|
|
assert get_templated_url('{%{{ ok }}{%') == '{%{%'
|
|
assert get_templated_url('{{ foo.bar }}', context={'foo': {'bar': 'ok'}}) == 'ok'
|
|
assert get_templated_url('{{ foo.bar }}') == ''
|
|
assert get_templated_url('{{ foo.0 }}{{ foo.1 }}{{ foo.2 }}', context={'foo': ['ok', 'doc']}) == 'okdoc'
|
|
assert get_templated_url('{{ foo.0.bar }}{{ foo.0.zoo }}', context={'foo': [{'bar': 'ok'}, 'ko']}) == 'ok'
|
|
# catch django syntax errors in TemplateError
|
|
for template in ('{% foobar %}', '{% if "coucou" %}', '{{}}', '{{ if "x" }}', '{{ _private }}'):
|
|
with pytest.raises(TemplateError, match='syntax error'):
|
|
assert get_templated_url(template, context=ctx) == 'bar'
|