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  }