summaryrefslogtreecommitdiff
path: root/addons/project/tests/test_access_rights.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/project/tests/test_access_rights.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/project/tests/test_access_rights.py')
-rw-r--r--addons/project/tests/test_access_rights.py228
1 files changed, 228 insertions, 0 deletions
diff --git a/addons/project/tests/test_access_rights.py b/addons/project/tests/test_access_rights.py
new file mode 100644
index 00000000..a912f357
--- /dev/null
+++ b/addons/project/tests/test_access_rights.py
@@ -0,0 +1,228 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo.addons.mail.tests.common import mail_new_test_user
+from odoo.addons.project.tests.test_project_base import TestProjectCommon
+from odoo.exceptions import AccessError, ValidationError
+from odoo.tests.common import users
+
+
+class TestAccessRights(TestProjectCommon):
+
+ def setUp(self):
+ super().setUp()
+ self.task = self.create_task('Make the world a better place')
+ self.user = mail_new_test_user(self.env, 'Internal user', groups='base.group_user')
+ self.portal = mail_new_test_user(self.env, 'Portal user', groups='base.group_portal')
+
+ def create_task(self, name, *, with_user=None, **kwargs):
+ values = dict(name=name, project_id=self.project_pigs.id, **kwargs)
+ return self.env['project.task'].with_user(with_user or self.env.user).create(values)
+
+
+class TestCRUDVisibilityFollowers(TestAccessRights):
+
+ def setUp(self):
+ super().setUp()
+ self.project_pigs.privacy_visibility = 'followers'
+
+ @users('Internal user', 'Portal user')
+ def test_project_no_write(self):
+ with self.assertRaises(AccessError, msg="%s should not be able to write on the project" % self.env.user.name):
+ self.project_pigs.with_user(self.env.user).name = "Take over the world"
+
+ self.project_pigs.allowed_user_ids = self.env.user
+ with self.assertRaises(AccessError, msg="%s should not be able to write on the project" % self.env.user.name):
+ self.project_pigs.with_user(self.env.user).name = "Take over the world"
+
+ @users('Internal user', 'Portal user')
+ def test_project_no_unlink(self):
+ self.project_pigs.task_ids.unlink()
+ with self.assertRaises(AccessError, msg="%s should not be able to unlink the project" % self.env.user.name):
+ self.project_pigs.with_user(self.env.user).unlink()
+
+ self.project_pigs.allowed_user_ids = self.env.user
+ self.project_pigs.task_ids.unlink()
+ with self.assertRaises(AccessError, msg="%s should not be able to unlink the project" % self.env.user.name):
+ self.project_pigs.with_user(self.env.user).unlink()
+
+ @users('Internal user', 'Portal user')
+ def test_project_no_read(self):
+ self.project_pigs.invalidate_cache()
+ with self.assertRaises(AccessError, msg="%s should not be able to read the project" % self.env.user.name):
+ self.project_pigs.with_user(self.env.user).name
+
+ @users('Portal user')
+ def test_project_allowed_portal_no_read(self):
+ self.project_pigs.allowed_user_ids = self.env.user
+ self.project_pigs.invalidate_cache()
+ with self.assertRaises(AccessError, msg="%s should not be able to read the project" % self.env.user.name):
+ self.project_pigs.with_user(self.env.user).name
+
+ @users('Internal user')
+ def test_project_allowed_internal_read(self):
+ self.project_pigs.allowed_user_ids = self.env.user
+ self.project_pigs.invalidate_cache()
+ self.project_pigs.with_user(self.env.user).name
+
+ @users('Internal user', 'Portal user')
+ def test_task_no_read(self):
+ self.task.invalidate_cache()
+ with self.assertRaises(AccessError, msg="%s should not be able to read the task" % self.env.user.name):
+ self.task.with_user(self.env.user).name
+
+ @users('Portal user')
+ def test_task_allowed_portal_no_read(self):
+ self.project_pigs.allowed_user_ids = self.env.user
+ self.task.invalidate_cache()
+ with self.assertRaises(AccessError, msg="%s should not be able to read the task" % self.env.user.name):
+ self.task.with_user(self.env.user).name
+
+ @users('Internal user')
+ def test_task_allowed_internal_read(self):
+ self.project_pigs.allowed_user_ids = self.env.user
+ self.task.invalidate_cache()
+ self.task.with_user(self.env.user).name
+
+ @users('Internal user', 'Portal user')
+ def test_task_no_write(self):
+ with self.assertRaises(AccessError, msg="%s should not be able to write on the task" % self.env.user.name):
+ self.task.with_user(self.env.user).name = "Paint the world in black & white"
+
+ self.project_pigs.allowed_user_ids = self.env.user
+ with self.assertRaises(AccessError, msg="%s should not be able to write on the task" % self.env.user.name):
+ self.task.with_user(self.env.user).name = "Paint the world in black & white"
+
+ @users('Internal user', 'Portal user')
+ def test_task_no_create(self):
+ with self.assertRaises(AccessError, msg="%s should not be able to create a task" % self.env.user.name):
+ self.create_task("Archive the world, it's not needed anymore")
+
+ self.project_pigs.allowed_user_ids = self.env.user
+ with self.assertRaises(AccessError, msg="%s should not be able to create a task" % self.env.user.name):
+ self.create_task("Archive the world, it's not needed anymore")
+
+ @users('Internal user', 'Portal user')
+ def test_task_no_unlink(self):
+ with self.assertRaises(AccessError, msg="%s should not be able to unlink the task" % self.env.user.name):
+ self.task.with_user(self.env.user).unlink()
+
+ self.project_pigs.allowed_user_ids = self.env.user
+ with self.assertRaises(AccessError, msg="%s should not be able to unlink the task" % self.env.user.name):
+ self.task.with_user(self.env.user).unlink()
+
+
+class TestCRUDVisibilityPortal(TestAccessRights):
+
+ def setUp(self):
+ super().setUp()
+ self.project_pigs.privacy_visibility = 'portal'
+
+ @users('Portal user')
+ def test_task_portal_no_read(self):
+ self.task.invalidate_cache()
+ with self.assertRaises(AccessError, msg="%s should not be able to read the task" % self.env.user.name):
+ self.task.with_user(self.env.user).name
+
+ @users('Portal user')
+ def test_task_allowed_portal_read(self):
+ self.project_pigs.allowed_user_ids = self.env.user
+ self.task.invalidate_cache()
+ self.task.with_user(self.env.user).name
+
+ @users('Internal user')
+ def test_task_internal_read(self):
+ self.task.with_user(self.env.user).name
+
+
+class TestCRUDVisibilityEmployees(TestAccessRights):
+
+ def setUp(self):
+ super().setUp()
+ self.project_pigs.privacy_visibility = 'employees'
+
+ @users('Portal user')
+ def test_task_portal_no_read(self):
+ self.task.invalidate_cache()
+ with self.assertRaises(AccessError, msg="%s should not be able to read the task" % self.env.user.name):
+ self.task.with_user(self.env.user).name
+
+ self.project_pigs.allowed_user_ids = self.env.user
+ self.task.invalidate_cache()
+ with self.assertRaises(AccessError, msg="%s should not be able to read the task" % self.env.user.name):
+ self.task.with_user(self.env.user).name
+
+ @users('Internal user')
+ def test_task_allowed_portal_read(self):
+ self.task.invalidate_cache()
+ self.task.with_user(self.env.user).name
+
+
+class TestAllowedUsers(TestAccessRights):
+
+ def setUp(self):
+ super().setUp()
+ self.project_pigs.privacy_visibility = 'followers'
+
+ def test_project_permission_added(self):
+ self.project_pigs.allowed_user_ids = self.user
+ self.assertIn(self.user, self.task.allowed_user_ids)
+
+ def test_project_default_permission(self):
+ self.project_pigs.allowed_user_ids = self.user
+ task = self.create_task("Review the end of the world")
+ self.assertIn(self.user, task.allowed_user_ids)
+
+ def test_project_default_customer_permission(self):
+ self.project_pigs.privacy_visibility = 'portal'
+ self.project_pigs.partner_id = self.portal.partner_id
+ self.assertIn(self.portal, self.task.allowed_user_ids)
+ self.assertIn(self.portal, self.project_pigs.allowed_user_ids)
+
+ def test_project_permission_removed(self):
+ self.project_pigs.allowed_user_ids = self.user
+ self.project_pigs.allowed_user_ids -= self.user
+ self.assertNotIn(self.user, self.task.allowed_user_ids)
+
+ def test_project_specific_permission(self):
+ self.project_pigs.allowed_user_ids = self.user
+ john = mail_new_test_user(self.env, login='John')
+ self.task.allowed_user_ids |= john
+ self.project_pigs.allowed_user_ids -= self.user
+ self.assertIn(john, self.task.allowed_user_ids, "John should still be allowed to read the task")
+
+ def test_project_specific_remove_mutliple_tasks(self):
+ self.project_pigs.allowed_user_ids = self.user
+ john = mail_new_test_user(self.env, login='John')
+ task = self.create_task('task')
+ self.task.allowed_user_ids |= john
+ self.project_pigs.allowed_user_ids -= self.user
+ self.assertIn(john, self.task.allowed_user_ids)
+ self.assertNotIn(john, task.allowed_user_ids)
+ self.assertNotIn(self.user, task.allowed_user_ids)
+ self.assertNotIn(self.user, self.task.allowed_user_ids)
+
+ def test_no_portal_allowed(self):
+ with self.assertRaises(ValidationError, msg="It should not allow to add portal users"):
+ self.task.allowed_user_ids = self.portal
+
+ def test_visibility_changed(self):
+ self.project_pigs.privacy_visibility = 'portal'
+ self.task.allowed_user_ids |= self.portal
+ self.assertNotIn(self.user, self.task.allowed_user_ids, "Internal user should have been removed from allowed users")
+ self.project_pigs.privacy_visibility = 'employees'
+ self.assertNotIn(self.portal, self.task.allowed_user_ids, "Portal user should have been removed from allowed users")
+
+ def test_write_task(self):
+ self.user.groups_id |= self.env.ref('project.group_project_user')
+ self.assertNotIn(self.user, self.project_pigs.allowed_user_ids)
+ self.task.allowed_user_ids = self.user
+ self.project_pigs.invalidate_cache()
+ self.task.invalidate_cache()
+ self.task.with_user(self.user).name = "I can edit a task!"
+
+ def test_no_write_project(self):
+ self.user.groups_id |= self.env.ref('project.group_project_user')
+ self.assertNotIn(self.user, self.project_pigs.allowed_user_ids)
+ with self.assertRaises(AccessError, msg="User should not be able to edit project"):
+ self.project_pigs.with_user(self.user).name = "I can't edit a task!"