Add test for money filter + streamline rounding error protection logic (#3714)

* add test cases

* use rounding protection only for currencies with <2 decimal places

* add more test cases

* use parameterized tests
This commit is contained in:
Mira
2023-11-13 17:37:18 +01:00
committed by GitHub
parent aa1c8ae054
commit 1d5a8a5948
2 changed files with 83 additions and 30 deletions

View File

@@ -19,34 +19,91 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
from decimal import Decimal
import pytest
from django.template import Context, Template
from django.test import RequestFactory
from django.utils import translation
TEMPLATE_REPLACE_PAGE = Template("{% load urlreplace %}{% url_replace request 'page' 3 %}")
from pretix.base.templatetags.money import money_filter
TEMPLATE_REPLACE_PAGE = Template(
"{% load urlreplace %}{% url_replace request 'page' 3 %}"
)
TEMPLATE_MONEY_FILTER = Template("{% load money %}{{ my_amount|money:my_currency }}")
NBSP = "\xa0"
def test_urlreplace_add__first_parameter():
factory = RequestFactory()
request = factory.get('/customer/details')
rendered = TEMPLATE_REPLACE_PAGE.render(Context({
'request': request
})).strip()
assert rendered == 'page=3'
request = factory.get("/customer/details")
rendered = TEMPLATE_REPLACE_PAGE.render(Context({"request": request})).strip()
assert rendered == "page=3"
def test_urlreplace_add_parameter():
factory = RequestFactory()
request = factory.get('/customer/details?foo=bar')
rendered = TEMPLATE_REPLACE_PAGE.render(Context({
'request': request
})).strip()
assert rendered in ('foo=bar&amp;page=3', 'page=3&amp;foo=bar')
request = factory.get("/customer/details?foo=bar")
rendered = TEMPLATE_REPLACE_PAGE.render(Context({"request": request})).strip()
assert rendered in ("foo=bar&amp;page=3", "page=3&amp;foo=bar")
def test_urlreplace_replace_parameter():
factory = RequestFactory()
request = factory.get('/customer/details?page=15')
rendered = TEMPLATE_REPLACE_PAGE.render(Context({
'request': request
})).strip()
assert rendered == 'page=3'
request = factory.get("/customer/details?page=15")
rendered = TEMPLATE_REPLACE_PAGE.render(Context({"request": request})).strip()
assert rendered == "page=3"
@pytest.mark.parametrize(
"locale,amount,currency,expected",
[
("en", None, "USD", "$0.00"),
("en", 1000000, "USD", "$1,000,000.00"),
("en", Decimal("1000.00"), "USD", "$1,000.00"),
("de", Decimal("1.23"), "EUR", "1,23" + NBSP + ""),
("de", Decimal("1000.00"), "EUR", "1.000,00" + NBSP + ""),
("de", Decimal("1023"), "JPY", "1.023" + NBSP + "¥"),
("en", Decimal("1023"), "JPY", "¥1,023"),
("pt-pt", Decimal("10.00"), "EUR", "10,00" + NBSP + ""),
("pt-br", Decimal("10.00"), "EUR", "" + NBSP + "10,00"),
# unknown currency
("de", Decimal("1234.56"), "FOO", "1.234,56" + NBSP + "FOO"),
("de", Decimal("1234.567"), "FOO", "1.234,57" + NBSP + "FOO"),
# rounding errors
("de", Decimal("1.234"), "EUR", "1,23" + NBSP + ""),
("de", Decimal("1023.1"), "JPY", "JPY 1023,10"),
]
)
def test_money_filter(locale, amount, currency, expected):
factory = RequestFactory()
translation.activate(locale)
request = factory.get("/foo/bar")
rendered = TEMPLATE_MONEY_FILTER.render(
Context(
{
"request": request,
"my_amount": amount,
"my_currency": currency,
}
)
).strip()
assert rendered == expected
@pytest.mark.parametrize(
"locale,amount,currency,expected",
[
("de", Decimal("1000.00"), "EUR", "1000,00"),
("en", Decimal("1000.00"), "EUR", "1000.00"),
("de", Decimal("1023.1"), "JPY", "1023,10"),
]
)
def test_money_filter_hidecurrency(locale, amount, currency, expected):
translation.activate(locale)
assert money_filter(amount, currency, hide_currency=True) == expected