snapshot: preserve dynamic pdf parity and quality pass
This commit is contained in:
75
backend/workflows/tests/test_pdf_generation.py
Normal file
75
backend/workflows/tests/test_pdf_generation.py
Normal file
@@ -0,0 +1,75 @@
|
||||
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)
|
||||
96
backend/workflows/tests/test_pdf_sections.py
Normal file
96
backend/workflows/tests/test_pdf_sections.py
Normal file
@@ -0,0 +1,96 @@
|
||||
from django.test import TestCase
|
||||
|
||||
from workflows.models import FormFieldConfig, FormSectionConfig, OffboardingRequest, OnboardingRequest
|
||||
from workflows.pdf_sections import build_pdf_sections
|
||||
|
||||
|
||||
class PDFSectionBuilderTests(TestCase):
|
||||
def test_onboarding_builder_respects_hidden_section_and_hidden_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='2026-11-01',
|
||||
employment_type='unbefristet',
|
||||
agreement='accepted',
|
||||
)
|
||||
|
||||
sections = build_pdf_sections('onboarding', request_obj, 'de')
|
||||
|
||||
self.assertEqual([section['key'] for section in sections], ['stammdaten', 'vertrag', 'abschluss'])
|
||||
stammdaten = next(section for section in sections if section['key'] == 'stammdaten')
|
||||
self.assertNotIn('job_title', [field['name'] for field in stammdaten['fields']])
|
||||
|
||||
def test_onboarding_builder_uses_field_order_and_overrides(self):
|
||||
FormFieldConfig.objects.update_or_create(
|
||||
form_type='onboarding',
|
||||
field_name='department',
|
||||
defaults={
|
||||
'sort_order': 1,
|
||||
'label_override': 'Team',
|
||||
'help_text_override': 'Interne Organisationseinheit',
|
||||
},
|
||||
)
|
||||
FormFieldConfig.objects.update_or_create(
|
||||
form_type='onboarding',
|
||||
field_name='gender',
|
||||
defaults={'sort_order': 5},
|
||||
)
|
||||
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='2026-11-01',
|
||||
employment_type='unbefristet',
|
||||
agreement='accepted',
|
||||
)
|
||||
|
||||
sections = build_pdf_sections('onboarding', request_obj, 'de')
|
||||
stammdaten = next(section for section in sections if section['key'] == 'stammdaten')
|
||||
visible_names = [field['name'] for field in stammdaten['fields']]
|
||||
department_field = next(field for field in stammdaten['fields'] if field['name'] == 'department')
|
||||
|
||||
self.assertLess(visible_names.index('department'), visible_names.index('gender'))
|
||||
self.assertEqual(department_field['label'], 'Team')
|
||||
self.assertEqual(department_field['help_text'], 'Interne Organisationseinheit')
|
||||
self.assertEqual(department_field['display_value'], 'IT-Service')
|
||||
|
||||
def test_offboarding_builder_has_section_parity_and_formats_values(self):
|
||||
FormSectionConfig.objects.update_or_create(
|
||||
form_type='offboarding',
|
||||
section_key='abschluss',
|
||||
defaults={'is_visible': False},
|
||||
)
|
||||
request_obj = OffboardingRequest.objects.create(
|
||||
full_name='Lara Beispiel',
|
||||
work_email='lara.beispiel@workdock.de',
|
||||
department='IT-Service',
|
||||
job_title='Engineer',
|
||||
last_working_day='2026-12-31',
|
||||
notes='Bitte Accounts sperren.',
|
||||
requested_by_email='admin@workdock.de',
|
||||
)
|
||||
|
||||
sections = build_pdf_sections('offboarding', request_obj, 'de')
|
||||
|
||||
self.assertEqual([section['key'] for section in sections], ['mitarbeitende', 'austritt'])
|
||||
mitarbeitende = next(section for section in sections if section['key'] == 'mitarbeitende')
|
||||
austritt = next(section for section in sections if section['key'] == 'austritt')
|
||||
self.assertIn('full_name', [field['name'] for field in mitarbeitende['fields']])
|
||||
self.assertIn('last_working_day', [field['name'] for field in austritt['fields']])
|
||||
date_field = next(field for field in austritt['fields'] if field['name'] == 'last_working_day')
|
||||
self.assertTrue(date_field['display_value'])
|
||||
Reference in New Issue
Block a user