From f58a7dc4b6d2a19887f5112ee28780ee3ac39283 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Tue, 19 Aug 2025 23:03:56 +0200 Subject: [PATCH] chore(*/tests): various tests --- jdav_web/contrib/tests.py | 41 +++++++++++++++++++++++++++++-- jdav_web/logindata/tests/views.py | 7 ++++++ jdav_web/mailer/tests/models.py | 18 +++++++++++++- jdav_web/members/tests/basic.py | 7 ++++++ jdav_web/startpage/tests.py | 16 ++++++++++++ 5 files changed, 86 insertions(+), 3 deletions(-) diff --git a/jdav_web/contrib/tests.py b/jdav_web/contrib/tests.py index 41e3726..99493e1 100644 --- a/jdav_web/contrib/tests.py +++ b/jdav_web/contrib/tests.py @@ -1,7 +1,13 @@ from django.test import TestCase from django.contrib.auth import get_user_model +from django.contrib import admin +from django.db import models +from django.test import RequestFactory +from unittest.mock import Mock +from rules.contrib.models import RulesModelMixin, RulesModelBase from contrib.models import CommonModel from contrib.rules import has_global_perm +from contrib.admin import CommonAdminMixin User = get_user_model() @@ -20,8 +26,6 @@ class CommonModelTestCase(TestCase): # Test that CommonModel has the expected functionality # Since it's abstract, we can't instantiate it directly # but we can check its metaclass and mixins - from rules.contrib.models import RulesModelMixin, RulesModelBase - self.assertTrue(issubclass(CommonModel, RulesModelMixin)) self.assertEqual(CommonModel.__class__, RulesModelBase) @@ -54,3 +58,36 @@ class GlobalPermissionRulesTestCase(TestCase): predicate = has_global_perm('auth.add_user') result = predicate(self.user, None) self.assertFalse(result) + + +class CommonAdminMixinTestCase(TestCase): + def setUp(self): + self.user = User.objects.create_user(username='testuser', password='testpass') + + def test_formfield_for_dbfield_with_formfield_overrides(self): + """Test formfield_for_dbfield when db_field class is in formfield_overrides""" + # Create a test admin instance that inherits from Django's ModelAdmin + class TestAdmin(CommonAdminMixin, admin.ModelAdmin): + formfield_overrides = { + models.ForeignKey: {'widget': Mock()} + } + + # Create a mock model to use with the admin + class TestModel: + _meta = Mock() + _meta.app_label = 'test' + + admin_instance = TestAdmin(TestModel, admin.site) + + # Create a mock ForeignKey field to trigger the missing line 147 + db_field = models.ForeignKey(User, on_delete=models.CASCADE) + + # Create a test request + request = RequestFactory().get('/') + request.user = self.user + + # Call the method to test formfield_overrides usage + result = admin_instance.formfield_for_dbfield(db_field, request, help_text='Test help text') + + # Verify that the formfield_overrides were used + self.assertIsNotNone(result) diff --git a/jdav_web/logindata/tests/views.py b/jdav_web/logindata/tests/views.py index 95c8200..00e22d2 100644 --- a/jdav_web/logindata/tests/views.py +++ b/jdav_web/logindata/tests/views.py @@ -9,6 +9,13 @@ from members.models import Member, DIVERSE from ..models import RegistrationPassword, initial_user_setup +class RegistrationPasswordTestCase(TestCase): + def test_str_method(self): + """Test RegistrationPassword __str__ method returns password""" + reg_password = RegistrationPassword.objects.create(password="test123") + self.assertEqual(str(reg_password), "test123") + + class RegisterViewTestCase(TestCase): def setUp(self): self.client = Client() diff --git a/jdav_web/mailer/tests/models.py b/jdav_web/mailer/tests/models.py index ded8fad..feaed68 100644 --- a/jdav_web/mailer/tests/models.py +++ b/jdav_web/mailer/tests/models.py @@ -124,7 +124,7 @@ class MessageTestCase(BasicMailerTestCase): # Verify the message was not marked as sent self.message.refresh_from_db() self.assertFalse(self.message.sent) - # Note: The submit method always returns SENT due to line 190 in the code + # Note: The submit method always returns SENT when an exception occurs self.assertEqual(result, SENT) @mock.patch('mailer.models.send') @@ -236,6 +236,22 @@ class MessageTestCase(BasicMailerTestCase): with self.assertRaises(Attachment.DoesNotExist): attachment.refresh_from_db() + @mock.patch('mailer.models.send') + def test_submit_with_association_email_enabled(self, mock_send): + """Test submit method when SEND_FROM_ASSOCIATION_EMAIL is True and sender has association_email""" + mock_send.return_value = SENT + + # Mock settings to enable association email sending + with mock.patch.object(settings, 'SEND_FROM_ASSOCIATION_EMAIL', True): + result = self.message.submit(sender=self.sender) + + # Check that send was called with sender's association email + self.assertTrue(mock_send.called) + call_args = mock_send.call_args + from_addr = call_args[0][2] # from_addr is the 3rd positional argument + expected_from = f"{self.sender.name} <{self.sender.association_email}>" + self.assertEqual(from_addr, expected_from) + class AttachmentTestCase(BasicMailerTestCase): def setUp(self): diff --git a/jdav_web/members/tests/basic.py b/jdav_web/members/tests/basic.py index 6d620f4..bb9b280 100644 --- a/jdav_web/members/tests/basic.py +++ b/jdav_web/members/tests/basic.py @@ -31,6 +31,7 @@ from members.admin import MemberWaitingListAdmin, MemberAdmin, FreizeitAdmin, Me MemberAdminForm, StatementOnListForm, KlettertreffAdmin, GroupAdmin,\ InvitationToGroupAdmin, AgeFilter, InvitedToGroupFilter from members.pdf import fill_pdf_form, render_tex, media_path, serve_pdf, find_template, merge_pdfs, render_docx, pdf_add_attachments, scale_pdf_page_to_a4, scale_pdf_to_a4 +from members.excel import generate_ljp_vbk from mailer.models import EmailAddress, Message from finance.models import Statement, Bill @@ -942,6 +943,12 @@ class FreizeitTestCase(BasicMemberTestCase): self.ex.end = timezone.datetime(2000, 1, 1, 12, 0, 0) self.assertEqual(self.ex.duration, 1) + def test_generate_ljp_vbk_no_proposal_raises_error(self): + """Test generate_ljp_vbk raises ValueError when excursion has no LJP proposal""" + with self.assertRaises(ValueError) as cm: + generate_ljp_vbk(self.ex) + self.assertIn("Excursion has no LJP proposal", str(cm.exception)) + class PDFActionMixin: def _test_pdf(self, name, pk, model='freizeit', invalid=False, username='superuser', post_data=None): diff --git a/jdav_web/startpage/tests.py b/jdav_web/startpage/tests.py index ef81f7d..94ab953 100644 --- a/jdav_web/startpage/tests.py +++ b/jdav_web/startpage/tests.py @@ -4,8 +4,11 @@ from django.conf import settings from django.templatetags.static import static from django.utils import timezone from django.core.files.uploadedfile import SimpleUploadedFile +from unittest import mock +from importlib import reload from members.models import Member, Group, DIVERSE +from startpage import urls from .models import Post, Section, Image @@ -139,3 +142,16 @@ class ViewTestCase(BasicTestCase): url = img.f.url response = c.get('/de' + url) self.assertEqual(response.status_code, 200, 'Images on posts should be visible without login.') + + def test_urlpatterns_with_redirect_url(self): + """Test URL patterns when STARTPAGE_REDIRECT_URL is not empty""" + + # Mock settings to have a non-empty STARTPAGE_REDIRECT_URL + with mock.patch.object(settings, 'STARTPAGE_REDIRECT_URL', 'https://example.com'): + # Reload the urls module to trigger the conditional urlpatterns creation + reload(urls) + + # Check that urlpatterns contains the redirect view + url_names = [pattern.name for pattern in urls.urlpatterns if hasattr(pattern, 'name')] + self.assertIn('index', url_names) + self.assertEqual(len(urls.urlpatterns), 2) # Should have index and impressum only