@@ -1916,3 +1916,139 @@ func Test_AddPullRequestReviewComment(t *testing.T) {
19161916 })
19171917 }
19181918}
1919+
1920+ func Test_UpdatePullRequestComment (t * testing.T ) {
1921+ // Verify tool definition once
1922+ mockClient := github .NewClient (nil )
1923+ tool , _ := UpdatePullRequestComment (stubGetClientFn (mockClient ), translations .NullTranslationHelper )
1924+
1925+ assert .Equal (t , "update_pull_request_comment" , tool .Name )
1926+ assert .NotEmpty (t , tool .Description )
1927+ assert .Contains (t , tool .InputSchema .Properties , "owner" )
1928+ assert .Contains (t , tool .InputSchema .Properties , "repo" )
1929+ assert .Contains (t , tool .InputSchema .Properties , "commentId" )
1930+ assert .Contains (t , tool .InputSchema .Properties , "body" )
1931+ assert .ElementsMatch (t , tool .InputSchema .Required , []string {"owner" , "repo" , "commentId" , "body" })
1932+
1933+ // Setup mock comment for success case
1934+ mockUpdatedComment := & github.PullRequestComment {
1935+ ID : github .Ptr (int64 (456 )),
1936+ Body : github .Ptr ("Updated comment text here" ),
1937+ HTMLURL : github .Ptr ("https://github.com/owner/repo/pull/1#discussion_r456" ),
1938+ Path : github .Ptr ("file1.txt" ),
1939+ UpdatedAt : & github.Timestamp {Time : time .Now ()},
1940+ User : & github.User {
1941+ Login : github .Ptr ("testuser" ),
1942+ },
1943+ }
1944+
1945+ tests := []struct {
1946+ name string
1947+ mockedClient * http.Client
1948+ requestArgs map [string ]interface {}
1949+ expectError bool
1950+ expectedComment * github.PullRequestComment
1951+ expectedErrMsg string
1952+ }{
1953+ {
1954+ name : "successful comment update" ,
1955+ mockedClient : mock .NewMockedHTTPClient (
1956+ mock .WithRequestMatchHandler (
1957+ mock .PatchReposPullsCommentsByOwnerByRepoByCommentId ,
1958+ expectRequestBody (t , map [string ]interface {}{
1959+ "body" : "Updated comment text here" ,
1960+ }).andThen (
1961+ mockResponse (t , http .StatusOK , mockUpdatedComment ),
1962+ ),
1963+ ),
1964+ ),
1965+ requestArgs : map [string ]interface {}{
1966+ "owner" : "owner" ,
1967+ "repo" : "repo" ,
1968+ "commentId" : float64 (456 ),
1969+ "body" : "Updated comment text here" ,
1970+ },
1971+ expectError : false ,
1972+ expectedComment : mockUpdatedComment ,
1973+ },
1974+ {
1975+ name : "comment update fails - not found" ,
1976+ mockedClient : mock .NewMockedHTTPClient (
1977+ mock .WithRequestMatchHandler (
1978+ mock .PatchReposPullsCommentsByOwnerByRepoByCommentId ,
1979+ http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
1980+ w .WriteHeader (http .StatusNotFound )
1981+ w .Header ().Set ("Content-Type" , "application/json" )
1982+ _ , _ = w .Write ([]byte (`{"message": "Comment not found"}` ))
1983+ }),
1984+ ),
1985+ ),
1986+ requestArgs : map [string ]interface {}{
1987+ "owner" : "owner" ,
1988+ "repo" : "repo" ,
1989+ "commentId" : float64 (999 ),
1990+ "body" : "This should fail" ,
1991+ },
1992+ expectError : true ,
1993+ expectedErrMsg : "failed to update pull request comment" ,
1994+ },
1995+ {
1996+ name : "comment update fails - validation error" ,
1997+ mockedClient : mock .NewMockedHTTPClient (
1998+ mock .WithRequestMatchHandler (
1999+ mock .PatchReposPullsCommentsByOwnerByRepoByCommentId ,
2000+ http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
2001+ w .WriteHeader (http .StatusUnprocessableEntity )
2002+ w .Header ().Set ("Content-Type" , "application/json" )
2003+ _ , _ = w .Write ([]byte (`{"message": "Validation Failed"}` ))
2004+ }),
2005+ ),
2006+ ),
2007+ requestArgs : map [string ]interface {}{
2008+ "owner" : "owner" ,
2009+ "repo" : "repo" ,
2010+ "commentId" : float64 (456 ),
2011+ "body" : "Invalid body" , // Changed this to a non-empty string
2012+ },
2013+ expectError : true ,
2014+ expectedErrMsg : "failed to update pull request comment" ,
2015+ },
2016+ }
2017+
2018+ for _ , tc := range tests {
2019+ t .Run (tc .name , func (t * testing.T ) {
2020+ client := github .NewClient (tc .mockedClient )
2021+ _ , handler := UpdatePullRequestComment (stubGetClientFn (client ), translations .NullTranslationHelper )
2022+
2023+ request := createMCPRequest (tc .requestArgs )
2024+
2025+ result , err := handler (context .Background (), request )
2026+
2027+ if tc .expectError {
2028+ require .Error (t , err )
2029+ assert .Contains (t , err .Error (), tc .expectedErrMsg )
2030+ return
2031+ }
2032+
2033+ require .NoError (t , err )
2034+ assert .NotNil (t , result )
2035+ require .Len (t , result .Content , 1 )
2036+
2037+ textContent := getTextResult (t , result )
2038+
2039+ // For non-error cases, check the returned comment
2040+ var returnedComment github.PullRequestComment
2041+ err = json .Unmarshal ([]byte (textContent .Text ), & returnedComment )
2042+ require .NoError (t , err )
2043+
2044+ assert .Equal (t , * tc .expectedComment .ID , * returnedComment .ID )
2045+ assert .Equal (t , * tc .expectedComment .Body , * returnedComment .Body )
2046+ if tc .expectedComment .Path != nil {
2047+ assert .Equal (t , * tc .expectedComment .Path , * returnedComment .Path )
2048+ }
2049+ if tc .expectedComment .HTMLURL != nil {
2050+ assert .Equal (t , * tc .expectedComment .HTMLURL , * returnedComment .HTMLURL )
2051+ }
2052+ })
2053+ }
2054+ }
0 commit comments