from datetime import date from odoo.tests.common import TransactionCase, tagged from odoo.addons.fusion_accounting_bank_rec.services.precedent_lookup import ( find_nearest_precedents, PrecedentMatch, ) @tagged('post_install', '-at_install') class TestPrecedentLookup(TransactionCase): def setUp(self): super().setUp() self.partner = self.env['res.partner'].create({'name': 'Precedent Lookup Partner'}) self.currency = self.env.ref('base.CAD') self.company = self.env.company for amt in [1847.50, 1847.50, 1800.00]: self.env['fusion.reconcile.precedent'].create({ 'company_id': self.company.id, 'partner_id': self.partner.id, 'amount': amt, 'currency_id': self.currency.id, 'date': date.today(), 'memo_tokens': 'RBC,ETF,REF', 'matched_move_line_count': 1, 'source': 'manual', }) def test_finds_amount_exact_precedents(self): results = find_nearest_precedents( self.env, partner_id=self.partner.id, amount=1847.50, k=5) amounts = [r.amount for r in results] self.assertEqual(amounts.count(1847.50), 2) def test_returns_empty_for_unknown_partner(self): results = find_nearest_precedents( self.env, partner_id=999999, amount=1847.50, k=5) self.assertEqual(results, []) def test_respects_k_limit(self): for i in range(10): self.env['fusion.reconcile.precedent'].create({ 'company_id': self.company.id, 'partner_id': self.partner.id, 'amount': 1847.50, 'currency_id': self.currency.id, 'date': date.today(), 'matched_move_line_count': 1, 'source': 'manual', }) results = find_nearest_precedents( self.env, partner_id=self.partner.id, amount=1847.50, k=3) self.assertEqual(len(results), 3) def test_results_sorted_by_similarity_desc(self): results = find_nearest_precedents( self.env, partner_id=self.partner.id, amount=1847.50, k=5) if len(results) >= 2: self.assertGreaterEqual(results[0].similarity_score, results[1].similarity_score) def test_memo_overlap_boosts_score(self): results_with_memo = find_nearest_precedents( self.env, partner_id=self.partner.id, amount=1847.50, k=5, memo_tokens=['RBC', 'ETF', 'REF']) results_no_memo = find_nearest_precedents( self.env, partner_id=self.partner.id, amount=1847.50, k=5) if results_with_memo and results_no_memo: self.assertGreaterEqual(results_with_memo[0].similarity_score, results_no_memo[0].similarity_score - 0.001) def test_amount_outside_tolerance_excluded(self): results = find_nearest_precedents( self.env, partner_id=self.partner.id, amount=2000.00, k=5) self.assertEqual(results, [])