mirror of
https://gitlab.com/flectra-community/server-ux.git
synced 2024-11-15 10:42:08 +00:00
209 lines
7.7 KiB
Python
209 lines
7.7 KiB
Python
|
# Copyright 2020 Ecosoft (http://ecosoft.co.th)
|
||
|
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
|
||
|
from flectra_test_helper import FakeModelLoader
|
||
|
|
||
|
from flectra.tests import common
|
||
|
from flectra.tests.common import tagged
|
||
|
|
||
|
|
||
|
@tagged("post_install", "-at_install")
|
||
|
class TierTierValidation(common.SavepointCase):
|
||
|
@classmethod
|
||
|
def setUpClass(cls):
|
||
|
super(TierTierValidation, cls).setUpClass()
|
||
|
|
||
|
cls.loader = FakeModelLoader(cls.env, cls.__module__)
|
||
|
cls.loader.backup_registry()
|
||
|
from .tier_validation_tester import TierValidationTester
|
||
|
|
||
|
cls.loader.update_registry((TierValidationTester,))
|
||
|
cls.test_model = cls.env[TierValidationTester._name]
|
||
|
cls.tester_model = cls.env["ir.model"].search(
|
||
|
[("model", "=", "tier.validation.tester")]
|
||
|
)
|
||
|
|
||
|
# Access record:
|
||
|
cls.env["ir.model.access"].create(
|
||
|
{
|
||
|
"name": "access.tester",
|
||
|
"model_id": cls.tester_model.id,
|
||
|
"perm_read": 1,
|
||
|
"perm_write": 1,
|
||
|
"perm_create": 1,
|
||
|
"perm_unlink": 1,
|
||
|
}
|
||
|
)
|
||
|
|
||
|
# Create users:
|
||
|
cls.group_system = cls.env.ref("base.group_system")
|
||
|
group_ids = cls.group_system.ids
|
||
|
cls.test_user_1 = cls.env["res.users"].create(
|
||
|
{"name": "John", "login": "test1", "groups_id": [(6, 0, group_ids)]}
|
||
|
)
|
||
|
cls.test_user_2 = cls.env["res.users"].create(
|
||
|
{"name": "Mike", "login": "test2"}
|
||
|
)
|
||
|
cls.test_user_3 = cls.env["res.users"].create(
|
||
|
{"name": "John Wick", "login": "test3", "groups_id": [(6, 0, group_ids)]}
|
||
|
)
|
||
|
|
||
|
# Create tier definitions:
|
||
|
cls.tier_def_obj = cls.env["tier.definition"]
|
||
|
cls.tier_def_obj.create(
|
||
|
{
|
||
|
"model_id": cls.tester_model.id,
|
||
|
"review_type": "individual",
|
||
|
"reviewer_id": cls.test_user_1.id,
|
||
|
"definition_domain": "[('test_field', '>', 1.0)]",
|
||
|
"sequence": 30,
|
||
|
}
|
||
|
)
|
||
|
|
||
|
cls.test_record = cls.test_model.create({"test_field": 2.5})
|
||
|
|
||
|
@classmethod
|
||
|
def tearDownClass(cls):
|
||
|
cls.loader.restore_registry()
|
||
|
super(TierTierValidation, cls).tearDownClass()
|
||
|
|
||
|
def test_1_auto_validation(self):
|
||
|
# Create new test record
|
||
|
test_record = self.test_model.create({"test_field": 2.5})
|
||
|
# Create tier definitions
|
||
|
self.tier_def_obj.create(
|
||
|
{
|
||
|
"model_id": self.tester_model.id,
|
||
|
"review_type": "individual",
|
||
|
"reviewer_id": self.test_user_1.id,
|
||
|
"sequence": 20,
|
||
|
"approve_sequence": True,
|
||
|
"auto_validate": True,
|
||
|
}
|
||
|
)
|
||
|
self.tier_def_obj.create(
|
||
|
{
|
||
|
"model_id": self.tester_model.id,
|
||
|
"review_type": "individual",
|
||
|
"reviewer_id": self.test_user_1.id,
|
||
|
"sequence": 10,
|
||
|
"approve_sequence": True,
|
||
|
"auto_validate": True,
|
||
|
"auto_validate_domain": "[('test_field', '>', 3)]",
|
||
|
}
|
||
|
)
|
||
|
# Request validation
|
||
|
test_record.with_user(self.test_user_2).request_validation()
|
||
|
record = test_record.with_user(self.test_user_1)
|
||
|
record.invalidate_cache()
|
||
|
# Auto validate, 1st tier, not auto validated
|
||
|
self.tier_def_obj._cron_auto_tier_validation()
|
||
|
self.assertEqual(
|
||
|
record.review_ids.mapped("status"), ["pending", "pending", "pending"]
|
||
|
)
|
||
|
# Manual validate 2nd tier -> OK
|
||
|
record.validate_tier()
|
||
|
self.assertEqual(
|
||
|
record.review_ids.mapped("status"), ["approved", "pending", "pending"]
|
||
|
)
|
||
|
# Auto validate, 2nd tier -> OK
|
||
|
self.tier_def_obj._cron_auto_tier_validation()
|
||
|
self.assertEqual(
|
||
|
record.review_ids.mapped("status"), ["approved", "approved", "pending"]
|
||
|
)
|
||
|
# Auto validate, 3rd tier -> Not pass validate domain
|
||
|
self.tier_def_obj._cron_auto_tier_validation()
|
||
|
self.assertEqual(
|
||
|
record.review_ids.mapped("status"), ["approved", "approved", "pending"]
|
||
|
)
|
||
|
# Manual validate 3rd tier -> OK
|
||
|
record.validate_tier()
|
||
|
self.assertEqual(
|
||
|
record.review_ids.mapped("status"), ["approved", "approved", "approved"]
|
||
|
)
|
||
|
|
||
|
def test_2_auto_validation_exception(self):
|
||
|
# Create new test record
|
||
|
test_record = self.test_model.create({"test_field": 2.5})
|
||
|
# Create tier definitions
|
||
|
self.tier_def_obj.create(
|
||
|
{
|
||
|
"model_id": self.tester_model.id,
|
||
|
"review_type": "individual",
|
||
|
"reviewer_group_id": self.group_system.id,
|
||
|
"sequence": 20,
|
||
|
"approve_sequence": True,
|
||
|
"auto_validate": True,
|
||
|
}
|
||
|
)
|
||
|
# Request validation
|
||
|
test_record.with_user(self.test_user_2).request_validation()
|
||
|
record = test_record.with_user(self.test_user_1)
|
||
|
record.invalidate_cache()
|
||
|
# Auto validate, 1st tier, not auto validated
|
||
|
self.tier_def_obj._cron_auto_tier_validation()
|
||
|
self.assertEqual(record.review_ids.mapped("status"), ["pending", "pending"])
|
||
|
# Manual validate 2nd tier -> OK
|
||
|
record.validate_tier()
|
||
|
self.assertEqual(record.review_ids.mapped("status"), ["approved", "pending"])
|
||
|
# Auto validate, 2nd tier -> Not OK, before len(reviewers) > 1
|
||
|
self.tier_def_obj._cron_auto_tier_validation()
|
||
|
self.assertEqual(record.review_ids.mapped("status"), ["approved", "pending"])
|
||
|
|
||
|
def test_3_trigger_server_action(self):
|
||
|
# Create new test record
|
||
|
test_record = self.test_model.create({"test_field": 2.5})
|
||
|
# Create server action
|
||
|
server_action = self.env["ir.actions.server"].create(
|
||
|
{
|
||
|
"name": "Set test_bool = True",
|
||
|
"model_id": self.tester_model.id,
|
||
|
"state": "code",
|
||
|
"code": "record.write({'test_bool': True})",
|
||
|
}
|
||
|
)
|
||
|
# Create tier definitions
|
||
|
self.tier_def_obj.create(
|
||
|
{
|
||
|
"model_id": self.tester_model.id,
|
||
|
"review_type": "individual",
|
||
|
"reviewer_id": self.test_user_1.id,
|
||
|
"sequence": 20,
|
||
|
"server_action_id": server_action.id, # Server Action
|
||
|
}
|
||
|
)
|
||
|
# Request validation
|
||
|
test_record.with_user(self.test_user_2).request_validation()
|
||
|
record = test_record.with_user(self.test_user_1)
|
||
|
record.invalidate_cache()
|
||
|
record.validate_tier()
|
||
|
self.assertTrue(record.test_bool)
|
||
|
|
||
|
def test_4_trigger_rejected_server_action(self):
|
||
|
# Create new test record
|
||
|
test_record = self.test_model.create({"test_field": 2.5})
|
||
|
# Create rejected server action
|
||
|
rejected_server_action = self.env["ir.actions.server"].create(
|
||
|
{
|
||
|
"name": "Set test_bool = True",
|
||
|
"model_id": self.tester_model.id,
|
||
|
"state": "code",
|
||
|
"code": "record.write({'test_bool': True})",
|
||
|
}
|
||
|
)
|
||
|
# Create tier definitions
|
||
|
self.tier_def_obj.create(
|
||
|
{
|
||
|
"model_id": self.tester_model.id,
|
||
|
"review_type": "individual",
|
||
|
"reviewer_id": self.test_user_1.id,
|
||
|
"sequence": 20,
|
||
|
"rejected_server_action_id": rejected_server_action.id,
|
||
|
}
|
||
|
)
|
||
|
# Request rejection
|
||
|
test_record.with_user(self.test_user_2).request_validation()
|
||
|
record = test_record.with_user(self.test_user_1)
|
||
|
record.invalidate_cache()
|
||
|
record.reject_tier()
|
||
|
self.assertTrue(record.test_bool)
|