ituac-crypto-hub/tests/eth/test_units.py
2026-09-08 09:29:20 -04:00

47 lines
1.9 KiB
Python

"""Offline behavior and precision checks for native ETH amounts."""
import unittest
from decimal import Decimal, localcontext
from core import CryptoHubError, InvalidAmountError
from eth import WEI_PER_ETH, eth_to_wei, wei_to_eth
class EthUnitsTest(unittest.TestCase):
def test_exact_conversions(self):
for eth, wei in [("0", 0), ("1", WEI_PER_ETH), ("0.1", 10**17),
("0.000000000000000001", 1), ("1.0000000000000000000", WEI_PER_ETH)]:
with self.subTest(eth=eth):
self.assertEqual(eth_to_wei(eth), wei)
self.assertEqual(eth_to_wei(Decimal(eth)), wei)
self.assertEqual(wei_to_eth(wei), Decimal(eth))
def test_invalid_eth_is_rejected(self):
for amount in [0.1, True, 1, None, "", "invalid", "-1", "NaN", "sNaN",
"Infinity", "-Infinity", "0.0000000000000000001"]:
with self.subTest(amount=amount):
with self.assertRaises(InvalidAmountError):
eth_to_wei(amount)
def test_invalid_wei_is_rejected(self):
for amount in [-1, True, False, 1.0, "1", Decimal("1"), None]:
with self.subTest(amount=amount):
with self.assertRaises(InvalidAmountError):
wei_to_eth(amount)
def test_large_amount_round_trip_ignores_decimal_precision(self):
wei = 123456789012345678901234567890123456789
expected = Decimal("123456789012345678901.234567890123456789")
with localcontext() as context:
context.prec = 6
self.assertEqual(wei_to_eth(wei), expected)
self.assertEqual(eth_to_wei(expected), wei)
self.assertEqual(eth_to_wei(wei_to_eth(wei)), wei)
def test_invalid_amount_is_public_library_error(self):
self.assertIsInstance(InvalidAmountError("invalid"), CryptoHubError)
if __name__ == "__main__":
unittest.main()