Files
Odoo-Modules/fusion_accounting_bank_rec/tests/test_bank_rec_adapter.py
gsinghpal 8eee64f053 feat(fusion_accounting_ai): wire BankRecAdapter fusion paths to engine
Enhances list_unreconciled_via_fusion to include fusion fields
(top_suggestion_id, confidence_band, attachment_count). Adds 3 new
adapter methods that proxy the engine: suggest_matches, accept_suggestion,
unreconcile. AI tools (Task 22+) and OWL controller (Task 26) will call
these adapter methods instead of touching the engine directly.

Made-with: Cursor
2026-04-19 11:25:41 -04:00

82 lines
3.9 KiB
Python

"""Tests for BankRecAdapter's fusion paths."""
from odoo.tests.common import TransactionCase, tagged
from odoo.addons.fusion_accounting_ai.services.data_adapters.bank_rec import BankRecAdapter
from . import _factories as f
@tagged('post_install', '-at_install')
class TestBankRecAdapter(TransactionCase):
def setUp(self):
super().setUp()
self.partner = self.env['res.partner'].create({'name': 'Adapter Test Partner'})
self.adapter = BankRecAdapter(self.env)
def test_list_unreconciled_via_fusion_returns_base_fields(self):
bank_line = f.make_bank_line(
self.env, amount=100.00, partner=self.partner, memo='Adapter base test')
result = self.adapter.list_unreconciled_via_fusion(
company_id=self.env.company.id, limit=50)
ours = [r for r in result if r['id'] == bank_line.id]
self.assertEqual(len(ours), 1)
row = ours[0]
for f_name in ['id', 'date', 'payment_ref', 'amount', 'partner_id', 'journal_id']:
self.assertIn(f_name, row)
self.assertIn('fusion_top_suggestion_id', row)
self.assertIn('fusion_confidence_band', row)
self.assertIn('attachment_count', row)
def test_list_unreconciled_via_community_omits_fusion_fields(self):
bank_line = f.make_bank_line(self.env, amount=200.00, partner=self.partner)
result = self.adapter.list_unreconciled_via_community(
company_id=self.env.company.id, limit=50)
ours = [r for r in result if r['id'] == bank_line.id]
self.assertEqual(len(ours), 1)
self.assertNotIn('fusion_top_suggestion_id', ours[0])
def test_suggest_matches_via_fusion_returns_dict(self):
partner = self.env['res.partner'].create({'name': 'Suggest Adapter'})
invoice = f.make_invoice(self.env, partner=partner, amount=350.00)
bank_line = f.make_bank_line(self.env, amount=350.00, partner=partner)
result = self.adapter.suggest_matches_via_fusion(
statement_line_ids=[bank_line.id], limit_per_line=3)
self.assertIsInstance(result, dict)
self.assertIn(bank_line.id, result)
self.assertGreater(len(result[bank_line.id]), 0)
def test_suggest_matches_via_community_returns_empty(self):
bank_line = f.make_bank_line(self.env, amount=100.00, partner=self.partner)
result = self.adapter.suggest_matches_via_community(
statement_line_ids=[bank_line.id])
self.assertEqual(result, {})
def test_accept_suggestion_via_fusion(self):
partner = self.env['res.partner'].create({'name': 'Accept Adapter'})
invoice = f.make_invoice(self.env, partner=partner, amount=425.00)
recv_lines = invoice.line_ids.filtered(
lambda l: l.account_id.account_type == 'asset_receivable')
bank_line = f.make_bank_line(self.env, amount=425.00, partner=partner)
sug = f.make_suggestion(
self.env, statement_line=bank_line,
candidate_move_lines=recv_lines, confidence=0.95)
result = self.adapter.accept_suggestion_via_fusion(suggestion_id=sug.id)
self.assertIn('partial_ids', result)
self.assertGreater(len(result['partial_ids']), 0)
def test_accept_suggestion_via_community_raises(self):
with self.assertRaises(NotImplementedError):
self.adapter.accept_suggestion_via_community(suggestion_id=1)
def test_unreconcile_via_fusion(self):
partner = self.env['res.partner'].create({'name': 'Unrec Adapter'})
bank_line, recv_lines = f.make_reconcileable_pair(
self.env, amount=275.00, partner=partner)
rec_result = self.env['fusion.reconcile.engine'].reconcile_one(
bank_line, against_lines=recv_lines)
partial_ids = rec_result['partial_ids']
result = self.adapter.unreconcile_via_fusion(
partial_reconcile_ids=partial_ids)
self.assertIn('unreconciled_line_ids', result)
self.assertGreater(len(result['unreconciled_line_ids']), 0)