Skip to content

Commit b631bbf

Browse files
committed
✅[#46] add update session profile tests
1 parent 5565720 commit b631bbf

File tree

6 files changed

+80
-55
lines changed

6 files changed

+80
-55
lines changed

open_api_framework/admin.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
from importlib import import_module
2-
3-
from django.conf import settings
41
from django.contrib import admin
52

63
from sessionprofile.models import SessionProfile
74

5+
from open_api_framework.utils import get_session_store
6+
87

98
@admin.register(SessionProfile)
109
class SessionProfileAdmin(admin.ModelAdmin):
@@ -13,7 +12,7 @@ class SessionProfileAdmin(admin.ModelAdmin):
1312
@property
1413
def SessionStore(self):
1514

16-
return import_module(settings.SESSION_ENGINE).SessionStore
15+
return get_session_store()
1716

1817
def get_queryset(self, request):
1918
qs = super().get_queryset(request)
@@ -35,8 +34,7 @@ def delete_model(self, request, obj):
3534

3635
def delete_queryset(self, request, queryset):
3736

38-
session_keys = list(queryset.values_list("session_key", flat=True))
39-
for session_key in session_keys:
40-
self.SessionStore(session_key).flush()
37+
for session_profile in queryset.iterator():
38+
self.SessionStore(session_profile.session_key).flush()
4139

4240
super().delete_queryset(request, queryset)

open_api_framework/conf/base.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,12 +231,14 @@
231231
"mozilla_django_oidc_db",
232232
"log_outgoing_requests",
233233
"django_setup_configuration",
234+
"sessionprofile",
234235
"open_api_framework",
235236
PROJECT_DIRNAME,
236237
]
237238

238239
MIDDLEWARE = [
239240
"django.middleware.security.SecurityMiddleware",
241+
"sessionprofile.middleware.SessionProfileMiddleware",
240242
"django.contrib.sessions.middleware.SessionMiddleware",
241243
"corsheaders.middleware.CorsMiddleware",
242244
"django.middleware.common.CommonMiddleware",

open_api_framework/utils.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from importlib import import_module
2+
3+
from django.conf import settings
4+
from django.contrib.sessions.backends.base import SessionBase
5+
6+
7+
def get_session_store() -> SessionBase:
8+
return import_module(settings.SESSION_ENGINE).SessionStore

tests/conftest.py

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,6 @@
1-
from importlib import import_module
1+
# import pytest
22

3-
from django.conf import settings as django_settings
43

5-
import pytest
6-
7-
8-
@pytest.fixture
9-
def cache_session_store(settings):
10-
settings.SESSION_ENGINE = "django.contrib.sessions.backends.cache"
11-
return import_module(django_settings.SESSION_ENGINE).SessionStore
12-
13-
14-
@pytest.fixture
15-
def db_session_store(settings):
16-
settings.SESSION_ENGINE = "django.contrib.sessions.backends.db"
17-
return import_module(django_settings.SESSION_ENGINE).SessionStore
4+
# @pytest.fixture
5+
# def some_fixture(request):
6+
# return "foo"

tests/factories.py

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
from importlib import import_module
2-
3-
from django.conf import settings
4-
5-
import factory
61
import factory.fuzzy
72
from sessionprofile.models import SessionProfile
83

4+
from open_api_framework.utils import get_session_store
5+
96

107
class SessionProfileFactory(factory.django.DjangoModelFactory):
118

@@ -14,11 +11,7 @@ class SessionProfileFactory(factory.django.DjangoModelFactory):
1411
class Meta:
1512
model = SessionProfile
1613

17-
@classmethod
18-
def create(cls, **kwargs):
19-
SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
20-
21-
instance = super().create(**kwargs)
22-
SessionStore(instance.session_key).save(True)
23-
24-
return instance
14+
@factory.post_generation
15+
def session(self, create, extracted, **kwargs):
16+
SessionStore = get_session_store()
17+
SessionStore(self.session_key).save(True)

tests/test_admin.py

Lines changed: 55 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1+
from django.contrib.sessions.backends.cache import SessionStore as CachedSessionStore
2+
from django.contrib.sessions.backends.db import SessionStore as DBSessionStore
13
from django.contrib.sessions.models import Session
4+
from django.test import override_settings
25
from django.urls import reverse
36

47
import pytest
5-
from pytest_django.fixtures import admin_user
68
from sessionprofile.models import SessionProfile
79

10+
from open_api_framework.utils import get_session_store
11+
812
from .factories import SessionProfileFactory
913

1014

@@ -25,9 +29,6 @@ def test_session_profile_sanity(client, admin_user, session_changelist_url):
2529
assert client.session.session_key == session.session_key
2630

2731

28-
admin_user2 = admin_user
29-
30-
3132
def test_only_session_profile_of_user_shown(
3233
client, admin_user, django_user_model, session_changelist_url
3334
):
@@ -54,18 +55,52 @@ def test_only_session_profile_of_user_shown(
5455
other_user_session = SessionProfile.objects.get(user=other_admin)
5556
assert other_user_session.session_key not in response.content.decode()
5657

58+
# should only be able to access own page
59+
change_url = reverse(
60+
"admin:sessionprofile_sessionprofile_change",
61+
args=[admin_user_session.session_key],
62+
)
63+
response = client.get(change_url)
64+
assert response.status_code == 200
5765

58-
def test_delete_with_session_db_backend(
59-
client, admin_user, session_changelist_url, db_session_store
60-
):
66+
change_url = reverse(
67+
"admin:sessionprofile_sessionprofile_change",
68+
args=[other_user_session.session_key],
69+
)
70+
response = client.get(change_url)
71+
assert response.status_code == 302
72+
assert response.url == reverse("admin:index")
73+
74+
75+
def test_cant_delete_other_users_session(client, admin_user, django_user_model):
76+
client.force_login(admin_user)
77+
78+
other_admin = django_user_model.objects.create_superuser("garry")
79+
80+
other_user_session = SessionProfileFactory(user=other_admin)
81+
82+
delete_url = reverse(
83+
"admin:sessionprofile_sessionprofile_delete",
84+
args=[other_user_session.session_key],
85+
)
86+
87+
response = client.post(delete_url, {"post": "yes"})
88+
assert response.status_code == 302
89+
90+
SessionStore = get_session_store()
91+
92+
assert SessionStore().exists(other_user_session.session_key)
93+
94+
95+
def test_delete_with_session_db_backend(client, admin_user, session_changelist_url):
6196
client.force_login(admin_user)
6297

6398
session = SessionProfileFactory(user=admin_user)
6499

65100
assert SessionProfile.objects.count() == 1
66101
# sesison created by login
67102
assert Session.objects.count() == 2
68-
assert db_session_store().exists(session.session_key)
103+
assert DBSessionStore().exists(session.session_key)
69104

70105
url = reverse("admin:sessionprofile_sessionprofile_delete", args=[session.pk])
71106

@@ -76,19 +111,18 @@ def test_delete_with_session_db_backend(
76111
assert SessionProfile.objects.count() == 1
77112
assert SessionProfile.objects.count() != session
78113
assert Session.objects.count() == 1
79-
assert not db_session_store().exists(session.session_key)
114+
assert not DBSessionStore().exists(session.session_key)
80115

81116

82-
def test_delete_with_session_cache_backend(
83-
client, admin_user, session_changelist_url, cache_session_store
84-
):
117+
@override_settings(SESSION_ENGINE="django.contrib.sessions.backends.cache")
118+
def test_delete_with_session_cache_backend(client, admin_user, session_changelist_url):
85119
client.force_login(admin_user)
86120

87121
session = SessionProfileFactory(user=admin_user)
88122

89123
assert SessionProfile.objects.count() == 1
90124
assert Session.objects.count() == 0
91-
assert cache_session_store().exists(session.session_key)
125+
assert CachedSessionStore().exists(session.session_key)
92126

93127
url = reverse("admin:sessionprofile_sessionprofile_delete", args=[session.pk])
94128

@@ -99,11 +133,11 @@ def test_delete_with_session_cache_backend(
99133
assert SessionProfile.objects.count() == 1
100134
assert SessionProfile.objects.count() != session
101135
assert Session.objects.count() == 0
102-
assert not cache_session_store().exists(session.session_key)
136+
assert not CachedSessionStore().exists(session.session_key)
103137

104138

105139
def test_delete_action_with_session_db_backend(
106-
client, admin_user, session_changelist_url, db_session_store
140+
client, admin_user, session_changelist_url
107141
):
108142
client.force_login(admin_user)
109143
sessions = SessionProfileFactory.create_batch(5, user=admin_user)
@@ -114,7 +148,7 @@ def test_delete_action_with_session_db_backend(
114148

115149
session_keys = [session.session_key for session in sessions]
116150
for session_key in session_keys:
117-
assert db_session_store().exists(session_key)
151+
assert DBSessionStore().exists(session_key)
118152

119153
response = client.post(
120154
session_changelist_url,
@@ -127,11 +161,12 @@ def test_delete_action_with_session_db_backend(
127161
assert Session.objects.count() == 1
128162

129163
for session_key in session_keys:
130-
assert not db_session_store().exists(session_key)
164+
assert not DBSessionStore().exists(session_key)
131165

132166

167+
@override_settings(SESSION_ENGINE="django.contrib.sessions.backends.cache")
133168
def test_delete_action_with_session_cache_backend(
134-
client, admin_user, session_changelist_url, cache_session_store
169+
client, admin_user, session_changelist_url
135170
):
136171

137172
client.force_login(admin_user)
@@ -145,7 +180,7 @@ def test_delete_action_with_session_cache_backend(
145180

146181
# sessions are created
147182
for session_key in session_keys:
148-
assert cache_session_store().exists(session_key)
183+
assert CachedSessionStore().exists(session_key)
149184

150185
response = client.post(
151186
session_changelist_url,
@@ -159,4 +194,4 @@ def test_delete_action_with_session_cache_backend(
159194

160195
# sessions should be deleted
161196
for session_key in session_keys:
162-
assert not cache_session_store().exists(session_key)
197+
assert not CachedSessionStore().exists(session_key)

0 commit comments

Comments
 (0)