74 lines
3.0 KiB
Python
74 lines
3.0 KiB
Python
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, [])
|