diff --git a/jdav_web/members/tests/basic.py b/jdav_web/members/tests/basic.py index 55c666a..0e19694 100644 --- a/jdav_web/members/tests/basic.py +++ b/jdav_web/members/tests/basic.py @@ -33,6 +33,7 @@ from members.admin import MemberWaitingListAdmin, MemberAdmin, FreizeitAdmin, Me 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 members.views import render_register_success, render_register_failed from mailer.models import EmailAddress, Message from finance.models import Statement, Bill @@ -1596,6 +1597,7 @@ class RegisterViewTestCase(BasicMemberTestCase): def setUp(self): super().setUp() + self.factory = RequestFactory() RegistrationPassword.objects.create(group=self.alp, password=RegisterViewTestCase.REGISTRATION_PASSWORD) @@ -1648,6 +1650,27 @@ class RegisterViewTestCase(BasicMemberTestCase): self.assertEqual(response.status_code, HTTPStatus.OK) self.assertContains(response, _("The entered password is wrong.")) + def test_register_no_group(self): + # Test when group is None, render_register_failed is called with reason + url = reverse('members:register') + response = self.client.post(url, data={ + 'password': '', + 'waiter_key': '', + 'save': '', + }) + self.assertEqual(response.status_code, HTTPStatus.OK) + self.assertContains(response, _('Registration failed')) + + def test_render_register_success(self): + # Test render_register_success return statement + response = render_register_success(self.factory.get('/'), "Test Group", "Test Member", False) + self.assertEqual(response.status_code, HTTPStatus.OK) + + def test_render_register_failed_with_reason(self): + # Test render_register_failed with reason to cover context assignment + response = render_register_failed(self.factory.get('/'), "Test reason") + self.assertEqual(response.status_code, HTTPStatus.OK) + class UploadRegistrationFormViewTestCase(BasicMemberTestCase): def setUp(self): @@ -1702,6 +1725,21 @@ class UploadRegistrationFormViewTestCase(BasicMemberTestCase): self.assertContains(response, _("Our team will process your registration shortly.")) + def test_upload_registration_form_validation_error(self): + # Test ValueError exception handling during form validation + url = reverse('members:upload_registration_form') + file = SimpleUploadedFile("form.pdf", b"file_content", content_type="application/pdf") + with mock.patch.object(Member, 'validate_registration_form') as mock_validate: + mock_validate.side_effect = ValueError("Test validation error") + response = self.client.post(url, data={ + 'key': self.reg.upload_registration_form_key, + 'registration_form': file, + }) + self.assertEqual(response.status_code, HTTPStatus.OK) + # Should stay on upload form page due to error + self.assertContains(response, + _('If you are not an adult yet, please let someone responsible for you sign the agreement.')) + class DownloadRegistrationFormViewTestCase(BasicMemberTestCase): def setUp(self): super().setUp() @@ -1965,6 +2003,15 @@ class ConfirmWaitingViewTestCase(BasicMemberTestCase): response = self.client.post(url, data={'key': self.waiter.leave_key}) self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) + def test_confirm_waiting_invalid_status(self): + # Test invalid status handling in confirm_waiting + url = reverse('members:confirm_waiting') + with mock.patch.object(MemberWaitingList, 'confirm_waiting') as mock_confirm: + mock_confirm.return_value = 999 # Invalid status + response = self.client.get(url, data={'key': self.key}) + self.assertEqual(response.status_code, HTTPStatus.OK) + self.assertContains(response, _('The supplied link is invalid.')) + class MailConfirmationViewTestCase(BasicMemberTestCase): def setUp(self): @@ -2063,6 +2110,22 @@ class EchoViewTestCase(BasicMemberTestCase): self.assertEqual(response.status_code, HTTPStatus.OK) self.assertContains(response, _('Your data was successfully updated.')) + def test_post_save_without_registration_form(self): + # Clear registration form to test member without registration_form case + self.fritz.registration_form = None + self.fritz.save() + url = reverse('members:echo') + response = self.client.post(url, data=dict( + REGISTRATION_DATA, + **EMERGENCY_CONTACT_DATA, + key=self.key, + password=self.fritz.echo_password, + save='', + )) + # Should redirect to upload registration form + self.assertEqual(response.status_code, HTTPStatus.FOUND) + self.assertIn('upload', response.url) + class TestRegistrationFilterTestCase(AdminTestCase): def setUp(self): diff --git a/jdav_web/members/views.py b/jdav_web/members/views.py index 29ade70..46d29c1 100644 --- a/jdav_web/members/views.py +++ b/jdav_web/members/views.py @@ -77,7 +77,7 @@ class MemberRegistrationWaitingListForm(ModelForm): 'prename': _('Prename of the member.'), 'lastname': _('Lastname of the member.'), } - required = [] + required = ['birth_date'] class EmergencyContactForm(ModelForm): @@ -319,7 +319,6 @@ def download_registration_form(request): return render_download_registration_form(request, member) except Member.DoesNotExist: return render_upload_registration_form_invalid(request) - return render_upload_registration_form_invalid(request) def render_upload_registration_form_invalid(request): @@ -364,7 +363,6 @@ def upload_registration_form(request): return render_upload_registration_form_success(request, member) except ValueError as e: return render_upload_registration_form(request, member, form, key) - return render_upload_registration_form_invalid(request) def confirm_mail(request):