feat(fusion_accounting_followup): 6 JSON-RPC endpoints for OWL widget
Adds Task 15 controller layer: - /fusion/followup/list_overdue - /fusion/followup/get_partner_detail - /fusion/followup/generate_text - /fusion/followup/send - /fusion/followup/pause - /fusion/followup/reset All endpoints use V19 type='jsonrpc' and route through fusion.followup.engine. 6 HttpCase tests added (69 total). Made-with: Cursor
This commit is contained in:
@@ -10,3 +10,4 @@ from . import test_res_partner_inherit
|
||||
from . import test_account_move_line_inherit
|
||||
from . import test_fusion_followup_engine
|
||||
from . import test_engine_integration
|
||||
from . import test_followup_controller
|
||||
|
||||
80
fusion_accounting_followup/tests/test_followup_controller.py
Normal file
80
fusion_accounting_followup/tests/test_followup_controller.py
Normal file
@@ -0,0 +1,80 @@
|
||||
"""HttpCase tests for the 6 follow-up JSON-RPC endpoints."""
|
||||
|
||||
import json
|
||||
from datetime import date, timedelta
|
||||
|
||||
from odoo.tests import tagged
|
||||
from odoo.tests.common import HttpCase, new_test_user
|
||||
|
||||
|
||||
@tagged('post_install', '-at_install')
|
||||
class TestFollowupController(HttpCase):
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.user = new_test_user(
|
||||
self.env, login='fu_test_user',
|
||||
groups='base.group_user,base.group_partner_manager,'
|
||||
'account.group_account_invoice',
|
||||
)
|
||||
|
||||
def _jsonrpc(self, endpoint, params):
|
||||
self.authenticate('fu_test_user', 'fu_test_user')
|
||||
url = f'/fusion/followup/{endpoint}'
|
||||
body = {'jsonrpc': '2.0', 'method': 'call', 'params': params, 'id': 1}
|
||||
response = self.url_open(
|
||||
url, data=json.dumps(body),
|
||||
headers={'Content-Type': 'application/json'},
|
||||
)
|
||||
self.assertEqual(
|
||||
response.status_code, 200,
|
||||
f"{endpoint} returned {response.status_code}: {response.text[:300]}",
|
||||
)
|
||||
result = response.json()
|
||||
if 'error' in result:
|
||||
self.fail(f"{endpoint} errored: {result['error']}")
|
||||
return result.get('result', {})
|
||||
|
||||
def test_list_overdue_returns_dict(self):
|
||||
result = self._jsonrpc('list_overdue', {'company_id': self.env.company.id})
|
||||
self.assertIn('partners', result)
|
||||
self.assertIn('total', result)
|
||||
|
||||
def test_get_partner_detail(self):
|
||||
partner = self.env['res.partner'].create({
|
||||
'name': 'Ctrl Test Partner', 'email': 'ctrl@test.local',
|
||||
})
|
||||
result = self._jsonrpc('get_partner_detail', {'partner_id': partner.id})
|
||||
self.assertEqual(result['partner']['id'], partner.id)
|
||||
self.assertIn('overdue', result)
|
||||
self.assertIn('history', result)
|
||||
|
||||
def test_pause_sets_paused_until(self):
|
||||
partner = self.env['res.partner'].create({'name': 'Pause Test'})
|
||||
future = (date.today() + timedelta(days=20)).isoformat()
|
||||
result = self._jsonrpc('pause', {
|
||||
'partner_id': partner.id, 'until_date': future,
|
||||
})
|
||||
self.assertEqual(result['paused_until'], future)
|
||||
|
||||
def test_reset_clears_status(self):
|
||||
partner = self.env['res.partner'].create({
|
||||
'name': 'Reset Test',
|
||||
'fusion_followup_status': 'paused',
|
||||
})
|
||||
result = self._jsonrpc('reset', {'partner_id': partner.id})
|
||||
self.assertEqual(result['status'], 'reset')
|
||||
|
||||
def test_send_no_overdue_returns_no_action(self):
|
||||
partner = self.env['res.partner'].create({
|
||||
'name': 'No Overdue', 'email': 'no@test.local',
|
||||
})
|
||||
result = self._jsonrpc('send', {
|
||||
'partner_id': partner.id, 'force': True,
|
||||
})
|
||||
self.assertIn(result.get('status'), ('no_action', 'no_overdue'))
|
||||
|
||||
def test_generate_text_no_level_returns_no_level(self):
|
||||
partner = self.env['res.partner'].create({'name': 'NoLevel Test'})
|
||||
result = self._jsonrpc('generate_text', {'partner_id': partner.id})
|
||||
self.assertIn(result.get('status'), ('no_level', 'ok'))
|
||||
Reference in New Issue
Block a user