diff --git a/fusion_accounting_followup/tests/__init__.py b/fusion_accounting_followup/tests/__init__.py index 583b044b..308d8a54 100644 --- a/fusion_accounting_followup/tests/__init__.py +++ b/fusion_accounting_followup/tests/__init__.py @@ -15,3 +15,4 @@ from . import test_followup_adapter from . import test_followup_tools from . import test_followup_cron from . import test_engine_property +from . import test_followup_full_flow diff --git a/fusion_accounting_followup/tests/test_followup_full_flow.py b/fusion_accounting_followup/tests/test_followup_full_flow.py new file mode 100644 index 00000000..8a65e12f --- /dev/null +++ b/fusion_accounting_followup/tests/test_followup_full_flow.py @@ -0,0 +1,84 @@ +"""End-to-end integration: scan -> escalate -> send -> reset.""" + +from datetime import date, timedelta +from odoo.tests.common import TransactionCase +from odoo.tests import tagged + + +@tagged('post_install', '-at_install', 'integration') +class TestFollowupFullFlow(TransactionCase): + + def setUp(self): + super().setUp() + self.engine = self.env['fusion.followup.engine'] + self.partner = self.env['res.partner'].create({ + 'name': 'Full Flow Partner', 'email': 'flow@test.local', + }) + for seq, name, days, tone in [(701, 'FlowReminder', 7, 'gentle'), + (702, 'FlowWarning', 30, 'firm'), + (703, 'FlowLegal', 60, 'legal')]: + self.env['fusion.followup.level'].create({ + 'name': name, 'sequence': seq, + 'delay_days': days, 'tone': tone, + }) + + line = self.env['account.move.line'].search([ + ('parent_state', '=', 'posted'), + ('account_id.account_type', '=', 'asset_receivable'), + ('reconciled', '=', False), + ('amount_residual', '>', 0), + ], limit=1) + if not line: + self.skipTest("No posted unreconciled receivable lines in test DB") + line.write({ + 'partner_id': self.partner.id, + 'date_maturity': date.today() - timedelta(days=20), + }) + + def test_full_flow_scan_send_reset(self): + level = self.engine.compute_followup_level(self.partner) + self.assertTrue(level) + self.assertGreater(level.delay_days, 0) + + Run = self.env['fusion.followup.run'] + before = Run.search_count([('partner_id', '=', self.partner.id)]) + result = self.engine.send_followup_email(self.partner, force=True) + after = Run.search_count([('partner_id', '=', self.partner.id)]) + self.assertGreater(after, before) + self.assertIn(result['status'], ('sent', 'manual_review')) + + self.engine.pause_followup(self.partner, + until_date=date.today() + timedelta(days=14)) + result_paused = self.engine.send_followup_email(self.partner) + self.assertTrue(result_paused['status'].startswith('paused')) + + self.engine.reset_followup(self.partner) + self.partner.invalidate_recordset(['fusion_followup_status']) + self.assertEqual(self.partner.fusion_followup_status, 'no_action') + + def test_escalate_advances_to_next_level(self): + Level = self.env['fusion.followup.level'] + level1 = Level.search([('sequence', '=', 701)], limit=1) + self.engine.send_followup_email(self.partner, level=level1, force=True) + self.partner.invalidate_recordset(['fusion_followup_last_level_id']) + result = self.engine.escalate_to_next_level(self.partner) + self.assertIn('partner_id', result) + self.partner.invalidate_recordset(['fusion_followup_last_level_id']) + if self.partner.fusion_followup_last_level_id: + self.assertGreaterEqual(self.partner.fusion_followup_last_level_id.sequence, 702) + + def test_text_cache_reused_on_repeat(self): + Cache = self.env['fusion.followup.text.cache'] + self.engine.send_followup_email(self.partner, force=True) + after_first = Cache.search_count([('partner_id', '=', self.partner.id)]) + self.engine.send_followup_email(self.partner, force=True) + after_second = Cache.search_count([('partner_id', '=', self.partner.id)]) + self.assertEqual(after_first, after_second) + + def test_history_records_each_send(self): + Run = self.env['fusion.followup.run'] + before = Run.search_count([('partner_id', '=', self.partner.id)]) + self.engine.send_followup_email(self.partner, force=True) + self.engine.send_followup_email(self.partner, force=True) + after = Run.search_count([('partner_id', '=', self.partner.id)]) + self.assertEqual(after - before, 2)