from datetime import date from odoo.tests.common import TransactionCase from odoo.tests import tagged from odoo.addons.fusion_accounting_assets.services.prorate import prorate_factor @tagged('post_install', '-at_install') class TestProrate(TransactionCase): def test_full_month_convention_always_one(self): f = prorate_factor( period_start=date(2026, 1, 1), period_end=date(2026, 1, 31), asset_start=date(2026, 1, 15), convention='full_month', ) self.assertEqual(f, 1.0) def test_asset_starts_before_period_full_factor(self): f = prorate_factor( period_start=date(2026, 1, 1), period_end=date(2026, 1, 31), asset_start=date(2025, 12, 1), convention='days_period', ) self.assertEqual(f, 1.0) def test_asset_starts_after_period_zero_factor(self): f = prorate_factor( period_start=date(2026, 1, 1), period_end=date(2026, 1, 31), asset_start=date(2026, 2, 5), convention='days_period', ) self.assertEqual(f, 0.0) def test_days_period_mid_month(self): # Jan 16 -> Jan 31 inclusive = 16 days; period = 31 days f = prorate_factor( period_start=date(2026, 1, 1), period_end=date(2026, 1, 31), asset_start=date(2026, 1, 16), convention='days_period', ) self.assertAlmostEqual(f, 16 / 31, places=5) def test_days_365_mid_month(self): # 16 days / 365 f = prorate_factor( period_start=date(2026, 1, 1), period_end=date(2026, 1, 31), asset_start=date(2026, 1, 16), convention='days_365', ) self.assertAlmostEqual(f, 16 / 365.0, places=5) def test_unknown_convention_raises(self): with self.assertRaises(ValueError): prorate_factor( period_start=date(2026, 1, 1), period_end=date(2026, 1, 31), asset_start=date(2026, 1, 15), convention='bogus', # type: ignore[arg-type] )