feat(fusion_accounting_followup): AI follow-up text generator + prompt
Made-with: Cursor
This commit is contained in:
@@ -2,3 +2,4 @@ from . import test_overdue_aging
|
||||
from . import test_level_resolver
|
||||
from . import test_risk_scorer
|
||||
from . import test_tone_selector
|
||||
from . import test_followup_text_generator
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
from odoo.tests.common import TransactionCase
|
||||
from odoo.tests import tagged
|
||||
from odoo.addons.fusion_accounting_followup.services.followup_text_generator import (
|
||||
generate_followup_text,
|
||||
)
|
||||
from odoo.addons.fusion_accounting_followup.services.followup_text_prompt import (
|
||||
SYSTEM_PROMPT, build_prompt,
|
||||
)
|
||||
|
||||
|
||||
@tagged('post_install', '-at_install')
|
||||
class TestFollowupTextGenerator(TransactionCase):
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.env['ir.config_parameter'].sudo().search([
|
||||
('key', 'in', ['fusion_accounting.provider.followup_text',
|
||||
'fusion_accounting.provider.default'])
|
||||
]).unlink()
|
||||
|
||||
def test_fallback_gentle(self):
|
||||
result = generate_followup_text(
|
||||
self.env, partner_name='Acme Corp', total_overdue=1500,
|
||||
currency_code='USD', longest_overdue_days=15, tone='gentle',
|
||||
invoice_count=2,
|
||||
)
|
||||
self.assertEqual(result['tone_used'], 'gentle')
|
||||
self.assertIn('Acme Corp', result['body'])
|
||||
self.assertIn('1,500.00', result['body'])
|
||||
|
||||
def test_fallback_firm(self):
|
||||
result = generate_followup_text(
|
||||
self.env, partner_name='Acme', total_overdue=5000,
|
||||
currency_code='USD', longest_overdue_days=45, tone='firm',
|
||||
invoice_count=3,
|
||||
)
|
||||
self.assertEqual(result['tone_used'], 'firm')
|
||||
|
||||
def test_fallback_legal(self):
|
||||
result = generate_followup_text(
|
||||
self.env, partner_name='Acme', total_overdue=10000,
|
||||
currency_code='USD', longest_overdue_days=90, tone='legal',
|
||||
invoice_count=5,
|
||||
)
|
||||
self.assertEqual(result['tone_used'], 'legal')
|
||||
self.assertIn('FINAL NOTICE', result['subject'])
|
||||
|
||||
def test_returns_required_keys(self):
|
||||
result = generate_followup_text(
|
||||
self.env, partner_name='X', total_overdue=100,
|
||||
currency_code='USD', longest_overdue_days=10, tone='gentle',
|
||||
)
|
||||
for key in ('subject', 'body', 'tone_used', 'key_points'):
|
||||
self.assertIn(key, result)
|
||||
|
||||
|
||||
@tagged('post_install', '-at_install')
|
||||
class TestFollowupTextPrompt(TransactionCase):
|
||||
|
||||
def test_system_prompt_requires_json(self):
|
||||
self.assertIn('JSON', SYSTEM_PROMPT)
|
||||
self.assertIn('"subject"', SYSTEM_PROMPT)
|
||||
self.assertIn('"body"', SYSTEM_PROMPT)
|
||||
|
||||
def test_build_prompt_returns_tuple(self):
|
||||
result = build_prompt(
|
||||
partner_name='X', total_overdue=100, currency_code='USD',
|
||||
longest_overdue_days=10, tone='gentle',
|
||||
)
|
||||
self.assertEqual(len(result), 2)
|
||||
self.assertIn('100.00', result[1])
|
||||
|
||||
def test_build_prompt_includes_risk_drivers(self):
|
||||
_, user = build_prompt(
|
||||
partner_name='X', total_overdue=100, currency_code='USD',
|
||||
longest_overdue_days=10, tone='firm',
|
||||
risk_drivers=['Chronic late payer', '5/10 paid late'],
|
||||
)
|
||||
self.assertIn('RISK FACTORS', user)
|
||||
self.assertIn('Chronic late payer', user)
|
||||
Reference in New Issue
Block a user