From f66865821740a05be4809c1879c1b485a9efbbc6 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Thu, 19 Jun 2025 16:26:53 +0200 Subject: [PATCH] test(cmd): additional test cases for config flags Relates to #131 --- pkg/kubernetes-mcp-server/cmd/root.go | 5 +- pkg/kubernetes-mcp-server/cmd/root_test.go | 67 +++++++++++++++++++ .../cmd/testdata/empty-config.toml | 0 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 pkg/kubernetes-mcp-server/cmd/testdata/empty-config.toml diff --git a/pkg/kubernetes-mcp-server/cmd/root.go b/pkg/kubernetes-mcp-server/cmd/root.go index 1becd2e..e59b7c2 100644 --- a/pkg/kubernetes-mcp-server/cmd/root.go +++ b/pkg/kubernetes-mcp-server/cmd/root.go @@ -90,9 +90,9 @@ func NewMCPServer(streams genericiooptions.IOStreams) *cobra.Command { }, } - cmd.Flags().StringVar(&o.ConfigPath, "config", o.ConfigPath, "Path of the config file. Each profile has its set of defaults.") cmd.Flags().BoolVar(&o.Version, "version", o.Version, "Print version information and quit") cmd.Flags().IntVar(&o.LogLevel, "log-level", o.LogLevel, "Set the log level (from 0 to 9)") + cmd.Flags().StringVar(&o.ConfigPath, "config", o.ConfigPath, "Path of the config file. Each profile has its set of defaults.") cmd.Flags().IntVar(&o.SSEPort, "sse-port", o.SSEPort, "Start a SSE server on the specified port") cmd.Flags().IntVar(&o.HttpPort, "http-port", o.HttpPort, "Start a streamable HTTP server on the specified port") cmd.Flags().StringVar(&o.SSEBaseUrl, "sse-base-url", o.SSEBaseUrl, "SSE public base URL to use when sending the endpoint message (e.g. https://example.com)") @@ -145,13 +145,14 @@ func (m *MCPServerOptions) Run() error { return fmt.Errorf("Invalid output name: %s, valid names are: %s\n", m.ListOutput, strings.Join(output.Names, ", ")) } klog.V(1).Info("Starting kubernetes-mcp-server") + klog.V(1).Infof(" - Config: %s", m.ConfigPath) klog.V(1).Infof(" - Profile: %s", profile.GetName()) klog.V(1).Infof(" - ListOutput: %s", listOutput.GetName()) klog.V(1).Infof(" - Read-only mode: %t", m.ReadOnly) klog.V(1).Infof(" - Disable destructive tools: %t", m.DisableDestructive) if m.Version { - fmt.Fprintf(m.Out, "%s\n", version.Version) + _, _ = fmt.Fprintf(m.Out, "%s\n", version.Version) return nil } mcpServer, err := mcp.NewServer(mcp.Configuration{ diff --git a/pkg/kubernetes-mcp-server/cmd/root_test.go b/pkg/kubernetes-mcp-server/cmd/root_test.go index 02af2b4..edda918 100644 --- a/pkg/kubernetes-mcp-server/cmd/root_test.go +++ b/pkg/kubernetes-mcp-server/cmd/root_test.go @@ -4,6 +4,9 @@ import ( "bytes" "io" "os" + "path/filepath" + "regexp" + "runtime" "strings" "testing" @@ -41,6 +44,30 @@ func TestVersion(t *testing.T) { } } +func TestConfig(t *testing.T) { + t.Run("defaults to none", func(t *testing.T) { + ioStreams, out := testStream() + rootCmd := NewMCPServer(ioStreams) + rootCmd.SetArgs([]string{"--version", "--log-level=1"}) + expectedConfig := `" - Config: "` + if err := rootCmd.Execute(); !strings.Contains(out.String(), expectedConfig) { + t.Fatalf("Expected config to be %s, got %s %v", expectedConfig, out.String(), err) + } + }) + t.Run("set with --config", func(t *testing.T) { + ioStreams, out := testStream() + rootCmd := NewMCPServer(ioStreams) + _, file, _, _ := runtime.Caller(0) + emptyConfigPath := filepath.Join(filepath.Dir(file), "testdata", "empty-config.toml") + rootCmd.SetArgs([]string{"--version", "--log-level=1", "--config", emptyConfigPath}) + _ = rootCmd.Execute() + expected := `(?m)\" - Config\:[^\"]+empty-config\.toml\"` + if m, err := regexp.MatchString(expected, out.String()); !m || err != nil { + t.Fatalf("Expected config to be %s, got %s %v", expected, out.String(), err) + } + }) +} + func TestProfile(t *testing.T) { t.Run("available", func(t *testing.T) { ioStreams, _ := testStream() @@ -59,6 +86,16 @@ func TestProfile(t *testing.T) { t.Fatalf("Expected profile 'full', got %s %v", out, err) } }) + t.Run("set with --profile", func(t *testing.T) { + ioStreams, out := testStream() + rootCmd := NewMCPServer(ioStreams) + rootCmd.SetArgs([]string{"--version", "--log-level=1", "--profile", "full"}) // TODO: change by some non-default profile + _ = rootCmd.Execute() + expected := `(?m)\" - Profile\: full\"` + if m, err := regexp.MatchString(expected, out.String()); !m || err != nil { + t.Fatalf("Expected profile to be %s, got %s %v", expected, out.String(), err) + } + }) } func TestListOutput(t *testing.T) { @@ -79,6 +116,16 @@ func TestListOutput(t *testing.T) { t.Fatalf("Expected list-output 'table', got %s %v", out, err) } }) + t.Run("set with --list-output", func(t *testing.T) { + ioStreams, out := testStream() + rootCmd := NewMCPServer(ioStreams) + rootCmd.SetArgs([]string{"--version", "--log-level=1", "--list-output", "yaml"}) + _ = rootCmd.Execute() + expected := `(?m)\" - ListOutput\: yaml\"` + if m, err := regexp.MatchString(expected, out.String()); !m || err != nil { + t.Fatalf("Expected list-output to be %s, got %s %v", expected, out.String(), err) + } + }) } func TestReadOnly(t *testing.T) { @@ -90,6 +137,16 @@ func TestReadOnly(t *testing.T) { t.Fatalf("Expected read-only mode false, got %s %v", out, err) } }) + t.Run("set with --read-only", func(t *testing.T) { + ioStreams, out := testStream() + rootCmd := NewMCPServer(ioStreams) + rootCmd.SetArgs([]string{"--version", "--log-level=1", "--read-only"}) + _ = rootCmd.Execute() + expected := `(?m)\" - Read-only mode\: true\"` + if m, err := regexp.MatchString(expected, out.String()); !m || err != nil { + t.Fatalf("Expected read-only mode to be %s, got %s %v", expected, out.String(), err) + } + }) } func TestDisableDestructive(t *testing.T) { @@ -101,4 +158,14 @@ func TestDisableDestructive(t *testing.T) { t.Fatalf("Expected disable destructive false, got %s %v", out, err) } }) + t.Run("set with --disable-destructive", func(t *testing.T) { + ioStreams, out := testStream() + rootCmd := NewMCPServer(ioStreams) + rootCmd.SetArgs([]string{"--version", "--log-level=1", "--disable-destructive"}) + _ = rootCmd.Execute() + expected := `(?m)\" - Disable destructive tools\: true\"` + if m, err := regexp.MatchString(expected, out.String()); !m || err != nil { + t.Fatalf("Expected disable-destructive mode to be %s, got %s %v", expected, out.String(), err) + } + }) } diff --git a/pkg/kubernetes-mcp-server/cmd/testdata/empty-config.toml b/pkg/kubernetes-mcp-server/cmd/testdata/empty-config.toml new file mode 100644 index 0000000..e69de29