import factory import pytest from django.urls import reverse from vergabe_teilnahme.apps.ausschreibungen.models import Ausschreibung from vergabe_teilnahme.apps.ausschreibungen.tests import AusschreibungFactory from vergabe_teilnahme.apps.bibliothek.models import Nachweis from .models import Anforderung, Los class LosFactory(factory.django.DjangoModelFactory): class Meta: model = Los ausschreibung = factory.SubFactory(AusschreibungFactory) losnummer = factory.Sequence(lambda n: f"L{n:02d}") lostitel = factory.Sequence(lambda n: f"Los {n}") class AnforderungFactory(factory.django.DjangoModelFactory): class Meta: model = Anforderung ausschreibung = factory.SubFactory(AusschreibungFactory) titel = factory.Sequence(lambda n: f"Anforderung {n}") verbindlichkeit = 'muss' erfuellungsstatus = 'offen' class NachweisFactory(factory.django.DjangoModelFactory): class Meta: model = Nachweis titel = factory.Sequence(lambda n: f"Nachweis {n}") # ─── Lose ────────────────────────────────────────────────────────────────── @pytest.mark.django_db def test_lose_liste_get(client): a = AusschreibungFactory() url = reverse('ausschreibungen:lose:liste', kwargs={'ausschreibung_id': a.pk}) response = client.get(url) assert response.status_code == 200 @pytest.mark.django_db def test_los_neu_post(client): a = AusschreibungFactory() url = reverse('ausschreibungen:lose:neu', kwargs={'ausschreibung_id': a.pk}) response = client.post(url, {'losnummer': 'L01', 'lostitel': 'Testlos'}) assert response.status_code == 302 assert Los.objects.filter(ausschreibung=a, losnummer='L01').exists() @pytest.mark.django_db def test_los_detail_get(client): los = LosFactory() url = reverse('ausschreibungen:lose:detail', kwargs={'ausschreibung_id': los.ausschreibung_id, 'los_pk': los.pk}) response = client.get(url) assert response.status_code == 200 # ─── Anforderungen ───────────────────────────────────────────────────────── @pytest.mark.django_db def test_anforderung_neu_post_muss(client): a = AusschreibungFactory() url = reverse('ausschreibungen:lose:anforderung_neu', kwargs={'ausschreibung_id': a.pk}) response = client.post(url, {'titel': 'Neue Anforderung', 'verbindlichkeit': 'muss', 'erfuellungsstatus': 'offen'}) assert response.status_code == 302 assert Anforderung.objects.filter(ausschreibung=a, titel='Neue Anforderung').exists() @pytest.mark.django_db def test_anforderung_status_htmx(client): anf = AnforderungFactory() url = reverse('ausschreibungen:lose:anforderung_status', kwargs={'ausschreibung_id': anf.ausschreibung_id, 'pk': anf.pk}) response = client.post(url, {'erfuellungsstatus': 'nicht_erfuellbar'}, HTTP_HX_REQUEST='true') assert response.status_code == 200 anf.refresh_from_db() assert anf.erfuellungsstatus == 'nicht_erfuellbar' @pytest.mark.django_db def test_ausschlusskriterium_banner_shown(client): a = AusschreibungFactory() AnforderungFactory( ausschreibung=a, ausschlusskriterium=True, erfuellungsstatus='nicht_erfuellbar', ) url = reverse('ausschreibungen:entscheidung', kwargs={'pk': a.pk}) response = client.get(url) assert response.status_code == 200 assert b'Nicht erf\xc3\xbcllbare Ausschlusskriterien' in response.content @pytest.mark.django_db def test_nachweis_zuordnen(client): anf = AnforderungFactory() n = NachweisFactory() url = reverse('ausschreibungen:lose:nachweis_zuordnen', kwargs={'ausschreibung_id': anf.ausschreibung_id, 'pk': anf.pk}) response = client.post(url, {'nachweis_pk': n.pk}) assert response.status_code == 200 assert anf.nachweise.filter(pk=n.pk).exists()