from odoo.tests.common import TransactionCase, tagged from odoo.addons.fusion_accounting_bank_rec.services.exchange_diff import ( compute_exchange_diff, ExchangeDiffResult, ) @tagged('post_install', '-at_install') class TestExchangeDiff(TransactionCase): def test_no_diff_when_currencies_match_and_rates_match(self): result = compute_exchange_diff( line_amount=100.00, line_currency_code='CAD', against_amount=100.00, against_currency_code='CAD', line_rate=1.0, against_rate=1.0, ) self.assertFalse(result.needs_diff_move) self.assertEqual(result.diff_amount, 0.0) def test_diff_when_rates_differ_same_currency(self): """USD invoice posted at 1.35, USD bank line settled at 1.40 -> diff exists. 100 USD at 1.40 = 140 CAD; same at 1.35 = 135 CAD; diff = 5 CAD gain.""" result = compute_exchange_diff( line_amount=100.00, line_currency_code='USD', against_amount=100.00, against_currency_code='USD', line_rate=1.40, against_rate=1.35, ) self.assertTrue(result.needs_diff_move) self.assertAlmostEqual(result.diff_amount, 5.00, places=2) def test_diff_negative_when_rate_dropped(self): """USD invoice at 1.40, settled at 1.35 -> loss""" result = compute_exchange_diff( line_amount=100.00, line_currency_code='USD', against_amount=100.00, against_currency_code='USD', line_rate=1.35, against_rate=1.40, ) self.assertTrue(result.needs_diff_move) self.assertAlmostEqual(result.diff_amount, -5.00, places=2) def test_company_amounts_computed_correctly(self): result = compute_exchange_diff( line_amount=100.00, line_currency_code='USD', against_amount=100.00, against_currency_code='USD', line_rate=1.40, against_rate=1.35, ) self.assertAlmostEqual(result.line_company_amount, 140.00, places=2) self.assertAlmostEqual(result.against_company_amount, 135.00, places=2) def test_tolerance_handles_rounding_noise(self): """Tiny FX rounding under 0.005 should NOT trigger a diff move.""" result = compute_exchange_diff( line_amount=100.00, line_currency_code='USD', against_amount=100.00, against_currency_code='USD', line_rate=1.40000, against_rate=1.40003, # 0.003 cent diff ) self.assertFalse(result.needs_diff_move)