package cli import ( "fmt" "testing" frameworkmanifest "gitea.lclr.dev/AI/mcp-framework/manifest" frameworksecretstore "gitea.lclr.dev/AI/mcp-framework/secretstore" ) func TestBuildAppReturnsConfiguredApp(t *testing.T) { app := BuildApp("dev") if app == nil { t.Fatal("expected app instance") } if app.prompter == nil { t.Fatal("expected config prompter to be configured") } if app.configStore == nil { t.Fatal("expected config store to be configured") } if app.openSecretStore == nil { t.Fatal("expected secret store opener to be configured") } if app.newMailService == nil { t.Fatal("expected mail service factory to be configured") } if app.newRunner == nil { t.Fatal("expected runner factory to be configured") } if app.loadManifest == nil { t.Fatal("expected manifest loader to be configured") } } func TestResolveSecretStorePolicyUsesManifestValue(t *testing.T) { policy, err := resolveSecretStorePolicy( func(string) (frameworkmanifest.File, string, error) { return frameworkmanifest.File{ SecretStore: frameworkmanifest.SecretStore{ BackendPolicy: "env-only", }, }, "/tmp/mcp.toml", nil }, func() (string, error) { return "/tmp/bin/email-mcp", nil }, ) if err != nil { t.Fatalf("resolveSecretStorePolicy returned error: %v", err) } if policy != frameworksecretstore.BackendEnvOnly { t.Fatalf("policy = %q, want %q", policy, frameworksecretstore.BackendEnvOnly) } } func TestResolveSecretStorePolicyReturnsErrorOnInvalidManifestValue(t *testing.T) { _, err := resolveSecretStorePolicy( func(string) (frameworkmanifest.File, string, error) { return frameworkmanifest.File{ SecretStore: frameworkmanifest.SecretStore{ BackendPolicy: "invalid-policy", }, }, "/tmp/mcp.toml", nil }, func() (string, error) { return "/tmp/bin/email-mcp", nil }, ) if err == nil { t.Fatal("expected invalid secret store policy error") } } func TestResolveSecretStorePolicyFallsBackToAutoWhenManifestMissing(t *testing.T) { policy, err := resolveSecretStorePolicy( func(string) (frameworkmanifest.File, string, error) { return frameworkmanifest.File{}, "", fmt.Errorf("manifest missing") }, func() (string, error) { return "/tmp/bin/email-mcp", nil }, ) if err != nil { t.Fatalf("resolveSecretStorePolicy returned error: %v", err) } if policy != frameworksecretstore.BackendAuto { t.Fatalf("policy = %q, want %q", policy, frameworksecretstore.BackendAuto) } } func TestBuildAppOpenSecretStoreMapsProfilePasswordToEnvironment(t *testing.T) { t.Setenv(passwordEnv, "env-secret") app := buildApp(nil, nil, nil, "dev", runtimeFactories{ loadManifest: func(string) (frameworkmanifest.File, string, error) { return frameworkmanifest.File{ SecretStore: frameworkmanifest.SecretStore{ BackendPolicy: "env-only", }, }, "/tmp/mcp.toml", nil }, resolveExecutable: func() (string, error) { return "/tmp/bin/email-mcp", nil }, }) store, err := app.openSecretStore() if err != nil { t.Fatalf("openSecretStore returned error: %v", err) } value, err := store.GetSecret("imap-password/work") if err != nil { t.Fatalf("GetSecret returned error: %v", err) } if value != "env-secret" { t.Fatalf("GetSecret = %q, want %q", value, "env-secret") } }