Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions src/bo4e/bo/tarifkosten.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
"""
Contains Tarifkosten class
and corresponding marshmallow schema for de-/serialization
"""
import attr
from marshmallow import fields

from bo4e.bo.kosten import Kosten, KostenSchema
from bo4e.bo.tarifinfo import Tarifinfo, TarifinfoSchema
from bo4e.enum.botyp import BoTyp


# pylint: disable=too-few-public-methods
@attr.s(auto_attribs=True, kw_only=True)
class Tarifkosten(Tarifinfo):
"""
Objekt zur Kommunikation von Kosten, die im Rahmen der Tarifanwendung entstehen
"""

# required attributes
bo_typ: BoTyp = attr.ib(default=BoTyp.TARIFKOSTEN)
kosten: Kosten = attr.ib(validator=attr.validators.instance_of(Kosten))
"""
Referenz (Link) zu einem Kostenobjekt, in dem die Kosten für die Anwendung
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Referenz (Link) zu einem Kostenobjekt, in dem die Kosten für die Anwendung
Referenz zu einem Kostenobjekt, in dem die Kosten für die Anwendung

ja, das steht in der doku, aber für uns macht das keinen Sinn/keinen Unterscheid

des Tarifs auf eine Abnahmesituation berechnet wurden
"""

# there are no optional attributes


class TarifkostenSchema(TarifinfoSchema):
"""
Schema for de-/serialization of Tarifkosten.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Schema for de-/serialization of Tarifkosten.
Schema for de-/serialization of Tarifkosten

"""

# class_name is needed to use the correct schema for deserialization.
# see function `deserialize` in geschaeftsobjekt.py
class_name = Tarifkosten # type:ignore[assignment]

# required attributes
kosten = fields.Nested(KostenSchema)
22 changes: 12 additions & 10 deletions tests/test_kosten.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,24 @@
from tests.test_betrag import example_betrag # type:ignore[import]
from tests.test_zeitraum import example_zeitraum # type:ignore[import]

example_kosten = Kosten(
kostenklasse=Kostenklasse.FREMDKOSTEN,
gueltigkeit=example_zeitraum,
kostenbloecke=[
Kostenblock(
kostenblockbezeichnung="Mein Kostenblock",
)
],
summe_kosten=[example_betrag],
)


class TestKosten:
@pytest.mark.parametrize(
"kosten",
[
pytest.param(
Kosten(
kostenklasse=Kostenklasse.FREMDKOSTEN,
gueltigkeit=example_zeitraum,
kostenbloecke=[
Kostenblock(
kostenblockbezeichnung="Mein Kostenblock",
)
],
summe_kosten=[example_betrag],
),
example_kosten,
id="maximal attributes",
)
],
Expand Down
51 changes: 51 additions & 0 deletions tests/test_tarifkosten.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import pytest # type:ignore[import]

from bo4e.bo.tarifkosten import Tarifkosten, TarifkostenSchema
from bo4e.enum.kundentyp import Kundentyp
from bo4e.enum.sparte import Sparte
from bo4e.enum.tarifart import Tarifart
from bo4e.enum.tarifmerkmal import Tarifmerkmal
from bo4e.enum.tariftyp import Tariftyp
from tests.serialization_helper import assert_serialization_roundtrip # type:ignore[import]
from tests.test_energiemix import example_energiemix # type:ignore[import]
from tests.test_kosten import example_kosten # type:ignore[import]
from tests.test_marktteilnehmer import example_marktteilnehmer # type:ignore[import]
from tests.test_vertragskonditionen import example_vertragskonditionen # type:ignore[import]
from tests.test_zeitraum import example_zeitraum # type:ignore[import]


class TestTarifkosten:
@pytest.mark.parametrize(
"tarifkosten",
[
pytest.param(
Tarifkosten(
bezeichnung="foo",
anbietername="der beste stromanbieter",
sparte=Sparte.STROM,
kundentypen=[Kundentyp.PRIVAT, Kundentyp.GEWERBE],
tarifart=Tarifart.MEHRTARIF,
tariftyp=Tariftyp.GRUND_ERSATZVERSORGUNG,
tarifmerkmale=[Tarifmerkmal.HEIZSTROM],
website="https://foo.inv",
bemerkung="super billig aber auch super dreckig",
vertragskonditionen=example_vertragskonditionen,
zeitliche_gueltigkeit=example_zeitraum,
energiemix=example_energiemix,
anbieter=example_marktteilnehmer,
kosten=example_kosten,
)
),
],
)
def test_serialization_roundtrip(self, tarifkosten: Tarifkosten):
"""
Test de-/serialisation
"""
assert_serialization_roundtrip(tarifkosten, TarifkostenSchema())

def test_missing_required_attribute(self):
with pytest.raises(TypeError) as excinfo:
_ = Tarifkosten()

assert "missing 9 required" in str(excinfo.value)