import json from odoo.tests.common import TransactionCase, tagged from odoo.exceptions import UserError @tagged('-at_install', 'post_install', 'fp_perms') class TestMigrationWorkflow(TransactionCase): def setUp(self): super().setUp() Users = self.env['res.users'].with_context(no_reset_password=True) self.owner = Users.create({ 'login': 'mig_owner', 'name': 'Mig Owner', 'email': 'mig_owner@example.com', 'group_ids': [(6, 0, [self.env.ref('fusion_plating.group_fp_owner').id])], }) def test_only_owner_can_approve(self): non_owner = self.env['res.users'].with_context(no_reset_password=True).create({ 'login': 'mig_nonowner', 'name': 'Non Owner', 'email': 'mig_nonowner@example.com', 'group_ids': [(6, 0, [self.env.ref('fusion_plating.group_fp_manager').id])], }) preview = self.env['fp.migration.preview'].create({}) preview._fp_build_lines() with self.assertRaises(UserError): preview.with_user(non_owner).action_approve_and_run() def test_approve_advances_state(self): preview = self.env['fp.migration.preview'].create({}) preview._fp_build_lines() preview.with_user(self.owner).action_approve_and_run() self.assertEqual(preview.state, 'approved') self.assertTrue(preview.approved_at) self.assertEqual(preview.approved_by_id, self.owner) def test_cancel_advances_state(self): preview = self.env['fp.migration.preview'].create({}) preview.action_cancel() self.assertEqual(preview.state, 'cancelled') def test_cancel_blocked_after_approval(self): preview = self.env['fp.migration.preview'].create({}) preview._fp_build_lines() preview.with_user(self.owner).action_approve_and_run() with self.assertRaises(UserError): preview.action_cancel() def test_rollback_restores_groups(self): # Create a test user with an old Manager group old_mgr = self.env.ref('fusion_plating.group_fusion_plating_manager') u = self.env['res.users'].with_context(no_reset_password=True).create({ 'login': 'mig_rb', 'name': 'RB', 'email': 'mig_rb@example.com', 'group_ids': [(6, 0, [old_mgr.id])], }) before_ids = sorted(u.groups_id.ids) preview = self.env['fp.migration.preview'].create({}) preview._fp_build_lines() preview.with_user(self.owner).action_approve_and_run() # Verify the migration changed things u.invalidate_recordset() # Now rollback preview.with_user(self.owner).action_rollback() u.invalidate_recordset() self.assertEqual(sorted(u.groups_id.ids), before_ids, 'Rollback must restore original groups_id') self.assertEqual(preview.state, 'rolled_back') def test_estimator_warning_flagged(self): est = self.env.ref('fusion_plating_configurator.group_fp_estimator', raise_if_not_found=False) if not est: self.skipTest('Estimator group not defined') u = self.env['res.users'].with_context(no_reset_password=True).create({ 'login': 'mig_est', 'name': 'Est', 'email': 'mig_est@example.com', 'group_ids': [(6, 0, [est.id])], }) preview = self.env['fp.migration.preview'].create({}) preview._fp_build_lines() line = preview.line_ids.filtered(lambda l: l.user_id == u) self.assertTrue(line.warning, 'Estimator-only user should be flagged for capability loss') self.assertEqual(line.proposed_role, 'sales_rep') def test_admin_user_maps_to_owner(self): # uid 2 always gets owner via the first mapping rule preview = self.env['fp.migration.preview'].create({}) preview._fp_build_lines() admin_line = preview.line_ids.filtered(lambda l: l.user_id.id == 2) if admin_line: self.assertEqual(admin_line.proposed_role, 'owner') def test_rollback_blocked_after_30_days(self): from datetime import timedelta preview = self.env['fp.migration.preview'].create({}) preview._fp_build_lines() preview.with_user(self.owner).action_approve_and_run() # Backdate approved_at by 31 days preview.approved_at = preview.approved_at - timedelta(days=31) preview.invalidate_recordset(['rollback_deadline']) with self.assertRaises(UserError): preview.with_user(self.owner).action_rollback()