Before this commit, if we have for instance 3 tasks called A, B and C where A depends on B and B depends on A then we have a cyclic dependency. Another example with the same tasks, we can have a cyclic dependency if A depends on B, B depends on C and C depends on A. This commit checks we have no cyclic dependencies when the user adds a dependency on a task. task-2387984 closes #66740
88 lines
3.8 KiB
Python
88 lines
3.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from odoo.fields import Command
|
|
from odoo.exceptions import ValidationError
|
|
from odoo.tests import tagged
|
|
|
|
from odoo.addons.project.tests.test_project_base import TestProjectCommon
|
|
|
|
|
|
@tagged('-at_install', 'post_install', 'task_dependencies')
|
|
class TestTaskDependencies(TestProjectCommon):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
|
|
cls.project_pigs.write({
|
|
'allow_task_dependencies': True,
|
|
})
|
|
cls.task_3 = cls.env['project.task'].with_context({'mail_create_nolog': True}).create({
|
|
'name': 'Pigs UserTask 2',
|
|
'user_id': cls.user_projectuser.id,
|
|
'project_id': cls.project_pigs.id,
|
|
})
|
|
|
|
def test_task_dependencies(self):
|
|
""" Test the task dependencies feature
|
|
|
|
Test Case:
|
|
=========
|
|
1) Add task2 as dependency in task1
|
|
2) Checks if the task1 has the task in depend_on_ids field.
|
|
"""
|
|
self.assertEqual(len(self.task_1.depend_on_ids), 0, "The task 1 should not have any dependency.")
|
|
self.task_1.write({
|
|
'depend_on_ids': [Command.link(self.task_2.id)],
|
|
})
|
|
self.assertEqual(len(self.task_1.depend_on_ids), 1, "The task 1 should have a dependency.")
|
|
self.task_1.write({
|
|
'depend_on_ids': [Command.link(self.task_3.id)],
|
|
})
|
|
self.assertEqual(len(self.task_1.depend_on_ids), 2, "The task 1 should have two dependencies.")
|
|
|
|
def test_cyclic_dependencies(self):
|
|
""" Test the cyclic dependencies
|
|
|
|
Test Case:
|
|
=========
|
|
1) Check initial setting on three tasks
|
|
2) Add task2 as dependency in task1
|
|
3) Add task3 as dependency in task2
|
|
4) Add task1 as dependency in task3 and check a validation error is raised
|
|
5) Add task1 as dependency in task2 and check a validation error is raised
|
|
"""
|
|
# 1) Check initial setting on three tasks
|
|
self.assertTrue(
|
|
len(self.task_1.depend_on_ids) == len(self.task_2.depend_on_ids) == len(self.task_3.depend_on_ids) == 0,
|
|
"The three tasks should depend on no tasks.")
|
|
self.assertTrue(self.task_1.allow_task_dependencies, 'The task dependencies feature should be enable.')
|
|
self.assertTrue(self.task_2.allow_task_dependencies, 'The task dependencies feature should be enable.')
|
|
self.assertTrue(self.task_3.allow_task_dependencies, 'The task dependencies feature should be enable.')
|
|
|
|
# 2) Add task2 as dependency in task1
|
|
self.task_1.write({
|
|
'depend_on_ids': [Command.link(self.task_2.id)],
|
|
})
|
|
self.assertEqual(len(self.task_1.depend_on_ids), 1, 'The task 1 should have one dependency.')
|
|
|
|
# 3) Add task3 as dependency in task2
|
|
self.task_2.write({
|
|
'depend_on_ids': [Command.link(self.task_3.id)],
|
|
})
|
|
self.assertEqual(len(self.task_2.depend_on_ids), 1, "The task 2 should have one dependency.")
|
|
|
|
# 4) Add task1 as dependency in task3 and check a validation error is raised
|
|
with self.assertRaises(ValidationError), self.cr.savepoint():
|
|
self.task_3.write({
|
|
'depend_on_ids': [Command.link(self.task_1.id)],
|
|
})
|
|
self.assertEqual(len(self.task_3.depend_on_ids), 0, "The dependency should not be added in the task 3 because of a cyclic dependency.")
|
|
|
|
# 5) Add task1 as dependency in task2 and check a validation error is raised
|
|
with self.assertRaises(ValidationError), self.cr.savepoint():
|
|
self.task_2.write({
|
|
'depend_on_ids': [Command.link(self.task_1.id)],
|
|
})
|
|
self.assertEqual(len(self.task_2.depend_on_ids), 1, "The number of dependencies should no change in the task 2 because of a cyclic dependency.")
|