tests: add UserSettings model and middleware tests; ensure tests create UserSettings defaults
This commit is contained in:
@@ -11,12 +11,15 @@ from PIL import Image
|
||||
from django.test import Client, RequestFactory, TestCase, override_settings
|
||||
from django.contrib.auth.models import User
|
||||
from django.utils import timezone
|
||||
from django.http import HttpResponse
|
||||
from django.template.response import TemplateResponse
|
||||
|
||||
# Project imports.
|
||||
from viewer.common import SORT_LABELS
|
||||
from viewer.directory import do_recursive_search
|
||||
from viewer.views import gallery_view
|
||||
from viewer.models import Image as Im
|
||||
from viewer.models import Image as Im, UserSettings
|
||||
from NibasaViewer.middleware import UserSettingsMiddleware
|
||||
|
||||
|
||||
class GalleryBaseTests(TestCase):
|
||||
@@ -38,6 +41,10 @@ class GalleryBaseTests(TestCase):
|
||||
self.client = Client()
|
||||
self.client.force_login(self.user)
|
||||
self.factory = RequestFactory()
|
||||
# Ensure UserSettings exists for the test user so middleware-backed
|
||||
# attributes (`theme`, `sort`) are available during view rendering
|
||||
# even when tests call views directly via RequestFactory.
|
||||
UserSettings.objects.get_or_create(user=self.user)
|
||||
|
||||
self._build_fixture_tree()
|
||||
|
||||
@@ -97,6 +104,12 @@ class GalleryViewTests(GalleryBaseTests):
|
||||
request = self.factory.get("/gallery/../")
|
||||
request.user = self.user
|
||||
|
||||
# When calling the view directly we still need to allow any
|
||||
# TemplateResponse processing to see the settings. Ensure the
|
||||
# request has the attributes the middleware would provide.
|
||||
request.theme = UserSettings._meta.get_field("theme").get_default()
|
||||
request.sort = UserSettings._meta.get_field("sort").get_default()
|
||||
|
||||
response = gallery_view(request, "../")
|
||||
self.assertEqual(response.status_code, 404)
|
||||
|
||||
@@ -501,3 +514,60 @@ class ImageModelTests(GalleryBaseTests):
|
||||
|
||||
img.refresh_from_db()
|
||||
self.assertTrue(img.favorite)
|
||||
|
||||
|
||||
class UserSettingsModelTests(TestCase):
|
||||
def test_usersettings_defaults(self):
|
||||
user = User.objects.create_user("usertest", "u@example.com", "pw")
|
||||
us = UserSettings.objects.create(user=user)
|
||||
|
||||
self.assertEqual(us.theme, "dark")
|
||||
self.assertEqual(us.sort, "abc")
|
||||
|
||||
|
||||
class UserSettingsMiddlewareTests(TestCase):
|
||||
def setUp(self):
|
||||
self.user = User.objects.create_user("mwuser", "mw@example.com", "pw")
|
||||
self.factory = RequestFactory()
|
||||
|
||||
def test_middleware_creates_settings_and_sets_request(self):
|
||||
request = self.factory.get("/")
|
||||
request.user = self.user
|
||||
|
||||
def get_response(req):
|
||||
return HttpResponse("ok")
|
||||
|
||||
mw = UserSettingsMiddleware(get_response)
|
||||
response = mw(request)
|
||||
|
||||
# UserSettings should have been created and request attrs populated
|
||||
self.assertTrue(UserSettings.objects.filter(user=self.user).exists())
|
||||
self.assertEqual(
|
||||
request.theme, UserSettings._meta.get_field("theme").get_default()
|
||||
)
|
||||
self.assertEqual(
|
||||
request.sort, UserSettings._meta.get_field("sort").get_default()
|
||||
)
|
||||
|
||||
def test_process_template_response_injects_and_preserves(self):
|
||||
# Create a UserSettings with non-defaults
|
||||
UserSettings.objects.create(user=self.user, theme="light", sort="cba")
|
||||
|
||||
request = self.factory.get("/")
|
||||
request.user = self.user
|
||||
|
||||
def get_response(req):
|
||||
# Provide a TemplateResponse that already sets `theme` to ensure
|
||||
# the middleware does not overwrite existing keys.
|
||||
return TemplateResponse(
|
||||
req, "viewer/gallery_view.html", {"theme": "override-theme"}
|
||||
)
|
||||
|
||||
mw = UserSettingsMiddleware(get_response)
|
||||
response = mw(request)
|
||||
|
||||
# process_template_response should set missing keys but preserve existing ones
|
||||
resp = mw.process_template_response(request, response)
|
||||
self.assertIsInstance(resp, TemplateResponse)
|
||||
self.assertEqual(resp.context_data.get("theme"), "override-theme")
|
||||
self.assertEqual(resp.context_data.get("sort"), "cba")
|
||||
|
||||
Reference in New Issue
Block a user