Files
vergabe-teilnahme/vergabe_teilnahme/apps/preise/tests.py

81 lines
2.6 KiB
Python

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