mirror of
https://github.com/bringout/oca-ocb-core.git
synced 2026-04-20 09:32:05 +02:00
77 lines
3.8 KiB
Python
77 lines
3.8 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo.http import root, SESSION_ROTATION_INTERVAL
|
|
from odoo.addons.base.tests.common import HttpCaseWithUserDemo
|
|
from odoo.addons.bus.models.bus import channel_with_db, json_dump
|
|
|
|
|
|
class TestWebsocketController(HttpCaseWithUserDemo):
|
|
def test_im_status_offline_on_websocket_closed(self):
|
|
self.authenticate("demo", "demo")
|
|
self.env["mail.presence"]._update_presence(self.user_demo)
|
|
self.env.cr.precommit.run() # trigger the creation of bus.bus records
|
|
self.env["bus.bus"].search([]).unlink()
|
|
self.make_jsonrpc_request("/websocket/on_closed", {})
|
|
self.env.cr.precommit.run() # trigger the creation of bus.bus records
|
|
message = self.make_jsonrpc_request(
|
|
"/websocket/peek_notifications",
|
|
{
|
|
"channels": [f"odoo-presence-res.partner_{self.partner_demo.id}"],
|
|
"last": 0,
|
|
"is_first_poll": True,
|
|
},
|
|
)["notifications"][0]["message"]
|
|
self.assertEqual(message["type"], "bus.bus/im_status_updated")
|
|
self.assertEqual(message["payload"]["partner_id"], self.partner_demo.id)
|
|
self.assertEqual(message["payload"]["im_status"], "offline")
|
|
self.assertEqual(message["payload"]["presence_status"], "offline")
|
|
|
|
def test_receive_missed_presences_on_peek_notifications(self):
|
|
self.authenticate("demo", "demo")
|
|
self.env["mail.presence"]._update_presence(self.user_demo)
|
|
self.env.cr.precommit.run() # trigger the creation of bus.bus records
|
|
# First request will get notifications and trigger the creation
|
|
# of the missed presences one.
|
|
last_id = self.env["bus.bus"]._bus_last_id()
|
|
self.make_jsonrpc_request(
|
|
"/websocket/peek_notifications",
|
|
{
|
|
"channels": [f"odoo-presence-res.partner_{self.partner_demo.id}"],
|
|
"last": last_id,
|
|
"is_first_poll": True,
|
|
},
|
|
)
|
|
self.env.cr.precommit.run() # trigger the creation of bus.bus records
|
|
notification = self.make_jsonrpc_request(
|
|
"/websocket/peek_notifications",
|
|
{
|
|
"channels": [f"odoo-presence-res.partner_{self.partner_demo.id}"],
|
|
"last": last_id,
|
|
"is_first_poll": True,
|
|
},
|
|
)["notifications"][0]
|
|
bus_record = self.env["bus.bus"].search([("id", "=", int(notification["id"]))])
|
|
self.assertEqual(
|
|
bus_record.channel, json_dump(channel_with_db(self.env.cr.dbname, self.partner_demo))
|
|
)
|
|
self.assertEqual(notification["message"]["type"], "bus.bus/im_status_updated")
|
|
self.assertEqual(notification["message"]["payload"]["partner_id"], self.partner_demo.id)
|
|
self.assertEqual(notification["message"]["payload"]["im_status"], "online")
|
|
self.assertEqual(notification["message"]["payload"]["presence_status"], "online")
|
|
|
|
def test_do_not_rotate_session_when_updating_presence(self):
|
|
self.authenticate('admin', 'admin')
|
|
self.url_open('/odoo')
|
|
original_session = self.opener.cookies['session_id']
|
|
original_session_obj = root.session_store.get(original_session)
|
|
original_session_obj['create_time'] -= SESSION_ROTATION_INTERVAL
|
|
root.session_store.save(original_session_obj)
|
|
self.make_jsonrpc_request('/websocket/peek_notifications', {
|
|
'channels': [],
|
|
'last': 0,
|
|
'is_first_poll': True,
|
|
})
|
|
self.make_jsonrpc_request('/websocket/update_bus_presence', {'inactivity_period': 0})
|
|
self.assertEqual(self.opener.cookies['session_id'], original_session)
|
|
self.url_open("/odoo")
|
|
self.assertNotEqual(self.opener.cookies['session_id'], original_session)
|