51 lines
1.2 KiB
Python
51 lines
1.2 KiB
Python
|
import datetime
|
||
|
import time
|
||
|
import contextlib
|
||
|
import os
|
||
|
from unittest import mock
|
||
|
|
||
|
import pytest
|
||
|
from tempora import timing
|
||
|
|
||
|
|
||
|
def test_IntervalGovernor():
|
||
|
"""
|
||
|
IntervalGovernor should prevent a function from being called more than
|
||
|
once per interval.
|
||
|
"""
|
||
|
func_under_test = mock.MagicMock()
|
||
|
# to look like a function, it needs a __name__ attribute
|
||
|
func_under_test.__name__ = 'func_under_test'
|
||
|
interval = datetime.timedelta(seconds=1)
|
||
|
governed = timing.IntervalGovernor(interval)(func_under_test)
|
||
|
governed('a')
|
||
|
governed('b')
|
||
|
governed(3, 'sir')
|
||
|
func_under_test.assert_called_once_with('a')
|
||
|
|
||
|
|
||
|
@pytest.fixture
|
||
|
def alt_tz(monkeypatch):
|
||
|
hasattr(time, 'tzset') or pytest.skip("tzset not available")
|
||
|
|
||
|
@contextlib.contextmanager
|
||
|
def change():
|
||
|
val = 'AEST-10AEDT-11,M10.5.0,M3.5.0'
|
||
|
with monkeypatch.context() as ctx:
|
||
|
ctx.setitem(os.environ, 'TZ', val)
|
||
|
time.tzset()
|
||
|
yield
|
||
|
time.tzset()
|
||
|
|
||
|
return change()
|
||
|
|
||
|
|
||
|
def test_Stopwatch_timezone_change(alt_tz):
|
||
|
"""
|
||
|
The stopwatch should provide a consistent duration even
|
||
|
if the timezone changes.
|
||
|
"""
|
||
|
watch = timing.Stopwatch()
|
||
|
with alt_tz:
|
||
|
assert abs(watch.split().total_seconds()) < 0.1
|