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)