TCPDashboard/tests/data/common/test_bucket.py

64 lines
3.0 KiB
Python
Raw Permalink Normal View History

import pytest
from datetime import datetime, timedelta
from data.common.aggregation.bucket import TimeframeBucket
from data.common.aggregation.batch import BatchCandleProcessor
class TestTimeframeBucket:
@pytest.mark.parametrize("timeframe, expected", [
("1s", timedelta(seconds=1)),
("5s", timedelta(seconds=5)),
("10s", timedelta(seconds=10)),
("15s", timedelta(seconds=15)),
("30s", timedelta(seconds=30)),
("1m", timedelta(minutes=1)),
("5m", timedelta(minutes=5)),
("15m", timedelta(minutes=15)),
("30m", timedelta(minutes=30)),
("1h", timedelta(hours=1)),
("4h", timedelta(hours=4)),
("1d", timedelta(days=1)),
])
def test_parse_timeframe_to_timedelta_valid(self, timeframe, expected):
assert TimeframeBucket._parse_timeframe_to_timedelta(timeframe) == expected
@pytest.mark.parametrize("timeframe", [
"1w", "abc", "60x", "", "m5", "-1m", "0h"
])
def test_parse_timeframe_to_timedelta_invalid(self, timeframe):
with pytest.raises(ValueError):
TimeframeBucket._parse_timeframe_to_timedelta(timeframe)
@pytest.mark.parametrize("timeframe", [
"-1m", "-5h", "-10s", "-2d"
])
def test_parse_timeframe_to_timedelta_negative(self, timeframe):
with pytest.raises(ValueError):
TimeframeBucket._parse_timeframe_to_timedelta(timeframe)
def test_calculate_end_time(self):
start = datetime(2024, 1, 1, 0, 0, 0)
bucket = TimeframeBucket(symbol="BTC-USDT", timeframe="5m", start_time=start)
expected_end = start + timedelta(minutes=5)
assert bucket.end_time == expected_end
@pytest.mark.parametrize("timeframe, timestamp, expected_start", [
("1s", datetime(2024, 1, 1, 12, 0, 0, 123456), datetime(2024, 1, 1, 12, 0, 0)),
("5s", datetime(2024, 1, 1, 12, 0, 7), datetime(2024, 1, 1, 12, 0, 5)),
("10s", datetime(2024, 1, 1, 12, 0, 17), datetime(2024, 1, 1, 12, 0, 10)),
("1m", datetime(2024, 1, 1, 12, 7, 45), datetime(2024, 1, 1, 12, 7, 0)),
("5m", datetime(2024, 1, 1, 9, 7, 30), datetime(2024, 1, 1, 9, 5, 0)),
("15m", datetime(2024, 1, 1, 9, 23, 0), datetime(2024, 1, 1, 9, 15, 0)),
("1h", datetime(2024, 1, 1, 13, 45, 0), datetime(2024, 1, 1, 13, 0, 0)),
("4h", datetime(2024, 1, 1, 11, 15, 0), datetime(2024, 1, 1, 8, 0, 0)),
("1d", datetime(2024, 1, 1, 18, 30, 0), datetime(2024, 1, 1, 0, 0, 0)),
])
def test_get_bucket_start_time_valid(timeframe, timestamp, expected_start):
processor = BatchCandleProcessor(symbol="BTC-USDT", exchange="okx", timeframes=[timeframe])
start = processor._get_bucket_start_time(timestamp, timeframe)
assert start == expected_start
@pytest.mark.parametrize("timeframe", ["0h", "-5m", "abc", "1w", "", "m5"])
def test_get_bucket_start_time_invalid(timeframe):
processor = BatchCandleProcessor(symbol="BTC-USDT", exchange="okx", timeframes=[timeframe])
with pytest.raises(ValueError):
processor._get_bucket_start_time(datetime(2024, 1, 1, 12, 0, 0), timeframe)