Files
clickstream-ch-kafka-supers…/generator/tests/conftest.py
T
Dmitry Dementiev 8f1e997cc9 feat(generator): откалиброван поток steady-stream генератора
- Зачем:
  - поток генератора должен соответствовать модели интенсивности и профилю сида перед реализацией состояния версии 2.
- Что:
  - событийный бюджет тика переведён в рождения визитов через ожидаемую среднюю длину визита.
  - дефолты интенсивности и обычный docker-compose запуск синхронизированы с целевыми 30 событиями в минуту.
  - добавлены статистические проверки длины визита, воронки, новых пользователей, межсессионных пауз и долгого окна потока.
  - обновлены README, OPERATIONS и карточка задачи 05.
- Проверка:
  - uv run --with-requirements generator/requirements.txt pytest generator/tests -q.
  - git diff --check.
2026-06-11 17:17:34 +03:00

63 lines
1.7 KiB
Python

"""
Pytest fixtures для тестирования генератора.
"""
import sys
from pathlib import Path
GENERATOR_DIR = Path(__file__).parent.parent
# Добавляем фасад generator.py и src-пакет в путь
sys.path.insert(0, str(GENERATOR_DIR))
sys.path.insert(0, str(GENERATOR_DIR / "src"))
import pytest
from generator import Config, EventDictionary
@pytest.fixture
def data_dir():
"""Путь к директории с тестовыми данными."""
return Path(__file__).parent.parent.parent / "data"
@pytest.fixture
def event_dictionary(data_dir):
"""Загруженный словарь событий."""
return EventDictionary.load(data_dir)
@pytest.fixture
def base_config(data_dir):
"""Базовая конфигурация для тестов."""
return Config(
kafka_bootstrap_servers="localhost:9092",
tick_seconds=5,
lambda_base_per_min=30,
jitter_pct=20,
min_events_per_tick=1,
max_events_per_tick=50,
data_dir=data_dir,
seed=42,
enabled=True,
metrics_port=9109,
state_enabled=True,
state_reset=False,
)
@pytest.fixture
def config_no_jitter(base_config):
"""Конфигурация без jitter."""
from dataclasses import replace
return replace(base_config, jitter_pct=0)
@pytest.fixture
def empty_temp_dir(tmp_path):
"""Временная директория с пустыми JSONL файлами."""
for fname in ["browser_events.jsonl", "location_events.jsonl",
"device_events.jsonl", "geo_events.jsonl"]:
(tmp_path / fname).touch()
return tmp_path