github.com/mattbailey/reviewdog@v0.10.0/service/gitlab/gitlab_mr_discussion_test.go (about) 1 package gitlab 2 3 import ( 4 "context" 5 "encoding/json" 6 "net/http" 7 "net/http/httptest" 8 "os" 9 "testing" 10 11 "github.com/google/go-cmp/cmp" 12 "github.com/xanzy/go-gitlab" 13 14 "github.com/reviewdog/reviewdog" 15 "github.com/reviewdog/reviewdog/service/serviceutil" 16 ) 17 18 func TestGitLabMergeRequestDiscussionCommenter_Post_Flush_review_api(t *testing.T) { 19 cwd, _ := os.Getwd() 20 defer os.Chdir(cwd) 21 os.Chdir("../..") 22 23 alreadyCommented1 := &reviewdog.Comment{ 24 CheckResult: &reviewdog.CheckResult{ 25 Path: "file.go", 26 Lnum: 1, 27 }, 28 Body: "already commented", 29 } 30 alreadyCommented2 := &reviewdog.Comment{ 31 CheckResult: &reviewdog.CheckResult{ 32 Path: "another/file.go", 33 Lnum: 14, 34 }, 35 Body: "already commented 2", 36 } 37 newComment1 := &reviewdog.Comment{ 38 CheckResult: &reviewdog.CheckResult{ 39 Path: "file.go", 40 Lnum: 14, 41 }, 42 Body: "new comment", 43 } 44 newComment2 := &reviewdog.Comment{ 45 CheckResult: &reviewdog.CheckResult{ 46 Path: "file2.go", 47 Lnum: 15, 48 }, 49 Body: "new comment 2", 50 } 51 52 comments := []*reviewdog.Comment{ 53 alreadyCommented1, 54 alreadyCommented2, 55 newComment1, 56 newComment2, 57 } 58 59 mux := http.NewServeMux() 60 mux.HandleFunc("/api/v4/projects/o/r/merge_requests/14/discussions", func(w http.ResponseWriter, r *http.Request) { 61 switch r.Method { 62 case http.MethodGet: 63 switch r.URL.Query().Get("page") { 64 default: 65 dls := []*gitlab.Discussion{ 66 { 67 Notes: []*gitlab.Note{ 68 { 69 Body: serviceutil.CommentBody(alreadyCommented1), 70 Position: &gitlab.NotePosition{ 71 NewPath: alreadyCommented1.Path, 72 NewLine: alreadyCommented1.Lnum, 73 }, 74 }, 75 { 76 Body: "unrelated commented", 77 Position: &gitlab.NotePosition{ 78 NewPath: "file.go", 79 NewLine: 1, 80 }, 81 }, 82 }, 83 }, 84 } 85 w.Header().Add("X-Next-Page", "2") 86 if err := json.NewEncoder(w).Encode(dls); err != nil { 87 t.Fatal(err) 88 } 89 case "2": 90 dls := []*gitlab.Discussion{ 91 { 92 Notes: []*gitlab.Note{ 93 { 94 Body: serviceutil.CommentBody(alreadyCommented2), 95 Position: &gitlab.NotePosition{ 96 NewPath: alreadyCommented2.Path, 97 NewLine: alreadyCommented2.Lnum, 98 }, 99 }, 100 }, 101 }, 102 } 103 if err := json.NewEncoder(w).Encode(dls); err != nil { 104 t.Fatal(err) 105 } 106 } 107 108 case http.MethodPost: 109 got := new(gitlab.CreateMergeRequestDiscussionOptions) 110 if err := json.NewDecoder(r.Body).Decode(got); err != nil { 111 t.Error(err) 112 } 113 switch got.Position.NewPath { 114 case "file.go": 115 want := &gitlab.CreateMergeRequestDiscussionOptions{ 116 Body: gitlab.String(serviceutil.CommentBody(newComment1)), 117 Position: &gitlab.NotePosition{ 118 BaseSHA: "xxx", StartSHA: "xxx", HeadSHA: "sha", PositionType: "text", NewPath: "file.go", NewLine: 14}, 119 } 120 if diff := cmp.Diff(got, want); diff != "" { 121 t.Error(diff) 122 } 123 case "file2.go": 124 want := &gitlab.CreateMergeRequestDiscussionOptions{ 125 Body: gitlab.String(serviceutil.CommentBody(newComment2)), 126 Position: &gitlab.NotePosition{ 127 BaseSHA: "xxx", StartSHA: "xxx", HeadSHA: "sha", PositionType: "text", NewPath: "file2.go", NewLine: 15}, 128 } 129 if diff := cmp.Diff(got, want); diff != "" { 130 t.Error(diff) 131 } 132 default: 133 t.Errorf("got unexpected discussion: %#v", got) 134 } 135 if err := json.NewEncoder(w).Encode(gitlab.Discussion{}); err != nil { 136 t.Fatal(err) 137 } 138 default: 139 t.Errorf("unexpected access: %v %v", r.Method, r.URL) 140 } 141 }) 142 mux.HandleFunc("/api/v4/projects/o/r/merge_requests/14", func(w http.ResponseWriter, r *http.Request) { 143 if r.Method != http.MethodGet { 144 t.Errorf("unexpected access: %v %v", r.Method, r.URL) 145 } 146 w.Write([]byte(`{"target_project_id": 14, "target_branch": "test-branch"}`)) 147 }) 148 mux.HandleFunc("/api/v4/projects/14/repository/branches/test-branch", func(w http.ResponseWriter, r *http.Request) { 149 if r.Method != http.MethodGet { 150 t.Errorf("unexpected access: %v %v", r.Method, r.URL) 151 } 152 w.Write([]byte(`{"commit": {"id": "xxx"}}`)) 153 }) 154 155 ts := httptest.NewServer(mux) 156 defer ts.Close() 157 158 cli := gitlab.NewClient(nil, "") 159 cli.SetBaseURL(ts.URL + "/api/v4") 160 161 g, err := NewGitLabMergeRequestDiscussionCommenter(cli, "o", "r", 14, "sha") 162 if err != nil { 163 t.Fatal(err) 164 } 165 166 for _, c := range comments { 167 if err := g.Post(context.Background(), c); err != nil { 168 t.Error(err) 169 } 170 } 171 if err := g.Flush(context.Background()); err != nil { 172 t.Errorf("%v", err) 173 } 174 }