import sys sys.path.insert(0, '..') from datetime import datetime, timedelta from bot.scheduler import ServerTime, Scheduler, OneShotTask, RepetitiveTask, CannotDoTask def test_servertime(): DELTA = timedelta(days=1) # a large number, so it's impossible to confuse ServerTime.DELTA = DELTA now = datetime.now() t = ServerTime(now-DELTA+timedelta(seconds=1)) assert -1 < t.from_now() < 1 t = ServerTime.fromlocal(datetime.now()+timedelta(seconds=1)) assert -1 < t.from_now() < 1 t = ServerTime.relative(timedelta(seconds=100)) assert 99 < t.from_now() < 100 t = ServerTime.now() assert t.from_now() <= 0 def test_DELTA(): old_delta = ServerTime.DELTA now = datetime.now() server_time = datetime(now.year, now.month, now.day, 10, 11, 12) ServerTime.set_server_time(server_time) server_now = ServerTime.now() assert server_now.dt.hour == 10 assert server_now.dt.minute == 11 assert server_now.dt.second == 12 class Counter: def __init__(self): self.a = 0 self.b = 0 def inc_a(self, num=1): self.a += num def inc_b(self, num=1): self.b += num def inc_a_raise(self): self.inc_a() raise CannotDoTask(wait=timedelta(seconds=0.1)) def long_wait(self): self.a += 42 raise CannotDoTask(timedelta(seconds=60)) def test_scheduler(): import time count = Counter() sched = Scheduler() start = time.time() sched.schedule(OneShotTask('inc_a', count.inc_a), ServerTime.relative(timedelta(seconds=1))) sched.schedule(OneShotTask('inc_b', count.inc_b), ServerTime.relative(timedelta(seconds=1.5))) sched.schedule(OneShotTask('inb_a 2', count.inc_a, 2), ServerTime.relative(timedelta(seconds=2))) sched.run_once() assert count.a == 1 sched.run_once() assert count.a == 1 assert count.b == 1 sched.run_once() assert count.a == 3 end = time.time() diff = end-start assert 1.90 < diff < 2.10 def test_empty_scheduler(): sched = Scheduler() sched.run() assert sched.tasks == [] def test_repetitive(): import time count = Counter() sched = Scheduler() start = time.time() sched.schedule(RepetitiveTask('inc_a_raise', count.inc_a_raise), ServerTime.relative(timedelta(seconds=0))) for i in range(10): sched.run_once() end = time.time() diff = end-start assert count.a == 10 assert 0.80 < diff < 1 def test_default_wait(): import time count = Counter() sched = Scheduler() start = time.time() sched.schedule(RepetitiveTask('inc_b', count.inc_b, default_wait=timedelta(seconds=0.1)), ServerTime.now()) for i in range(10): sched.run_once() end = time.time() diff = end-start assert count.b == 10 assert 0.80 < diff < 1 def test_max_wait(): import time count = Counter() sched = Scheduler() start = time.time() sched.schedule(RepetitiveTask('long_wait', count.long_wait, max_wait=timedelta(seconds=1)), ServerTime.now()) sched.run_once() assert count.a == 42 sched.run_once() assert count.a == 84 end = time.time() diff = end-start assert 0.90 < diff < 1.10 def test_max_wait(): import time count = Counter() sched = Scheduler() start = time.time() sched.schedule(RepetitiveTask('long_wait', count.long_wait, max_wait=timedelta(seconds=1)), ServerTime.now()) sched.run_once() assert count.a == 42 sched.run_once() assert count.a == 84 end = time.time() diff = end-start assert 0.90 < diff < 1.10 def test_wait(): import time count = Counter() sched = Scheduler() start = time.time() sched.schedule(RepetitiveTask('long_wait', count.long_wait, wait=timedelta(seconds=1)), ServerTime.now()) sched.run_once() assert count.a == 42 sched.run_once() assert count.a == 84 end = time.time() diff = end-start assert 0.90 < diff < 1.10