blob: 650246b0b72a0acefbf1ae3ac375576aa1a3df8e [file] [log] [blame]
package gerrit_test
import (
"context"
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"testing"
"github.com/andygrunwald/go-gerrit"
)
func ExampleChangesService_QueryChanges() {
ctx := context.Background()
instance := "https://android-review.googlesource.com/"
client, err := gerrit.NewClient(ctx, instance, nil)
if err != nil {
panic(err)
}
opt := &gerrit.QueryChangeOptions{}
opt.Query = []string{
"change:249244",
}
opt.Limit = 2
opt.AdditionalFields = []string{"LABELS"}
changes, _, err := client.Changes.QueryChanges(ctx, opt)
if err != nil {
panic(err)
}
for _, change := range *changes {
fmt.Printf("Project: %s -> %s -> %s%d\n", change.Project, change.Subject, instance, change.Number)
}
// Output:
// Project: platform/art -> ART: Change return types of field access entrypoints -> https://android-review.googlesource.com/249244
}
func ExampleChangesService_QueryChanges_withSubmittable() {
instance := "https://android-review.googlesource.com/"
ctx := context.Background()
client, err := gerrit.NewClient(ctx, instance, nil)
if err != nil {
panic(err)
}
opt := &gerrit.QueryChangeOptions{}
opt.Query = []string{
"change:249244",
}
opt.AdditionalFields = []string{"SUBMITTABLE"}
changes, _, err := client.Changes.QueryChanges(ctx, opt)
if err != nil {
panic(err)
}
for _, change := range *changes {
fmt.Printf("Project: %s -> %s -> %s%d, Ready to submit: %t\n", change.Project, change.Subject, instance, change.Number, change.Submittable)
}
// Output:
// Project: platform/art -> ART: Change return types of field access entrypoints -> https://android-review.googlesource.com/249244, Ready to submit: false
}
// Prior to fixing #18 this test would fail.
func ExampleChangesService_QueryChanges_withSymbols() {
instance := "https://android-review.googlesource.com/"
ctx := context.Background()
client, err := gerrit.NewClient(ctx, instance, nil)
if err != nil {
panic(err)
}
opt := &gerrit.QueryChangeOptions{}
opt.Query = []string{
"change:249244 status:merged",
}
opt.Limit = 2
opt.AdditionalFields = []string{"LABELS"}
changes, _, err := client.Changes.QueryChanges(ctx, opt)
if err != nil {
panic(err)
}
for _, change := range *changes {
fmt.Printf("Project: %s -> %s -> %s%d\n", change.Project, change.Subject, instance, change.Number)
}
// Output:
// Project: platform/art -> ART: Change return types of field access entrypoints -> https://android-review.googlesource.com/249244
}
func ExampleChangesService_PublishChangeEdit() {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "ok")
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
panic(err)
}
_, err = client.Changes.PublishChangeEdit(ctx, "123", "NONE")
if err != nil {
panic(err)
}
}
func disallowEmptyFields(t *testing.T, payload map[string]interface{}, path string) {
for field, generic := range payload {
curPath := field
if len(path) > 0 {
curPath = path + "." + field
}
switch value := generic.(type) {
case string:
if len(value) == 0 {
t.Errorf("Empty value for field %q", curPath)
}
case map[string]interface{}:
if len(value) == 0 {
t.Errorf("Empty value for field %q", curPath)
}
disallowEmptyFields(t, value, curPath)
}
}
}
func TestChangesService_CreateChange(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
decoder := json.NewDecoder(r.Body)
var payload map[string]interface{}
if err := decoder.Decode(&payload); err != nil {
t.Error(err)
}
jsonStr, err := json.MarshalIndent(payload, "", " ")
if err != nil {
t.Error(err)
}
if len(jsonStr) == 0 {
t.Error("Empty request payload")
}
required := func(field string) string {
value, ok := payload[field]
strVal := value.(string)
if !ok {
t.Errorf("Missing required field %q", field)
}
return strVal
}
project := required("project")
branch := required("branch")
subject := required("subject")
if merge, ok := payload["merge"]; ok {
if _, ok := merge.(map[string]interface{})["source"]; !ok {
t.Error(`Missing required field "merge.source"`)
}
}
disallowEmptyFields(t, payload, "")
if r.URL.Path != "/changes/" {
t.Errorf("%s != /changes/", r.URL.Path)
}
if r.Method != "POST" {
t.Errorf("%s != POST", r.Method)
}
fmt.Fprintf(w, `{ "id": "abc1234", "project": "%s", "branch": "%s", "subject": "%s"}`, project, branch, subject)
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
t.Error(err)
}
cases := map[string]gerrit.ChangeInput{
"RequiredOnly": {
Project: "myProject",
Branch: "main",
Subject: "test change",
},
"WithMerge": {
Project: "myProject",
Branch: "main",
Subject: "test change",
Merge: &gerrit.MergeInput{
Source: "45/3/1",
},
},
"WithAppend": {
Project: "myProject",
Branch: "main",
Subject: "test change",
Author: &gerrit.AccountInput{
Username: "roboto",
Name: "Rob Oto",
},
},
}
for name, input := range cases {
t.Run(name, func(t *testing.T) {
info, _, err := client.Changes.CreateChange(ctx, &input)
if err != nil {
t.Error(err)
}
if info.ID != "abc1234" {
t.Error("Invalid id")
}
})
}
}
func TestChangesService_SubmitChange(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/changes/123/submit" {
t.Errorf("%s != /changes/123/submit", r.URL.Path)
}
fmt.Fprint(w, `{"id": "123"}`)
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
t.Error(err)
}
info, _, err := client.Changes.SubmitChange(ctx, "123", nil)
if err != nil {
t.Error(err)
}
if info.ID != "123" {
t.Error("Invalid id")
}
}
func TestChangesService_SubmitChange_Conflict(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusConflict)
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
t.Error(err)
}
_, response, _ := client.Changes.SubmitChange(ctx, "123", nil)
if response.StatusCode != http.StatusConflict {
t.Error("Expected 409 code")
}
}
func TestChangesService_AbandonChange(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/changes/123/abandon" {
t.Errorf("%s != /changes/123/abandon", r.URL.Path)
}
fmt.Fprint(w, `{"id": "123"}`)
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
t.Error(err)
}
info, _, err := client.Changes.AbandonChange(ctx, "123", nil)
if err != nil {
t.Error(err)
}
if info.ID != "123" {
t.Error("Invalid id")
}
}
func TestChangesService_AbandonChange_Conflict(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusConflict)
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
t.Error(err)
}
_, response, _ := client.Changes.AbandonChange(ctx, "123", nil)
if response.StatusCode != http.StatusConflict {
t.Error("Expected 409 code")
}
}
func TestChangesService_RebaseChange(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/changes/123/rebase" {
t.Errorf("%s != /changes/123/rebase", r.URL.Path)
}
fmt.Fprint(w, `{"id": "123"}`)
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
t.Error(err)
}
info, _, err := client.Changes.RebaseChange(ctx, "123", nil)
if err != nil {
t.Error(err)
}
if info.ID != "123" {
t.Error("Invalid id")
}
}
func TestChangesService_RebaseChange_Conflict(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusConflict)
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
t.Error(err)
}
_, response, _ := client.Changes.RebaseChange(ctx, "123", nil)
if response.StatusCode != http.StatusConflict {
t.Error("Expected 409 code")
}
}
func TestChangesService_RestoreChange(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/changes/123/restore" {
t.Errorf("%s != /changes/123/restore", r.URL.Path)
}
fmt.Fprint(w, `{"id": "123"}`)
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
t.Error(err)
}
info, _, err := client.Changes.RestoreChange(ctx, "123", nil)
if err != nil {
t.Error(err)
}
if info.ID != "123" {
t.Error("Invalid id")
}
}
func TestChangesService_RestoreChange_Conflict(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusConflict)
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
t.Error(err)
}
_, response, _ := client.Changes.RestoreChange(ctx, "123", nil)
if response.StatusCode != http.StatusConflict {
t.Error("Expected 409 code")
}
}
func TestChangesService_RevertChange(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/changes/123/revert" {
t.Errorf("%s != /changes/123/revert", r.URL.Path)
}
fmt.Fprint(w, `{"id": "123"}`)
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
t.Error(err)
}
info, _, err := client.Changes.RevertChange(ctx, "123", nil)
if err != nil {
t.Error(err)
}
if info.ID != "123" {
t.Error("Invalid id")
}
}
func TestChangesService_RevertChange_Conflict(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusConflict)
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
t.Error(err)
}
_, response, _ := client.Changes.RevertChange(ctx, "123", nil)
if response.StatusCode != http.StatusConflict {
t.Error("Expected 409 code")
}
}
func TestChangesService_SetCommitMessage(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/changes/123/message" {
t.Errorf("%s != /changes/123/message", r.URL.Path)
}
if r.Method != "PUT" {
t.Error("Method != PUT")
}
w.WriteHeader(http.StatusOK)
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
t.Error(err)
}
cm := &gerrit.CommitMessageInput{Message: "New commit message"}
_, err = client.Changes.SetCommitMessage(ctx, "123", cm)
if err != nil {
t.Error(err)
}
}
func TestChangesService_SetCommitMessage_NotFound(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/changes/123/message" {
t.Errorf("%s != /changes/123/message", r.URL.Path)
}
if r.Method != "PUT" {
t.Error("Method != PUT")
}
w.WriteHeader(http.StatusNotFound)
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
t.Error(err)
}
cm := &gerrit.CommitMessageInput{Message: "New commit message"}
resp, err := client.Changes.SetCommitMessage(ctx, "123", cm)
if err == nil {
t.Error("Expected error, instead nil")
}
if resp.StatusCode != http.StatusNotFound {
t.Error("Expected 404 code")
}
}
func TestChangesService_SetReadyForReview(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/changes/123/ready" {
t.Errorf("%s != /changes/123/ready", r.URL.Path)
}
if r.Method != "POST" {
t.Error("Method != POST")
}
w.WriteHeader(http.StatusOK)
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
t.Error(err)
}
cm := &gerrit.ReadyForReviewInput{Message: "Now ready for review"}
_, err = client.Changes.SetReadyForReview(ctx, "123", cm)
if err != nil {
t.Error(err)
}
}
func TestChangesService_SetReadyForReview_NotFound(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/changes/123/ready" {
t.Errorf("%s != /changes/123/ready", r.URL.Path)
}
if r.Method != "POST" {
t.Error("Method != POST")
}
w.WriteHeader(http.StatusNotFound)
}))
defer ts.Close()
ctx := context.Background()
client, err := gerrit.NewClient(ctx, ts.URL, nil)
if err != nil {
t.Error(err)
}
cm := &gerrit.ReadyForReviewInput{Message: "Now ready for review"}
resp, err := client.Changes.SetReadyForReview(ctx, "123", cm)
if err == nil {
t.Error("Expected error, instead nil")
}
if resp.StatusCode != http.StatusNotFound {
t.Error("Expected 404 code")
}
}