Files
clickstream-ch-kafka-supers…/generator/tests/test_launch.py
T
ddadminandClaude Fable 5 10ee1a1cb6 feat(generator): эталонный мир в git и import по умолчанию
- Зачем:
  - менти собирал мир генерацией (минуты и десятки минут CPU); теперь
    готовый трёхдневный мир загружается импортом за ~2 минуты, и числа
    у всех менти совпадают число-в-число (issue #3).
- Что:
  - артефакт data/startup_history/reference-world.json.xz в git:
    3 модельных дня daily-wave, ~850 МБ JSON → 32 МБ xz;
  - чтение и запись артефакта понимают .xz потоково (lzma); пустое поле
    artifact_path в пульте и make startup-history-import читают эталон;
  - длительность профиля daily-wave стала 3d — в тон эталонному миру;
  - предпроверка чистого стенда ставит зависимости генератора через uv;
    экспорт и импорт разведены отдельными переменными Makefile;
  - доки и runbook обновлены; новые контрактные тесты: xz round-trip
    и дефолтные пути артефакта.
- Проверка:
  - make test (210 + 31) и make lint зелёные; импорт на чистом стенде
    за 2м03с, manifest совпал (280437 событий), Superset-проверка
    зелёная; независимое ревью — APPROVED.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 18:49:02 +03:00

103 lines
4.0 KiB
Python

"""
Тесты профилей и глаголов запуска генератора.
"""
from datetime import datetime, timezone
def test_daily_wave_is_the_default_for_api_and_cli(monkeypatch):
"""Ручные точки входа без профиля выбирают daily-wave."""
from clickstream_generator.launch import _parse_args, build_launch_env
monkeypatch.delenv("PROFILE", raising=False)
monkeypatch.delenv("GEN_LAUNCH_PROFILE", raising=False)
assert build_launch_env("backfill")["GEN_LAUNCH_PROFILE"] == "daily-wave"
assert _parse_args(["backfill"]).profile == "daily-wave"
def test_duration_2d_sets_model_t_end_from_t0():
"""Длительность 2d считается от T0 без ручного GEN_MODEL_T_END."""
from clickstream_generator.launch import build_launch_env
env = build_launch_env("backfill", profile_name="ci", duration="2d")
assert env["GEN_MODEL_T0"] == "2026-01-01T00:00:00+00:00"
assert env["GEN_MODEL_T_END"] == "2026-01-03T00:00:00+00:00"
def test_daily_wave_profile_uses_three_days_by_default():
"""Профиль daily-wave даёт историю с суточной волной."""
from clickstream_generator.launch import build_launch_env
env = build_launch_env("backfill", profile_name="daily-wave")
assert env["GEN_LAUNCH_PROFILE"] == "daily-wave"
assert env["GEN_HISTORY_DURATION"] == "3d"
assert env["GEN_MODEL_T_END"] == "2026-01-04T00:00:00+00:00"
assert env["GEN_MODEL_TIME_SPEED"] == "60"
assert env["GEN_TICK_SECONDS"] == "1"
def test_backfill_verb_maps_to_existing_low_level_flags():
"""Глагол backfill оставляет прежнюю механику запуска под капотом."""
from clickstream_generator.launch import build_launch_env
env = build_launch_env("backfill", profile_name="ci")
assert env["GEN_RUN_MODE"] == "backfill"
assert env["GEN_STATE_RESET"] == "true"
def test_continue_and_reset_verbs_map_to_existing_low_level_flags():
"""Глаголы continue и reset задают только старый контракт state."""
from clickstream_generator.launch import build_launch_env
continue_env = build_launch_env("continue", profile_name="ci")
reset_env = build_launch_env(
"reset",
profile_name="ci",
overrides={"GEN_MODEL_T_END": "2026-01-09T00:00:00+00:00"},
)
assert continue_env["GEN_RUN_MODE"] == "live"
assert continue_env["GEN_STATE_RESET"] == "false"
assert continue_env["GEN_MODEL_T_END"] == "2026-01-01T06:00:00+00:00"
assert reset_env["GEN_RUN_MODE"] == "live"
assert reset_env["GEN_STATE_RESET"] == "true"
assert "GEN_MODEL_T_END" not in reset_env
def test_next_day_verb_restores_snapshot_without_reset():
"""Глагол next-day включает отдельный ограниченный режим от текущей границы."""
from clickstream_generator.launch import build_launch_env
env = build_launch_env(
"next-day",
profile_name="ci",
overrides={
"GEN_MODEL_T0": "2026-01-01T00:00:00+00:00",
"GEN_MODEL_T_END": "2026-01-03T00:00:00+00:00",
},
)
assert env["GEN_RUN_MODE"] == "next-day"
assert env["GEN_STATE_RESET"] == "false"
assert env["GEN_MODEL_T_END"] == "2026-01-03T00:00:00+00:00"
def test_ci_profile_keeps_previous_default_backfill_window():
"""CI-профиль сохраняет прежний 6-часовой проверочный запуск."""
from clickstream_generator.launch import build_launch_env
env = build_launch_env("backfill", profile_name="ci")
t0 = datetime.fromisoformat(env["GEN_MODEL_T0"])
t_end = datetime.fromisoformat(env["GEN_MODEL_T_END"])
assert t0 == datetime(2026, 1, 1, 0, 0, tzinfo=timezone.utc)
assert (t_end - t0).total_seconds() == 6 * 60 * 60
assert env["GEN_MODEL_TIME_SPEED"] == "1"
assert env["GEN_TICK_SECONDS"] == "60"
assert env["GEN_LAMBDA_BASE_PER_MIN"] == "60"
assert env["GEN_JITTER_PCT"] == "0"