package handlers import ( "encoding/json" "net/http" "net/http/httptest" "strings" "testing" agentbackup "zlh-agent/internal/backup" "zlh-agent/internal/state" ) func TestHandleGameBackupRestoreIncludesCheckpoint(t *testing.T) { oldLoadBackupConfig := loadBackupConfig oldRestoreBackup := restoreBackup loadBackupConfig = func() (*state.Config, error) { return &state.Config{ ContainerType: "game", Game: "minecraft", Variant: "vanilla", }, nil } restoreBackup = func(_ *state.Config, id string) (agentbackup.RestoreResult, error) { return agentbackup.RestoreResult{ Backup: agentbackup.Manifest{ ID: id, Type: agentbackup.BackupTypeManual, }, Checkpoint: agentbackup.Manifest{ ID: "checkpoint-1", Type: agentbackup.BackupTypeCheckpoint, Reason: agentbackup.BackupReasonPreRestore, }, }, nil } t.Cleanup(func() { loadBackupConfig = oldLoadBackupConfig restoreBackup = oldRestoreBackup }) req := httptest.NewRequest(http.MethodPost, "/game/backups/restore", strings.NewReader(`{"id":"target-1"}`)) rec := httptest.NewRecorder() HandleGameBackupRestore(rec, req) if rec.Code != http.StatusOK { t.Fatalf("status = %d, body = %s", rec.Code, rec.Body.String()) } var response struct { Restored bool `json:"restored"` Backup agentbackup.Manifest `json:"backup"` Checkpoint agentbackup.Manifest `json:"checkpoint"` } if err := json.NewDecoder(rec.Body).Decode(&response); err != nil { t.Fatalf("decode response: %v", err) } if !response.Restored { t.Fatalf("restored = false, want true") } if response.Backup.ID != "target-1" { t.Fatalf("backup id = %q, want target-1", response.Backup.ID) } if response.Checkpoint.ID != "checkpoint-1" { t.Fatalf("checkpoint id = %q, want checkpoint-1", response.Checkpoint.ID) } if response.Checkpoint.Type != agentbackup.BackupTypeCheckpoint { t.Fatalf("checkpoint type = %q, want %q", response.Checkpoint.Type, agentbackup.BackupTypeCheckpoint) } if response.Checkpoint.Reason != agentbackup.BackupReasonPreRestore { t.Fatalf("checkpoint reason = %q, want %q", response.Checkpoint.Reason, agentbackup.BackupReasonPreRestore) } }