from decimal import Decimal import factory import pytest from django.urls import reverse from vergabe_teilnahme.apps.ausschreibungen.tests import AusschreibungFactory from vergabe_teilnahme.apps.core.services import gewichteter_durchschnitt from .models import Preispunkt class PreispunktFactory(factory.django.DjangoModelFactory): class Meta: model = Preispunkt ausschreibung = factory.SubFactory(AusschreibungFactory) leistungstyp = 'IT-Dienstleistung' konkrete_leistung = factory.Sequence(lambda n: f'Leistung {n}') mengeneinheit = 'Stück' einzelpreis = Decimal('100.00') vergleichsgewicht = Decimal('1.0') @pytest.mark.django_db def test_vergleichsgewicht_null_gespeichert(client): a = AusschreibungFactory() url = reverse('ausschreibungen:preise:neu', kwargs={'ausschreibung_id': a.pk}) response = client.post(url, { 'leistungstyp': 'Test', 'konkrete_leistung': 'Leistung mit Gewicht 0', 'mengeneinheit': 'Stück', 'waehrung': 'EUR', 'vergleichsgewicht': '0.0', }) assert response.status_code == 302 pp = Preispunkt.objects.get(ausschreibung=a) assert pp.vergleichsgewicht == Decimal('0.0') @pytest.mark.django_db def test_vergleichsgewicht_zu_gross_validation_error(client): a = AusschreibungFactory() url = reverse('ausschreibungen:preise:neu', kwargs={'ausschreibung_id': a.pk}) response = client.post(url, { 'leistungstyp': 'Test', 'konkrete_leistung': 'Leistung', 'mengeneinheit': 'Stück', 'waehrung': 'EUR', 'vergleichsgewicht': '2.5', }) assert response.status_code == 200 assert not Preispunkt.objects.filter(ausschreibung=a).exists() def test_gewichteter_durchschnitt_berechnung(): class FakePP: def __init__(self, einzelpreis, gewicht): self.einzelpreis = Decimal(str(einzelpreis)) self.vergleichsgewicht = Decimal(str(gewicht)) punkte = [ FakePP(100, 1.0), FakePP(110, 2.0), FakePP(90, 0.0), # ausgeschlossen ] ergebnis = gewichteter_durchschnitt(punkte) assert ergebnis is not None expected = (Decimal('100') * 1 + Decimal('110') * 2) / (1 + 2) assert round(ergebnis['wert'], 2) == round(expected, 2) @pytest.mark.django_db def test_auswertung_view_200(client): a = AusschreibungFactory() PreispunktFactory(ausschreibung=a, einzelpreis=Decimal('150.00')) url = reverse('ausschreibungen:preise:auswertung', kwargs={'ausschreibung_id': a.pk}) response = client.get(url) assert response.status_code == 200 assert 'ergebnis' in response.context