|
9 | 9 | flow. |
10 | 10 | """ |
11 | 11 |
|
| 12 | +from odoo import Command |
12 | 13 | from odoo.tests import TransactionCase, tagged |
13 | 14 |
|
14 | 15 |
|
@@ -149,6 +150,101 @@ def test_hide_menus_is_idempotent(self): |
149 | 150 | for record in after_second: |
150 | 151 | self.assertEqual(record.state, "hide") |
151 | 152 |
|
| 153 | + def test_reapply_hide_after_simulated_upgrade_reset(self): |
| 154 | + """_reapply_hide() re-applies the hide group after a module upgrade |
| 155 | + reset the menu's group_ids via XML (noupdate="0"). |
| 156 | +
|
| 157 | + A real module upgrade can't run inside a test transaction, so we |
| 158 | + simulate its effect: hide the menu, then overwrite group_ids the way |
| 159 | + an XML data reload would, dropping the hide group. _reapply_hide() |
| 160 | + must detect the stale state and restore the hidden configuration. |
| 161 | + """ |
| 162 | + hide_group = self.env.ref("spp_hide_menus_base.group_hide_menus_user") |
| 163 | + record = self.env["spp.hide.menu"].create({"menu_id": self.menu.id, "xml_id": "test.hide_menu_target"}) |
| 164 | + record.hide_menu() |
| 165 | + self.assertIn(hide_group, self.menu.group_ids, "precondition: menu should be hidden") |
| 166 | + |
| 167 | + # Simulate the upgrade resetting group_ids to the module's XML default |
| 168 | + # (some real group, without the hide group). |
| 169 | + reset_groups = self.env.ref("base.group_user") |
| 170 | + self.menu.write({"group_ids": [Command.set([reset_groups.id])]}) |
| 171 | + self.assertNotIn(hide_group, self.menu.group_ids, "precondition: reset must drop the hide group") |
| 172 | + |
| 173 | + record._reapply_hide() |
| 174 | + |
| 175 | + self.assertIn( |
| 176 | + hide_group, |
| 177 | + self.menu.group_ids, |
| 178 | + "_reapply_hide() should restore the hide group after an upgrade reset", |
| 179 | + ) |
| 180 | + # The reset groups become the new restore snapshot so show_menu() |
| 181 | + # returns the menu to its real post-upgrade default. |
| 182 | + self.assertEqual(record.default_group_ids, reset_groups) |
| 183 | + |
| 184 | + def test_reapply_hide_noop_when_already_hidden(self): |
| 185 | + """_reapply_hide() is a no-op when the hide group is still present. |
| 186 | +
|
| 187 | + If no upgrade reset happened, the guard (hide_group not in |
| 188 | + group_ids) is False, so neither group_ids nor the saved snapshot |
| 189 | + should change. |
| 190 | + """ |
| 191 | + hide_group = self.env.ref("spp_hide_menus_base.group_hide_menus_user") |
| 192 | + record = self.env["spp.hide.menu"].create({"menu_id": self.menu.id, "xml_id": "test.hide_menu_target"}) |
| 193 | + record.hide_menu() |
| 194 | + groups_before = self.menu.group_ids |
| 195 | + snapshot_before = record.default_group_ids |
| 196 | + self.assertIn(hide_group, groups_before, "precondition: menu should be hidden") |
| 197 | + |
| 198 | + record._reapply_hide() |
| 199 | + |
| 200 | + self.assertEqual(self.menu.group_ids, groups_before) |
| 201 | + self.assertEqual(record.default_group_ids, snapshot_before) |
| 202 | + |
| 203 | + def test_hide_menus_reapplies_after_reset(self): |
| 204 | + """``hide_menus()`` re-hides an already-hidden menu whose group_ids |
| 205 | + were reset, exercising the ``elif ... state == "hide"`` branch. |
| 206 | +
|
| 207 | + This is the end-to-end shape of the upgrade bug: a menu is hidden, |
| 208 | + a later module upgrade resets its group_ids, and the next |
| 209 | + install/upgrade pass through hide_menus() must put the hide group |
| 210 | + back. |
| 211 | + """ |
| 212 | + IrModuleModule = self.env["ir.module.module"] |
| 213 | + HideMenu = self.env["spp.hide.menu"] |
| 214 | + hide_group = self.env.ref("spp_hide_menus_base.group_hide_menus_user") |
| 215 | + |
| 216 | + # Find one resolvable MENU_APP entry to drive the real entry point. |
| 217 | + target = None |
| 218 | + for module_name, info in IrModuleModule.MENU_APP.items(): |
| 219 | + menu = self.env.ref(info["menu_xml_id"], raise_if_not_found=False) |
| 220 | + module = IrModuleModule.search([("name", "=", module_name)], limit=1) |
| 221 | + if menu and module: |
| 222 | + target = menu |
| 223 | + break |
| 224 | + if target is None: |
| 225 | + self.skipTest("No MENU_APP entries are resolvable in this test DB") |
| 226 | + |
| 227 | + # First pass creates the record and hides the menu. |
| 228 | + HideMenu.search([]).unlink() |
| 229 | + IrModuleModule.hide_menus() |
| 230 | + record = HideMenu.search([("menu_id", "=", target.id)], limit=1) |
| 231 | + self.assertTrue(record, "hide_menus() should have created a hide record") |
| 232 | + self.assertEqual(record.state, "hide") |
| 233 | + self.assertIn(hide_group, target.group_ids) |
| 234 | + |
| 235 | + # Simulate an upgrade resetting the menu's group_ids via XML. |
| 236 | + reset_groups = self.env.ref("base.group_user") |
| 237 | + target.write({"group_ids": [Command.set([reset_groups.id])]}) |
| 238 | + self.assertNotIn(hide_group, target.group_ids) |
| 239 | + |
| 240 | + # Second pass must re-hide via the state == "hide" branch. |
| 241 | + IrModuleModule.hide_menus() |
| 242 | + self.assertIn( |
| 243 | + hide_group, |
| 244 | + target.group_ids, |
| 245 | + "hide_menus() should re-hide a menu whose group_ids were reset on upgrade", |
| 246 | + ) |
| 247 | + |
152 | 248 | def test_hide_menus_skips_unknown_modules(self): |
153 | 249 | """An ir.module.module record whose name isn't in MENU_APP must be |
154 | 250 | ignored by hide_menus() — no spp.hide.menu record is created for it. |
|
0 commit comments