[IMP] hr_*: Improve tests execution speed by using setUpClass

closes odoo/odoo#79063

Taskid: 2669222
Related: odoo/enterprise#21920
Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
This commit is contained in:
William Braeckman
2021-10-27 13:16:42 +00:00
committed by Yannick Tivisse
parent 30c53a4370
commit ecddd5f729
21 changed files with 332 additions and 266 deletions
+4 -3
View File
@@ -7,7 +7,8 @@ from odoo.tests import common
class TestHrCommon(common.TransactionCase):
def setUp(self):
super(TestHrCommon, self).setUp()
@classmethod
def setUpClass(cls):
super(TestHrCommon, cls).setUpClass()
self.res_users_hr_officer = mail_new_test_user(self.env, login='hro', groups='base.group_user,hr.group_hr_user', name='HR Officer', email='hro@example.com')
cls.res_users_hr_officer = mail_new_test_user(cls.env, login='hro', groups='base.group_user,hr.group_hr_user', name='HR Officer', email='hro@example.com')
+7 -6
View File
@@ -6,15 +6,16 @@ from odoo.addons.hr.tests.common import TestHrCommon
class TestChannel(TestHrCommon):
def setUp(self):
super(TestChannel, self).setUp()
@classmethod
def setUpClass(cls):
super(TestChannel, cls).setUpClass()
self.channel = self.env['mail.channel'].create({'name': 'Test'})
cls.channel = cls.env['mail.channel'].create({'name': 'Test'})
emp0 = self.env['hr.employee'].create({
'user_id': self.res_users_hr_officer.id,
emp0 = cls.env['hr.employee'].create({
'user_id': cls.res_users_hr_officer.id,
})
self.department = self.env['hr.department'].create({
cls.department = cls.env['hr.department'].create({
'name': 'Test Department',
'member_ids': [(4, emp0.id)],
})
+9 -8
View File
@@ -6,21 +6,22 @@ from odoo.addons.hr.tests.common import TestHrCommon
class TestHrFlow(TestHrCommon):
def setUp(self):
super(TestHrFlow, self).setUp()
self.dep_rd = self.env['hr.department'].create({
@classmethod
def setUpClass(cls):
super(TestHrFlow, cls).setUpClass()
cls.dep_rd = cls.env['hr.department'].create({
'name': 'Research & Development',
})
self.job_developer = self.env['hr.job'].create({
cls.job_developer = cls.env['hr.job'].create({
'name': 'Experienced Developer',
'department_id': self.dep_rd.id,
'department_id': cls.dep_rd.id,
'no_of_recruitment': 5,
})
self.employee_niv = self.env['hr.employee'].create({
cls.employee_niv = cls.env['hr.employee'].create({
'name': 'Sharlene Rhodes',
})
self.job_developer = self.job_developer.with_user(self.res_users_hr_officer.id)
self.employee_niv = self.employee_niv.with_user(self.res_users_hr_officer.id)
cls.job_developer = cls.job_developer.with_user(cls.res_users_hr_officer.id)
cls.employee_niv = cls.employee_niv.with_user(cls.res_users_hr_officer.id)
def test_open2recruit2close_job(self):
+14 -13
View File
@@ -8,23 +8,24 @@ from odoo.addons.base.models.qweb import QWebException
class TestMultiCompany(TestHrCommon):
def setUp(self):
super().setUp()
self.company_1 = self.env['res.company'].create({'name': 'Opoo'})
self.company_2 = self.env['res.company'].create({'name': 'Otoo'})
self.employees = self.env['hr.employee'].create([
{'name': 'Bidule', 'company_id': self.company_1.id},
{'name': 'Machin', 'company_id': self.company_2.id},
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.company_1 = cls.env['res.company'].create({'name': 'Opoo'})
cls.company_2 = cls.env['res.company'].create({'name': 'Otoo'})
cls.employees = cls.env['hr.employee'].create([
{'name': 'Bidule', 'company_id': cls.company_1.id},
{'name': 'Machin', 'company_id': cls.company_2.id},
])
self.res_users_hr_officer.company_ids = [
(4, self.company_1.id),
(4, self.company_2.id),
cls.res_users_hr_officer.company_ids = [
(4, cls.company_1.id),
(4, cls.company_2.id),
]
self.res_users_hr_officer.company_id = self.company_1.id
cls.res_users_hr_officer.company_id = cls.company_1.id
# flush and invalidate the cache, otherwise a full cache may prevent
# access rights to be checked
self.employees.flush()
self.employees.invalidate_cache()
cls.employees.flush()
cls.employees.invalidate_cache()
def test_multi_company_report(self):
content, content_type = self.env.ref('hr.hr_employee_print_badge').with_user(self.res_users_hr_officer).with_context(
+16 -15
View File
@@ -78,28 +78,29 @@ class TestSelfAccessProfile(TestHrCommon):
class TestSelfAccessRights(TestHrCommon):
def setUp(self):
super(TestSelfAccessRights, self).setUp()
self.richard = new_test_user(self.env, login='ric', groups='base.group_user', name='Simple employee', email='ric@example.com')
self.richard_emp = self.env['hr.employee'].create({
@classmethod
def setUpClass(cls):
super(TestSelfAccessRights, cls).setUpClass()
cls.richard = new_test_user(cls.env, login='ric', groups='base.group_user', name='Simple employee', email='ric@example.com')
cls.richard_emp = cls.env['hr.employee'].create({
'name': 'Richard',
'user_id': self.richard.id,
'address_home_id': self.env['res.partner'].create({'name': 'Richard', 'phone': '21454', 'type': 'private'}).id,
'user_id': cls.richard.id,
'address_home_id': cls.env['res.partner'].create({'name': 'Richard', 'phone': '21454', 'type': 'private'}).id,
})
self.hubert = new_test_user(self.env, login='hub', groups='base.group_user', name='Simple employee', email='hub@example.com')
self.hubert_emp = self.env['hr.employee'].create({
cls.hubert = new_test_user(cls.env, login='hub', groups='base.group_user', name='Simple employee', email='hub@example.com')
cls.hubert_emp = cls.env['hr.employee'].create({
'name': 'Hubert',
'user_id': self.hubert.id,
'address_home_id': self.env['res.partner'].create({'name': 'Hubert', 'type': 'private'}).id,
'user_id': cls.hubert.id,
'address_home_id': cls.env['res.partner'].create({'name': 'Hubert', 'type': 'private'}).id,
})
self.protected_fields_emp = OrderedDict([(k, v) for k, v in self.env['hr.employee']._fields.items() if v.groups == 'hr.group_hr_user'])
cls.protected_fields_emp = OrderedDict([(k, v) for k, v in cls.env['hr.employee']._fields.items() if v.groups == 'hr.group_hr_user'])
# Compute fields and id field are always readable by everyone
self.read_protected_fields_emp = OrderedDict([(k, v) for k, v in self.env['hr.employee']._fields.items() if not v.compute and k != 'id'])
self.self_protected_fields_user = OrderedDict([
cls.read_protected_fields_emp = OrderedDict([(k, v) for k, v in cls.env['hr.employee']._fields.items() if not v.compute and k != 'id'])
cls.self_protected_fields_user = OrderedDict([
(k, v)
for k, v in self.env['res.users']._fields.items()
if v.groups == 'hr.group_hr_user' and k in self.env['res.users'].SELF_READABLE_FIELDS
for k, v in cls.env['res.users']._fields.items()
if v.groups == 'hr.group_hr_user' and k in cls.env['res.users'].SELF_READABLE_FIELDS
])
# Read hr.employee #
@@ -2,19 +2,21 @@
import time
from odoo.tests.common import TransactionCase
from odoo.tests.common import tagged, TransactionCase
@tagged('jesaispas')
class TestHrAttendance(TransactionCase):
"""Tests for attendance date ranges validity"""
def setUp(self):
super(TestHrAttendance, self).setUp()
self.attendance = self.env['hr.attendance']
self.test_employee = self.env['hr.employee'].create({'name': "Jacky"})
# demo data contains set up for self.test_employee
self.open_attendance = self.attendance.create({
'employee_id': self.test_employee.id,
@classmethod
def setUpClass(cls):
super(TestHrAttendance, cls).setUpClass()
cls.attendance = cls.env['hr.attendance']
cls.test_employee = cls.env['hr.employee'].create({'name': "Jacky"})
# demo data contains set up for cls.test_employee
cls.open_attendance = cls.attendance.create({
'employee_id': cls.test_employee.id,
'check_in': time.strftime('%Y-%m-10 10:00'),
})
@@ -6,26 +6,33 @@ from unittest.mock import patch
from odoo import fields
from odoo.tests import new_test_user
from odoo.tests.common import TransactionCase
from odoo.tests.common import tagged, TransactionCase
@tagged('attendance_process')
class TestHrAttendance(TransactionCase):
"""Test for presence validity"""
def setUp(self):
super(TestHrAttendance, self).setUp()
self.user = new_test_user(self.env, login='fru', groups='base.group_user,hr_attendance.group_hr_attendance_use_pin')
self.user_no_pin = new_test_user(self.env, login='gru', groups='base.group_user')
self.test_employee = self.env['hr.employee'].create({
@classmethod
def setUpClass(cls):
super(TestHrAttendance, cls).setUpClass()
cls.user = new_test_user(cls.env, login='fru', groups='base.group_user,hr_attendance.group_hr_attendance_use_pin')
cls.user_no_pin = new_test_user(cls.env, login='gru', groups='base.group_user')
cls.test_employee = cls.env['hr.employee'].create({
'name': "François Russie",
'user_id': self.user.id,
'user_id': cls.user.id,
'pin': '1234',
})
self.employee_kiosk = self.env['hr.employee'].create({
cls.employee_kiosk = cls.env['hr.employee'].create({
'name': "Machiavel",
'pin': '5678',
})
def setUp(self):
super().setUp()
# Cache error if not done during setup
(self.test_employee | self.employee_kiosk).last_attendance_id.unlink()
def test_employee_state(self):
# Make sure the attendance of the employee will display correctly
assert self.test_employee.attendance_state == 'checked_out'
+27 -26
View File
@@ -7,50 +7,51 @@ from odoo.tests import common
class TestHrHolidaysCommon(common.TransactionCase):
def setUp(self):
super(TestHrHolidaysCommon, self).setUp()
self.env.user.tz = 'Europe/Brussels'
@classmethod
def setUpClass(cls):
super(TestHrHolidaysCommon, cls).setUpClass()
cls.env.user.tz = 'Europe/Brussels'
# Test users to use through the various tests
self.user_hruser = mail_new_test_user(self.env, login='armande', groups='base.group_user,hr_holidays.group_hr_holidays_user')
self.user_hruser_id = self.user_hruser.id
cls.user_hruser = mail_new_test_user(cls.env, login='armande', groups='base.group_user,hr_holidays.group_hr_holidays_user')
cls.user_hruser_id = cls.user_hruser.id
self.user_hrmanager = mail_new_test_user(self.env, login='bastien', groups='base.group_user,hr_holidays.group_hr_holidays_manager')
self.user_hrmanager_id = self.user_hrmanager.id
cls.user_hrmanager = mail_new_test_user(cls.env, login='bastien', groups='base.group_user,hr_holidays.group_hr_holidays_manager')
cls.user_hrmanager_id = cls.user_hrmanager.id
self.user_employee = mail_new_test_user(self.env, login='david', groups='base.group_user')
self.user_employee_id = self.user_employee.id
cls.user_employee = mail_new_test_user(cls.env, login='david', groups='base.group_user')
cls.user_employee_id = cls.user_employee.id
# Hr Data
Department = self.env['hr.department'].with_context(tracking_disable=True)
Department = cls.env['hr.department'].with_context(tracking_disable=True)
self.hr_dept = Department.create({
cls.hr_dept = Department.create({
'name': 'Human Resources',
})
self.rd_dept = Department.create({
cls.rd_dept = Department.create({
'name': 'Research and devlopment',
})
self.employee_emp = self.env['hr.employee'].create({
cls.employee_emp = cls.env['hr.employee'].create({
'name': 'David Employee',
'user_id': self.user_employee_id,
'department_id': self.rd_dept.id,
'user_id': cls.user_employee_id,
'department_id': cls.rd_dept.id,
})
self.employee_emp_id = self.employee_emp.id
cls.employee_emp_id = cls.employee_emp.id
self.employee_hruser = self.env['hr.employee'].create({
cls.employee_hruser = cls.env['hr.employee'].create({
'name': 'Armande HrUser',
'user_id': self.user_hruser_id,
'department_id': self.rd_dept.id,
'user_id': cls.user_hruser_id,
'department_id': cls.rd_dept.id,
})
self.employee_hruser_id = self.employee_hruser.id
cls.employee_hruser_id = cls.employee_hruser.id
self.employee_hrmanager = self.env['hr.employee'].create({
cls.employee_hrmanager = cls.env['hr.employee'].create({
'name': 'Bastien HrManager',
'user_id': self.user_hrmanager_id,
'department_id': self.hr_dept.id,
'parent_id': self.employee_hruser_id,
'user_id': cls.user_hrmanager_id,
'department_id': cls.hr_dept.id,
'parent_id': cls.employee_hruser_id,
})
self.employee_hrmanager_id = self.employee_hrmanager.id
cls.employee_hrmanager_id = cls.employee_hrmanager.id
self.rd_dept.write({'manager_id': self.employee_hruser_id})
cls.rd_dept.write({'manager_id': cls.employee_hruser_id})
+36 -34
View File
@@ -12,61 +12,62 @@ from odoo.tools import mute_logger
@tests.tagged('access_rights', 'post_install', '-at_install')
class TestHrHolidaysAccessRightsCommon(TestHrHolidaysCommon):
def setUp(self):
super(TestHrHolidaysAccessRightsCommon, self).setUp()
self.leave_type = self.env['hr.leave.type'].create({
@classmethod
def setUpClass(cls):
super(TestHrHolidaysAccessRightsCommon, cls).setUpClass()
cls.leave_type = cls.env['hr.leave.type'].create({
'name': 'Unlimited',
'leave_validation_type': 'hr',
'requires_allocation': 'no',
})
self.rd_dept.manager_id = False
self.hr_dept.manager_id = False
self.employee_emp.parent_id = False
self.employee_leave = self.env['hr.leave'].with_user(self.user_employee_id).create({
cls.rd_dept.manager_id = False
cls.hr_dept.manager_id = False
cls.employee_emp.parent_id = False
cls.employee_leave = cls.env['hr.leave'].with_user(cls.user_employee_id).create({
'name': 'Test',
'holiday_status_id': self.leave_type.id,
'department_id': self.employee_emp.department_id.id,
'employee_id': self.employee_emp.id,
'holiday_status_id': cls.leave_type.id,
'department_id': cls.employee_emp.department_id.id,
'employee_id': cls.employee_emp.id,
'date_from': datetime.now(),
'date_to': datetime.now() + relativedelta(days=1),
'number_of_days': 1,
})
self.lt_no_validation = self.env['hr.leave.type'].create({
cls.lt_no_validation = cls.env['hr.leave.type'].create({
'name': 'Validation = no_validation',
'leave_validation_type': 'hr',
'requires_allocation': 'no',
})
self.lt_validation_hr = self.env['hr.leave.type'].create({
cls.lt_validation_hr = cls.env['hr.leave.type'].create({
'name': 'Validation = HR',
'leave_validation_type': 'hr',
'requires_allocation': 'no',
})
self.lt_validation_manager = self.env['hr.leave.type'].create({
cls.lt_validation_manager = cls.env['hr.leave.type'].create({
'name': 'Validation = manager',
'leave_validation_type': 'hr',
'requires_allocation': 'no',
})
self.lt_validation_both = self.env['hr.leave.type'].create({
cls.lt_validation_both = cls.env['hr.leave.type'].create({
'name': 'Validation = both',
'leave_validation_type': 'hr',
'requires_allocation': 'no',
})
self.draft_status = [
self.lt_validation_hr,
self.lt_validation_manager,
self.lt_validation_both
cls.draft_status = [
cls.lt_validation_hr,
cls.lt_validation_manager,
cls.lt_validation_both
]
self.confirm_status = [
self.lt_no_validation,
self.lt_validation_hr,
self.lt_validation_manager,
self.lt_validation_both
cls.confirm_status = [
cls.lt_no_validation,
cls.lt_validation_hr,
cls.lt_validation_manager,
cls.lt_validation_both
]
def request_leave(self, user_id, date_from, number_of_days, values=None):
@@ -765,25 +766,26 @@ class TestAccessRightsUnlink(TestHrHolidaysAccessRightsCommon):
class TestMultiCompany(TestHrHolidaysCommon):
def setUp(self):
super(TestMultiCompany, self).setUp()
self.new_company = self.env['res.company'].create({
@classmethod
def setUpClass(cls):
super(TestMultiCompany, cls).setUpClass()
cls.new_company = cls.env['res.company'].create({
'name': 'Crocodile Dundee Company',
})
self.leave_type = self.env['hr.leave.type'].create({
cls.leave_type = cls.env['hr.leave.type'].create({
'name': 'Unlimited - Company New',
'company_id': self.new_company.id,
'company_id': cls.new_company.id,
'leave_validation_type': 'hr',
'requires_allocation': 'no',
})
self.rd_dept.manager_id = False
self.hr_dept.manager_id = False
cls.rd_dept.manager_id = False
cls.hr_dept.manager_id = False
self.employee_leave = self.env['hr.leave'].create({
cls.employee_leave = cls.env['hr.leave'].create({
'name': 'Test',
'holiday_status_id': self.leave_type.id,
'department_id': self.employee_emp.department_id.id,
'employee_id': self.employee_emp.id,
'holiday_status_id': cls.leave_type.id,
'department_id': cls.employee_emp.department_id.id,
'employee_id': cls.employee_emp.id,
'date_from': datetime.now(),
'date_to': datetime.now() + relativedelta(days=1),
'number_of_days': 1,
@@ -12,9 +12,10 @@ from odoo.addons.hr_holidays.tests.common import TestHrHolidaysCommon
@tagged('post_install', '-at_install')
class TestAccrualAllocations(TestHrHolidaysCommon):
def setUp(self):
super(TestAccrualAllocations, self).setUp()
self.leave_type = self.env['hr.leave.type'].create({
@classmethod
def setUpClass(cls):
super(TestAccrualAllocations, cls).setUpClass()
cls.leave_type = cls.env['hr.leave.type'].create({
'name': 'Paid Time Off',
'time_type': 'leave',
'requires_allocation': 'yes',
@@ -10,28 +10,29 @@ import time
@tests.tagged('access_rights', 'post_install', '-at_install')
class TestAllocationRights(TestHrHolidaysCommon):
def setUp(self):
super().setUp()
self.rd_dept.manager_id = False
self.hr_dept.manager_id = False
self.employee_emp.parent_id = False
self.employee_emp.leave_manager_id = False
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.rd_dept.manager_id = False
cls.hr_dept.manager_id = False
cls.employee_emp.parent_id = False
cls.employee_emp.leave_manager_id = False
self.lt_no_validation = self.env['hr.leave.type'].create({
cls.lt_no_validation = cls.env['hr.leave.type'].create({
'name': 'Validation = HR',
'allocation_validation_type': 'officer',
'requires_allocation': 'no',
'employee_requests': 'yes',
})
self.lt_validation_manager = self.env['hr.leave.type'].create({
cls.lt_validation_manager = cls.env['hr.leave.type'].create({
'name': 'Validation = manager',
'allocation_validation_type': 'officer',
'requires_allocation': 'yes',
'employee_requests': 'yes',
})
self.lt_allocation_manager = self.env['hr.leave.type'].create({
cls.lt_allocation_manager = cls.env['hr.leave.type'].create({
'name': 'Validation = manager',
'allocation_validation_type': 'set',
'requires_allocation': 'yes',
@@ -85,11 +86,12 @@ class TestAccessRightsSimpleUser(TestAllocationRights):
class TestAccessRightsEmployeeManager(TestAllocationRights):
def setUp(self):
super().setUp()
self.managed_employee = self.env['hr.employee'].create({
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.managed_employee = cls.env['hr.employee'].create({
'name': 'Jolly Jumper',
'leave_manager_id': self.user_employee.id,
'leave_manager_id': cls.user_employee.id,
})
def test_manager_request_allocation_other(self):
@@ -8,10 +8,11 @@ from odoo.exceptions import ValidationError
class TestAutomaticLeaveDates(TestHrHolidaysCommon):
def setUp(self):
super(TestAutomaticLeaveDates, self).setUp()
@classmethod
def setUpClass(cls):
super(TestAutomaticLeaveDates, cls).setUpClass()
self.leave_type = self.env['hr.leave.type'].create({
cls.leave_type = cls.env['hr.leave.type'].create({
'name': 'Automatic Test',
'time_type': 'leave',
'requires_allocation': 'no',
+13 -11
View File
@@ -27,43 +27,45 @@ class TestLeaveRequests(TestHrHolidaysCommon):
self.assertEqual(holiday_status.virtual_remaining_leaves, vrl,
'hr_holidays: wrong type days computation')
def setUp(self):
super(TestLeaveRequests, self).setUp()
@classmethod
def setUpClass(cls):
super(TestLeaveRequests, cls).setUpClass()
# Make sure we have the rights to create, validate and delete the leaves, leave types and allocations
LeaveType = self.env['hr.leave.type'].with_user(self.user_hrmanager_id).with_context(tracking_disable=True)
LeaveType = cls.env['hr.leave.type'].with_user(cls.user_hrmanager_id).with_context(tracking_disable=True)
self.holidays_type_1 = LeaveType.create({
cls.holidays_type_1 = LeaveType.create({
'name': 'NotLimitedHR',
'requires_allocation': 'no',
'leave_validation_type': 'hr',
})
self.holidays_type_2 = LeaveType.create({
cls.holidays_type_2 = LeaveType.create({
'name': 'Limited',
'requires_allocation': 'yes',
'employee_requests': 'yes',
'leave_validation_type': 'hr',
})
self.holidays_type_3 = LeaveType.create({
cls.holidays_type_3 = LeaveType.create({
'name': 'TimeNotLimited',
'requires_allocation': 'no',
'leave_validation_type': 'manager',
})
self.set_employee_create_date(self.employee_emp_id, '2010-02-03 00:00:00')
self.set_employee_create_date(self.employee_hruser_id, '2010-02-03 00:00:00')
cls.set_employee_create_date(cls.employee_emp_id, '2010-02-03 00:00:00')
cls.set_employee_create_date(cls.employee_hruser_id, '2010-02-03 00:00:00')
def set_employee_create_date(self, id, newdate):
@classmethod
def set_employee_create_date(cls, _id, newdate):
""" This method is a hack in order to be able to define/redefine the create_date
of the employees.
This is done in SQL because ORM does not allow to write onto the create_date field.
"""
self.env.cr.execute("""
cls.env.cr.execute("""
UPDATE
hr_employee
SET create_date = '%s'
WHERE id = %s
""" % (newdate, id))
""" % (newdate, _id))
@mute_logger('odoo.models.unlink', 'odoo.addons.mail.models.mail_mail')
def test_overlapping_requests(self):
+15 -13
View File
@@ -13,9 +13,10 @@ from odoo.addons.hr_holidays.tests.common import TestHrHolidaysCommon
@tagged('out_of_office')
class TestOutOfOffice(TestHrHolidaysCommon):
def setUp(self):
super().setUp()
self.leave_type = self.env['hr.leave.type'].create({
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.leave_type = cls.env['hr.leave.type'].create({
'name': 'Legal Leaves',
'time_type': 'leave',
'requires_allocation': 'no',
@@ -60,26 +61,27 @@ class TestOutOfOffice(TestHrHolidaysCommon):
@tagged('out_of_office')
class TestOutOfOfficePerformance(TestHrHolidaysCommon, TransactionCaseWithUserDemo):
def setUp(self):
super(TestOutOfOfficePerformance, self).setUp()
self.leave_type = self.env['hr.leave.type'].create({
@classmethod
def setUpClass(cls):
super(TestOutOfOfficePerformance, cls).setUpClass()
cls.leave_type = cls.env['hr.leave.type'].create({
'name': 'Legal Leaves',
'time_type': 'leave',
'requires_allocation': 'no',
})
self.leave_date_end = (datetime.today() + relativedelta(days=3))
self.leave = self.env['hr.leave'].create({
cls.leave_date_end = (datetime.today() + relativedelta(days=3))
cls.leave = cls.env['hr.leave'].create({
'name': 'Christmas',
'employee_id': self.employee_hruser_id,
'holiday_status_id': self.leave_type.id,
'employee_id': cls.employee_hruser_id,
'holiday_status_id': cls.leave_type.id,
'date_from': (datetime.today() - relativedelta(days=1)),
'date_to': (datetime.today() + relativedelta(days=3)),
'number_of_days': 4,
})
self.hr_user = self.employee_hruser.user_id
self.hr_partner = self.employee_hruser.user_id.partner_id
self.employer_partner = self.user_employee.partner_id
cls.hr_user = cls.employee_hruser.user_id
cls.hr_partner = cls.employee_hruser.user_id.partner_id
cls.employer_partner = cls.user_employee.partner_id
@users('__system__', 'demo')
@warmup
+21 -20
View File
@@ -12,43 +12,44 @@ from odoo.tools.misc import DEFAULT_SERVER_DATE_FORMAT
@tagged('post_install', '-at_install')
class TestPartner(TransactionCase):
def setUp(self):
super().setUp()
@classmethod
def setUpClass(cls):
super().setUpClass()
# use a single value for today throughout the tests to avoid weird scenarios around midnight
self.today = date.today()
baseUser = self.env['res.users'].create({
cls.today = date.today()
baseUser = cls.env['res.users'].create({
'email': 'e.e@example.com',
'groups_id': [Command.link(self.env.ref('base.group_user').id)],
'groups_id': [Command.link(cls.env.ref('base.group_user').id)],
'login': 'emp',
'name': 'Ernest Employee',
'notification_type': 'inbox',
'signature': '--\nErnest',
})
self.partner = baseUser.partner_id
self.users = baseUser + self.env['res.users'].create({
cls.partner = baseUser.partner_id
cls.users = baseUser + cls.env['res.users'].create({
'name': 'test1',
'login': 'test1',
'email': 'test1@example.com',
'partner_id': self.partner.id,
'partner_id': cls.partner.id,
})
self.employees = self.env['hr.employee'].create([{
cls.employees = cls.env['hr.employee'].create([{
'user_id': user.id,
} for user in self.users])
self.leave_type = self.env['hr.leave.type'].create({
} for user in cls.users])
cls.leave_type = cls.env['hr.leave.type'].create({
'requires_allocation': 'no',
'name': 'Legal Leaves',
'time_type': 'leave',
})
self.leaves = self.env['hr.leave'].create([{
'date_from': self.today + relativedelta(days=-2),
'date_to': self.today + relativedelta(days=2),
'employee_id': self.employees[0].id,
'holiday_status_id': self.leave_type.id,
cls.leaves = cls.env['hr.leave'].create([{
'date_from': cls.today + relativedelta(days=-2),
'date_to': cls.today + relativedelta(days=2),
'employee_id': cls.employees[0].id,
'holiday_status_id': cls.leave_type.id,
}, {
'date_from': self.today + relativedelta(days=-2),
'date_to': self.today + relativedelta(days=3),
'employee_id': self.employees[1].id,
'holiday_status_id': self.leave_type.id,
'date_from': cls.today + relativedelta(days=-2),
'date_to': cls.today + relativedelta(days=3),
'employee_id': cls.employees[1].id,
'holiday_status_id': cls.leave_type.id,
}])
def test_res_partner_mail_partner_format(self):
+27 -26
View File
@@ -7,80 +7,81 @@ from odoo.exceptions import AccessError, UserError
class TestCommonTimesheet(TransactionCase):
def setUp(self):
super(TestCommonTimesheet, self).setUp()
@classmethod
def setUpClass(cls):
super(TestCommonTimesheet, cls).setUpClass()
# Crappy hack to disable the rule from timesheet grid, if it exists
# The registry doesn't contain the field timesheet_manager_id.
# but there is an ir.rule about it, crashing during its evaluation
rule = self.env.ref('timesheet_grid.hr_timesheet_rule_approver_update', raise_if_not_found=False)
rule = cls.env.ref('timesheet_grid.hr_timesheet_rule_approver_update', raise_if_not_found=False)
if rule:
rule.active = False
# customer partner
self.partner = self.env['res.partner'].create({
cls.partner = cls.env['res.partner'].create({
'name': 'Customer Task',
'email': 'customer@task.com',
'phone': '42',
})
self.analytic_account = self.env['account.analytic.account'].create({
cls.analytic_account = cls.env['account.analytic.account'].create({
'name': 'Analytic Account for Test Customer',
'partner_id': self.partner.id,
'partner_id': cls.partner.id,
'code': 'TEST'
})
# project and tasks
self.project_customer = self.env['project.project'].create({
cls.project_customer = cls.env['project.project'].create({
'name': 'Project X',
'allow_timesheets': True,
'partner_id': self.partner.id,
'analytic_account_id': self.analytic_account.id,
'partner_id': cls.partner.id,
'analytic_account_id': cls.analytic_account.id,
})
self.task1 = self.env['project.task'].create({
cls.task1 = cls.env['project.task'].create({
'name': 'Task One',
'priority': '0',
'kanban_state': 'normal',
'project_id': self.project_customer.id,
'partner_id': self.partner.id,
'project_id': cls.project_customer.id,
'partner_id': cls.partner.id,
})
self.task2 = self.env['project.task'].create({
cls.task2 = cls.env['project.task'].create({
'name': 'Task Two',
'priority': '1',
'kanban_state': 'done',
'project_id': self.project_customer.id,
'project_id': cls.project_customer.id,
})
# users
self.user_employee = self.env['res.users'].create({
cls.user_employee = cls.env['res.users'].create({
'name': 'User Employee',
'login': 'user_employee',
'email': 'useremployee@test.com',
'groups_id': [(6, 0, [self.ref('hr_timesheet.group_hr_timesheet_user')])],
'groups_id': [(6, 0, [cls.env.ref('hr_timesheet.group_hr_timesheet_user').id])],
})
self.user_employee2 = self.env['res.users'].create({
cls.user_employee2 = cls.env['res.users'].create({
'name': 'User Employee 2',
'login': 'user_employee2',
'email': 'useremployee2@test.com',
'groups_id': [(6, 0, [self.ref('hr_timesheet.group_hr_timesheet_user')])],
'groups_id': [(6, 0, [cls.env.ref('hr_timesheet.group_hr_timesheet_user').id])],
})
self.user_manager = self.env['res.users'].create({
cls.user_manager = cls.env['res.users'].create({
'name': 'User Officer',
'login': 'user_manager',
'email': 'usermanager@test.com',
'groups_id': [(6, 0, [self.ref('hr_timesheet.group_timesheet_manager')])],
'groups_id': [(6, 0, [cls.env.ref('hr_timesheet.group_timesheet_manager').id])],
})
# employees
self.empl_employee = self.env['hr.employee'].create({
cls.empl_employee = cls.env['hr.employee'].create({
'name': 'User Empl Employee',
'user_id': self.user_employee.id,
'user_id': cls.user_employee.id,
})
self.empl_employee2 = self.env['hr.employee'].create({
cls.empl_employee2 = cls.env['hr.employee'].create({
'name': 'User Empl Employee 2',
'user_id': self.user_employee2.id,
'user_id': cls.user_employee2.id,
})
self.empl_manager = self.env['hr.employee'].create({
cls.empl_manager = cls.env['hr.employee'].create({
'name': 'User Empl Officer',
'user_id': self.user_manager.id,
'user_id': cls.user_manager.id,
})
class TestTimesheet(TestCommonTimesheet):
+19 -8
View File
@@ -57,11 +57,22 @@ class TestWorkEntryBase(TransactionCase):
def create_work_entry(self, start, stop, work_entry_type=None):
work_entry_type = work_entry_type or self.work_entry_type
return self.env['hr.work.entry'].create({
'contract_id': self.richard_emp.contract_ids[0].id,
'name': "Work entry %s-%s" % (start, stop),
'date_start': start,
'date_stop': stop,
'employee_id': self.richard_emp.id,
'work_entry_type_id': work_entry_type.id,
})
return self.create_work_entries([(start, stop, work_entry_type)])
def create_work_entries(self, intervals):
default_work_entry_type = self.work_entry_type
create_vals = []
for interval in intervals:
start = interval[0]
stop = interval[1]
work_entry_type = interval[2] if len(interval) == 3\
else default_work_entry_type
create_vals.append({
'contract_id': self.richard_emp.contract_ids[0].id,
'name': 'Work entry %s-%s' % (start, stop),
'date_start': start,
'date_stop': stop,
'employee_id': self.richard_emp.id,
'work_entry_type_id': work_entry_type.id,
})
return self.env['hr.work.entry'].create(create_vals)
@@ -13,23 +13,25 @@ from odoo.addons.hr_work_entry_contract.tests.common import TestWorkEntryBase
@tagged('work_entry')
class TestWorkEntry(TestWorkEntryBase):
def setUp(self):
super(TestWorkEntry, self).setUp()
self.tz = pytz.timezone(self.richard_emp.tz)
self.start = datetime(2015, 11, 1, 1, 0, 0)
self.end = datetime(2015, 11, 30, 23, 59, 59)
self.resource_calendar_id = self.env['resource.calendar'].create({'name': 'My Calendar'})
contract = self.env['hr.contract'].create({
'date_start': self.start.date() - relativedelta(days=5),
@classmethod
def setUpClass(cls):
super(TestWorkEntry, cls).setUpClass()
cls.tz = pytz.timezone(cls.richard_emp.tz)
cls.start = datetime(2015, 11, 1, 1, 0, 0)
cls.end = datetime(2015, 11, 30, 23, 59, 59)
cls.resource_calendar_id = cls.env['resource.calendar'].create({'name': 'My Calendar'})
contract = cls.env['hr.contract'].create({
'date_start': cls.start.date() - relativedelta(days=5),
'name': 'dodo',
'resource_calendar_id': self.resource_calendar_id.id,
'resource_calendar_id': cls.resource_calendar_id.id,
'wage': 1000,
'employee_id': self.richard_emp.id,
'employee_id': cls.richard_emp.id,
'state': 'open',
'date_generated_from': self.end.date() + relativedelta(days=5),
'date_generated_from': cls.end.date() + relativedelta(days=5),
})
self.richard_emp.resource_calendar_id = self.resource_calendar_id
self.richard_emp.contract_id = contract
cls.richard_emp.resource_calendar_id = cls.resource_calendar_id
cls.richard_emp.contract_id = contract
def test_no_duplicate(self):
self.richard_emp.generate_work_entries(self.start, self.end)
@@ -102,13 +104,23 @@ class TestWorkEntry(TestWorkEntryBase):
def test_outside_calendar(self):
""" Test leave work entries outside schedule are conflicting """
# Outside but not a leave
work_entry_1 = self.create_work_entry(datetime(2018, 10, 10, 3, 0), datetime(2018, 10, 10, 4, 0))
# Outside and a leave
work_entry_2 = self.create_work_entry(datetime(2018, 10, 10, 1, 0), datetime(2018, 10, 10, 2, 0), work_entry_type=self.work_entry_type_leave)
# Overlapping and a leave
work_entry_3 = self.create_work_entry(datetime(2018, 10, 10, 7, 0), datetime(2018, 10, 10, 10, 0), work_entry_type=self.work_entry_type_leave)
# Overlapping and not a leave
work_entry_4 = self.create_work_entry(datetime(2018, 10, 10, 11, 0), datetime(2018, 10, 10, 13, 0))
# work_entry_1 = self.create_work_entry(datetime(2018, 10, 10, 3, 0), datetime(2018, 10, 10, 4, 0))
# # Outside and a leave
# work_entry_2 = self.create_work_entry(datetime(2018, 10, 10, 1, 0), datetime(2018, 10, 10, 2, 0), work_entry_type=self.work_entry_type_leave)
# # Overlapping and a leave
# work_entry_3 = self.create_work_entry(datetime(2018, 10, 10, 7, 0), datetime(2018, 10, 10, 10, 0), work_entry_type=self.work_entry_type_leave)
# # Overlapping and not a leave
# work_entry_4 = self.create_work_entry(datetime(2018, 10, 10, 11, 0), datetime(2018, 10, 10, 13, 0))
work_entry_1, work_entry_2, work_entry_3, work_entry_4 = self.create_work_entries([
# Outside but not a leave
(datetime(2018, 10, 10, 3, 0), datetime(2018, 10, 10, 4, 0)),
# Outside and a leave
(datetime(2018, 10, 10, 1, 0), datetime(2018, 10, 10, 2, 0), self.work_entry_type_leave),
# Overlapping and a leave
(datetime(2018, 10, 10, 7, 0), datetime(2018, 10, 10, 10, 0), self.work_entry_type_leave),
# Overlapping and not a leave
(datetime(2018, 10, 10, 11, 0), datetime(2018, 10, 10, 13, 0)),
])
(work_entry_1 | work_entry_2 | work_entry_3 | work_entry_4)._mark_leaves_outside_schedule()
self.assertEqual(work_entry_2.state, 'conflict', "It should conflict")
self.assertNotEqual(work_entry_1.state, 'conflict', "It should not conflict")
@@ -117,8 +129,12 @@ class TestWorkEntry(TestWorkEntryBase):
def test_write_conflict(self):
""" Test updating work entries dates recomputes conflicts """
work_entry_1 = self.create_work_entry(datetime(2018, 10, 10, 9, 0), datetime(2018, 10, 10, 12, 0))
work_entry_2 = self.create_work_entry(datetime(2018, 10, 10, 12, 0), datetime(2018, 10, 10, 18, 0))
# work_entry_1 = self.create_work_entry(datetime(2018, 10, 10, 9, 0), datetime(2018, 10, 10, 12, 0))
# work_entry_2 = self.create_work_entry(datetime(2018, 10, 10, 12, 0), datetime(2018, 10, 10, 18, 0))
work_entry_1, work_entry_2 = self.create_work_entries([
(datetime(2018, 10, 10, 9, 0), datetime(2018, 10, 10, 12, 0)),
(datetime(2018, 10, 10, 12, 0), datetime(2018, 10, 10, 18, 0)),
])
self.assertNotEqual(work_entry_1.state, 'conflict', "It should not conflict")
self.assertNotEqual(work_entry_2.state, 'conflict', "It should not conflict")
work_entry_1.date_stop = datetime(2018, 10, 10, 14, 0)
@@ -131,9 +147,14 @@ class TestWorkEntry(TestWorkEntryBase):
def test_write_move(self):
""" Test completely moving a work entry recomputes conflicts """
work_entry_1 = self.create_work_entry(datetime(2018, 10, 10, 9, 0), datetime(2018, 10, 10, 12, 0))
work_entry_2 = self.create_work_entry(datetime(2018, 10, 18, 9, 0), datetime(2018, 10, 18, 12, 0))
work_entry_3 = self.create_work_entry(datetime(2018, 10, 18, 10, 0), datetime(2018, 10, 18, 12, 0))
# work_entry_1 = self.create_work_entry(datetime(2018, 10, 10, 9, 0), datetime(2018, 10, 10, 12, 0))
# work_entry_2 = self.create_work_entry(datetime(2018, 10, 18, 9, 0), datetime(2018, 10, 18, 12, 0))
# work_entry_3 = self.create_work_entry(datetime(2018, 10, 18, 10, 0), datetime(2018, 10, 18, 12, 0))
work_entry_1, work_entry_2, work_entry_3 = self.create_work_entries([
(datetime(2018, 10, 10, 9, 0), datetime(2018, 10, 10, 12, 0)),
(datetime(2018, 10, 18, 9, 0), datetime(2018, 10, 18, 12, 0)),
(datetime(2018, 10, 18, 10, 0), datetime(2018, 10, 18, 12, 0)),
])
work_entry_2.write({
'date_start': datetime(2018, 10, 10, 9, 0),
'date_stop': datetime(2018, 10, 10, 10, 0),
@@ -152,8 +173,12 @@ class TestWorkEntry(TestWorkEntryBase):
def test_unarchive_conflict(self):
""" Test archive/unarchive a work entry recomputes conflicts """
work_entry_1 = self.create_work_entry(datetime(2018, 10, 10, 9, 0), datetime(2018, 10, 10, 12, 0))
work_entry_2 = self.create_work_entry(datetime(2018, 10, 10, 10, 0), datetime(2018, 10, 10, 18, 0))
# work_entry_1 = self.create_work_entry(datetime(2018, 10, 10, 9, 0), datetime(2018, 10, 10, 12, 0))
# work_entry_2 = self.create_work_entry(datetime(2018, 10, 10, 10, 0), datetime(2018, 10, 10, 18, 0))
work_entry_1, work_entry_2 = self.create_work_entries([
(datetime(2018, 10, 10, 9, 0), datetime(2018, 10, 10, 12, 0)),
(datetime(2018, 10, 10, 10, 0), datetime(2018, 10, 10, 18, 0)),
])
work_entry_2.active = False
self.assertNotEqual(work_entry_1.state, 'conflict', "It should not conflict")
self.assertEqual(work_entry_2.state, 'cancelled', "It should be cancelled")
@@ -8,13 +8,14 @@ from odoo.addons.hr_work_entry_holidays.tests.common import TestWorkEntryHoliday
class TestWorkEntryHolidaysMultiContract(TestWorkEntryHolidaysBase):
def setUp(self):
super().setUp()
self.leave_type = self.env['hr.leave.type'].create({
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.leave_type = cls.env['hr.leave.type'].create({
'name': 'Legal Leaves',
'time_type': 'leave',
'requires_allocation': 'no',
'work_entry_type_id': self.work_entry_type_leave.id
'work_entry_type_id': cls.work_entry_type_leave.id
})
def create_leave(self, start, end):
@@ -8,14 +8,15 @@ from odoo.addons.hr_work_entry_holidays.tests.common import TestWorkEntryHoliday
class TestPayslipHolidaysComputation(TestWorkEntryHolidaysBase):
def setUp(self):
super().setUp()
@classmethod
def setUpClass(cls):
super().setUpClass()
self.leave_type = self.env['hr.leave.type'].create({
cls.leave_type = cls.env['hr.leave.type'].create({
'name': 'Legal Leaves',
'time_type': 'leave',
'requires_allocation': 'no',
'work_entry_type_id': self.work_entry_type_leave.id
'work_entry_type_id': cls.work_entry_type_leave.id
})
def test_work_data(self):
@@ -12,23 +12,24 @@ from odoo.addons.hr_work_entry_holidays.tests.common import TestWorkEntryHoliday
@tagged('work_entry')
class TestWorkeEntryHolidaysWorkEntry(TestWorkEntryHolidaysBase):
def setUp(self):
super(TestWorkeEntryHolidaysWorkEntry, self).setUp()
self.tz = pytz.timezone(self.richard_emp.tz)
self.start = datetime(2015, 11, 1, 1, 0, 0)
self.end = datetime(2015, 11, 30, 23, 59, 59)
self.resource_calendar_id = self.env['resource.calendar'].create({'name': 'Zboub'})
contract = self.env['hr.contract'].create({
'date_start': self.start.date() - relativedelta(days=5),
@classmethod
def setUpClass(cls):
super(TestWorkeEntryHolidaysWorkEntry, cls).setUpClass()
cls.tz = pytz.timezone(cls.richard_emp.tz)
cls.start = datetime(2015, 11, 1, 1, 0, 0)
cls.end = datetime(2015, 11, 30, 23, 59, 59)
cls.resource_calendar_id = cls.env['resource.calendar'].create({'name': 'Zboub'})
contract = cls.env['hr.contract'].create({
'date_start': cls.start.date() - relativedelta(days=5),
'name': 'dodo',
'resource_calendar_id': self.resource_calendar_id.id,
'resource_calendar_id': cls.resource_calendar_id.id,
'wage': 1000,
'employee_id': self.richard_emp.id,
'employee_id': cls.richard_emp.id,
'state': 'open',
'date_generated_from': self.end.date() + relativedelta(days=5),
'date_generated_from': cls.end.date() + relativedelta(days=5),
})
self.richard_emp.resource_calendar_id = self.resource_calendar_id
self.richard_emp.contract_id = contract
cls.richard_emp.resource_calendar_id = cls.resource_calendar_id
cls.richard_emp.contract_id = contract
def test_validate_non_approved_leave_work_entry(self):
work_entry1 = self.env['hr.work.entry'].create({