test: Phase 2b restore orchestration coverage + nil-safe isDebug

Adds an in-process orchestration test for RestoreFromRecoveryUnit: success path
calls recreate with non-secret env + recovered secrets merged; data-key-missing
path is REFUSED and recreate is never called. Makes Manager.isDebug nil-safe
(behavior-neutral in prod; cfg is always set) so the gate/orchestration are testable.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-13 11:17:08 +02:00
parent 7863e62f29
commit e02292aa1a
3 changed files with 81 additions and 9 deletions
@@ -11,10 +11,14 @@ import (
"testing"
)
// fakeRecoveryProvider is a minimal StackDataProvider for the capture test.
// fakeRecoveryProvider is a configurable StackDataProvider for the capture + restore tests.
type fakeRecoveryProvider struct {
info RecoveryInfo
hdd string
info RecoveryInfo
hdd string
secrets map[string]string // returned by RecoverStackSecrets
gotEnv map[string]string // captured by RecreateStackFromUnit
running bool // returned by RefreshAndIsRunning
stopped bool
}
func (f *fakeRecoveryProvider) GetStackComposePath(string) (string, bool) {
@@ -24,14 +28,17 @@ func (f *fakeRecoveryProvider) ListDeployedStacks() []StackSummary { retur
func (f *fakeRecoveryProvider) GetStackHDDMounts(string) []string { return nil }
func (f *fakeRecoveryProvider) GetStackHDDPath(string) string { return f.hdd }
func (f *fakeRecoveryProvider) GetDockerVolumes(string) []string { return nil }
func (f *fakeRecoveryProvider) StopStack(string) error { return nil }
func (f *fakeRecoveryProvider) StopStack(string) error { f.stopped = true; return nil }
func (f *fakeRecoveryProvider) StartStack(string) error { return nil }
func (f *fakeRecoveryProvider) RefreshAndIsRunning(string) bool { return false }
func (f *fakeRecoveryProvider) RefreshAndIsRunning(string) bool { return f.running }
func (f *fakeRecoveryProvider) GetStackRecoveryInfo(string) (RecoveryInfo, bool) {
return f.info, true
}
func (f *fakeRecoveryProvider) RecoverStackSecrets(string, []string) map[string]string { return nil }
func (f *fakeRecoveryProvider) RecreateStackFromUnit(string, string, map[string]string) error {
func (f *fakeRecoveryProvider) RecoverStackSecrets(string, []string) map[string]string {
return f.secrets
}
func (f *fakeRecoveryProvider) RecreateStackFromUnit(_, _ string, fullEnv map[string]string) error {
f.gotEnv = fullEnv
return nil
}