Coverage for ingadhoc-odoo-saas-adhoc / saas_provider_upgrade / tests / test_upgrade_line.py: 100%
64 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 19:24 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 19:24 +0000
1from unittest.mock import patch
3from odoo import Command
4from odoo.exceptions import UserError
6from .test_provider_upgrade_base import TestProviderUpgradeCommon
9class TestProviderUpgradeLine(TestProviderUpgradeCommon):
10 def test_approve_and_revert_script(self):
11 ul = self.upgrade_line_02
13 # Guardamos el old_script para el revert
14 old_script = ul.script
16 # Suponemos que estamos desarrollando un nuevo script
17 dev_script = "x = 1"
18 ul.dev_script = dev_script
20 # Aprobamos el scirpt sin testear (mock _validate_ops to bypass request requirement)
21 with patch.object(type(ul), "_validate_ops"):
22 ul.with_context(skip_test=True).action_approve_script()
24 self.assertFalse(ul.dev_script)
25 self.assertEqual(ul.script, dev_script)
26 self.assertEqual(ul.script_version, 2)
27 self.assertEqual(ul.state, "approved")
29 # Revertimos el cambio
30 revert_wizard = (
31 self.env["saas.provider.upgrade.revert.wizard"]
32 .with_context(to_version=1, upgrade_line_id=ul.id)
33 .create([{}])
34 )
35 revert_wizard.confirm()
37 # Se deberia volver al old_script con una version nueva
38 self.assertFalse(ul.dev_script)
39 self.assertEqual(ul.script, old_script)
40 self.assertEqual(ul.script_version, 3)
41 self.assertEqual(ul.state, "approved")
43 def test_get_script_version_test_dev_returns_dev_script(self):
44 """In test_dev context, return a temporary script built from `dev_script`."""
45 request = self.env["helpdesk.ticket.upgrade.request"]._create_request(self.upgrade_ticket.id, "test")
47 ul = self.upgrade_line_02
48 ul.dev_script = "dev_x = 42"
49 ul.dev_execution_mode = "odooly"
51 script_version = ul.with_context(test_dev=True, ticket_request_id=request.id)._get_script_version()
53 self.assertEqual(script_version.script, "dev_x = 42")
54 self.assertEqual(script_version.execution_mode, "odooly")
55 self.assertFalse(bool(script_version.id))
57 def test_get_script_version_no_actual_script_with_customer_note(self):
58 """When no actual script exists and customer notes are enabled, return a temporary empty script."""
59 request = self.env["helpdesk.ticket.upgrade.request"]._create_request(self.upgrade_ticket.id, "test")
61 # Create an upgrade line without an actual script but that generates a customer note
62 ul = self.env["saas.upgrade.line"].create(
63 {
64 "name": "[Test] UL no actual script with note",
65 "upgrade_type_ids": [Command.link(self.upgrade_type.id)],
66 "type": "4_post",
67 "state": "approved",
68 "run_type": "test",
69 "add_customer_note": True,
70 "adhoc_product_id": self.env.ref("saas_provider_adhoc.adhoc_product_actualizacion_actualizacion").id,
71 }
72 )
74 script_version = ul.with_context(ticket_request_id=request.id)._get_script_version()
76 # Should return a temporary (new) record with empty script and 'odooly' execution mode
77 self.assertEqual(script_version.script, "")
78 self.assertEqual(script_version.execution_mode, "odooly")
79 # New records are not persisted and therefore have falsy id
80 self.assertFalse(bool(script_version.id))
82 def test_get_script_version_run_type_production_returns_actual(self):
83 """If `run_type` is 'production', return the actual persisted script."""
84 request = self.env["helpdesk.ticket.upgrade.request"]._create_request(self.upgrade_ticket.id, "test")
86 ul = self.upgrade_line_02
87 # ensure there is an actual script
88 actual = ul.actual_script_id
89 ul.run_type = "production"
91 script_version = ul.with_context(ticket_request_id=request.id)._get_script_version()
92 self.assertEqual(script_version, actual)
94 def test_get_script_version_condition_true_returns_mapped_version(self):
95 """When production freeze applies and the request mapping specifies a version, return that mapped script."""
96 request = self.env["helpdesk.ticket.upgrade.request"]._create_request(self.upgrade_ticket.id, "test")
97 request.active_production_freeze = True
98 request.aim = "production"
100 ul = self.upgrade_line_02
101 # create a script version to be returned
102 version = 99
103 desired_script = self.env["saas.upgrade.line.script"].create(
104 {"upgrade_line_id": ul.id, "version": version, "script": "x = 1"}
105 )
107 # patch request mapping and production_freeze_ignore
108 with patch.object(
109 type(request), "_get_upgrade_line_versions_to_use", return_value={str(ul.id): version}
110 ), patch.object(type(ul), "_production_freeze_ignore", return_value=False):
111 script_version = ul.with_context(ticket_request_id=request.id)._get_script_version()
112 self.assertEqual(script_version, desired_script)
114 def test_get_script_version_condition_true_missing_version_raises(self):
115 """When production freeze applies but the mapped version does not exist, raise `UserError`."""
116 request = self.env["helpdesk.ticket.upgrade.request"]._create_request(self.upgrade_ticket.id, "test")
117 request.active_production_freeze = True
118 request.aim = "production"
120 ul = self.upgrade_line_02
121 missing_version = 12345
122 with patch.object(
123 type(request), "_get_upgrade_line_versions_to_use", return_value={str(ul.id): missing_version}
124 ), patch.object(type(ul), "_production_freeze_ignore", return_value=False):
125 with self.assertRaises(UserError):
126 ul.with_context(ticket_request_id=request.id)._get_script_version()