generated from coulomb/repo-seed
81 lines
2.6 KiB
Python
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
|