obook/mass_editing/tests/test_mass_editing.py

238 lines
9 KiB
Python

# Copyright 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com)
# Copyright 2018 Aitor Bouzas <aitor.bouzas@adaptivecity.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
# import ast
from odoo.modules import registry
from odoo.tests import common
from ..hooks import uninstall_hook
class TestMassEditing(common.SavepointCase):
at_install = False
post_install = True
def setUp(self):
super().setUp()
self.MassEditingWizard = self.env["mass.editing.wizard"]
self.ResPartnerTitle = self.env["res.partner.title"]
self.ResLang = self.env["res.lang"]
self.IrTranslation = self.env["ir.translation"]
self.IrActionsActWindow = self.env["ir.actions.act_window"]
self.mass_editing_user = self.env.ref("mass_editing.mass_editing_user")
self.mass_editing_partner_title = self.env.ref(
"mass_editing.mass_editing_partner_title"
)
self.users = self.env["res.users"].search([])
self.user = self.env.ref("base.user_demo")
self.partner_title = self._create_partner_title()
def _create_partner_title(self):
"""Create a Partner Title."""
# Loads German to work with translations
self.ResLang.load_lang("de_DE")
# Creating the title in English
partner_title = self.ResPartnerTitle.create(
{"name": "Ambassador", "shortcut": "Amb."}
)
# Adding translated terms
ctx = {"lang": "de_DE"}
partner_title.with_context(ctx).write(
{"name": "Botschafter", "shortcut": "Bots."}
)
return partner_title
def _create_wizard_and_apply_values(self, mass_editing, items, vals):
return self.MassEditingWizard.with_context(
mass_operation_mixin_name="mass.editing",
mass_operation_mixin_id=mass_editing.id,
active_ids=items.ids,
).create(vals)
def test_wiz_fields_view_get(self):
"""Test whether fields_view_get method returns arch.
with dynamic fields.
"""
result = self.MassEditingWizard.with_context(
mass_operation_mixin_name="mass.editing",
mass_operation_mixin_id=self.mass_editing_user.id,
active_ids=[],
).fields_view_get()
arch = result.get("arch", "")
self.assertTrue(
"selection__email" in arch,
"Fields view get must return architecture with fields" "created dynamicaly",
)
def test_wiz_read_fields(self):
"""Test whether read method returns all fields or not."""
fields_view = self.MassEditingWizard.with_context(
mass_operation_mixin_name="mass.editing",
mass_operation_mixin_id=self.mass_editing_user.id,
active_ids=[],
).fields_view_get()
fields = list(fields_view["fields"].keys())
# add a real field
fields.append("display_name")
vals = {"selection__email": "remove", "selection__phone": "remove"}
mass_wizard = self._create_wizard_and_apply_values(
self.mass_editing_user, self.users, vals
)
result = mass_wizard.read(fields)[0]
self.assertTrue(
all([field in result for field in fields]), "Read must return all fields."
)
def test_mass_edit_partner_title(self):
"""Test Case for MASS EDITING which will check if translation
was loaded for new partner title, and if they are removed
as well as the value for the abbreviation for the partner title."""
search_domain = [
("res_id", "=", self.partner_title.id),
("type", "=", "model"),
("name", "=", "res.partner.title,shortcut"),
("lang", "=", "de_DE"),
]
translation_ids = self.IrTranslation.search(search_domain)
self.assertEqual(
len(translation_ids),
1,
"Translation for Partner Title's Abbreviation " "was not loaded properly.",
)
# Removing partner title with mass edit action
vals = {"selection__shortcut": "remove"}
self._create_wizard_and_apply_values(
self.mass_editing_partner_title, self.partner_title, vals
)
self.assertEqual(
self.partner_title.shortcut,
False,
"Partner Title's Abbreviation should be removed.",
)
# Checking if translations were also removed
translation_ids = self.IrTranslation.search(search_domain)
self.assertEqual(
len(translation_ids),
0,
"Translation for Partner Title's Abbreviation " "was not removed properly.",
)
def test_mass_edit_email(self):
"""Test Case for MASS EDITING which will remove and after add
User's email and will assert the same."""
# Remove email and phone
vals = {"selection__email": "remove", "selection__phone": "remove"}
self._create_wizard_and_apply_values(self.mass_editing_user, self.user, vals)
self.assertEqual(self.user.email, False, "User's Email should be removed.")
# Set email address
vals = {"selection__email": "set", "email": "sample@mycompany.com"}
self._create_wizard_and_apply_values(self.mass_editing_user, self.user, vals)
self.assertNotEqual(self.user.email, False, "User's Email should be set.")
def test_mass_edit_m2m_categ(self):
"""Test Case for MASS EDITING which will remove and add
Partner's category m2m."""
# Remove m2m categories
vals = {"selection__category_id": "remove_m2m"}
self._create_wizard_and_apply_values(self.mass_editing_user, self.user, vals)
self.assertNotEqual(
self.user.category_id, False, "User's category should be removed."
)
# Add m2m categories
dist_categ_id = self.env.ref("base.res_partner_category_14").id
vend_categ_id = self.env.ref("base.res_partner_category_0").id
vals = {
"selection__category_id": "add",
"category_id": [[6, 0, [dist_categ_id, vend_categ_id]]],
}
self._create_wizard_and_apply_values(self.mass_editing_user, self.user, vals)
self.assertTrue(
all(
item in self.user.category_id.ids
for item in [dist_categ_id, vend_categ_id]
),
"Partner's category should be added.",
)
# Remove one m2m category
vals = {
"selection__category_id": "remove_m2m",
"category_id": [[6, 0, [vend_categ_id]]],
}
self._create_wizard_and_apply_values(self.mass_editing_user, self.user, vals)
self.assertTrue(
[dist_categ_id] == self.user.category_id.ids,
"User's category should be removed.",
)
def test_mass_edit_o2m_log_ids(self):
"""Test Case for MASS EDITING which will remove and after add
User's log_ids and will assert the same."""
# Add one log_ids
self.env['res.users.log'].sudo(self.user).create({})
self.assertTrue(self.user.log_ids)
# Remove one log_ids
vals = {"selection__log_ids": "remove_o2m"}
self._create_wizard_and_apply_values(
self.mass_editing_user, self.user, vals)
self.assertFalse(
self.user.log_ids.exists(), "User's log_ids should be removed.")
# Set one log_ids
vals = {
'selection__log_ids': "set_o2m",
'log_ids': [[
0,
0,
{}
]]}
self._create_wizard_and_apply_values(
self.mass_editing_user, self.user, vals)
self.assertTrue(
self.user.log_ids, "User's log_ids should be set.")
def test_sidebar_action(self):
"""Test if Sidebar Action is added / removed to / from give object."""
self.assertTrue(
self.mass_editing_user.ref_ir_act_window_id, "Sidebar action must exist."
)
# Remove the sidebar actions
self.mass_editing_user.disable_mass_operation()
self.assertFalse(
self.mass_editing_user.ref_ir_act_window_id,
"Sidebar action must be removed.",
)
def test_unlink_mass(self):
"""Test if related actions are removed when mass editing
record is unlinked."""
act_window = self.mass_editing_user.ref_ir_act_window_id
self.mass_editing_user.unlink()
self.assertFalse(
act_window.exists(),
"Sidebar action must be removed when mass" " editing is unlinked.",
)
def test_uninstall_hook(self):
"""Test if related actions are removed when mass editing
record is uninstalled."""
uninstall_hook(self.cr, registry)
mass_action_id = self.mass_editing_user.ref_ir_act_window_id.id
count = len(self.IrActionsActWindow.browse(mass_action_id))
self.assertTrue(
count == 0,
"Sidebar action must be removed when mass"
" editing module is uninstalled.",
)