Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace)
This commit is contained in:
@@ -0,0 +1,231 @@
|
||||
# Copyright (C) 2024 Cetmix OÜ
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from unittest.mock import patch
|
||||
|
||||
from odoo import _
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
from odoo.addons.cetmix_tower_server.models.constants import (
|
||||
GENERAL_ERROR,
|
||||
JET_NOT_FOUND,
|
||||
JET_TEMPLATE_NOT_FOUND,
|
||||
)
|
||||
|
||||
from .common_jets import TestTowerJetsCommon
|
||||
|
||||
|
||||
class TestTowerServerJetActionCommand(TestTowerJetsCommon): # pylint: disable=protected-access
|
||||
"""Tests for cx.tower.server._command_runner_jet_action."""
|
||||
|
||||
def _create_jet_action_command(self, jet_template, jet_action):
|
||||
"""Create a command that triggers a jet action for the given template."""
|
||||
return self.Command.create(
|
||||
{
|
||||
"name": "Test jet action command",
|
||||
"action": "jet_action",
|
||||
"jet_template_id": jet_template.id,
|
||||
"jet_action_id": jet_action.id,
|
||||
}
|
||||
)
|
||||
|
||||
def _create_jet_action_log(self, jet, command):
|
||||
"""Create a command log bound to a jet and command."""
|
||||
return self.CommandLog.create(
|
||||
{
|
||||
"server_id": jet.server_id.id,
|
||||
"command_id": command.id,
|
||||
"jet_id": jet.id,
|
||||
}
|
||||
)
|
||||
|
||||
def test_command_runner_jet_action_requires_log_record(self):
|
||||
"""Calling without a log record must raise ValidationError."""
|
||||
with self.assertRaises(ValidationError):
|
||||
self.server_test_1._command_runner_jet_action(False)
|
||||
|
||||
def test_command_runner_jet_action_missing_jet_action(self):
|
||||
"""Missing command jet_action_id finishes with GENERAL_ERROR."""
|
||||
command = self._create_jet_action_command(
|
||||
self.jet_template_test,
|
||||
self.action_stopped_to_running,
|
||||
)
|
||||
command.write({"jet_action_id": False})
|
||||
log = self._create_jet_action_log(self.jet_test, command)
|
||||
|
||||
result = self.server_test_1._command_runner_jet_action(log)
|
||||
|
||||
self.assertEqual(result["status"], GENERAL_ERROR)
|
||||
self.assertEqual(result["response"], None)
|
||||
self.assertEqual(result["error"], _("Jet action is not found."))
|
||||
log.invalidate_recordset()
|
||||
self.assertEqual(log.command_status, GENERAL_ERROR)
|
||||
|
||||
def test_command_runner_jet_action_missing_jet(self):
|
||||
"""Missing jet on the log finishes with JET_NOT_FOUND."""
|
||||
command = self._create_jet_action_command(
|
||||
self.jet_template_test,
|
||||
self.action_stopped_to_running,
|
||||
)
|
||||
log = self.CommandLog.create(
|
||||
{
|
||||
"server_id": self.server_test_1.id,
|
||||
"command_id": command.id,
|
||||
"jet_id": False,
|
||||
}
|
||||
)
|
||||
|
||||
result = self.server_test_1._command_runner_jet_action(log)
|
||||
|
||||
self.assertEqual(result["status"], JET_NOT_FOUND)
|
||||
self.assertIsNotNone(result["error"])
|
||||
|
||||
def test_command_runner_jet_action_missing_jet_template(self):
|
||||
"""
|
||||
Missing jet_template_id on the command finishes with
|
||||
JET_TEMPLATE_NOT_FOUND.
|
||||
"""
|
||||
command = self._create_jet_action_command(
|
||||
self.jet_template_test,
|
||||
self.action_stopped_to_running,
|
||||
)
|
||||
command.write({"jet_template_id": False})
|
||||
log = self._create_jet_action_log(self.jet_test, command)
|
||||
|
||||
result = self.server_test_1._command_runner_jet_action(log)
|
||||
|
||||
self.assertEqual(result["status"], JET_TEMPLATE_NOT_FOUND)
|
||||
self.assertIsNotNone(result["error"])
|
||||
|
||||
@patch(
|
||||
"odoo.addons.cetmix_tower_server.models.cx_tower_jet.CxTowerJet._trigger_action",
|
||||
autospec=True,
|
||||
)
|
||||
def test_command_runner_jet_action_success_aggregates_response(self, mock_trigger):
|
||||
mock_trigger.return_value = {"status": 0, "error": None}
|
||||
command = self._create_jet_action_command(
|
||||
self.jet_template_test,
|
||||
self.action_stopped_to_running,
|
||||
)
|
||||
log = self._create_jet_action_log(self.jet_test, command)
|
||||
|
||||
result = self.server_test_1._command_runner_jet_action(log)
|
||||
|
||||
self.assertEqual(result["status"], 0)
|
||||
self.assertIsNone(result["error"])
|
||||
self.assertTrue(result["response"])
|
||||
self.assertIn("Action triggered for", result["response"])
|
||||
self.assertIn(self.jet_test.reference, result["response"])
|
||||
mock_trigger.assert_called_once()
|
||||
log.invalidate_recordset()
|
||||
self.assertEqual(log.command_status, 0)
|
||||
self.assertIn("Action triggered for", log.command_response)
|
||||
self.assertFalse(log.command_error)
|
||||
|
||||
@patch(
|
||||
"odoo.addons.cetmix_tower_server.models.cx_tower_jet.CxTowerJet._trigger_action",
|
||||
autospec=True,
|
||||
)
|
||||
def test_command_runner_jet_action_failure_single_jet_error_message(
|
||||
self, mock_trigger
|
||||
):
|
||||
mock_trigger.return_value = {"status": 1, "error": "No action found"}
|
||||
command = self._create_jet_action_command(
|
||||
self.jet_template_test,
|
||||
self.action_stopped_to_running,
|
||||
)
|
||||
log = self._create_jet_action_log(self.jet_test, command)
|
||||
|
||||
result = self.server_test_1._command_runner_jet_action(log)
|
||||
|
||||
self.assertEqual(result["status"], GENERAL_ERROR)
|
||||
self.assertIsNone(result["response"])
|
||||
self.assertTrue(result["error"])
|
||||
lines = result["error"].split("\n")
|
||||
self.assertEqual(len(lines), 2)
|
||||
self.assertIn("Action triggered for", lines[0])
|
||||
self.assertIn(self.jet_test.reference, lines[1])
|
||||
self.assertIn("No action found", lines[1])
|
||||
|
||||
@patch(
|
||||
"odoo.addons.cetmix_tower_server.models.cx_tower_jet.CxTowerJet._trigger_action",
|
||||
autospec=True,
|
||||
)
|
||||
def test_command_runner_jet_action_failure_status_without_error_text(
|
||||
self, mock_trigger
|
||||
):
|
||||
mock_trigger.return_value = {"status": 99, "error": None}
|
||||
command = self._create_jet_action_command(
|
||||
self.jet_template_test,
|
||||
self.action_stopped_to_running,
|
||||
)
|
||||
log = self._create_jet_action_log(self.jet_test, command)
|
||||
|
||||
result = self.server_test_1._command_runner_jet_action(log)
|
||||
|
||||
self.assertEqual(result["status"], GENERAL_ERROR)
|
||||
self.assertIn(self.jet_test.reference, result["error"])
|
||||
self.assertIn("99", result["error"])
|
||||
|
||||
@patch(
|
||||
"odoo.addons.cetmix_tower_server.models.cx_tower_jet.CxTowerJet._trigger_action",
|
||||
autospec=True,
|
||||
)
|
||||
def test_command_runner_jet_action_failure_multiple_jets(self, mock_trigger):
|
||||
jet_b = self._create_jet(
|
||||
name="Second Jet",
|
||||
reference="jet_second",
|
||||
template=self.jet_template_test,
|
||||
server=self.server_test_1,
|
||||
)
|
||||
|
||||
def side_effect(jet_self, *_args, **_kwargs):
|
||||
jet_self.ensure_one()
|
||||
if jet_self.id == self.jet_test.id:
|
||||
return {"status": 1, "error": "No action found"}
|
||||
return {"status": 2, "error": "Jet is busy"}
|
||||
|
||||
mock_trigger.side_effect = side_effect
|
||||
|
||||
command = self._create_jet_action_command(
|
||||
self.jet_template_test,
|
||||
self.action_stopped_to_running,
|
||||
)
|
||||
log = self._create_jet_action_log(self.jet_woocommerce, command)
|
||||
|
||||
with patch(
|
||||
"odoo.addons.cetmix_tower_server.models.cx_tower_jet.CxTowerJet._get_dependent_jets_by_template",
|
||||
autospec=True,
|
||||
return_value=self.jet_test | jet_b,
|
||||
):
|
||||
result = self.server_test_1._command_runner_jet_action(log)
|
||||
|
||||
self.assertEqual(result["status"], GENERAL_ERROR)
|
||||
lines = result["error"].split("\n")
|
||||
self.assertEqual(len(lines), 2)
|
||||
self.assertIn("Action triggered for", lines[0])
|
||||
self.assertIn(self.jet_test.reference, lines[0])
|
||||
self.assertIn(jet_b.reference, lines[0])
|
||||
agg = lines[1]
|
||||
self.assertIn(f"{self.jet_test.reference}: No action found", agg)
|
||||
self.assertIn(f"{jet_b.reference}: Jet is busy", agg)
|
||||
|
||||
@patch(
|
||||
"odoo.addons.cetmix_tower_server.models.cx_tower_jet.CxTowerJet._get_dependent_jets_by_template",
|
||||
autospec=True,
|
||||
)
|
||||
def test_command_runner_jet_action_no_dependent_jets(self, mock_deps):
|
||||
mock_deps.return_value = self.Jet.browse()
|
||||
command = self._create_jet_action_command(
|
||||
self.jet_template_test,
|
||||
self.action_stopped_to_running,
|
||||
)
|
||||
log = self._create_jet_action_log(self.jet_woocommerce, command)
|
||||
|
||||
result = self.server_test_1._command_runner_jet_action(log)
|
||||
|
||||
self.assertEqual(result["status"], 0)
|
||||
self.assertIsNone(result["error"])
|
||||
self.assertTrue(result["response"])
|
||||
self.assertIn(self.jet_woocommerce.name, result["response"])
|
||||
self.assertIn(self.jet_template_test.name, result["response"])
|
||||
Reference in New Issue
Block a user