fix: harden DynDNS recovery and publish v1.5.1

This commit is contained in:
admin committed 2026-10-10 02:26:47 +02:00
1 parent 3383b91e49
commit 81def77e3c
37 files changed
+2415 -250

No files matched your search

+43
View File
@@ -14,6 +14,49 @@ import (
"github.com/root-kdw12/hetzner-api-dyndns-records-webinterface/internal/secure"
)
func TestRunCompletionIsAtomicAndInterruptedRunsRecover(t *testing.T) {
ctx := context.Background()
database, err := Open(ctx, filepath.Join(t.TempDir(), "app.db"))
if err != nil {
t.Fatal(err)
}
defer database.Close()
id, err := database.CreateUpdateRun(ctx)
if err != nil {
t.Fatal(err)
}
if _, err := database.db.Exec(`CREATE TRIGGER reject_state BEFORE UPDATE ON settings BEGIN SELECT RAISE(FAIL, 'storage failure'); END`); err != nil {
t.Fatal(err)
}
if err := database.CompleteUpdateRun(ctx, id, "ok", "198.51.100.42", "", "completed"); err == nil {
t.Fatal("storage failure silently ignored")
}
runs, err := database.RecentRuns(ctx, 1)
if err != nil || runs[0].Status != "running" {
t.Fatalf("partially committed run: %#v %v", runs, err)
}
if _, err := database.db.Exec(`DROP TRIGGER reject_state`); err != nil {
t.Fatal(err)
}
if err := database.CompleteUpdateRun(ctx, id, "ok", "198.51.100.42", "", "completed"); err != nil {
t.Fatal(err)
}
if _, err := database.CreateUpdateRun(ctx); err != nil {
t.Fatal(err)
}
if err := database.RecoverInterruptedRuns(ctx); err != nil {
t.Fatal(err)
}
runs, err = database.RecentRuns(ctx, 10)
if err != nil || len(runs) != 2 || runs[0].Status != "error" || runs[0].FinishedAt.IsZero() || runs[1].Status != "ok" {
t.Fatalf("incorrect restart recovery: %#v %v", runs, err)
}
settings, err := database.GetSettings(ctx)
if err != nil || settings.LastIPv4 != "198.51.100.42" || settings.LastRunStatus != "error" {
t.Fatalf("restart corrupted state: %#v %v", settings, err)
}
}
func TestMigrateAppliesEveryIntermediateSchemaFromV1(t *testing.T) {
t.Parallel()
ctx := context.Background()