1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
# Python
from __future__ import with_statement
from __future__ import unicode_literals
import base64
try:
from importlib import reload as reload_module
except ImportError:
from imp import reload as reload_module
import json
# Django
from django.test import TestCase
from django.test.client import Client
try:
from django.urls import reverse
except ImportError:
from django.core.urlresolvers import reverse
from django.contrib.auth.models import User
try:
from django.utils.six import binary_type, text_type
except ImportError:
binary_type, text_type = bytes, str
# Django-CRUM
from crum import get_current_user, impersonate
class TestCRUM(TestCase):
"""Test cases for the CRUM app."""
def setUp(self):
super(TestCRUM, self).setUp()
self.user_password = User.objects.make_random_password()
self.user = User.objects.create_user('user', 'user@example.com',
self.user_password)
def test_middleware(self):
# For test coverage.
import crum
reload_module(crum)
# Test anonymous user.
self.assertEqual(get_current_user(), None)
url = reverse('test_app:index')
response = self.client.get(url)
response_content = response.content.decode('utf-8')
self.assertEqual(response.status_code, 200)
self.assertEqual(response_content, 'AnonymousUser')
self.assertEqual(get_current_user(), None)
# Test logged in user.
self.client.login(username=self.user.username,
password=self.user_password)
response = self.client.get(url)
response_content = response.content.decode('utf-8')
self.assertEqual(response.status_code, 200)
self.assertEqual(response_content, text_type(self.user))
self.assertEqual(get_current_user(), None)
# Test impersonate context manager.
with impersonate(self.user):
self.assertEqual(get_current_user(), self.user)
self.assertEqual(get_current_user(), None)
# Test impersonate(None) within view requested by logged in user.
self.client.login(username=self.user.username,
password=self.user_password)
response = self.client.get(url + '?impersonate=1')
response_content = response.content.decode('utf-8')
self.assertEqual(response.status_code, 200)
self.assertEqual(response_content, text_type(None))
self.assertEqual(get_current_user(), None)
# Test when request raises exception.
try:
response = self.client.get(url + '?raise=1')
except RuntimeError:
response = None
self.assertEqual(response, None)
self.assertEqual(get_current_user(), None)
def test_middleware_with_rest_framework(self):
# Test anonymous user.
self.assertEqual(get_current_user(), None)
url = reverse('test_app:api_index')
response = self.client.get(url)
response_content = json.loads(response.content.decode('utf-8'))
self.assertEqual(response.status_code, 200)
self.assertEqual(response_content, text_type('AnonymousUser'))
self.assertEqual(get_current_user(), None)
# Test logged in user (session auth).
self.client.login(username=self.user.username,
password=self.user_password)
response = self.client.get(url)
response_content = json.loads(response.content.decode('utf-8'))
self.assertEqual(response.status_code, 200)
self.assertEqual(response_content, text_type(self.user))
self.assertEqual(get_current_user(), None)
# Test logged in user (basic auth).
basic_auth = '{0}:{1}'.format(self.user.username, self.user_password)
basic_auth = binary_type(basic_auth.encode('utf-8'))
basic_auth = base64.b64encode(basic_auth).decode('ascii')
client_kwargs = {'HTTP_AUTHORIZATION': 'Basic %s' % basic_auth}
client = Client(**client_kwargs)
response = client.get(url)
response_content = json.loads(response.content.decode('utf-8'))
self.assertEqual(response.status_code, 200)
self.assertEqual(response_content, text_type(self.user))
self.assertEqual(get_current_user(), None)
# Test impersonate(None) within view requested by logged in user.
self.client.login(username=self.user.username,
password=self.user_password)
response = self.client.get(url + '?impersonate=1')
response_content = json.loads(response.content.decode('utf-8'))
self.assertEqual(response.status_code, 200)
self.assertEqual(response_content, text_type(None))
self.assertEqual(get_current_user(), None)
# Test when request raises exception.
try:
response = self.client.get(url + '?raise=1')
except RuntimeError:
response = None
self.assertEqual(response, None)
self.assertEqual(get_current_user(), None)
|