73 lines
2.8 KiB
Python
73 lines
2.8 KiB
Python
import os
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
from zoneinfo import ZoneInfo
|
|
|
|
import pytest
|
|
|
|
from beaver_agent.memory import handouts
|
|
from beaver_agent.memory.handouts import deploy_mark
|
|
|
|
ZONE = ZoneInfo("Europe/Warsaw")
|
|
NOW = "2026-09-17 06:30"
|
|
|
|
|
|
def _at(text: str) -> float:
|
|
return datetime.fromisoformat(text).replace(tzinfo=ZONE).timestamp()
|
|
|
|
|
|
def _touch(path: Path, when: str) -> Path:
|
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
path.write_text("", encoding="utf-8")
|
|
os.utime(path, (_at(when), _at(when)))
|
|
return path
|
|
|
|
|
|
def _bundle(tmp_path: Path, started: str, code: str) -> tuple[Path, Path]:
|
|
proc = _touch(tmp_path / "proc" / "1", started)
|
|
package = tmp_path / "beaver_agent"
|
|
_touch(package / "memory" / "handouts.py", code)
|
|
_touch(package / "vault.py", "2026-09-10 12:00")
|
|
# мусор компилятора не должен выглядеть свежим кодом
|
|
_touch(package / "memory" / "__pycache__" / "handouts.py", "2026-09-17 06:00")
|
|
return proc, package
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def _now(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
monkeypatch.setattr(handouts.time, "time", lambda: _at(NOW))
|
|
|
|
|
|
def test_code_older_than_start(tmp_path: Path) -> None:
|
|
proc, package = _bundle(tmp_path, "2026-09-16 03:11", "2026-09-16 03:03")
|
|
assert deploy_mark(proc, package) == (
|
|
"Выкат: процесс поднят 2026-09-16 03:11 (27 ч назад), свежесть кода "
|
|
"2026-09-16 03:03 - код старше старта, значит крутится то, что выкатывали."
|
|
)
|
|
|
|
|
|
def test_code_newer_than_start(tmp_path: Path) -> None:
|
|
proc, package = _bundle(tmp_path, "2026-09-16 03:11", "2026-09-17 06:20")
|
|
assert deploy_mark(proc, package) == (
|
|
"Выкат: процесс поднят 2026-09-16 03:11 (27 ч назад), свежесть кода "
|
|
"2026-09-17 06:20 - код НОВЕЕ старта: правка на диске есть, "
|
|
"рестарта после неё не было."
|
|
)
|
|
|
|
|
|
def test_same_minute(tmp_path: Path) -> None:
|
|
proc, package = _bundle(tmp_path, "2026-09-17 06:00", "2026-09-17 06:00:30")
|
|
assert deploy_mark(proc, package) == (
|
|
"Выкат: процесс поднят 2026-09-17 06:00 (30 мин назад), свежесть кода "
|
|
"2026-09-17 06:00 - выкат и правка в одну минуту."
|
|
)
|
|
|
|
|
|
def test_no_source(tmp_path: Path) -> None:
|
|
proc, package = _bundle(tmp_path, "2026-09-16 03:11", "2026-09-16 03:03")
|
|
assert deploy_mark(tmp_path / "нет", package) is None
|
|
assert deploy_mark(proc, tmp_path / "пусто") is None
|
|
only_cache = tmp_path / "кеш"
|
|
_touch(only_cache / "__pycache__" / "handouts.py", "2026-09-17 06:00")
|
|
assert deploy_mark(proc, only_cache) is None
|