from datetime import date, timedelta, datetime from odoo.tests.common import TransactionCase, tagged from odoo.addons.fusion_accounting_bank_rec.services.pattern_extractor import ( extract_pattern_for_partner, ) @tagged('post_install', '-at_install') class TestPatternExtractor(TransactionCase): def setUp(self): super().setUp() self.partner = self.env['res.partner'].create({'name': 'Pattern Test Partner'}) self.currency = self.env.ref('base.CAD') self.company = self.env.company def _make_precedent(self, *, amount, days_ago, memo='RBC,ETF', count=1, source='manual'): return self.env['fusion.reconcile.precedent'].create({ 'company_id': self.company.id, 'partner_id': self.partner.id, 'amount': amount, 'currency_id': self.currency.id, 'date': date.today() - timedelta(days=days_ago), 'memo_tokens': memo, 'matched_move_line_count': count, 'reconciled_at': datetime.now() - timedelta(days=days_ago), 'source': source, }) def test_extracts_typical_amount_range(self): for d in [10, 24, 38, 52]: self._make_precedent(amount=1847.50, days_ago=d) pattern_vals = extract_pattern_for_partner( self.env, company_id=self.company.id, partner_id=self.partner.id) self.assertIn('typical_amount_range', pattern_vals) self.assertEqual(pattern_vals['reconcile_count'], 4) def test_detects_exact_amount_strategy(self): for d in range(0, 56, 14): self._make_precedent(amount=1847.50, days_ago=d, count=1) pattern_vals = extract_pattern_for_partner( self.env, company_id=self.company.id, partner_id=self.partner.id) self.assertEqual(pattern_vals['pref_strategy'], 'exact_amount') def test_detects_multi_invoice_strategy(self): for d in range(0, 56, 14): self._make_precedent(amount=2500.00, days_ago=d, count=3) pattern_vals = extract_pattern_for_partner( self.env, company_id=self.company.id, partner_id=self.partner.id) self.assertEqual(pattern_vals['pref_strategy'], 'multi_invoice') def test_computes_cadence_days(self): for d in [0, 14, 28, 42]: self._make_precedent(amount=1000, days_ago=d) pattern_vals = extract_pattern_for_partner( self.env, company_id=self.company.id, partner_id=self.partner.id) self.assertAlmostEqual(pattern_vals['typical_cadence_days'], 14.0, delta=1) def test_extracts_common_memo_tokens(self): self._make_precedent(amount=1000, days_ago=10, memo='RBC,ETF,REF') self._make_precedent(amount=1000, days_ago=24, memo='RBC,ETF,DEPOSIT') self._make_precedent(amount=1000, days_ago=38, memo='RBC,ETF,REF') pattern_vals = extract_pattern_for_partner( self.env, company_id=self.company.id, partner_id=self.partner.id) self.assertIn('RBC', pattern_vals['common_memo_tokens']) self.assertIn('ETF', pattern_vals['common_memo_tokens']) def test_returns_zero_count_for_partner_with_no_precedents(self): other_partner = self.env['res.partner'].create({'name': 'Empty Partner'}) pattern_vals = extract_pattern_for_partner( self.env, company_id=self.company.id, partner_id=other_partner.id) self.assertEqual(pattern_vals['reconcile_count'], 0)