forked from Mapan/odoo17e
65 lines
3.3 KiB
Python
65 lines
3.3 KiB
Python
from datetime import datetime
|
|
|
|
from odoo.tests.common import BaseCase
|
|
from odoo.addons.appointment.utils import intervals_overlap, invert_intervals
|
|
|
|
class TestAppointmentIntervalUtils(BaseCase):
|
|
def test_intervals_intersections(self):
|
|
test_data = [
|
|
((datetime(2023, 2, 14), datetime(2023, 2, 15)), (datetime(2023, 2, 15), datetime(2023, 2, 16)), False),
|
|
((datetime(2023, 2, 14), datetime(2023, 2, 15)), (datetime(2023, 2, 13), datetime(2023, 2, 16)), True),
|
|
((datetime(2023, 2, 13), datetime(2023, 2, 16)), (datetime(2023, 2, 14), datetime(2023, 2, 15)), True),
|
|
((datetime(2023, 2, 13), datetime(2023, 2, 16)), (datetime(2023, 2, 15), datetime(2023, 2, 17)), True),
|
|
]
|
|
for interval_a, interval_b, overlaps in test_data:
|
|
with self.subTest(interval_a=interval_a, interval_b=interval_b):
|
|
self.assertEqual(intervals_overlap(interval_a, interval_b), overlaps)
|
|
|
|
def test_intervals_inversion(self):
|
|
test_intervals = [
|
|
(datetime(2023, 2, 5), datetime(2023, 2, 6)), # no adjacent
|
|
(datetime(2023, 2, 7), datetime(2023, 2, 7)), # 0-length
|
|
(datetime(2023, 2, 9), datetime(2023, 2, 10)), # multi-adjacent
|
|
(datetime(2023, 2, 10), datetime(2023, 2, 11)),
|
|
(datetime(2023, 2, 11), datetime(2023, 2, 12)),
|
|
(datetime(2023, 2, 13), datetime(2023, 2, 15)), # overlapping
|
|
(datetime(2023, 2, 14), datetime(2023, 2, 18)),
|
|
(datetime(2023, 2, 15), datetime(2023, 2, 16)), # contained inside the previous
|
|
(datetime(2023, 2, 25), datetime(2023, 3, 10)), # unordered non-adjacent
|
|
(datetime(2023, 2, 20), datetime(2023, 2, 22)),
|
|
]
|
|
test_limits = [
|
|
(datetime(2023, 1, 1), datetime(2023, 4, 1)), # all-encompassing
|
|
(datetime(2023, 2, 5), datetime(2023, 3, 10)), # exact fit original intervals
|
|
(datetime(2023, 2, 9), datetime(2023, 2, 12)), # exact fit of one interval
|
|
(datetime(2023, 2, 6), datetime(2023, 2, 9)), # exact fit of one inverted interval
|
|
(datetime(2023, 2, 8), datetime(2023, 2, 11)), # overlapping some
|
|
]
|
|
test_results = [
|
|
[
|
|
(datetime(2023, 1, 1), datetime(2023, 2, 5)),
|
|
(datetime(2023, 2, 6), datetime(2023, 2, 9)),
|
|
(datetime(2023, 2, 12), datetime(2023, 2, 13)),
|
|
(datetime(2023, 2, 18), datetime(2023, 2, 20)),
|
|
(datetime(2023, 2, 22), datetime(2023, 2, 25)),
|
|
(datetime(2023, 3, 10), datetime(2023, 4, 1)),
|
|
],
|
|
[
|
|
(datetime(2023, 2, 6), datetime(2023, 2, 9)),
|
|
(datetime(2023, 2, 12), datetime(2023, 2, 13)),
|
|
(datetime(2023, 2, 18), datetime(2023, 2, 20)),
|
|
(datetime(2023, 2, 22), datetime(2023, 2, 25)),
|
|
],
|
|
[],
|
|
[
|
|
(datetime(2023, 2, 6), datetime(2023, 2, 9)),
|
|
],
|
|
[
|
|
(datetime(2023, 2, 8), datetime(2023, 2, 9)),
|
|
],
|
|
]
|
|
for limits, expected_result in zip(test_limits, test_results):
|
|
start, end = limits
|
|
with self.subTest(start=start, end=end):
|
|
self.assertListEqual(invert_intervals(test_intervals, start, end), expected_result)
|