vbv/server/vbv_lernwelt/shop/tests/test_invoice.py

179 lines
5.7 KiB
Python

from datetime import date
from unittest.mock import create_autospec
from django.test import TestCase
from vbv_lernwelt.core.admin import User
from vbv_lernwelt.shop.invoice.abacus import AbacusInvoiceCreator
from vbv_lernwelt.shop.invoice.creator import Item
from vbv_lernwelt.shop.invoice.repositories import InvoiceRepository
from vbv_lernwelt.shop.models import CheckoutInformation
USER_USERNAME = "testuser"
USER_EMAIL = "test@example.com"
USER_PASSWORD = "testpassword"
class InvoiceTestCase(TestCase):
def setUp(self) -> None:
self.user = User.objects.create_user(
username=USER_USERNAME,
email=USER_EMAIL,
password=USER_PASSWORD,
is_active=True,
)
def test_render_invoice_xml(self):
# GIVEN
creator = AbacusInvoiceCreator(repository=create_autospec(InvoiceRepository))
# WHEN
invoice_xml = creator.render_invoice_xml(
abacus_debitor_number=60000012,
abacus_order_id=6000000001,
order_date=date(2024, 2, 15),
datatrans_transaction_id="24021508331287484",
item_description="myVBV Versicherungsvermittler - Lernpfad, 2024-02-15, Skender, Gebhart-Krasniqi",
)
# example from Skender
expected_xml = """<?xml version="1.0" encoding="utf-8"?>
<AbaConnectContainer>
<Task>
<Parameter>
<Application>ORDE</Application>
<Id>Verkaufsauftrag</Id>
<MapId>AbaDefault</MapId>
<Version>2022.00</Version>
</Parameter>
<Transaction>
<SalesOrderHeader mode="SAVE">
<SalesOrderHeaderFields mode="SAVE">
<CustomerNumber>60000012</CustomerNumber>
<ProcessFlowNumber>30</ProcessFlowNumber>
<PaymentCode>9999</PaymentCode>
<PurchaseOrderDate>2024-02-15</PurchaseOrderDate>
<ReferencePurchaseOrder>24021508331287484</ReferencePurchaseOrder>
<GroupingNumberAscii1>6000000001</GroupingNumberAscii1>
</SalesOrderHeaderFields>
<Item mode="SAVE">
<ItemFields mode="SAVE">
<DeliveryDate>2024-02-15</DeliveryDate>
<ItemNumber>1</ItemNumber>
<ProductNumber>30202</ProductNumber>
<QuantityOrdered>1</QuantityOrdered>
</ItemFields>
<ItemText mode="SAVE">
<ItemTextFields mode="SAVE">
<Text>myVBV Versicherungsvermittler - Lernpfad, 2024-02-15, Skender, Gebhart-Krasniqi</Text>
</ItemTextFields>
</ItemText>
</Item>
</SalesOrderHeader>
</Transaction>
</Task>
</AbaConnectContainer>
"""
# THEN
self.maxDiff = None
self.assertXMLEqual(expected_xml, invoice_xml)
def test_render_customer_xml(self):
# GIVEN
creator = AbacusInvoiceCreator(
repository=create_autospec(InvoiceRepository))
# WHEN
customer_xml = creator.render_customer_xml(
abacus_debitor_number=60000012,
last_name="Gebhart-Krasniqi",
first_name="Skender",
company_name="VBV",
street="Laupenstrasse",
house_number="10",
zip_code="3000",
city="Bern",
country="CH",
language="de",
email="skender.krasniqi@vbv-afa.ch"
)
print(customer_xml)
# example from Skender
expected_xml = """<?xml version="1.0" encoding="utf-8"?>
<AbaConnectContainer>
<Task>
<Parameter>
<Application>DEBI</Application>
<ID>Kunden</ID>
<MapID>AbaDefault</MapID>
<Version>2022.00</Version>
</Parameter>
<Transaction>
<Customer mode="SAVE">
<CustomerNumber>60000012</CustomerNumber>
<DefaultCurrency>CHF</DefaultCurrency>
<PaymentTermNumber>1</PaymentTermNumber>
<ReminderProcedure>NORM</ReminderProcedure>
<AddressData mode="SAVE">
<AddressNumber>60000012</AddressNumber>
<Name>Gebhart-Krasniqi</Name>
<FirstName>Skender</FirstName>
<Text>VBV</Text>
<Street>Laupenstrasse</Street>
<HouseNumber>10</HouseNumber>
<ZIP>3000</ZIP>
<City>Bern</City>
<Country>CH</Country>
<Language>de</Language>
<Email>skender.krasniqi@vbv-afa.ch</Email>
</AddressData>
</Customer>
</Transaction>
</Task>
</AbaConnectContainer>
"""
# THEN
self.maxDiff = None
self.assertXMLEqual(expected_xml, customer_xml)
def test_create_invoice_calls_upload(self):
# GIVEN
repository_mock = create_autospec(InvoiceRepository)
creator = AbacusInvoiceCreator(repository=repository_mock)
expected_filename = "test.xml"
checkout_information = CheckoutInformation.objects.create(
user=self.user,
transaction_id="12345",
product_sku="001",
product_name="Test Product",
product_description="Test Product Description",
product_price=1000,
state="initialized",
)
# WHEN
creator.create_invoice(
checkout_information=checkout_information,
filename=expected_filename,
)
# THEN
repository_mock.upload_invoice.assert_called_once()
uploaded_invoice, uploaded_filename = repository_mock.upload_invoice.call_args[
0
]
assert uploaded_filename == expected_filename
assert "<CustomerNumber>12345</CustomerNumber>" in uploaded_invoice
assert "<ItemNumber>1</ItemNumber>" in uploaded_invoice
assert "<ProductNumber>001</ProductNumber>" in uploaded_invoice
assert "<QuantityOrdered>1</QuantityOrdered>" in uploaded_invoice
assert "<Text>Test Product Description</Text>" in uploaded_invoice