From 0730dbfc8685c19d54abbbdd8a0a5ac33c61f15d Mon Sep 17 00:00:00 2001 From: matthiasng Date: Mon, 23 Dec 2019 18:41:25 +0100 Subject: [PATCH 1/5] remove warnings --- admin.go | 4 ++++ dashboard.go | 2 +- datasource_test.go | 2 +- folder.go | 6 ++++++ org_users.go | 6 ++++++ orgs.go | 9 ++++++++- 6 files changed, 26 insertions(+), 3 deletions(-) diff --git a/admin.go b/admin.go index 1caf0c3..72c823b 100644 --- a/admin.go +++ b/admin.go @@ -11,6 +11,10 @@ import ( func (c *Client) CreateUser(user User) (int64, error) { id := int64(0) data, err := json.Marshal(user) + if err != nil { + return id, err + } + req, err := c.newRequest("POST", "/api/admin/users", nil, bytes.NewBuffer(data)) if err != nil { return id, err diff --git a/dashboard.go b/dashboard.go index 2d6418f..952d91e 100644 --- a/dashboard.go +++ b/dashboard.go @@ -28,7 +28,7 @@ type Dashboard struct { Meta DashboardMeta `json:"meta"` Model map[string]interface{} `json:"dashboard"` Folder int64 `json:"folderId"` - Overwrite bool `json:overwrite` + Overwrite bool `json:"overwrite"` } // Deprecated: use NewDashboard instead diff --git a/datasource_test.go b/datasource_test.go index 4988719..5b65840 100644 --- a/datasource_test.go +++ b/datasource_test.go @@ -18,7 +18,7 @@ func gapiTestTools(code int, body string) (*httptest.Server, *Client) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(code) w.Header().Set("Content-Type", "application/json") - fmt.Fprintf(w, body) + fmt.Fprint(w, body) })) tr := &http.Transport{ diff --git a/folder.go b/folder.go index 55613c6..ffa68ab 100644 --- a/folder.go +++ b/folder.go @@ -63,6 +63,9 @@ func (c *Client) NewFolder(title string) (Folder, error) { "title": title, } data, err := json.Marshal(dataMap) + if err != nil { + return folder, err + } req, err := c.newRequest("POST", "/api/folders", nil, bytes.NewBuffer(data)) if err != nil { return folder, err @@ -91,6 +94,9 @@ func (c *Client) UpdateFolder(id string, name string) error { "name": name, } data, err := json.Marshal(dataMap) + if err != nil { + return err + } req, err := c.newRequest("PUT", fmt.Sprintf("/api/folders/%s", id), nil, bytes.NewBuffer(data)) if err != nil { return err diff --git a/org_users.go b/org_users.go index 69d8e0d..a20eddc 100644 --- a/org_users.go +++ b/org_users.go @@ -46,6 +46,9 @@ func (c *Client) AddOrgUser(orgId int64, user, role string) error { "role": role, } data, err := json.Marshal(dataMap) + if err != nil { + return err + } req, err := c.newRequest("POST", fmt.Sprintf("/api/orgs/%d/users", orgId), nil, bytes.NewBuffer(data)) if err != nil { return err @@ -65,6 +68,9 @@ func (c *Client) UpdateOrgUser(orgId, userId int64, role string) error { "role": role, } data, err := json.Marshal(dataMap) + if err != nil { + return err + } req, err := c.newRequest("PATCH", fmt.Sprintf("/api/orgs/%d/users/%d", orgId, userId), nil, bytes.NewBuffer(data)) if err != nil { return err diff --git a/orgs.go b/orgs.go index 2ef4e2d..4df27ab 100644 --- a/orgs.go +++ b/orgs.go @@ -78,11 +78,15 @@ func (c *Client) Org(id int64) (Org, error) { } func (c *Client) NewOrg(name string) (int64, error) { + id := int64(0) + dataMap := map[string]string{ "name": name, } data, err := json.Marshal(dataMap) - id := int64(0) + if err != nil { + return id, err + } req, err := c.newRequest("POST", "/api/orgs", nil, bytes.NewBuffer(data)) if err != nil { return id, err @@ -114,6 +118,9 @@ func (c *Client) UpdateOrg(id int64, name string) error { "name": name, } data, err := json.Marshal(dataMap) + if err != nil { + return err + } req, err := c.newRequest("PUT", fmt.Sprintf("/api/orgs/%d", id), nil, bytes.NewBuffer(data)) if err != nil { return err From 872ad9e3dbdfaa07a197ddd7275f3a96e41abe81 Mon Sep 17 00:00:00 2001 From: matthiasng Date: Mon, 23 Dec 2019 21:18:28 +0100 Subject: [PATCH 2/5] dashboard tests --- dashboard_test.go | 122 +++++++++++++++++++++++++++++++++++++++++++++ datasource_test.go | 29 ----------- mock.go | 45 +++++++++++++++++ 3 files changed, 167 insertions(+), 29 deletions(-) create mode 100644 dashboard_test.go create mode 100644 mock.go diff --git a/dashboard_test.go b/dashboard_test.go new file mode 100644 index 0000000..8b51b01 --- /dev/null +++ b/dashboard_test.go @@ -0,0 +1,122 @@ +package gapi + +import ( + "testing" + + "github.com/gobs/pretty" +) + +const ( + createdAndUpdateDashboardResponse = `{ + "slug": "test", + "id": 1, + "uid": "nErXDvCkzz", + "status": "success", + "version": 1 + }` + + getDashboardBySlugResponse = `{ + "dashboard": { + "id": 1, + "uid": "cIBgcSjkk", + "title": "Production Overview", + "version": 0 + }, + "meta": { + "isStarred": false, + "url": "/d/cIBgcSjkk/production-overview", + "slug": "production-overview" + } + }` +) + +func TestDashboardCreateAndUpdate(t *testing.T) { + server, client := gapiTestTools(200, createdAndUpdateDashboardResponse) + defer server.Close() + + dashboard := Dashboard{ + Model: map[string]interface{}{ + "title": "test", + }, + Folder: 0, + Overwrite: false, + } + + resp, err := client.NewDashboard(dashboard) + if err != nil { + t.Fatal(err) + } + + t.Log(pretty.PrettyFormat(resp)) + + if resp.Uid != "nErXDvCkzz" { + t.Errorf("Invalid uid - %s, Expected %s", resp.Uid, "nErXDvCkzz") + } + + for _, code := range []int{400, 401, 403, 412} { + server.code = code + _, err = client.NewDashboard(dashboard) + if err == nil { + t.Errorf("%d not detected", code) + } + } +} + +func TestDashboardGetBySlug(t *testing.T) { + server, client := gapiTestTools(200, getDashboardBySlugResponse) + defer server.Close() + + resp, err := client.Dashboard("test") + if err != nil { + t.Error(err) + } + + t.Log(pretty.PrettyFormat(resp)) + + uid, ok := resp.Model["uid"] + if !ok || uid != "cIBgcSjkk" { + t.Errorf("Invalid uid - %s, Expected %s", uid, "cIBgcSjkk") + } + + for _, code := range []int{401, 403, 404} { + server.code = code + _, err = client.Dashboard("test") + if err == nil { + t.Errorf("%d not detected", code) + } + } +} + +func TestDashboardDeleteBySlug(t *testing.T) { + server, client := gapiTestTools(200, "") + defer server.Close() + + err := client.DeleteDashboard("test") + if err != nil { + t.Error(err) + } + + for _, code := range []int{401, 403, 404, 412} { + server.code = code + err = client.DeleteDashboard("test") + if err == nil { + t.Errorf("%d not detected", code) + } + } +} + +// func TestDashboardNew(t *testing.T) { +// mock, client := newMockApiServer() +// defer mock.server.Close() + +// response, err := client.NewDashboard(exampleDashboard) +// if err != nil { +// t.Error(err) +// } + +// t.Log(pretty.PrettyFormat(response)) + +// if response.Uid == "" { +// t.Error("dashboard creation response should return the created dashboard UID") +// } +// } diff --git a/datasource_test.go b/datasource_test.go index 5b65840..7c3ff7f 100644 --- a/datasource_test.go +++ b/datasource_test.go @@ -1,10 +1,6 @@ package gapi import ( - "fmt" - "net/http" - "net/http/httptest" - "net/url" "testing" "github.com/gobs/pretty" @@ -14,31 +10,6 @@ const ( createdDataSourceJSON = `{"id":1,"message":"Datasource added", "name": "test_datasource"}` ) -func gapiTestTools(code int, body string) (*httptest.Server, *Client) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(code) - w.Header().Set("Content-Type", "application/json") - fmt.Fprint(w, body) - })) - - tr := &http.Transport{ - Proxy: func(req *http.Request) (*url.URL, error) { - return url.Parse(server.URL) - }, - } - - httpClient := &http.Client{Transport: tr} - - url := url.URL{ - Scheme: "http", - Host: "my-grafana.com", - } - - client := &Client{"my-key", url, httpClient} - - return server, client -} - func TestNewDataSource(t *testing.T) { server, client := gapiTestTools(200, createdDataSourceJSON) defer server.Close() diff --git a/mock.go b/mock.go new file mode 100644 index 0000000..607e27d --- /dev/null +++ b/mock.go @@ -0,0 +1,45 @@ +package gapi + +import ( + "fmt" + "net/http" + "net/http/httptest" + "net/url" +) + +type mockServer struct { + code int + server *httptest.Server +} + +func (m *mockServer) Close() { + m.server.Close() +} + +func gapiTestTools(code int, body string) (*mockServer, *Client) { + mock := &mockServer{ + code: code, + } + + mock.server = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(mock.code) + w.Header().Set("Content-Type", "application/json") + fmt.Fprint(w, body) + })) + + tr := &http.Transport{ + Proxy: func(req *http.Request) (*url.URL, error) { + return url.Parse(mock.server.URL) + }, + } + + httpClient := &http.Client{Transport: tr} + + url := url.URL{ + Scheme: "http", + Host: "my-grafana.com", + } + + client := &Client{"my-key", url, httpClient} + return mock, client +} From ea90ab92b3afc3def454bd327d13fbd3f36c36c5 Mon Sep 17 00:00:00 2001 From: matthiasng Date: Sun, 26 Jan 2020 12:44:25 +0100 Subject: [PATCH 3/5] *DashboardByUid tests --- dashboard_test.go | 52 ++++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/dashboard_test.go b/dashboard_test.go index 8b51b01..4a64186 100644 --- a/dashboard_test.go +++ b/dashboard_test.go @@ -15,7 +15,7 @@ const ( "version": 1 }` - getDashboardBySlugResponse = `{ + getDashboardResponse = `{ "dashboard": { "id": 1, "uid": "cIBgcSjkk", @@ -62,32 +62,43 @@ func TestDashboardCreateAndUpdate(t *testing.T) { } } -func TestDashboardGetBySlug(t *testing.T) { - server, client := gapiTestTools(200, getDashboardBySlugResponse) +func TestDashboardGet(t *testing.T) { + server, client := gapiTestTools(200, getDashboardResponse) defer server.Close() resp, err := client.Dashboard("test") if err != nil { t.Error(err) } - - t.Log(pretty.PrettyFormat(resp)) - uid, ok := resp.Model["uid"] if !ok || uid != "cIBgcSjkk" { t.Errorf("Invalid uid - %s, Expected %s", uid, "cIBgcSjkk") } + resp, err = client.DashboardByUID("cIBgcSjkk") + if err != nil { + t.Error(err) + } + uid, ok = resp.Model["uid"] + if !ok || uid != "cIBgcSjkk" { + t.Errorf("Invalid uid - %s, Expected %s", uid, "cIBgcSjkk") + } + for _, code := range []int{401, 403, 404} { server.code = code _, err = client.Dashboard("test") if err == nil { t.Errorf("%d not detected", code) } + + _, err = client.DashboardByUID("cIBgcSjkk") + if err == nil { + t.Errorf("%d not detected", code) + } } } -func TestDashboardDeleteBySlug(t *testing.T) { +func TestDashboardDelete(t *testing.T) { server, client := gapiTestTools(200, "") defer server.Close() @@ -96,27 +107,22 @@ func TestDashboardDeleteBySlug(t *testing.T) { t.Error(err) } + err = client.DeleteDashboardByUID("cIBgcSjkk") + if err != nil { + t.Error(err) + } + for _, code := range []int{401, 403, 404, 412} { server.code = code + err = client.DeleteDashboard("test") if err == nil { t.Errorf("%d not detected", code) } + + err = client.DeleteDashboardByUID("cIBgcSjkk") + if err == nil { + t.Errorf("%d not detected", code) + } } } - -// func TestDashboardNew(t *testing.T) { -// mock, client := newMockApiServer() -// defer mock.server.Close() - -// response, err := client.NewDashboard(exampleDashboard) -// if err != nil { -// t.Error(err) -// } - -// t.Log(pretty.PrettyFormat(response)) - -// if response.Uid == "" { -// t.Error("dashboard creation response should return the created dashboard UID") -// } -// } From 1bda260092aac2f0dd872179e6bee40040b3087c Mon Sep 17 00:00:00 2001 From: Tony Li Date: Tue, 2 Jun 2020 00:08:58 -0700 Subject: [PATCH 4/5] update test to use vet --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 7f493bc..d9ffe2c 100644 --- a/.drone.yml +++ b/.drone.yml @@ -8,4 +8,4 @@ steps: image: golang commands: - go mod download - - go test + - go test -race -vet all -mod readonly ./... From c3a11b4d0f130ca902ffd13b83e0fffd6c5d3b40 Mon Sep 17 00:00:00 2001 From: Tony Li Date: Tue, 2 Jun 2020 00:10:32 -0700 Subject: [PATCH 5/5] add test coverage info --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index d9ffe2c..6a14429 100644 --- a/.drone.yml +++ b/.drone.yml @@ -8,4 +8,4 @@ steps: image: golang commands: - go mod download - - go test -race -vet all -mod readonly ./... + - go test -cover -race -vet all -mod readonly ./...