chore(*/tests): various tests

pull/154/head^2
Christian Merten 4 months ago
parent 52f0209912
commit f58a7dc4b6
Signed by: christian.merten
GPG Key ID: D953D69721B948B3

@ -1,7 +1,13 @@
from django.test import TestCase from django.test import TestCase
from django.contrib.auth import get_user_model 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.models import CommonModel
from contrib.rules import has_global_perm from contrib.rules import has_global_perm
from contrib.admin import CommonAdminMixin
User = get_user_model() User = get_user_model()
@ -20,8 +26,6 @@ class CommonModelTestCase(TestCase):
# Test that CommonModel has the expected functionality # Test that CommonModel has the expected functionality
# Since it's abstract, we can't instantiate it directly # Since it's abstract, we can't instantiate it directly
# but we can check its metaclass and mixins # but we can check its metaclass and mixins
from rules.contrib.models import RulesModelMixin, RulesModelBase
self.assertTrue(issubclass(CommonModel, RulesModelMixin)) self.assertTrue(issubclass(CommonModel, RulesModelMixin))
self.assertEqual(CommonModel.__class__, RulesModelBase) self.assertEqual(CommonModel.__class__, RulesModelBase)
@ -54,3 +58,36 @@ class GlobalPermissionRulesTestCase(TestCase):
predicate = has_global_perm('auth.add_user') predicate = has_global_perm('auth.add_user')
result = predicate(self.user, None) result = predicate(self.user, None)
self.assertFalse(result) 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)

@ -9,6 +9,13 @@ from members.models import Member, DIVERSE
from ..models import RegistrationPassword, initial_user_setup 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): class RegisterViewTestCase(TestCase):
def setUp(self): def setUp(self):
self.client = Client() self.client = Client()

@ -124,7 +124,7 @@ class MessageTestCase(BasicMailerTestCase):
# Verify the message was not marked as sent # Verify the message was not marked as sent
self.message.refresh_from_db() self.message.refresh_from_db()
self.assertFalse(self.message.sent) 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) self.assertEqual(result, SENT)
@mock.patch('mailer.models.send') @mock.patch('mailer.models.send')
@ -236,6 +236,22 @@ class MessageTestCase(BasicMailerTestCase):
with self.assertRaises(Attachment.DoesNotExist): with self.assertRaises(Attachment.DoesNotExist):
attachment.refresh_from_db() 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): class AttachmentTestCase(BasicMailerTestCase):
def setUp(self): def setUp(self):

@ -31,6 +31,7 @@ from members.admin import MemberWaitingListAdmin, MemberAdmin, FreizeitAdmin, Me
MemberAdminForm, StatementOnListForm, KlettertreffAdmin, GroupAdmin,\ MemberAdminForm, StatementOnListForm, KlettertreffAdmin, GroupAdmin,\
InvitationToGroupAdmin, AgeFilter, InvitedToGroupFilter 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.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 mailer.models import EmailAddress, Message
from finance.models import Statement, Bill 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.ex.end = timezone.datetime(2000, 1, 1, 12, 0, 0)
self.assertEqual(self.ex.duration, 1) 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: class PDFActionMixin:
def _test_pdf(self, name, pk, model='freizeit', invalid=False, username='superuser', post_data=None): def _test_pdf(self, name, pk, model='freizeit', invalid=False, username='superuser', post_data=None):

@ -4,8 +4,11 @@ from django.conf import settings
from django.templatetags.static import static from django.templatetags.static import static
from django.utils import timezone from django.utils import timezone
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
from unittest import mock
from importlib import reload
from members.models import Member, Group, DIVERSE from members.models import Member, Group, DIVERSE
from startpage import urls
from .models import Post, Section, Image from .models import Post, Section, Image
@ -139,3 +142,16 @@ class ViewTestCase(BasicTestCase):
url = img.f.url url = img.f.url
response = c.get('/de' + url) response = c.get('/de' + url)
self.assertEqual(response.status_code, 200, 'Images on posts should be visible without login.') 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

Loading…
Cancel
Save