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
82 lines
3.9 KiB
Python
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)
|