From 9717026dcc6d29baed0fc683ff4e55d8303fa664 Mon Sep 17 00:00:00 2001 From: RomainLibert Date: Thu, 18 Jan 2018 13:47:01 +0100 Subject: [PATCH] [IMP] Resource: Expand testing on timezones We need to check if resource module takes into account the timezone of the employee taking a leave and the timezone of the user asking to see when this employee has taken some leave. Basically everything should be done in UTC internally and then converted back to the user's timezone. --- addons/resource/tests/test_resource.py | 113 +++++++++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/addons/resource/tests/test_resource.py b/addons/resource/tests/test_resource.py index ffc124313c0..39861cf9805 100644 --- a/addons/resource/tests/test_resource.py +++ b/addons/resource/tests/test_resource.py @@ -265,6 +265,119 @@ class ResourceWorkingHours(TestResourceCommon): compute_leaves=True) self.assertEqual(res, 9.5) + def test_calendar_leave_intervals_timezone(self): + # _iter_leave_intervals takes UTC and outputs UTC + # Leave is taken by user in US/Alaska timezone + # It should be visible at the right time for every timezone + self.env.user.tz = 'US/Alaska' + (self.leave1 | self.leave2 | self.leave3).unlink() + leave = self.env['resource.calendar.leaves'].create({ + 'name': 'Timezoned Leaves', + 'calendar_id': self.calendar.id, + 'resource_id': self.resource1_id, + 'date_from': to_naive_utc(Datetime.from_string('2013-02-21 10:00:00'), self.env.user), + 'date_to': to_naive_utc(Datetime.from_string('2013-02-26 12:00:00'), self.env.user) + }) + + def to_tuple(interval): + return (interval.start_datetime, interval.end_datetime) + + # Checking for 'Europe/Brussels' + self.env.user.tz = 'Europe/Brussels' + leaves = list(self.calendar._iter_leave_intervals( + to_naive_utc(Datetime.from_string('2013-02-26 14:00:00'), self.env.user), + to_naive_utc(Datetime.from_string('2013-02-26 15:30:00'), self.env.user), + self.resource1_id)) + self.assertEqual(len(leaves), 0) + + leaves = list(self.calendar._iter_leave_intervals( + to_naive_utc(Datetime.from_string('2013-02-26 08:00:00'), self.env.user), + to_naive_utc(Datetime.from_string('2013-02-26 11:00:00'), self.env.user), + self.resource1_id))[0] + self.assertEqual(len(leaves), 1) + self.assertEqual(to_tuple(leaves[0]), (Datetime.from_string('2013-02-26 07:00:00'), Datetime.from_string('2013-02-26 10:00:00'))) + + leaves = list(self.calendar._iter_leave_intervals( + to_naive_utc(Datetime.from_string('2013-02-22 08:00:00'), self.env.user), + to_naive_utc(Datetime.from_string('2013-02-22 20:00:00'), self.env.user), + self.resource1_id))[0] + self.assertEqual(len(leaves), 2) + self.assertEqual(to_tuple(leaves[0]), (Datetime.from_string('2013-02-22 07:00:00'), Datetime.from_string('2013-02-22 12:00:00'))) + + # Checking for 'Japan' + self.env.user.tz = 'Japan' + leaves = list(self.calendar._iter_leave_intervals( + to_naive_utc(Datetime.from_string('2013-02-26 14:00:00'), self.env.user), + to_naive_utc(Datetime.from_string('2013-02-26 15:30:00'), self.env.user), + self.resource1_id)) + self.assertEqual(len(leaves), 0) + + leaves = list(self.calendar._iter_leave_intervals( + to_naive_utc(Datetime.from_string('2013-02-26 08:00:00'), self.env.user), + to_naive_utc(Datetime.from_string('2013-02-26 11:00:00'), self.env.user), + self.resource1_id))[0] + self.assertEqual(len(leaves), 1) + self.assertEqual(to_tuple(leaves[0]), (Datetime.from_string('2013-02-25 23:00:00'), Datetime.from_string('2013-02-26 02:00:00'))) + + leaves = list(self.calendar._iter_leave_intervals( + to_naive_utc(Datetime.from_string('2013-02-22 08:00:00'), self.env.user), + to_naive_utc(Datetime.from_string('2013-02-22 20:00:00'), self.env.user), + self.resource1_id))[0] + self.assertEqual(len(leaves), 2) + self.assertEqual(to_tuple(leaves[0]), (Datetime.from_string('2013-02-21 23:00:00'), Datetime.from_string('2013-02-22 04:00:00'))) + + def test_calendar_work_days_intervals_timezone(self): + # _get_day_work_intervals converts from the timezone + # of the user into UTC + self.env.user.tz = 'US/Alaska' + (self.leave1 | self.leave2 | self.leave3).unlink() + leave = self.env['resource.calendar.leaves'].create({ + 'name': 'Timezoned Leaves', + 'calendar_id': self.calendar.id, + 'resource_id': self.resource1_id, + 'date_from': to_naive_utc(Datetime.from_string('2013-02-21 10:00:00'), self.env.user), + 'date_to': to_naive_utc(Datetime.from_string('2013-02-26 12:00:00'), self.env.user) + }) + + def to_tuple(interval): + return (interval.start_datetime, interval.end_datetime) + + intervals = self.calendar._get_day_work_intervals(Date.from_string('2013-02-26'), time(10), time(18), False, self.resource1_id) + self.assertEqual(to_tuple(intervals[0]), (Datetime.from_string('2013-02-26 19:00:00'), Datetime.from_string('2013-02-27 01:00:00'))) + intervals = self.calendar._get_day_work_intervals(Date.from_string('2013-02-26'), time(10), time(18), True, self.resource1_id) + self.assertEqual(to_tuple(intervals[0]), (Datetime.from_string('2013-02-26 21:00:00'), Datetime.from_string('2013-02-27 01:00:00'))) + + self.env.user.tz = 'Japan' + + intervals = self.calendar._get_day_work_intervals(Date.from_string('2013-02-26'), time(10), time(18), False, self.resource1_id) + self.assertEqual(to_tuple(intervals[0]), (Datetime.from_string('2013-02-26 01:00:00'), Datetime.from_string('2013-02-26 07:00:00'))) + intervals = self.calendar._get_day_work_intervals(Date.from_string('2013-02-26'), time(10), time(18), True, self.resource1_id) + self.assertEqual(to_tuple(intervals[0]), (Datetime.from_string('2013-02-26 03:00:00'), Datetime.from_string('2013-02-26 07:00:00'))) + + def test_calendar_leave_days_intervals_timezone(self): + # _get_day_leave_intervals converts from the timezone + # of the user into UTC + self.env.user.tz = 'US/Alaska' + (self.leave1 | self.leave2 | self.leave3).unlink() + leave = self.env['resource.calendar.leaves'].create({ + 'name': 'Timezoned Leaves', + 'calendar_id': self.calendar.id, + 'resource_id': self.resource1_id, + 'date_from': to_naive_utc(Datetime.from_string('2013-02-21 10:00:00'), self.env.user), + 'date_to': to_naive_utc(Datetime.from_string('2013-02-26 12:00:00'), self.env.user) + }) + + def to_tuple(interval): + return (interval.start_datetime, interval.end_datetime) + + intervals = self.calendar._get_day_leave_intervals(Date.from_string('2013-02-26'), time(10), time(18), self.resource1_id) + self.assertEqual(to_tuple(intervals[0]), (Datetime.from_string('2013-02-26 19:00:00'), Datetime.from_string('2013-02-26 21:00:00'))) + + self.env.user.tz = 'Japan' + + intervals = self.calendar._get_day_leave_intervals(Date.from_string('2013-02-26'), time(10), time(18), self.resource1_id) + self.assertEqual(to_tuple(intervals[0]), (Datetime.from_string('2013-02-26 01:00:00'), Datetime.from_string('2013-02-26 03:00:00'))) + def test_calendar_hours_scheduling_backward(self): res = self.calendar._schedule_hours(-40, day_dt=Datetime.from_string('2013-02-12 09:00:00')) # current day, limited at 09:00 because of day_dt specified -> 1 hour