fix: detect odoo chatter updates
This commit is contained in:
+71
-15
@@ -39,6 +39,8 @@ def make_config():
|
||||
config.set("odoo", "model", "helpdesk.ticket")
|
||||
config.set("odoo", "limit", "0")
|
||||
config.set("odoo", "order", "id asc")
|
||||
config.set("odoo", "track_chatter", "true")
|
||||
config.set("odoo", "chatter_model", "mail.message")
|
||||
config.add_section("rocket")
|
||||
config.set("rocket", "webhook_url", "https://rocket.example.test/webhook-test")
|
||||
config.add_section("http")
|
||||
@@ -51,19 +53,35 @@ def make_config():
|
||||
class TicketingStateTest(unittest.TestCase):
|
||||
def test_build_tickets_state_uses_string_ids_for_json_keys(self):
|
||||
state = ticketing.build_tickets_state([
|
||||
{"id": 12, "write_date": "2026-07-24 10:00:00"},
|
||||
{
|
||||
"id": 12,
|
||||
"write_date": "2026-07-24 10:00:00",
|
||||
"_last_chatter_update": "2026-07-24 10:05:00|99",
|
||||
},
|
||||
{"id": 34, "write_date": "2026-07-24 11:00:00"},
|
||||
])
|
||||
|
||||
self.assertEqual(state, {
|
||||
"12": "2026-07-24 10:00:00",
|
||||
"34": "2026-07-24 11:00:00",
|
||||
"12": {
|
||||
"write_date": "2026-07-24 10:00:00",
|
||||
"last_chatter_update": "2026-07-24 10:05:00|99",
|
||||
},
|
||||
"34": {
|
||||
"write_date": "2026-07-24 11:00:00",
|
||||
"last_chatter_update": None,
|
||||
},
|
||||
})
|
||||
|
||||
def test_get_updated_ticket_ids_detects_new_and_changed_tickets(self):
|
||||
previous_state = {
|
||||
"1": "2026-07-24 09:00:00",
|
||||
"2": "2026-07-24 09:30:00",
|
||||
"1": {
|
||||
"write_date": "2026-07-24 09:00:00",
|
||||
"last_chatter_update": None,
|
||||
},
|
||||
"2": {
|
||||
"write_date": "2026-07-24 09:30:00",
|
||||
"last_chatter_update": None,
|
||||
},
|
||||
}
|
||||
tickets = [
|
||||
{"id": 1, "write_date": "2026-07-24 09:00:00"},
|
||||
@@ -73,6 +91,21 @@ class TicketingStateTest(unittest.TestCase):
|
||||
|
||||
self.assertEqual(ticketing.get_updated_ticket_ids(tickets, previous_state), [2, 3])
|
||||
|
||||
def test_get_updated_ticket_ids_detects_chatter_change(self):
|
||||
previous_state = {
|
||||
"260": {
|
||||
"write_date": "2026-07-24 09:00:00",
|
||||
"last_chatter_update": "2026-07-24 09:15:00|1200",
|
||||
},
|
||||
}
|
||||
tickets = [{
|
||||
"id": 260,
|
||||
"write_date": "2026-07-24 09:00:00",
|
||||
"_last_chatter_update": "2026-07-24 10:00:00|1201",
|
||||
}]
|
||||
|
||||
self.assertEqual(ticketing.get_updated_ticket_ids(tickets, previous_state), [260])
|
||||
|
||||
def test_build_notification_message_is_verbose_and_limited(self):
|
||||
previous_state = {
|
||||
"1": "2026-07-24 09:00:00",
|
||||
@@ -159,7 +192,12 @@ class TicketingStateTest(unittest.TestCase):
|
||||
def test_save_and_load_tickets_state_roundtrip(self):
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
state_path = os.path.join(tmpdir, "tickets_state.json")
|
||||
expected_state = {"42": "2026-07-24 12:00:00"}
|
||||
expected_state = {
|
||||
"42": {
|
||||
"write_date": "2026-07-24 12:00:00",
|
||||
"last_chatter_update": None,
|
||||
},
|
||||
}
|
||||
|
||||
ticketing.save_tickets_state(state_path, expected_state)
|
||||
|
||||
@@ -173,23 +211,41 @@ class TicketingStateTest(unittest.TestCase):
|
||||
tickets_response.json.return_value = {
|
||||
"result": [{"id": 42, "write_date": "2026-07-24 12:00:00"}],
|
||||
}
|
||||
post.side_effect = [auth_response, tickets_response]
|
||||
chatter_response = Mock()
|
||||
chatter_response.json.return_value = {
|
||||
"result": [{
|
||||
"id": 100,
|
||||
"res_id": 42,
|
||||
"write_date": "2026-07-24 12:05:00",
|
||||
"date": "2026-07-24 12:04:00",
|
||||
}],
|
||||
}
|
||||
post.side_effect = [auth_response, tickets_response, chatter_response]
|
||||
|
||||
tickets = ticketing.fetch_odoo_tickets(make_config())
|
||||
|
||||
self.assertEqual(tickets, [{"id": 42, "write_date": "2026-07-24 12:00:00"}])
|
||||
self.assertEqual(tickets, [{
|
||||
"id": 42,
|
||||
"write_date": "2026-07-24 12:00:00",
|
||||
"_last_chatter_update": "2026-07-24 12:05:00|100",
|
||||
}])
|
||||
auth_response.raise_for_status.assert_called_once_with()
|
||||
tickets_response.raise_for_status.assert_called_once_with()
|
||||
self.assertEqual(post.call_count, 2)
|
||||
self.assertEqual(post.call_args.kwargs["timeout"], 5)
|
||||
self.assertEqual(post.call_args.kwargs["json"]["params"]["service"], "object")
|
||||
self.assertEqual(post.call_args.kwargs["json"]["params"]["method"], "execute_kw")
|
||||
chatter_response.raise_for_status.assert_called_once_with()
|
||||
self.assertEqual(post.call_count, 3)
|
||||
ticket_call = post.call_args_list[1]
|
||||
self.assertEqual(ticket_call.kwargs["timeout"], 5)
|
||||
self.assertEqual(ticket_call.kwargs["json"]["params"]["service"], "object")
|
||||
self.assertEqual(ticket_call.kwargs["json"]["params"]["method"], "execute_kw")
|
||||
self.assertEqual(
|
||||
post.call_args.kwargs["json"]["params"]["args"][6]["fields"],
|
||||
ticket_call.kwargs["json"]["params"]["args"][6]["fields"],
|
||||
["id", "name", "stage_id", "partner_id", "user_id", "write_date"],
|
||||
)
|
||||
self.assertEqual(post.call_args.kwargs["json"]["params"]["args"][6]["limit"], 0)
|
||||
self.assertEqual(post.call_args.kwargs["json"]["params"]["args"][6]["order"], "id asc")
|
||||
self.assertEqual(ticket_call.kwargs["json"]["params"]["args"][6]["limit"], 0)
|
||||
self.assertEqual(ticket_call.kwargs["json"]["params"]["args"][6]["order"], "id asc")
|
||||
chatter_call = post.call_args_list[2]
|
||||
self.assertEqual(chatter_call.kwargs["json"]["params"]["args"][3], "mail.message")
|
||||
self.assertEqual(chatter_call.kwargs["json"]["params"]["args"][6]["limit"], 0)
|
||||
|
||||
@patch("ticketing_setup.requests.post")
|
||||
def test_fetch_odoo_tickets_rejects_jsonrpc_error(self, post):
|
||||
|
||||
Reference in New Issue
Block a user