from datetime import date from pathlib import Path from django.test import TestCase, override_settings from pypdf import PdfReader from workflows.models import FormFieldConfig, FormSectionConfig, OffboardingRequest, OnboardingRequest from workflows.tasks import _generate_offboarding_pdf, _generate_onboarding_pdf @override_settings(PDF_OUTPUT_DIR=Path('/tmp/onoff_test_pdfs')) class PDFGenerationTests(TestCase): def _extract_pdf_text(self, pdf_path: Path) -> str: reader = PdfReader(str(pdf_path)) return "\n".join((page.extract_text() or "") for page in reader.pages) def test_onboarding_pdf_respects_hidden_section_and_field(self): FormSectionConfig.objects.update_or_create( form_type='onboarding', section_key='itsetup', defaults={'is_visible': False}, ) FormFieldConfig.objects.update_or_create( form_type='onboarding', field_name='job_title', defaults={'is_visible': False}, ) request_obj = OnboardingRequest.objects.create( full_name='Max Mustermann', gender='herr', job_title='Consultant', department='IT-Service', work_email='max.mustermann@workdock.de', contract_start=date(2026, 11, 1), employment_type='unbefristet', needed_devices='Laptop\nMonitor', onboarded_by_email='requester@workdock.de', onboarded_by_name='Mia Beispiel', agreement='accepted', ) pdf_path = _generate_onboarding_pdf(request_obj) text = self._extract_pdf_text(pdf_path) self.assertIn('Max Mustermann', text) self.assertIn('IT-Service', text) self.assertIn('Stammdaten', text) self.assertNotIn('Consultant', text) self.assertNotIn('Laptop', text) self.assertNotIn('IT-Setup', text) self.assertNotIn('1. Stammdaten', text) self.assertNotIn('Vorname', text) self.assertNotIn('Nachname', text) self.assertNotIn('onboarded_by_email', text) def test_offboarding_pdf_uses_dynamic_sections(self): request_obj = OffboardingRequest.objects.create( full_name='Lara Beispiel', work_email='lara.beispiel@workdock.de', department='IT-Service', job_title='Engineer', last_working_day=date(2026, 12, 31), notes='Bitte Accounts sperren.', requested_by_email='admin@workdock.de', requested_by_name='Nina Admin', ) pdf_path = _generate_offboarding_pdf(request_obj) text = self._extract_pdf_text(pdf_path) self.assertIn('Lara Beispiel', text) self.assertIn('Engineer', text) self.assertIn('31. Dezember 2026', text) self.assertIn('Bitte Accounts sperren.', text) self.assertNotIn('1. Mitarbeitende', text)