Files
backup-master/internal/catalog/catalog_test.go
T
mrleo1nidandClaude Opus 5.5 1d44d067e9 backup-master: сервер бэкапов, агент и восстановление VPS
Один бинарник backupctl:
- server: API для агентов и restore, веб-морда (один админ), SQLite,
  ретеншн GFS, heavy-части, уведомления ntfy, раздача agent.sh/restore.sh;
- backup/plan: сбор по каталогу категорий (files/systemd/xui/compose),
  горячие дампы Postgres/Mongo/MySQL, снимок x-ui.db, docker-тома,
  digest образов, проверка crontab, потоковая отправка tar.zst;
- restore: провижининг на основе vps_installer с теми же версиями пакетов,
  recipes 3x-ui/nebula/sing-box нужных версий, восстановление compose
  с заливкой дампов и закреплением образов по digest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 21:52:40 +03:00

40 lines
946 B
Go

package catalog
import "testing"
func TestDefaultAndMerge(t *testing.T) {
base, err := Default()
if err != nil {
t.Fatal(err)
}
if base.Find("stoat") == nil || base.Find("xui") == nil {
t.Fatal("в каталоге нет stoat/xui")
}
over, err := Parse([]byte(`
categories:
- {name: scripts, disabled: true}
- name: extra
type: files
paths: [/srv/extra]
- name: telegraf
type: files
paths: [/etc/telegraf]
`))
if err != nil {
t.Fatal(err)
}
m := Merge(base, over)
if err := m.Validate(); err != nil {
t.Fatal(err)
}
if !m.Find("scripts").Disabled || len(m.Find("scripts").Paths) == 0 {
t.Error("короткая форма disabled должна сохранять остальные поля")
}
if m.Find("extra") == nil {
t.Error("новая категория не добавлена")
}
if m.Find("telegraf").Type != TypeFiles {
t.Error("категория не заменена")
}
}