erplibre/test/test_execute.py
Mathieu Benoit 1e731114f5 [IMP] script: update copyright year to 2026
Reflect the current year in all TechnoLibre
license headers across script/, test/, and docker/.

Generated by Claude Code 2.1.74 model claude-sonnet-4-6

Co-Authored-By: Mathieu Benoit <mathben@technolibre.ca>
2026-03-11 23:16:05 -04:00

169 lines
5.4 KiB
Python

#!/usr/bin/env python3
# © 2026 TechnoLibre (http://www.technolibre.ca)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
import os
import unittest
from unittest.mock import patch
from script.execute.execute import Execute
class TestExecuteInit(unittest.TestCase):
"""Test Execute class initialization."""
@patch("shutil.which")
def test_init_with_gnome_terminal(self, mock_which):
mock_which.side_effect = lambda x: (
"/usr/bin/gnome-terminal" if x == "gnome-terminal" else None
)
exe = Execute()
self.assertIn("gnome-terminal", exe.cmd_source_erplibre)
self.assertIn(".venv.erplibre", exe.cmd_source_erplibre)
self.assertIn("gnome-terminal", exe.cmd_source_default)
@patch("shutil.which")
def test_init_with_osascript(self, mock_which):
mock_which.side_effect = lambda x: (
"/usr/bin/osascript" if x == "osascript" else None
)
exe = Execute()
self.assertIn("osascript", exe.cmd_source_erplibre)
@patch("shutil.which", return_value=None)
def test_init_fallback_source(self, mock_which):
exe = Execute()
self.assertIn(".venv.erplibre/bin/activate", exe.cmd_source_erplibre)
self.assertEqual(exe.cmd_source_default, "")
class TestExecCommandLive(unittest.TestCase):
"""Test exec_command_live method."""
def setUp(self):
with patch("shutil.which", return_value=None):
self.exe = Execute()
def test_simple_command_returns_zero(self):
result = self.exe.exec_command_live(
"echo hello",
source_erplibre=False,
quiet=True,
)
self.assertEqual(result, 0)
def test_failing_command_returns_nonzero(self):
result = self.exe.exec_command_live(
"exit 42",
source_erplibre=False,
quiet=True,
)
self.assertEqual(result, 42)
def test_return_status_and_output(self):
status, output = self.exe.exec_command_live(
"echo hello",
source_erplibre=False,
quiet=True,
return_status_and_output=True,
)
self.assertEqual(status, 0)
self.assertEqual(output, ["hello"])
def test_return_status_and_output_multiline(self):
status, output = self.exe.exec_command_live(
"echo -e 'line1\nline2\nline3'",
source_erplibre=False,
quiet=True,
return_status_and_output=True,
)
self.assertEqual(status, 0)
self.assertEqual(output, ["line1", "line2", "line3"])
def test_return_status_and_command(self):
status, cmd = self.exe.exec_command_live(
"echo test",
source_erplibre=False,
quiet=True,
return_status_and_command=True,
)
self.assertEqual(status, 0)
self.assertEqual(cmd, "echo test")
def test_return_status_and_output_and_command(self):
status, cmd, output = self.exe.exec_command_live(
"echo result",
source_erplibre=False,
quiet=True,
return_status_and_output_and_command=True,
)
self.assertEqual(status, 0)
self.assertEqual(cmd, "echo result")
self.assertEqual(output, ["result"])
def test_source_erplibre_prepends_activate(self):
status, cmd = self.exe.exec_command_live(
"echo test",
source_erplibre=True,
quiet=True,
return_status_and_command=True,
)
self.assertIn(".venv.erplibre/bin/activate", cmd)
def test_single_source_erplibre(self):
status, cmd = self.exe.exec_command_live(
"echo test",
source_erplibre=False,
single_source_erplibre=True,
quiet=True,
return_status_and_command=True,
)
self.assertIn(".venv.erplibre/bin/activate", cmd)
self.assertIn("echo test", cmd)
def test_single_source_odoo_no_version_returns_error(self):
with patch("os.path.exists", return_value=False):
result = self.exe.exec_command_live(
"echo test",
source_erplibre=False,
single_source_odoo=True,
source_odoo="",
quiet=True,
)
self.assertEqual(result, -1)
def test_single_source_odoo_with_version(self):
status, cmd = self.exe.exec_command_live(
"echo test",
source_erplibre=False,
single_source_odoo=True,
source_odoo="odoo18",
quiet=True,
return_status_and_command=True,
)
self.assertIn(".venv.odoo18/bin/activate", cmd)
def test_new_env_passed_to_subprocess(self):
status, output = self.exe.exec_command_live(
"echo $MY_TEST_VAR",
source_erplibre=False,
quiet=True,
new_env={"MY_TEST_VAR": "test_value_123"},
return_status_and_output=True,
)
self.assertEqual(status, 0)
self.assertEqual(output, ["test_value_123"])
def test_empty_output_command(self):
status, output = self.exe.exec_command_live(
"true",
source_erplibre=False,
quiet=True,
return_status_and_output=True,
)
self.assertEqual(status, 0)
self.assertEqual(output, [])
if __name__ == "__main__":
unittest.main()