43 lines
1.9 KiB
Python
43 lines
1.9 KiB
Python
import unittest
|
|
|
|
try:
|
|
from server import domain
|
|
except ImportError:
|
|
domain = None
|
|
|
|
|
|
class DomainTests(unittest.TestCase):
|
|
def run_function(self, name, *args):
|
|
self.assertIsNotNone(domain, 'Service date rules must be implemented')
|
|
return getattr(domain, name)(*args)
|
|
|
|
def test_calendar_months_and_leap_year(self):
|
|
self.assertEqual(self.run_function('add_cycle','2026-01-31',1,'months'),'2026-02-28')
|
|
self.assertEqual(self.run_function('add_cycle','2028-01-31',1,'months'),'2028-02-29')
|
|
|
|
def test_fixed_months_restore_original_anchor(self):
|
|
rule = dict(dueDate='2026-02-28',anchorDate='2026-01-31',interval=1,unit='months',anchor='scheduled')
|
|
self.assertEqual(self.run_function('next_due',rule,'2026-02-28'),'2026-03-31')
|
|
|
|
def test_early_fixed_completion_advances_current_occurrence(self):
|
|
rule = dict(dueDate='2026-10-10',anchorDate='2026-10-10',interval=1,unit='months',anchor='scheduled')
|
|
self.assertEqual(self.run_function('next_due',rule,'2026-10-04'),'2026-11-10')
|
|
|
|
def test_overdue_fixed_completion_skips_elapsed_occurrences(self):
|
|
rule = dict(dueDate='2026-01-31',anchorDate='2026-01-31',interval=1,unit='months',anchor='scheduled')
|
|
self.assertEqual(self.run_function('next_due',rule,'2026-04-01'),'2026-04-30')
|
|
|
|
def test_completion_based_dates_start_from_actual_date(self):
|
|
rule = dict(dueDate='2026-10-03',interval=90,unit='days',anchor='completion')
|
|
self.assertEqual(self.run_function('next_due',rule,'2026-10-04'),'2027-01-02')
|
|
|
|
def test_bad_date_and_cycle_rejected(self):
|
|
self.assertIsNotNone(domain)
|
|
for value, interval, unit in [('2026-02-30',1,'months'),('2026-10-04',0,'days'),('2026-10-04',True,'days')]:
|
|
with self.assertRaises(ValueError):
|
|
domain.add_cycle(value,interval,unit)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|