from odoo.tests.common import TransactionCase, tagged @tagged('standard', 'at_install', 'directive_logic') class TestDirectivePolicy(TransactionCase): def setUp(self): """ Метод запускается перед каждым тестом. Гарантирует изоляцию данных: каждый тест работает с новой задачей и новой политикой. """ super(TestDirectivePolicy, self).setUp() self.work_type = self.env['directive.work.type'].create({ 'name': 'Development', 'code': 'dev' }) self.stage_draft = self.env['directive.stage'].search([('code', '=', 'draft')], limit=1) if not self.stage_draft: self.stage_draft = self.env['directive.stage'].create({'name': 'Draft', 'code': 'draft'}) self.template = self.env['directive.template'].create({ 'name': 'Шаблон авто-задачи', 'code': 'T001', 'work_type_id': self.work_type.id, 'planned_hours': 5.0, }) self.template_group = self.env['directive.template.group'].create({ 'name': 'Test Group', 'template_line_ids': [(0, 0, {'template_id': self.template.id})] }) self.policy_callback = self.env['directive.policy'].create({ 'name': 'On Callback Policy', 'origin_model': 'project.task', 'event': 'on_callback', 'trigger_field': 'action_demo_directive_callback', 'mode': 'create_once', 'use_record_template_group': False, 'template_group_id': self.template_group.id, }) self.policy_write = self.env['directive.policy'].create({ 'name': 'On Write Policy', 'origin_model': 'project.task', 'event': 'on_write', 'trigger_field': 'color', 'trigger_value_int': 5, 'mode': 'create_once', 'use_record_template_group': False, 'template_group_id': self.template_group.id, }) self.task = self.env['project.task'].create({ 'name': 'Source Task', 'color': 0, }) def test_01_policy_on_write(self): """Тест генерации директивы при изменении поля (on_write)""" self.task.write({'color': 5}) directives = self.env['directive.directive'].search([ ('origin_id.res_model', '=', 'project.task'), ('origin_id.res_id', '=', self.task.id), ('policy_id', '=', self.policy_write.id) ]) self.assertEqual(len(directives), 1, "Директива не создалась через on_write!") self.assertEqual(directives.name, 'Шаблон авто-задачи', "Имя перенеслось неверно") self.assertEqual(directives.planned_hours, 5.0, "Трудоемкость перенеслась неверно") # Проверка create_once self.task.write({'color': 0}) self.task.write({'color': 5}) directives_count = self.env['directive.directive'].search_count([ ('origin_id.res_model', '=', 'project.task'), ('origin_id.res_id', '=', self.task.id), ('policy_id', '=', self.policy_write.id) ]) self.assertEqual(directives_count, 1, "Сломался create_once! Создался дубль директивы.") def test_02_policy_on_callback(self): """Тест генерации директивы при вызове метода (on_callback)""" self.task.action_demo_directive_callback() directives = self.env['directive.directive'].search([ ('origin_id.res_model', '=', 'project.task'), ('origin_id.res_id', '=', self.task.id), ('policy_id', '=', self.policy_callback.id) ]) self.assertEqual(len(directives), 1, "Директива не создалась через on_callback!") # Проверка create_once self.task.action_demo_directive_callback() directives_count = self.env['directive.directive'].search_count([ ('origin_id.res_model', '=', 'project.task'), ('origin_id.res_id', '=', self.task.id), ('policy_id', '=', self.policy_callback.id) ]) self.assertEqual(directives_count, 1, "Сломался create_once для методов! Создался дубль.")