Initial commit: Debian Manager — управление Debian-серверами
- SSH/SFTP управление без агентов - Пакеты (apt), Docker, файлы, systemd, ufw, cron - Плейбуки, групповые операции, планировщик - Бэкапы, отчёты, Portainer, Proxmox VE, Gitea Deploy - Терминал, Telegram-уведомления, тёмная/светлая тема
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
"""Юнит-тесты парсеров на фикстурах (без сервера)."""
|
||||
from app.core.cron_svc import parse_crontab, humanize, render, CronLine
|
||||
from app.core.packages import Package, split_packages
|
||||
|
||||
|
||||
# ---------- cron ----------
|
||||
|
||||
CRONTAB_FIXTURE = """\
|
||||
# комментарий
|
||||
SHELL=/bin/bash
|
||||
0 3 * * * /usr/bin/backup.sh --full
|
||||
# 30 4 * * 0 /usr/bin/weekly.sh
|
||||
@daily /home/dimon/cleanup.sh
|
||||
*/15 * * * * curl -s https://example.com/ping
|
||||
not a cron line
|
||||
"""
|
||||
|
||||
|
||||
def test_parse_enabled_entry():
|
||||
lines = parse_crontab(CRONTAB_FIXTURE)
|
||||
entry = next(l for l in lines if "backup.sh" in l.raw)
|
||||
assert entry.is_entry and entry.enabled
|
||||
assert entry.schedule == "0 3 * * *"
|
||||
assert entry.command == "/usr/bin/backup.sh --full"
|
||||
|
||||
|
||||
def test_parse_disabled_entry():
|
||||
lines = parse_crontab(CRONTAB_FIXTURE)
|
||||
entry = next(l for l in lines if "weekly.sh" in l.raw)
|
||||
assert entry.is_entry and not entry.enabled
|
||||
assert entry.schedule == "30 4 * * 0"
|
||||
|
||||
|
||||
def test_parse_special_at():
|
||||
lines = parse_crontab(CRONTAB_FIXTURE)
|
||||
entry = next(l for l in lines if "cleanup.sh" in l.raw)
|
||||
assert entry.is_entry and entry.schedule == "@daily"
|
||||
|
||||
|
||||
def test_parse_comment_not_entry():
|
||||
lines = parse_crontab(CRONTAB_FIXTURE)
|
||||
assert lines[0].comment == "# комментарий" or not lines[0].is_entry
|
||||
non_entry = [l for l in lines if not l.is_entry]
|
||||
assert any("SHELL" in l.raw for l in non_entry)
|
||||
|
||||
|
||||
def test_render_roundtrip():
|
||||
lines = parse_crontab(CRONTAB_FIXTURE)
|
||||
out = render(lines)
|
||||
lines2 = parse_crontab(out)
|
||||
entries1 = [(l.schedule, l.command, l.enabled) for l in lines if l.is_entry]
|
||||
entries2 = [(l.schedule, l.command, l.enabled) for l in lines2 if l.is_entry]
|
||||
assert entries1 == entries2
|
||||
|
||||
|
||||
def test_humanize_daily():
|
||||
assert humanize("@daily") == "ежедневно"
|
||||
|
||||
|
||||
def test_humanize_valid_cron():
|
||||
assert "следующий запуск" in humanize("0 3 * * *")
|
||||
|
||||
|
||||
def test_humanize_invalid():
|
||||
assert humanize("99 99 * * *") in ("неверное выражение",)
|
||||
|
||||
|
||||
# ---------- packages ----------
|
||||
|
||||
def test_split_packages():
|
||||
pkgs = [
|
||||
Package("bash", "5.2", "required", True),
|
||||
Package("dpkg", "1.22", "important", True),
|
||||
Package("nginx", "1.24", "optional", True),
|
||||
Package("libnginx-mod-http", "1.24", "optional", False),
|
||||
]
|
||||
res = split_packages(pkgs)
|
||||
assert {p.name for p in res["system"]} == {"bash", "dpkg"}
|
||||
assert {p.name for p in res["user"]} == {"nginx"}
|
||||
assert {p.name for p in res["deps"]} == {"libnginx-mod-http"}
|
||||
Reference in New Issue
Block a user