summaryrefslogtreecommitdiff
path: root/addons/project_timesheet_holidays/tests
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_timesheet_holidays/tests
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/project_timesheet_holidays/tests')
-rw-r--r--addons/project_timesheet_holidays/tests/__init__.py4
-rw-r--r--addons/project_timesheet_holidays/tests/test_timesheet_holidays.py119
2 files changed, 123 insertions, 0 deletions
diff --git a/addons/project_timesheet_holidays/tests/__init__.py b/addons/project_timesheet_holidays/tests/__init__.py
new file mode 100644
index 00000000..a506a284
--- /dev/null
+++ b/addons/project_timesheet_holidays/tests/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import test_timesheet_holidays
diff --git a/addons/project_timesheet_holidays/tests/test_timesheet_holidays.py b/addons/project_timesheet_holidays/tests/test_timesheet_holidays.py
new file mode 100644
index 00000000..e999b84e
--- /dev/null
+++ b/addons/project_timesheet_holidays/tests/test_timesheet_holidays.py
@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from datetime import datetime
+from dateutil.relativedelta import relativedelta
+
+from odoo import fields, SUPERUSER_ID
+
+from odoo.tests import common, new_test_user
+from odoo.addons.hr_timesheet.tests.test_timesheet import TestCommonTimesheet
+
+
+class TestTimesheetHolidaysCreate(common.TransactionCase):
+
+ def test_status_create(self):
+ """Ensure that when a status is created, it fullfills the project and task constrains"""
+ status = self.env['hr.leave.type'].create({
+ 'name': 'A nice Leave Type',
+ 'allocation_type': 'no'
+ })
+
+ company = self.env.company
+ self.assertEqual(status.timesheet_project_id, company.leave_timesheet_project_id, 'The default project linked to the status should be the same as the company')
+ self.assertEqual(status.timesheet_task_id, company.leave_timesheet_task_id, 'The default task linked to the status should be the same as the company')
+
+ def test_company_create(self):
+ main_company = self.env.ref('base.main_company')
+ user = new_test_user(self.env, login='fru',
+ groups='base.group_user,base.group_erp_manager,base.group_partner_manager',
+ company_id=main_company.id,
+ company_ids=[(6, 0, main_company.ids)])
+ Company = self.env['res.company']
+ Company = Company.with_user(user)
+ Company = Company.with_company(main_company)
+ company = Company.create({'name': "Wall Company"})
+ self.assertEqual(company.leave_timesheet_project_id.sudo().company_id, company, "It should have created a project for the company")
+
+class TestTimesheetHolidays(TestCommonTimesheet):
+
+ def setUp(self):
+ super(TestTimesheetHolidays, self).setUp()
+
+ self.employee_working_calendar = self.empl_employee.resource_calendar_id
+ # leave dates : from next monday to next wednesday (to avoid crashing tests on weekend, when
+ # there is no work days in working calendar)
+ # NOTE: second and millisecond can add a working days
+ self.leave_start_datetime = datetime(2018, 2, 5, 7, 0, 0, 0) # this is monday
+ self.leave_end_datetime = self.leave_start_datetime + relativedelta(days=3)
+
+ # all company have those internal project/task (created by default)
+ self.internal_project = self.env.company.leave_timesheet_project_id
+ self.internal_task_leaves = self.env.company.leave_timesheet_task_id
+
+ self.hr_leave_type_with_ts = self.env['hr.leave.type'].create({
+ 'name': 'Leave Type with timesheet generation',
+ 'allocation_type': 'no',
+ 'timesheet_generate': True,
+ 'timesheet_project_id': self.internal_project.id,
+ 'timesheet_task_id': self.internal_task_leaves.id,
+ 'validity_start': False,
+ })
+ self.hr_leave_type_no_ts = self.env['hr.leave.type'].create({
+ 'name': 'Leave Type without timesheet generation',
+ 'allocation_type': 'no',
+ 'timesheet_generate': False,
+ 'timesheet_project_id': False,
+ 'timesheet_task_id': False,
+ 'validity_start': False,
+ })
+
+ # HR Officer allocates some leaves to the employee 1
+ self.Requests = self.env['hr.leave'].with_context(mail_create_nolog=True, mail_notrack=True)
+ self.Allocations = self.env['hr.leave.allocation'].with_context(mail_create_nolog=True, mail_notrack=True)
+ self.hr_leave_allocation_with_ts = self.Allocations.sudo().create({
+ 'name': 'Days for limited category with timesheet',
+ 'employee_id': self.empl_employee.id,
+ 'holiday_status_id': self.hr_leave_type_with_ts.id,
+ 'number_of_days': 10,
+ })
+ self.hr_leave_allocation_with_ts.action_approve()
+ self.hr_leave_allocation_no_ts = self.Allocations.sudo().create({
+ 'name': 'Days for limited category without timesheet',
+ 'employee_id': self.empl_employee.id,
+ 'holiday_status_id': self.hr_leave_type_no_ts.id,
+ 'number_of_days': 10,
+ })
+ self.hr_leave_allocation_no_ts.action_approve()
+
+ def test_validate_with_timesheet(self):
+ # employee creates a leave request
+ number_of_days = (self.leave_end_datetime - self.leave_start_datetime).days
+ holiday = self.Requests.with_user(self.user_employee).create({
+ 'name': 'Leave 1',
+ 'employee_id': self.empl_employee.id,
+ 'holiday_status_id': self.hr_leave_type_with_ts.id,
+ 'date_from': self.leave_start_datetime,
+ 'date_to': self.leave_end_datetime,
+ 'number_of_days': number_of_days,
+ })
+ holiday.with_user(SUPERUSER_ID).action_validate()
+ self.assertEqual(len(holiday.timesheet_ids), number_of_days, 'Number of generated timesheets should be the same as the leave duration (1 per day between %s and %s)' % (fields.Datetime.to_string(self.leave_start_datetime), fields.Datetime.to_string(self.leave_end_datetime)))
+
+ # manager refuse the leave
+ holiday.with_user(SUPERUSER_ID).action_refuse()
+ self.assertEqual(len(holiday.timesheet_ids), 0, 'Number of linked timesheets should be zero, since the leave is refused.')
+
+ def test_validate_without_timesheet(self):
+ # employee creates a leave request
+ number_of_days = (self.leave_end_datetime - self.leave_start_datetime).days
+ holiday = self.Requests.with_user(self.user_employee).create({
+ 'name': 'Leave 1',
+ 'employee_id': self.empl_employee.id,
+ 'holiday_status_id': self.hr_leave_type_no_ts.id,
+ 'date_from': self.leave_start_datetime,
+ 'date_to': self.leave_end_datetime,
+ 'number_of_days': number_of_days,
+ })
+ holiday.with_user(SUPERUSER_ID).action_validate()
+ self.assertEqual(len(holiday.timesheet_ids), 0, 'Number of generated timesheets should be zero since the leave type does not generate timesheet')