From 0b593c186a7b5eb6ec54653fb9cc873f55cb152c Mon Sep 17 00:00:00 2001 From: Mira Weller Date: Tue, 2 Dec 2025 14:01:35 +0100 Subject: [PATCH] add test cases note: bezahlcode encoding changed slightly due to actually url-encoding all parameters (comma is now encoded as %2C). i tested with ING app, it accepts both. before: 'bank://singlepaymentsepa?name=Verein%20f%C3%BCr%20Testzwecke%20e.V.&iban=DE37796500000069799047&bic=BYLADEM1MIL&amount=123,00&reason=TESTVERANST-12345¤cy=EUR' after: 'bank://singlepaymentsepa?name=Verein%20f%C3%BCr%20Testzwecke%20e.V.&iban=DE37796500000069799047&bic=BYLADEM1MIL&amount=123%2C00&reason=TESTVERANST-12345¤cy=EUR' --- src/pretix/helpers/payment.py | 14 ++-- src/tests/helpers/test_payment.py | 102 ++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 7 deletions(-) create mode 100644 src/tests/helpers/test_payment.py diff --git a/src/pretix/helpers/payment.py b/src/pretix/helpers/payment.py index 37e0e5f700..88be6dfaa1 100644 --- a/src/pretix/helpers/payment.py +++ b/src/pretix/helpers/payment.py @@ -1,5 +1,5 @@ import text_unidecode -from django.utils.http import urlencode +from urllib.parse import urlencode, quote from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ @@ -85,13 +85,13 @@ def euro_bezahlcode( return qr_data = f"bank://singlepaymentsepa?" + urlencode({ - "name": bank_details_sepa_name, - "iban":bank_details_sepa_iban, - "bic": bank_details_sepa_bic, + "name": str(bank_details_sepa_name), + "iban": str(bank_details_sepa_iban), + "bic": str(bank_details_sepa_bic), "amount": commadecimal(amount), - "reason": code, - "currency": event.currency, - }) + "reason": str(code), + "currency": str(event.currency), + }, quote_via=quote) return { "id": "bezahlcode", "label": "BezahlCode", diff --git a/src/tests/helpers/test_payment.py b/src/tests/helpers/test_payment.py new file mode 100644 index 0000000000..ae72bd2b3e --- /dev/null +++ b/src/tests/helpers/test_payment.py @@ -0,0 +1,102 @@ +from datetime import timedelta +from decimal import Decimal + +import pytest +from django.utils.timezone import now + +from pretix.base.models import Organizer, Event +from pretix.helpers.payment import generate_payment_qr_codes + + +@pytest.fixture +def env(): + o = Organizer.objects.create(name='Verein für Testzwecke e.V.', slug='testverein') + event = Event.objects.create( + organizer=o, name='Testveranstaltung', slug='testveranst', + date_from=now() + timedelta(days=10), + live=True, is_public=False, currency='EUR', + ) + event.settings.invoice_address_from = 'Verein für Testzwecke e.V.' + event.settings.invoice_address_from_zipcode = '1234' + event.settings.invoice_address_from_city = 'Testhausen' + event.settings.invoice_address_from_country = 'CH' + + return o, event + + +@pytest.mark.django_db +def test_payment_qr_codes_euro(env): + o, event = env + codes = generate_payment_qr_codes( + event=event, + code='TESTVERANST-12345', + amount=Decimal('123.00'), + bank_details_sepa_bic='BYLADEM1MIL', + bank_details_sepa_iban='DE37796500000069799047', + bank_details_sepa_name='Verein für Testzwecke e.V.', + ) + assert len(codes) == 2 + assert codes[0]['label'] == 'EPC-QR' + assert codes[0]['qr_data'] == '''BCD +002 +2 +SCT +BYLADEM1MIL +Verein fur Testzwecke e.V. +DE37796500000069799047 +EUR123.00 + + +TESTVERANST-12345 + +''' + + assert codes[1]['label'] == 'BezahlCode' + assert codes[1]['qr_data'] == 'bank://singlepaymentsepa?name=Verein%20f%C3%BCr%20Testzwecke%20e.V.&iban=DE37796500000069799047&bic=BYLADEM1MIL&amount=123%2C00&reason=TESTVERANST-12345¤cy=EUR' + + +@pytest.mark.django_db +def test_payment_qr_codes_swiss(env): + o, event = env + codes = generate_payment_qr_codes( + event=event, + code='TESTVERANST-12345', + amount=Decimal('123.00'), + bank_details_sepa_bic='TESTCHXXXXX', + bank_details_sepa_iban='CH6389144757654882127', + bank_details_sepa_name='Verein für Testzwecke e.V.', + ) + assert codes[0]['label'] == 'QR-bill' + assert codes[0]['qr_data'] == "\r\n".join([ + "SPC", + "0200", + "1", + "CH6389144757654882127", + "K", + "Verein fur Testzwecke e.V.", + "Verein fur Testzwecke e.V.", + "1234 Testhausen", + "", + "", + "CH", + "", + "", + "", + "", + "", + "", + "", + "123.00", + "EUR", + "", + "", + "", + "", + "", + "", + "", + "NON", + "", + "TESTVERANST-12345", + "EPD", + ]) \ No newline at end of file