from django.core.files.uploadedfile import SimpleUploadedFile from django.test import TestCase from io import BytesIO from PIL import Image from workflows.forms import AccountAvatarForm, OnboardingRequestForm, PortalBrandingForm class UploadValidationTests(TestCase): def test_avatar_rejects_mismatched_extension_and_signature(self): form = AccountAvatarForm( data={}, files={ 'avatar_image': SimpleUploadedFile( 'avatar.png', b'not-a-real-png', content_type='image/png', ) }, ) self.assertFalse(form.is_valid()) self.assertIn('avatar_image', form.errors) def test_logo_accepts_valid_svg(self): form = PortalBrandingForm( data={ 'portal_title': 'Workdock', 'company_name': 'Workdock', 'company_domain': 'workdock.de', 'support_email': 'info@workdock.de', 'sender_display_name': 'Workdock', 'login_subtitle': 'Login', 'footer_text': 'Footer', 'footer_text_en': 'Footer', 'legal_notice': '', 'legal_notice_en': '', 'default_language': 'de', 'primary_color': '#000078', 'secondary_color': '#c0002b', }, files={ 'logo_image': SimpleUploadedFile( 'logo.svg', b'', content_type='image/svg+xml', ) }, ) self.assertTrue(form.is_valid(), form.errors) def test_favicon_rejects_wrong_signature(self): form = PortalBrandingForm( data={ 'portal_title': 'Workdock', 'company_name': 'Workdock', 'company_domain': 'workdock.de', 'support_email': 'info@workdock.de', 'sender_display_name': 'Workdock', 'login_subtitle': 'Login', 'footer_text': 'Footer', 'footer_text_en': 'Footer', 'legal_notice': '', 'legal_notice_en': '', 'default_language': 'de', 'primary_color': '#000078', 'secondary_color': '#c0002b', }, files={ 'favicon_image': SimpleUploadedFile( 'favicon.ico', b'not-an-ico', content_type='image/x-icon', ) }, ) self.assertFalse(form.is_valid()) self.assertIn('favicon_image', form.errors) def test_pdf_letterhead_rejects_non_pdf_content(self): form = PortalBrandingForm( data={ 'portal_title': 'Workdock', 'company_name': 'Workdock', 'company_domain': 'workdock.de', 'support_email': 'info@workdock.de', 'sender_display_name': 'Workdock', 'login_subtitle': 'Login', 'footer_text': 'Footer', 'footer_text_en': 'Footer', 'legal_notice': '', 'legal_notice_en': '', 'default_language': 'de', 'primary_color': '#000078', 'secondary_color': '#c0002b', }, files={ 'pdf_letterhead': SimpleUploadedFile( 'letterhead.pdf', b'not-a-pdf', content_type='application/pdf', ) }, ) self.assertFalse(form.is_valid()) self.assertIn('pdf_letterhead', form.errors) def test_signature_accepts_valid_png(self): buffer = BytesIO() Image.new('RGBA', (2, 2), (0, 0, 0, 255)).save(buffer, format='PNG') png_bytes = buffer.getvalue() form = OnboardingRequestForm( data={ 'first_name': 'Max', 'last_name': 'Mustermann', 'gender': 'herr', 'job_title': 'Consultant', 'department': 'IT-Service', 'work_email': 'max.mustermann@workdock.de', 'contract_start': '2026-11-01', 'employment_type': 'unbefristet', 'group_mailboxes_required_choice': 'nein', 'additional_hardware_needed_choice': 'nein', 'additional_software_needed_choice': 'nein', 'additional_access_needed_choice': 'nein', 'successor_required_choice': 'nein', 'inherit_phone_number_choice': 'nein', 'agreement_confirm': 'on', }, files={ 'signature_image': SimpleUploadedFile( 'signature.png', png_bytes, content_type='image/png', ) }, requester_email='requester@workdock.de', ) self.assertTrue(form.is_valid(), form.errors)