From 8a3d8e9926e93554a137162adc19d780937cc37a Mon Sep 17 00:00:00 2001 From: Ankitsinghsisodya Date: Thu, 7 May 2026 03:11:51 +0530 Subject: [PATCH 1/2] Add unit tests for resource help and tool delete functionality - Implemented TestResource_Help to validate help command behavior for various subcommands. - Added tests for the delete tool to ensure it handles readonly mode and validation errors correctly when both path and name are provided, or neither is provided. - Included TestTool_Delete_Readonly, TestTool_Delete_BothPathAndName, and TestTool_Delete_NeitherPathNorName to cover these scenarios. These tests enhance the coverage and reliability of the MCP resource and tool functionalities. --- pkg/mcp/tools_delete_test.go | 64 ++++++++++++++++++++++++++++++++++++ pkg/mcp/tools_deploy_test.go | 19 +++++++++++ 2 files changed, 83 insertions(+) diff --git a/pkg/mcp/tools_delete_test.go b/pkg/mcp/tools_delete_test.go index 1bccc57df6..ea2a7f734f 100644 --- a/pkg/mcp/tools_delete_test.go +++ b/pkg/mcp/tools_delete_test.go @@ -8,6 +8,70 @@ import ( "knative.dev/func/pkg/mcp/mock" ) +// TestTool_Delete_Readonly ensures the delete tool returns an error when the server is in readonly mode. +func TestTool_Delete_Readonly(t *testing.T) { + client, _, err := newTestPairWithReadonly(t, true) + if err != nil { + t.Fatal(err) + } + + result, err := client.CallTool(t.Context(), &mcp.CallToolParams{ + Name: "delete", + Arguments: map[string]any{"name": "my-function"}, + }) + if err != nil { + t.Fatal(err) + } + if !result.IsError { + t.Fatal("expected error result for readonly server, got success") + } +} + +// TestTool_Delete_BothPathAndName ensures the delete tool returns a validation error +// when both path and name are provided simultaneously. +func TestTool_Delete_BothPathAndName(t *testing.T) { + client, server, err := newTestPair(t) + if err != nil { + t.Fatal(err) + } + server.readonly = false + + result, err := client.CallTool(t.Context(), &mcp.CallToolParams{ + Name: "delete", + Arguments: map[string]any{ + "path": "/some/path", + "name": "my-function", + }, + }) + if err != nil { + t.Fatal(err) + } + if !result.IsError { + t.Fatal("expected error result when both path and name are provided, got success") + } +} + +// TestTool_Delete_NeitherPathNorName ensures the delete tool returns a validation error +// when neither path nor name is provided. +func TestTool_Delete_NeitherPathNorName(t *testing.T) { + client, server, err := newTestPair(t) + if err != nil { + t.Fatal(err) + } + server.readonly = false + + result, err := client.CallTool(t.Context(), &mcp.CallToolParams{ + Name: "delete", + Arguments: map[string]any{}, + }) + if err != nil { + t.Fatal(err) + } + if !result.IsError { + t.Fatal("expected error result when neither path nor name is provided, got success") + } +} + // TestTool_Delete_Args ensures the delete tool executes with all arguments passed correctly. func TestTool_Delete_Args(t *testing.T) { // Test data - defined once and used for both input and validation diff --git a/pkg/mcp/tools_deploy_test.go b/pkg/mcp/tools_deploy_test.go index 4b8d2e83c4..2fc591237d 100644 --- a/pkg/mcp/tools_deploy_test.go +++ b/pkg/mcp/tools_deploy_test.go @@ -8,6 +8,25 @@ import ( "knative.dev/func/pkg/mcp/mock" ) +// TestTool_Deploy_Readonly ensures the deploy tool returns an error when the server is in readonly mode. +func TestTool_Deploy_Readonly(t *testing.T) { + client, _, err := newTestPairWithReadonly(t, true) + if err != nil { + t.Fatal(err) + } + + result, err := client.CallTool(t.Context(), &mcp.CallToolParams{ + Name: "deploy", + Arguments: map[string]any{"path": "."}, + }) + if err != nil { + t.Fatal(err) + } + if !result.IsError { + t.Fatal("expected error result for readonly server, got success") + } +} + // TestTool_Deploy_Args ensures the deploy tool executes with all arguments passed correctly. func TestTool_Deploy_Args(t *testing.T) { // Test data - defined once and used for both input and validation From 1fe74bb86d137105910ff6736619aa6fa2746ea1 Mon Sep 17 00:00:00 2001 From: Ankitsinghsisodya Date: Thu, 7 May 2026 03:22:04 +0530 Subject: [PATCH 2/2] Refactor test setup in tool delete tests - Simplified the test setup in TestTool_Delete_BothPathAndName and TestTool_Delete_NeitherPathNorName by removing the unused server variable from newTestPair. - This change enhances code clarity and maintains the focus on testing the delete tool's functionality. --- pkg/mcp/tools_delete_test.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pkg/mcp/tools_delete_test.go b/pkg/mcp/tools_delete_test.go index ea2a7f734f..7cefc73416 100644 --- a/pkg/mcp/tools_delete_test.go +++ b/pkg/mcp/tools_delete_test.go @@ -30,11 +30,10 @@ func TestTool_Delete_Readonly(t *testing.T) { // TestTool_Delete_BothPathAndName ensures the delete tool returns a validation error // when both path and name are provided simultaneously. func TestTool_Delete_BothPathAndName(t *testing.T) { - client, server, err := newTestPair(t) + client, _, err := newTestPair(t) if err != nil { t.Fatal(err) } - server.readonly = false result, err := client.CallTool(t.Context(), &mcp.CallToolParams{ Name: "delete", @@ -54,11 +53,10 @@ func TestTool_Delete_BothPathAndName(t *testing.T) { // TestTool_Delete_NeitherPathNorName ensures the delete tool returns a validation error // when neither path nor name is provided. func TestTool_Delete_NeitherPathNorName(t *testing.T) { - client, server, err := newTestPair(t) + client, _, err := newTestPair(t) if err != nil { t.Fatal(err) } - server.readonly = false result, err := client.CallTool(t.Context(), &mcp.CallToolParams{ Name: "delete",