Changeset View
Changeset View
Standalone View
Standalone View
looper/tests/test_money.py
| from typing import Callable | |||||
| from unittest import TestCase | from unittest import TestCase | ||||
| import functools | |||||
| import django.test | import django.test | ||||
| from looper.money import * | from looper.money import ( | ||||
| Money, | |||||
| CurrencyMismatch, | |||||
| sum_per_currency, | |||||
| convert_currency, | |||||
| sum_to_euros, | |||||
| ) | |||||
| EUR: typing.Callable[[int], Money] = functools.partial(Money, 'EUR') | EUR: Callable[[int], Money] = functools.partial(Money, 'EUR') | ||||
| USD: typing.Callable[[int], Money] = functools.partial(Money, 'USD') | USD: Callable[[int], Money] = functools.partial(Money, 'USD') | ||||
| class BasicOperationsTest(TestCase): | class BasicOperationsTest(TestCase): | ||||
| def test_properties(self) -> None: | def test_properties(self) -> None: | ||||
| self.assertEqual('EUR', EUR(414).currency) | self.assertEqual('EUR', EUR(414).currency) | ||||
| self.assertEqual(414, EUR(414).cents) | self.assertEqual(414, EUR(414).cents) | ||||
| def test_bad_currency(self) -> None: | def test_bad_currency(self) -> None: | ||||
| Show All 34 Lines | def test_ordering(self) -> None: | ||||
| self.assertGreater(EUR(16), EUR(15)) | self.assertGreater(EUR(16), EUR(15)) | ||||
| self.assertGreaterEqual(EUR(16), EUR(15)) | self.assertGreaterEqual(EUR(16), EUR(15)) | ||||
| self.assertGreaterEqual(EUR(15), EUR(15)) | self.assertGreaterEqual(EUR(15), EUR(15)) | ||||
| self.assertGreaterEqual(EUR(15), -EUR(100)) | self.assertGreaterEqual(EUR(15), -EUR(100)) | ||||
| with self.assertRaises(TypeError): | with self.assertRaises(TypeError): | ||||
| EUR(15) < 30 | EUR(15) < 30 | ||||
| def test_arithmetic_unsupported(self): | def test_arithmetic_unsupported(self) -> None: | ||||
| m = EUR(56123) | m = EUR(56123) | ||||
| with self.assertRaises(TypeError): | with self.assertRaises(TypeError): | ||||
| m + 3 | m + 3 # type: ignore[operator] | ||||
| with self.assertRaises(TypeError): | with self.assertRaises(TypeError): | ||||
| 3 + m | 3 + m # type: ignore[operator] | ||||
| with self.assertRaises(TypeError): | with self.assertRaises(TypeError): | ||||
| m - 3 | m - 3 # type: ignore[operator] | ||||
| with self.assertRaises(TypeError): | with self.assertRaises(TypeError): | ||||
| 3 - m | 3 - m # type: ignore[operator] | ||||
| with self.assertRaises(TypeError): | with self.assertRaises(TypeError): | ||||
| m * m | m * m # type: ignore[operator] | ||||
| with self.assertRaises(TypeError): | with self.assertRaises(TypeError): | ||||
| 3.0 * m | 3.0 * m # type: ignore[operator] | ||||
| with self.assertRaises(TypeError): | with self.assertRaises(TypeError): | ||||
| m * 3.0 | m * 3.0 # type: ignore[operator] | ||||
| def test_immutability(self) -> None: | def test_immutability(self) -> None: | ||||
| m1 = EUR(4123) | m1 = EUR(4123) | ||||
| m2 = m1 | m2 = m1 | ||||
| m1 += EUR(1) | m1 += EUR(1) | ||||
| self.assertEqual(EUR(4124), m1) | self.assertEqual(EUR(4124), m1) | ||||
| self.assertEqual(EUR(4123), m2) | self.assertEqual(EUR(4123), m2) | ||||
| Show All 18 Lines | def test_floor_division(self) -> None: | ||||
| EUR(14) // 4.0j # type: ignore | EUR(14) // 4.0j # type: ignore | ||||
| with self.assertRaises(TypeError): | with self.assertRaises(TypeError): | ||||
| EUR(14) // EUR(4) # type: ignore | EUR(14) // EUR(4) # type: ignore | ||||
| with self.assertRaises(ValueError): | with self.assertRaises(ValueError): | ||||
| EUR(14) // -4 | EUR(14) // -4 | ||||
| with self.assertRaises(ZeroDivisionError): | with self.assertRaises(ZeroDivisionError): | ||||
| EUR(14) // 0 | EUR(14) // 0 | ||||
| def test_ratio(self): | def test_ratio(self) -> None: | ||||
| self.assertEqual(0.0, EUR(0) / EUR(4)) | self.assertEqual(0.0, EUR(0) / EUR(4)) | ||||
| self.assertEqual(1.0, EUR(4) / EUR(4)) | self.assertEqual(1.0, EUR(4) / EUR(4)) | ||||
| self.assertEqual(-2.0, EUR(4) / EUR(-2)) | self.assertEqual(-2.0, EUR(4) / EUR(-2)) | ||||
| self.assertAlmostEqual(1.15, USD(17332) / USD(15072), places=3) | self.assertAlmostEqual(1.15, USD(17332) / USD(15072), places=3) # type: ignore | ||||
| with self.assertRaises(CurrencyMismatch): | with self.assertRaises(CurrencyMismatch): | ||||
| EUR(14) / USD(14) | EUR(14) / USD(14) | ||||
| def test_equality(self) -> None: | def test_equality(self) -> None: | ||||
| self.assertEqual(hash(('EUR', 513)), hash(EUR(513))) | self.assertEqual(hash(('EUR', 513)), hash(EUR(513))) | ||||
| m1 = EUR(551) | m1 = EUR(551) | ||||
| m2 = EUR(551) | m2 = EUR(551) | ||||
| ▲ Show 20 Lines • Show All 50 Lines • ▼ Show 20 Lines | |||||
| class SumTest(TestCase): | class SumTest(TestCase): | ||||
| def test_empty(self) -> None: | def test_empty(self) -> None: | ||||
| self.assertEqual({}, sum_per_currency([])) | self.assertEqual({}, sum_per_currency([])) | ||||
| def test_one_currency_one_amount(self) -> None: | def test_one_currency_one_amount(self) -> None: | ||||
| self.assertEqual({'HRK': Money('HRK', 47)}, sum_per_currency([Money('HRK', 47)])) | self.assertEqual({'HRK': Money('HRK', 47)}, sum_per_currency([Money('HRK', 47)])) | ||||
| def test_one_currency_multiple_amounts(self) -> None: | def test_one_currency_multiple_amounts(self) -> None: | ||||
| self.assertEqual({'HRK': Money('HRK', 374)}, | self.assertEqual( | ||||
| sum_per_currency([Money('HRK', 47), Money('HRK', 327)])) | {'HRK': Money('HRK', 374)}, sum_per_currency([Money('HRK', 47), Money('HRK', 327)]) | ||||
| ) | |||||
| def test_multiple_currencies(self) -> None: | def test_multiple_currencies(self) -> None: | ||||
| self.assertEqual( | self.assertEqual( | ||||
| {'HRK': Money('HRK', 47 + 327), | {'HRK': Money('HRK', 47 + 327), 'SGD': Money('SGD', 413 + 385)}, | ||||
| 'SGD': Money('SGD', 413 + 385)}, | sum_per_currency( | ||||
| sum_per_currency([ | [Money('HRK', 47), Money('HRK', 327), Money('SGD', 413), Money('SGD', 385)] | ||||
| Money('HRK', 47), | ), | ||||
| Money('HRK', 327), | |||||
| Money('SGD', 413), | |||||
| Money('SGD', 385), | |||||
| ]) | |||||
| ) | ) | ||||
| self.assertEqual( | self.assertEqual( | ||||
| {'HRK': Money('HRK', 47 + 327), | { | ||||
| 'HRK': Money('HRK', 47 + 327), | |||||
| 'SGD': Money('SGD', 413 + 385), | 'SGD': Money('SGD', 413 + 385), | ||||
| 'USD': Money('USD', 161)}, | 'USD': Money('USD', 161), | ||||
| sum_per_currency([ | }, | ||||
| sum_per_currency( | |||||
| [ | |||||
| Money('HRK', 327), | Money('HRK', 327), | ||||
| Money('SGD', 413), | Money('SGD', 413), | ||||
| Money('HRK', 47), | Money('HRK', 47), | ||||
| Money('USD', 161), | Money('USD', 161), | ||||
| Money('SGD', 385), | Money('SGD', 385), | ||||
| ]) | ] | ||||
| ), | |||||
| ) | ) | ||||
| @django.test.override_settings( | @django.test.override_settings( | ||||
| LOOPER_CONVERTION_RATES_FROM_EURO={ | LOOPER_CONVERTION_RATES_FROM_EURO={'EUR': 1.0, 'USD': 1.15} # US$ 1.15 = € 1.00 | ||||
| 'EUR': 1.0, | |||||
| 'USD': 1.15, # US$ 1.15 = € 1.00 | |||||
| } | |||||
| ) | ) | ||||
| class SumToEuroTest(django.test.TestCase): | class SumToEuroTest(django.test.TestCase): | ||||
| def test_empty(self) -> None: | def test_empty(self) -> None: | ||||
| self.assertEqual(Money('EUR', 0), sum_to_euros([])) | self.assertEqual(Money('EUR', 0), sum_to_euros([])) | ||||
| def test_single_euro(self) -> None: | def test_single_euro(self) -> None: | ||||
| self.assertEqual(Money('EUR', 215), sum_to_euros([Money('EUR', 215)])) | self.assertEqual(Money('EUR', 215), sum_to_euros([Money('EUR', 215)])) | ||||
| Show All 18 Lines | class ConvertCurrencyTest(django.test.TestCase): | ||||
| def test_usd_to_eur(self) -> None: | def test_usd_to_eur(self) -> None: | ||||
| self.assertEqual(Money('EUR', 435), convert_currency(Money('USD', 500), to_currency='EUR')) | self.assertEqual(Money('EUR', 435), convert_currency(Money('USD', 500), to_currency='EUR')) | ||||
| def test_eur_to_usd(self) -> None: | def test_eur_to_usd(self) -> None: | ||||
| self.assertEqual(Money('USD', 500), convert_currency(Money('EUR', 435), to_currency='USD')) | self.assertEqual(Money('USD', 500), convert_currency(Money('EUR', 435), to_currency='USD')) | ||||
| def test_sgd_to_usd(self) -> None: | def test_sgd_to_usd(self) -> None: | ||||
| self.assertEqual(Money('USD', 34230), | self.assertEqual( | ||||
| convert_currency(Money('SGD', 47327), to_currency='USD')) | Money('USD', 34230), convert_currency(Money('SGD', 47327), to_currency='USD') | ||||
| ) | |||||
| class PickleMoneyTest(TestCase): | class PickleMoneyTest(TestCase): | ||||
| def test_pickle(self) -> None: | def test_pickle(self) -> None: | ||||
| import pickle | import pickle | ||||
| amt = Money('HRK', 716) | amt = Money('HRK', 716) | ||||
| pickled = pickle.dumps(amt) | pickled = pickle.dumps(amt) | ||||
| unpickled = pickle.loads(pickled) | unpickled = pickle.loads(pickled) | ||||
| self.assertEqual(amt, unpickled) | self.assertEqual(amt, unpickled) | ||||