Skip to content

Commit 84534ec

Browse files
authored
Merge pull request #178 from jazzband/split-up-tests
Split up test modules
2 parents fccea08 + b9faa80 commit 84534ec

File tree

8 files changed

+383
-337
lines changed

8 files changed

+383
-337
lines changed

tests/test_admin.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
from urllib.parse import urlencode
2+
3+
from django.contrib.auth.models import User
4+
from django.test import TestCase
5+
from django.urls import reverse
6+
7+
from user_sessions.backends.db import SessionStore
8+
9+
from .utils import Client
10+
11+
12+
class AdminTest(TestCase):
13+
client_class = Client
14+
15+
def setUp(self):
16+
User.objects.create_superuser('bouke', '', 'secret')
17+
assert self.client.login(username='bouke', password='secret')
18+
19+
expired = SessionStore(user_agent='Python/2.5', ip='20.13.1.1')
20+
expired.set_expiry(-365 * 86400)
21+
expired.save()
22+
unexpired = SessionStore(user_agent='Python/2.7', ip='1.1.1.1')
23+
unexpired.save()
24+
25+
self.admin_url = reverse('admin:user_sessions_session_changelist')
26+
27+
def test_list(self):
28+
with self.assertWarnsRegex(UserWarning, r"The address 1\.1\.1\.1 is not in the database"):
29+
response = self.client.get(self.admin_url)
30+
self.assertContains(response, 'Select session to change')
31+
self.assertContains(response, '127.0.0.1')
32+
self.assertContains(response, '20.13.1.1')
33+
self.assertContains(response, '1.1.1.1')
34+
35+
def test_search(self):
36+
with self.assertWarnsRegex(UserWarning, r"The address 127\.0\.0\.1 is not in the database"):
37+
response = self.client.get(self.admin_url, {'q': 'bouke'})
38+
self.assertContains(response, '127.0.0.1')
39+
self.assertNotContains(response, '20.13.1.1')
40+
self.assertNotContains(response, '1.1.1.1')
41+
42+
def test_mine(self):
43+
my_sessions = f"{self.admin_url}?{urlencode({'owner': 'my'})}"
44+
with self.assertWarnsRegex(UserWarning, r"The address 127\.0\.0\.1 is not in the database"):
45+
response = self.client.get(my_sessions)
46+
self.assertContains(response, '127.0.0.1')
47+
self.assertNotContains(response, '1.1.1.1')
48+
49+
def test_expired(self):
50+
expired = f"{self.admin_url}?{urlencode({'active': '0'})}"
51+
with self.assertWarnsRegex(UserWarning, r"The address 20\.13\.1\.1 is not in the database"):
52+
response = self.client.get(expired)
53+
self.assertContains(response, '20.13.1.1')
54+
self.assertNotContains(response, '1.1.1.1')
55+
56+
def test_unexpired(self):
57+
unexpired = f"{self.admin_url}?{urlencode({'active': '1'})}"
58+
with self.assertWarnsRegex(UserWarning, r"The address 1\.1\.1\.1 is not in the database"):
59+
response = self.client.get(unexpired)
60+
self.assertContains(response, '1.1.1.1')
61+
self.assertNotContains(response, '20.13.1.1')

tests/test_client.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from unittest.mock import patch
2+
3+
from django.contrib.auth.models import User
4+
from django.conf import settings
5+
from django.test import TestCase
6+
from django.test.utils import override_settings
7+
8+
from user_sessions.backends.db import SessionStore
9+
10+
from .utils import Client
11+
12+
13+
class ClientTest(TestCase):
14+
def test_invalid_login(self):
15+
client = Client()
16+
self.assertFalse(client.login())
17+
18+
def test_restore_session(self):
19+
store = SessionStore(user_agent='Python/2.7', ip='127.0.0.1')
20+
store['foo'] = 'bar'
21+
store.save()
22+
client = Client()
23+
client.cookies[settings.SESSION_COOKIE_NAME] = store.session_key
24+
User.objects.create_user('bouke', '', 'secret')
25+
assert client.login(username='bouke', password='secret')
26+
self.assertEqual(client.session['foo'], 'bar')
27+
28+
def test_login_logout(self):
29+
client = Client()
30+
User.objects.create_user('bouke', '', 'secret')
31+
assert client.login(username='bouke', password='secret')
32+
assert settings.SESSION_COOKIE_NAME in client.cookies
33+
34+
client.logout()
35+
assert settings.SESSION_COOKIE_NAME not in client.cookies
36+
37+
# should not raise
38+
client.logout()
39+
40+
@patch('django.contrib.auth.signals.user_logged_in.send')
41+
def test_login_signal(self, mock_user_logged_in):
42+
client = Client()
43+
User.objects.create_user('bouke', '', 'secret')
44+
assert client.login(username='bouke', password='secret')
45+
assert mock_user_logged_in.called
46+
request = mock_user_logged_in.call_args[1]['request']
47+
assert getattr(request, 'user', None) is not None
48+
49+
@override_settings(INSTALLED_APPS=())
50+
def test_no_session(self):
51+
self.assertIsNone(Client().session)

tests/test_commands.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from datetime import timedelta
2+
3+
from django.contrib.auth.models import User
4+
from django.core.management import call_command
5+
from django.test import TestCase, TransactionTestCase
6+
from django.test.utils import modify_settings
7+
from django.utils.timezone import now
8+
9+
from user_sessions.models import Session
10+
11+
12+
class ClearsessionsCommandTest(TestCase):
13+
def test_can_call(self):
14+
Session.objects.create(expire_date=now() - timedelta(days=1),
15+
ip='127.0.0.1')
16+
call_command('clearsessions')
17+
self.assertEqual(Session.objects.count(), 0)
18+
19+
20+
class MigratesessionsCommandTest(TransactionTestCase):
21+
@modify_settings(INSTALLED_APPS={'append': 'django.contrib.sessions'})
22+
def test_migrate_from_login(self):
23+
from django.contrib.sessions.backends.db import (
24+
SessionStore as DjangoSessionStore,
25+
)
26+
from django.contrib.sessions.models import Session as DjangoSession
27+
try:
28+
call_command('migrate', 'sessions')
29+
call_command('clearsessions')
30+
user = User.objects.create_user('bouke', '', 'secret')
31+
session = DjangoSessionStore()
32+
session['_auth_user_id'] = user.id
33+
session.save()
34+
self.assertEqual(Session.objects.count(), 0)
35+
self.assertEqual(DjangoSession.objects.count(), 1)
36+
call_command('migratesessions')
37+
new_sessions = list(Session.objects.all())
38+
self.assertEqual(len(new_sessions), 1)
39+
self.assertEqual(new_sessions[0].user, user)
40+
self.assertEqual(new_sessions[0].ip, '127.0.0.1')
41+
finally:
42+
call_command('migrate', 'sessions', 'zero')

tests/test_middleware.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from django.contrib.auth.models import User
2+
from django.conf import settings
3+
from django.test import TestCase
4+
from django.urls import reverse
5+
6+
from user_sessions.models import Session
7+
8+
9+
class MiddlewareTest(TestCase):
10+
def test_unmodified_session(self):
11+
self.client.get('/', HTTP_USER_AGENT='Python/2.7')
12+
self.assertNotIn(settings.SESSION_COOKIE_NAME, self.client.cookies)
13+
14+
def test_modify_session(self):
15+
self.client.get('/modify_session/', HTTP_USER_AGENT='Python/2.7')
16+
self.assertIn(settings.SESSION_COOKIE_NAME, self.client.cookies)
17+
session = Session.objects.get(
18+
pk=self.client.cookies[settings.SESSION_COOKIE_NAME].value
19+
)
20+
self.assertEqual(session.user_agent, 'Python/2.7')
21+
self.assertEqual(session.ip, '127.0.0.1')
22+
23+
def test_login(self):
24+
admin_login_url = reverse('admin:login')
25+
user = User.objects.create_superuser('bouke', '', 'secret')
26+
response = self.client.post(admin_login_url,
27+
data={
28+
'username': 'bouke',
29+
'password': 'secret',
30+
'this_is_the_login_form': '1',
31+
'next': '/admin/'},
32+
HTTP_USER_AGENT='Python/2.7')
33+
self.assertRedirects(response, '/admin/')
34+
session = Session.objects.get(
35+
pk=self.client.cookies[settings.SESSION_COOKIE_NAME].value
36+
)
37+
self.assertEqual(
38+
self.client.cookies[settings.SESSION_COOKIE_NAME]["samesite"],
39+
settings.SESSION_COOKIE_SAMESITE,
40+
)
41+
self.assertEqual(user, session.user)
42+
43+
def test_long_ua(self):
44+
self.client.get('/modify_session/',
45+
HTTP_USER_AGENT=''.join('a' for _ in range(400)))

tests/test_models.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from django.contrib import auth
2+
from django.contrib.auth.models import User
3+
from django.test import TestCase
4+
5+
from user_sessions.backends.db import SessionStore
6+
from user_sessions.models import Session
7+
8+
9+
class ModelTest(TestCase):
10+
def test_get_decoded(self):
11+
User.objects.create_user('bouke', '', 'secret', id=1)
12+
store = SessionStore(user_agent='Python/2.7', ip='127.0.0.1')
13+
store[auth.SESSION_KEY] = 1
14+
store['foo'] = 'bar'
15+
store.save()
16+
17+
session = Session.objects.get(pk=store.session_key)
18+
self.assertEqual(session.get_decoded(),
19+
{'foo': 'bar', auth.SESSION_KEY: 1})
20+
21+
def test_very_long_ua(self):
22+
ua = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; ' \
23+
'Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; ' \
24+
'.NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; ' \
25+
'InfoPath.3; ms-office; MSOffice 14)'
26+
store = SessionStore(user_agent=ua, ip='127.0.0.1')
27+
store.save()
28+
29+
session = Session.objects.get(pk=store.session_key)
30+
self.assertEqual(session.user_agent, ua[:200])

tests/test_sessionstore.py

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
from datetime import timedelta
2+
3+
from django.contrib import auth
4+
from django.contrib.auth.models import User
5+
from django.contrib.sessions.backends.base import CreateError
6+
from django.test import TestCase
7+
from django.utils.timezone import now
8+
9+
from user_sessions.backends.db import SessionStore
10+
from user_sessions.models import Session
11+
12+
13+
class SessionStoreTest(TestCase):
14+
def setUp(self):
15+
self.store = SessionStore(user_agent='Python/2.7', ip='127.0.0.1')
16+
User.objects.create_user('bouke', '', 'secret', id=1)
17+
18+
def test_untouched_init(self):
19+
self.assertFalse(self.store.modified)
20+
self.assertFalse(self.store.accessed)
21+
22+
def test_auth_session_key(self):
23+
self.assertFalse(auth.SESSION_KEY in self.store)
24+
self.assertFalse(self.store.modified)
25+
self.assertTrue(self.store.accessed)
26+
27+
self.store.get(auth.SESSION_KEY)
28+
self.assertFalse(self.store.modified)
29+
30+
self.store[auth.SESSION_KEY] = 1
31+
self.assertTrue(self.store.modified)
32+
33+
def test_save(self):
34+
self.store[auth.SESSION_KEY] = 1
35+
self.store.save()
36+
37+
session = Session.objects.get(pk=self.store.session_key)
38+
self.assertEqual(session.user_agent, 'Python/2.7')
39+
self.assertEqual(session.ip, '127.0.0.1')
40+
self.assertEqual(session.user_id, 1)
41+
self.assertAlmostEqual(now(), session.last_activity,
42+
delta=timedelta(seconds=5))
43+
44+
def test_load_unmodified(self):
45+
self.store[auth.SESSION_KEY] = 1
46+
self.store.save()
47+
store2 = SessionStore(session_key=self.store.session_key,
48+
user_agent='Python/2.7', ip='127.0.0.1')
49+
store2.load()
50+
self.assertEqual(store2.user_agent, 'Python/2.7')
51+
self.assertEqual(store2.ip, '127.0.0.1')
52+
self.assertEqual(store2.user_id, 1)
53+
self.assertEqual(store2.modified, False)
54+
55+
def test_load_modified(self):
56+
self.store[auth.SESSION_KEY] = 1
57+
self.store.save()
58+
store2 = SessionStore(session_key=self.store.session_key,
59+
user_agent='Python/3.3', ip='8.8.8.8')
60+
store2.load()
61+
self.assertEqual(store2.user_agent, 'Python/3.3')
62+
self.assertEqual(store2.ip, '8.8.8.8')
63+
self.assertEqual(store2.user_id, 1)
64+
self.assertEqual(store2.modified, True)
65+
66+
def test_duplicate_create(self):
67+
s1 = SessionStore(session_key='DUPLICATE', user_agent='Python/2.7', ip='127.0.0.1')
68+
s1.create()
69+
s2 = SessionStore(session_key='DUPLICATE', user_agent='Python/2.7', ip='127.0.0.1')
70+
s2.create()
71+
self.assertNotEqual(s1.session_key, s2.session_key)
72+
73+
s3 = SessionStore(session_key=s1.session_key, user_agent='Python/2.7', ip='127.0.0.1')
74+
with self.assertRaises(CreateError):
75+
s3.save(must_create=True)
76+
77+
def test_delete(self):
78+
# not persisted, should just return
79+
self.store.delete()
80+
81+
# create, then delete
82+
self.store.create()
83+
session_key = self.store.session_key
84+
self.store.delete()
85+
86+
# non-existing sessions, should not raise
87+
self.store.delete()
88+
self.store.delete(session_key)
89+
90+
def test_clear(self):
91+
"""
92+
Clearing the session should clear all non-browser information
93+
"""
94+
self.store[auth.SESSION_KEY] = 1
95+
self.store.clear()
96+
self.store.save()
97+
98+
session = Session.objects.get(pk=self.store.session_key)
99+
self.assertEqual(session.user_id, None)

0 commit comments

Comments
 (0)