package github import ( "context" "encoding/json" "net/http" "testing" "time" "github.com/github/github-mcp-server/pkg/translations" "github.com/google/go-github/v69/github" "github.com/migueleliasweb/go-github-mock/src/mock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func Test_GetMe(t *testing.T) { // Verify tool definition mockClient := github.NewClient(nil) tool, _ := GetMe(stubGetClientFn(mockClient), translations.NullTranslationHelper) assert.Equal(t, "get_me", tool.Name) assert.NotEmpty(t, tool.Description) assert.Contains(t, tool.InputSchema.Properties, "reason") assert.Empty(t, tool.InputSchema.Required) // No required parameters // Setup mock user response mockUser := &github.User{ Login: github.Ptr("testuser"), Name: github.Ptr("Test User"), Email: github.Ptr("test@example.com"), Bio: github.Ptr("GitHub user for testing"), Company: github.Ptr("Test Company"), Location: github.Ptr("Test Location"), HTMLURL: github.Ptr("https://github.com/testuser"), CreatedAt: &github.Timestamp{Time: time.Now().Add(-365 * 24 * time.Hour)}, Type: github.Ptr("User"), Plan: &github.Plan{ Name: github.Ptr("pro"), }, } tests := []struct { name string mockedClient *http.Client requestArgs map[string]interface{} expectError bool expectedUser *github.User expectedErrMsg string }{ { name: "successful get user", mockedClient: mock.NewMockedHTTPClient( mock.WithRequestMatch( mock.GetUser, mockUser, ), ), requestArgs: map[string]interface{}{}, expectError: false, expectedUser: mockUser, }, { name: "successful get user with reason", mockedClient: mock.NewMockedHTTPClient( mock.WithRequestMatch( mock.GetUser, mockUser, ), ), requestArgs: map[string]interface{}{ "reason": "Testing API", }, expectError: false, expectedUser: mockUser, }, { name: "get user fails", mockedClient: mock.NewMockedHTTPClient( mock.WithRequestMatchHandler( mock.GetUser, http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusUnauthorized) _, _ = w.Write([]byte(`{"message": "Unauthorized"}`)) }), ), ), requestArgs: map[string]interface{}{}, expectError: true, expectedErrMsg: "failed to get user", }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { // Setup client with mock client := github.NewClient(tc.mockedClient) _, handler := GetMe(stubGetClientFn(client), translations.NullTranslationHelper) // Create call request request := createMCPRequest(tc.requestArgs) // Call handler result, err := handler(context.Background(), request) // Verify results if tc.expectError { require.Error(t, err) assert.Contains(t, err.Error(), tc.expectedErrMsg) return } require.NoError(t, err) // Parse result and get text content if no error textContent := getTextResult(t, result) // Unmarshal and verify the result var returnedUser github.User err = json.Unmarshal([]byte(textContent.Text), &returnedUser) require.NoError(t, err) // Verify user details assert.Equal(t, *tc.expectedUser.Login, *returnedUser.Login) assert.Equal(t, *tc.expectedUser.Name, *returnedUser.Name) assert.Equal(t, *tc.expectedUser.Email, *returnedUser.Email) assert.Equal(t, *tc.expectedUser.Bio, *returnedUser.Bio) assert.Equal(t, *tc.expectedUser.HTMLURL, *returnedUser.HTMLURL) assert.Equal(t, *tc.expectedUser.Type, *returnedUser.Type) }) } }