diff --git a/dokumente/tests.py b/dokumente/tests.py index b7afaf8..ede69f8 100644 --- a/dokumente/tests.py +++ b/dokumente/tests.py @@ -1,4 +1,500 @@ -from django.test import TestCase -from .models import Dokument +from django.test import TestCase, Client +from django.urls import reverse +from datetime import date, timedelta +from .models import ( + Dokumententyp, Person, Thema, Dokument, Vorgabe, + VorgabeLangtext, VorgabeKurztext, Geltungsbereich, + Einleitung, Checklistenfrage, Changelog +) +from abschnitte.models import Abschnitttyp +from referenzen.models import Referenz +from stichworte.models import Stichwort +from rollen.models import Rolle -# Create your tests here. + +class DokumententypModelTest(TestCase): + """Test cases for Dokumententyp model""" + + def setUp(self): + self.dokumententyp = Dokumententyp.objects.create( + name="Standard", + verantwortliche_ve="IT Department" + ) + + def test_dokumententyp_creation(self): + """Test that Dokumententyp is created correctly""" + self.assertEqual(self.dokumententyp.name, "Standard") + self.assertEqual(self.dokumententyp.verantwortliche_ve, "IT Department") + + def test_dokumententyp_str(self): + """Test string representation of Dokumententyp""" + self.assertEqual(str(self.dokumententyp), "Standard") + + def test_dokumententyp_verbose_name(self): + """Test verbose name""" + self.assertEqual( + Dokumententyp._meta.verbose_name, + "Dokumententyp" + ) + self.assertEqual( + Dokumententyp._meta.verbose_name_plural, + "Dokumententypen" + ) + + +class PersonModelTest(TestCase): + """Test cases for Person model""" + + def setUp(self): + self.person = Person.objects.create( + name="Max Mustermann", + funktion="Manager" + ) + + def test_person_creation(self): + """Test that Person is created correctly""" + self.assertEqual(self.person.name, "Max Mustermann") + self.assertEqual(self.person.funktion, "Manager") + + def test_person_str(self): + """Test string representation of Person""" + self.assertEqual(str(self.person), "Max Mustermann") + + def test_person_verbose_name_plural(self): + """Test verbose name plural""" + self.assertEqual( + Person._meta.verbose_name_plural, + "Personen" + ) + + +class ThemaModelTest(TestCase): + """Test cases for Thema model""" + + def setUp(self): + self.thema = Thema.objects.create( + name="Security", + erklaerung="Security related topics" + ) + + def test_thema_creation(self): + """Test that Thema is created correctly""" + self.assertEqual(self.thema.name, "Security") + self.assertEqual(self.thema.erklaerung, "Security related topics") + + def test_thema_str(self): + """Test string representation of Thema""" + self.assertEqual(str(self.thema), "Security") + + def test_thema_blank_erklaerung(self): + """Test that erklaerung can be blank""" + thema = Thema.objects.create(name="Testing") + self.assertEqual(thema.erklaerung, "") + + +class DokumentModelTest(TestCase): + """Test cases for Dokument model""" + + def setUp(self): + self.dokumententyp = Dokumententyp.objects.create( + name="Policy", + verantwortliche_ve="Legal" + ) + self.autor = Person.objects.create( + name="John Doe", + funktion="Author" + ) + self.pruefer = Person.objects.create( + name="Jane Smith", + funktion="Reviewer" + ) + self.dokument = Dokument.objects.create( + nummer="DOC-001", + dokumententyp=self.dokumententyp, + name="Security Policy", + gueltigkeit_von=date.today(), + signatur_cso="CSO-123", + anhaenge="Appendix A, B" + ) + self.dokument.autoren.add(self.autor) + self.dokument.pruefende.add(self.pruefer) + + def test_dokument_creation(self): + """Test that Dokument is created correctly""" + self.assertEqual(self.dokument.nummer, "DOC-001") + self.assertEqual(self.dokument.name, "Security Policy") + self.assertEqual(self.dokument.dokumententyp, self.dokumententyp) + + def test_dokument_str(self): + """Test string representation of Dokument""" + self.assertEqual(str(self.dokument), "DOC-001 – Security Policy") + + def test_dokument_many_to_many_relationships(self): + """Test many-to-many relationships""" + self.assertIn(self.autor, self.dokument.autoren.all()) + self.assertIn(self.pruefer, self.dokument.pruefende.all()) + + def test_dokument_optional_fields(self): + """Test optional fields can be None or blank""" + dokument = Dokument.objects.create( + nummer="DOC-002", + dokumententyp=self.dokumententyp, + name="Test Document" + ) + self.assertIsNone(dokument.gueltigkeit_von) + self.assertIsNone(dokument.gueltigkeit_bis) + self.assertEqual(dokument.signatur_cso, "") + self.assertEqual(dokument.anhaenge, "") + + +class VorgabeModelTest(TestCase): + """Test cases for Vorgabe model""" + + def setUp(self): + self.dokumententyp = Dokumententyp.objects.create( + name="Standard", + verantwortliche_ve="IT" + ) + self.dokument = Dokument.objects.create( + nummer="STD-001", + dokumententyp=self.dokumententyp, + name="IT Standard" + ) + self.thema = Thema.objects.create(name="Security") + self.vorgabe = Vorgabe.objects.create( + nummer=1, + dokument=self.dokument, + thema=self.thema, + titel="Password Requirements", + gueltigkeit_von=date.today() - timedelta(days=30) + ) + + def test_vorgabe_creation(self): + """Test that Vorgabe is created correctly""" + self.assertEqual(self.vorgabe.nummer, 1) + self.assertEqual(self.vorgabe.dokument, self.dokument) + self.assertEqual(self.vorgabe.thema, self.thema) + + def test_vorgabennummer(self): + """Test Vorgabennummer generation""" + expected = "STD-001.S.1" + self.assertEqual(self.vorgabe.Vorgabennummer(), expected) + + def test_vorgabe_str(self): + """Test string representation of Vorgabe""" + expected = "STD-001.S.1: Password Requirements" + self.assertEqual(str(self.vorgabe), expected) + + def test_get_status_active(self): + """Test get_status returns 'active' for current vorgabe""" + status = self.vorgabe.get_status() + self.assertEqual(status, "active") + + def test_get_status_future(self): + """Test get_status returns 'future' for future vorgabe""" + future_vorgabe = Vorgabe.objects.create( + nummer=2, + dokument=self.dokument, + thema=self.thema, + titel="Future Requirement", + gueltigkeit_von=date.today() + timedelta(days=30) + ) + status = future_vorgabe.get_status() + self.assertEqual(status, "future") + + def test_get_status_expired(self): + """Test get_status returns 'expired' for expired vorgabe""" + expired_vorgabe = Vorgabe.objects.create( + nummer=3, + dokument=self.dokument, + thema=self.thema, + titel="Old Requirement", + gueltigkeit_von=date.today() - timedelta(days=60), + gueltigkeit_bis=date.today() - timedelta(days=10) + ) + status = expired_vorgabe.get_status() + self.assertEqual(status, "expired") + + def test_get_status_verbose(self): + """Test get_status with verbose=True""" + future_vorgabe = Vorgabe.objects.create( + nummer=4, + dokument=self.dokument, + thema=self.thema, + titel="Future Test", + gueltigkeit_von=date.today() + timedelta(days=10) + ) + status = future_vorgabe.get_status(verbose=True) + self.assertIn("Ist erst ab dem", status) + self.assertIn("in Kraft", status) + + def test_get_status_with_custom_check_date(self): + """Test get_status with custom check_date""" + vorgabe = Vorgabe.objects.create( + nummer=5, + dokument=self.dokument, + thema=self.thema, + titel="Test Requirement", + gueltigkeit_von=date.today() - timedelta(days=60), + gueltigkeit_bis=date.today() - timedelta(days=10) + ) + check_date = date.today() - timedelta(days=30) + status = vorgabe.get_status(check_date=check_date) + self.assertEqual(status, "active") + + +class VorgabeTextAbschnitteTest(TestCase): + """Test cases for VorgabeLangtext and VorgabeKurztext""" + + def setUp(self): + self.dokumententyp = Dokumententyp.objects.create( + name="Standard", + verantwortliche_ve="IT" + ) + self.dokument = Dokument.objects.create( + nummer="STD-001", + dokumententyp=self.dokumententyp, + name="Test Standard" + ) + self.thema = Thema.objects.create(name="Testing") + self.vorgabe = Vorgabe.objects.create( + nummer=1, + dokument=self.dokument, + thema=self.thema, + titel="Test Vorgabe", + gueltigkeit_von=date.today() + ) + self.abschnitttyp = Abschnitttyp.objects.create( + name="Paragraph", + format_string="

{}

" + ) + + def test_vorgabe_langtext_creation(self): + """Test VorgabeLangtext creation""" + langtext = VorgabeLangtext.objects.create( + abschnitt=self.vorgabe, + abschnitttyp=self.abschnitttyp, + content="This is a long text description", + order=1 + ) + self.assertEqual(langtext.abschnitt, self.vorgabe) + self.assertEqual(langtext.content, "This is a long text description") + + def test_vorgabe_kurztext_creation(self): + """Test VorgabeKurztext creation""" + kurztext = VorgabeKurztext.objects.create( + abschnitt=self.vorgabe, + abschnitttyp=self.abschnitttyp, + content="Short summary", + order=1 + ) + self.assertEqual(kurztext.abschnitt, self.vorgabe) + self.assertEqual(kurztext.content, "Short summary") + + +class DokumentTextAbschnitteTest(TestCase): + """Test cases for Geltungsbereich and Einleitung""" + + def setUp(self): + self.dokumententyp = Dokumententyp.objects.create( + name="Policy", + verantwortliche_ve="Legal" + ) + self.dokument = Dokument.objects.create( + nummer="POL-001", + dokumententyp=self.dokumententyp, + name="Test Policy" + ) + self.abschnitttyp = Abschnitttyp.objects.create( + name="Paragraph", + format_string="

{}

" + ) + + def test_geltungsbereich_creation(self): + """Test Geltungsbereich creation""" + geltungsbereich = Geltungsbereich.objects.create( + geltungsbereich=self.dokument, + abschnitttyp=self.abschnitttyp, + content="Applies to all employees", + order=1 + ) + self.assertEqual(geltungsbereich.geltungsbereich, self.dokument) + self.assertEqual(geltungsbereich.content, "Applies to all employees") + + def test_einleitung_creation(self): + """Test Einleitung creation""" + einleitung = Einleitung.objects.create( + einleitung=self.dokument, + abschnitttyp=self.abschnitttyp, + content="This document defines...", + order=1 + ) + self.assertEqual(einleitung.einleitung, self.dokument) + self.assertEqual(einleitung.content, "This document defines...") + + +class ChecklistenfrageModelTest(TestCase): + """Test cases for Checklistenfrage model""" + + def setUp(self): + self.dokumententyp = Dokumententyp.objects.create( + name="Standard", + verantwortliche_ve="QA" + ) + self.dokument = Dokument.objects.create( + nummer="QA-001", + dokumententyp=self.dokumententyp, + name="QA Standard" + ) + self.thema = Thema.objects.create(name="Quality") + self.vorgabe = Vorgabe.objects.create( + nummer=1, + dokument=self.dokument, + thema=self.thema, + titel="Quality Check", + gueltigkeit_von=date.today() + ) + self.frage = Checklistenfrage.objects.create( + vorgabe=self.vorgabe, + frage="Have all tests passed?" + ) + + def test_checklistenfrage_creation(self): + """Test Checklistenfrage creation""" + self.assertEqual(self.frage.vorgabe, self.vorgabe) + self.assertEqual(self.frage.frage, "Have all tests passed?") + + def test_checklistenfrage_str(self): + """Test string representation""" + self.assertEqual(str(self.frage), "Have all tests passed?") + + def test_checklistenfrage_related_name(self): + """Test related name works correctly""" + self.assertIn(self.frage, self.vorgabe.checklistenfragen.all()) + + +class ChangelogModelTest(TestCase): + """Test cases for Changelog model""" + + def setUp(self): + self.dokumententyp = Dokumententyp.objects.create( + name="Standard", + verantwortliche_ve="IT" + ) + self.dokument = Dokument.objects.create( + nummer="STD-001", + dokumententyp=self.dokumententyp, + name="IT Standard" + ) + self.autor = Person.objects.create( + name="John Doe", + funktion="Developer" + ) + self.changelog = Changelog.objects.create( + dokument=self.dokument, + datum=date.today(), + aenderung="Initial version" + ) + self.changelog.autoren.add(self.autor) + + def test_changelog_creation(self): + """Test Changelog creation""" + self.assertEqual(self.changelog.dokument, self.dokument) + self.assertEqual(self.changelog.aenderung, "Initial version") + self.assertIn(self.autor, self.changelog.autoren.all()) + + def test_changelog_str(self): + """Test string representation""" + expected = f"{date.today()} – STD-001" + self.assertEqual(str(self.changelog), expected) + + +class ViewsTestCase(TestCase): + """Test cases for views""" + + def setUp(self): + self.client = Client() + self.dokumententyp = Dokumententyp.objects.create( + name="Standard", + verantwortliche_ve="IT" + ) + self.dokument = Dokument.objects.create( + nummer="STD-001", + dokumententyp=self.dokumententyp, + name="Test Standard" + ) + self.thema = Thema.objects.create(name="Testing") + self.vorgabe = Vorgabe.objects.create( + nummer=1, + dokument=self.dokument, + thema=self.thema, + titel="Test Requirement", + gueltigkeit_von=date.today() + ) + self.abschnitttyp = Abschnitttyp.objects.create( + name="Paragraph", + format_string="

{}

" + ) + + def test_standard_list_view(self): + """Test standard_list view""" + response = self.client.get(reverse('standard_list')) + self.assertEqual(response.status_code, 200) + self.assertContains(response, "STD-001") + self.assertIn('dokumente', response.context) + + def test_standard_detail_view(self): + """Test standard_detail view""" + response = self.client.get( + reverse('standard_detail', kwargs={'nummer': 'STD-001'}) + ) + self.assertEqual(response.status_code, 200) + self.assertIn('standard', response.context) + self.assertIn('vorgaben', response.context) + self.assertEqual(response.context['standard'], self.dokument) + + def test_standard_detail_view_404(self): + """Test standard_detail view returns 404 for non-existent document""" + response = self.client.get( + reverse('standard_detail', kwargs={'nummer': 'NONEXISTENT'}) + ) + self.assertEqual(response.status_code, 404) + + def test_standard_checkliste_view(self): + """Test standard_checkliste view""" + response = self.client.get( + reverse('standard_checkliste', kwargs={'nummer': 'STD-001'}) + ) + self.assertEqual(response.status_code, 200) + self.assertIn('standard', response.context) + self.assertIn('vorgaben', response.context) + + def test_standard_history_view(self): + """Test standard_detail with history (check_date)""" + url = reverse('standard_history', kwargs={'nummer': 'STD-001'}) + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + +class URLPatternsTest(TestCase): + """Test URL patterns""" + + def test_standard_list_url_resolves(self): + """Test that standard_list URL resolves correctly""" + url = reverse('standard_list') + self.assertEqual(url, '/dokumente/') + + def test_standard_detail_url_resolves(self): + """Test that standard_detail URL resolves correctly""" + url = reverse('standard_detail', kwargs={'nummer': 'TEST-001'}) + self.assertEqual(url, '/dokumente/TEST-001/') + + def test_standard_checkliste_url_resolves(self): + """Test that standard_checkliste URL resolves correctly""" + url = reverse('standard_checkliste', kwargs={'nummer': 'TEST-001'}) + self.assertEqual(url, '/dokumente/TEST-001/checkliste/') + + def test_standard_history_url_resolves(self): + """Test that standard_history URL resolves correctly""" + url = reverse('standard_history', kwargs={'nummer': 'TEST-001'}) + self.assertEqual(url, '/dokumente/TEST-001/history/')