102 lines
1.8 KiB
Python
102 lines
1.8 KiB
Python
from datetime import datetime, timezone
|
|
from ipaddress import IPv4Address
|
|
from uuid import uuid4
|
|
|
|
from core.domain.models import NormalizedCDR
|
|
from core.worker.batch import (
|
|
BufferedCDR,
|
|
KafkaPosition,
|
|
MicroBatch,
|
|
)
|
|
|
|
|
|
def normalized_cdr(
|
|
raw_id: str,
|
|
) -> NormalizedCDR:
|
|
now = datetime.now(
|
|
timezone.utc
|
|
)
|
|
|
|
return NormalizedCDR(
|
|
cdr_id=uuid4(),
|
|
raw_id=raw_id,
|
|
|
|
msisdn="+19875551234",
|
|
imsi="310410998877665",
|
|
|
|
service_type="4G_DATA",
|
|
radio_access_type="LTE_4G",
|
|
cell_id="4021_8812",
|
|
|
|
bytes_uploaded=100,
|
|
bytes_downloaded=200,
|
|
total_bytes=300,
|
|
duration_seconds=300,
|
|
|
|
session_start_time=now,
|
|
session_end_time=now,
|
|
|
|
source_ip=IPv4Address(
|
|
"10.240.12.1"
|
|
),
|
|
)
|
|
|
|
|
|
def buffered_item(
|
|
raw_id: str,
|
|
offset: int,
|
|
) -> BufferedCDR:
|
|
return BufferedCDR(
|
|
cdr=normalized_cdr(raw_id),
|
|
position=KafkaPosition(
|
|
topic="cdr.raw",
|
|
partition=0,
|
|
offset=offset,
|
|
),
|
|
)
|
|
|
|
|
|
def test_batch_flushes_when_full() -> None:
|
|
batch = MicroBatch(
|
|
max_size=2,
|
|
flush_interval_seconds=10,
|
|
)
|
|
|
|
batch.add(
|
|
buffered_item(
|
|
raw_id="raw-1",
|
|
offset=1,
|
|
)
|
|
)
|
|
|
|
assert batch.is_full is False
|
|
|
|
batch.add(
|
|
buffered_item(
|
|
raw_id="raw-2",
|
|
offset=2,
|
|
)
|
|
)
|
|
|
|
assert batch.is_full is True
|
|
|
|
|
|
def test_batch_clear_resets_state() -> None:
|
|
batch = MicroBatch(
|
|
max_size=2,
|
|
flush_interval_seconds=10,
|
|
)
|
|
|
|
batch.add(
|
|
buffered_item(
|
|
raw_id="raw-1",
|
|
offset=1,
|
|
)
|
|
)
|
|
|
|
batch.clear()
|
|
|
|
assert batch.size == 0
|
|
assert batch.is_empty is True
|
|
assert batch.is_due() is False
|