Includes:
- compositor.app, compositor.session, compositor.session.app, compositor.audit.log models
- /web/compositor/{token,apps,launch,audit} HTTP controllers with JWT (HS256)
- CompositorService OWL service (reusable via useService('compositor'))
- CompositorCanvas OWL component (reusable canvas wrapper)
- Security: compositor_group_user, compositor_group_manager groups + ir.access.csv rules
- 5 demo apps pre-loaded (gnome-calculator, xterm, gtk4-demo, glxgears, featherpad)
- Audit log capturing JWT issuance + app launch events
- Stub mode: launching apps returns a stub SurfaceHandle when proxy isn't connected
- Tested against Odoo 20 + PostgreSQL 17
Author: 1bspace.com
Parent company: 1B Global
License: Proprietary (1B Space internal use)
46 lines
1.7 KiB
Python
46 lines
1.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Tests for compositor.session model."""
|
|
|
|
from odoo.tests import common, tagged
|
|
|
|
|
|
@tagged("post_install", "-at_install")
|
|
class TestCompositorSession(common.TransactionCase):
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.Session = self.env["compositor.session"]
|
|
self.App = self.env["compositor.app"]
|
|
|
|
def test_create_session_defaults(self):
|
|
session = self.Session.create({})
|
|
self.assertEqual(session.state, "pending")
|
|
self.assertTrue(session.compositor_session_id)
|
|
self.assertEqual(session.user_id, self.env.user)
|
|
self.assertEqual(session.app_count, 0)
|
|
self.assertEqual(session.running_app_count, 0)
|
|
|
|
def test_session_app_lifecycle(self):
|
|
session = self.Session.create({})
|
|
app = self.App.create({
|
|
"name": "Test", "app_id": "test-lifecycle", "executable": "/bin/true",
|
|
})
|
|
inst = self.env["compositor.session.app"].create({
|
|
"session_id": session.id, "app_id": app.id,
|
|
})
|
|
self.assertEqual(inst.state, "launching")
|
|
inst.write({"state": "running"})
|
|
self.assertEqual(session.running_app_count, 1)
|
|
inst.action_terminate()
|
|
self.assertEqual(inst.state, "terminated")
|
|
self.assertEqual(session.running_app_count, 0)
|
|
|
|
def test_action_close(self):
|
|
session = self.Session.create({})
|
|
app = self.App.create({"name": "X", "app_id": "x", "executable": "/bin/true"})
|
|
inst = self.env["compositor.session.app"].create({
|
|
"session_id": session.id, "app_id": app.id, "state": "running",
|
|
})
|
|
session.action_close()
|
|
self.assertEqual(session.state, "closed")
|
|
self.assertEqual(inst.state, "terminated")
|