package server import ( "bytes" "io" "log/slog" "net/http/httptest" "net/url" "strings" "testing" "git.coopcloud.tech/wiki-cafe/member-console/internal/config" "github.com/spf13/viper" ) // acmeConfigs is a brand-neutral installed-integration fixture for the // settings surface. var acmeConfigs = []IntegrationConfigInfo{ { Slug: "acme", DisplayName: "Acme Widgets", Keys: []config.ConfigKey{ {Name: "acme-widget-url", RequiredGroup: "Acme", Usage: "Widget service URL"}, {Name: "acme-widget-scheme", Default: "https", Enum: []string{"http", "https"}, Usage: "Widget URL scheme"}, {Name: "acme-widget-domains", Default: []string(nil), Usage: "Widget domains"}, {Name: "acme-widget-token", Secret: true, RequiredGroup: "Acme", Usage: "Widget admin token"}, }, }, } func settingsTestHandler() *OperatorPartialsHandler { return &OperatorPartialsHandler{ IntegrationConfigs: acmeConfigs, Logger: slog.New(slog.NewTextHandler(io.Discard, nil)), } } func TestIntegrationSettingsTemplate(t *testing.T) { tmpl := parseOperatorPartials(t) data := IntegrationSettingsData{ Slug: "acme", DisplayName: "Acme Widgets", SurfacePath: "/operator/integrations/acme", Saved: "acme-widget-scheme", Error: "value \"gopher\" is not one of http|https", ErrorKey: "acme-widget-scheme", Rows: []SettingRow{ {Key: "acme-widget-url", Usage: "Widget service URL", Kind: "string", Required: true, Effective: "https://widgets.example.com", Source: "environment"}, {Key: "acme-widget-scheme", Usage: "Widget URL scheme", Kind: "enum", Enum: []string{"http", "https"}, Effective: "https", Source: "override", Override: "http", HasOverride: true, PendingRestart: true}, {Key: "acme-widget-domains", Usage: "Widget domains", Kind: "list", Effective: "", Source: "default"}, {Key: "acme-widget-token", Usage: "Widget admin token", Secret: true, SecretSet: false}, {Key: "acme-widget-secondary-token", Usage: "Secondary widget token", Secret: true, SecretSet: true}, {Key: "acme-mode", Usage: "Processing mode", Kind: "enum", Enum: []string{"test", "live"}, Effective: "test", Source: "default", Warning: "Selecting live moves this deployment onto real payment processing: charges become real money, not test transactions."}, }, } var buf bytes.Buffer if err := tmpl.ExecuteTemplate(&buf, "operator_integration_settings.html", data); err != nil { t.Fatalf("render: %v", err) } out := buf.String() for _, want := range []string{ "Acme Widgets settings", `hx-post="/operator/integrations/acme/settings"`, "Pending restart", "Managed via environment", `