Skip to content

Commit

Permalink
Add support for extension schemas
Browse files Browse the repository at this point in the history
  • Loading branch information
heimweh committed Feb 4, 2020
1 parent 65bf90f commit 76aaa2d
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 0 deletions.
70 changes: 70 additions & 0 deletions extension_schema.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package pagerduty

import (
"fmt"
"net/http"

"github.com/google/go-querystring/query"
)

type ExtensionSchema struct {
APIObject
IconURL string `json:"icon_url"`
LogoURL string `json:"logo_url"`
Label string `json:"label"`
Key string `json:"key"`
Description string `json:"description"`
GuideURL string `json:"guide_url"`
SendTypes []string `json:"send_types"`
URL string `json:"url"`
}

type ListExtensionSchemaResponse struct {
APIListObject
ExtensionSchemas []ExtensionSchema `json:"extension_schemas"`
}

type ListExtensionSchemaOptions struct {
APIListObject
Query string `url:"query,omitempty"`
}

func (c *Client) ListExtensionSchemas(o ListExtensionSchemaOptions) (*ListExtensionSchemaResponse, error) {
v, err := query.Values(o)
if err != nil {
return nil, err
}

resp, err := c.get("/extension_schemas?" + v.Encode())
if err != nil {
return nil, err
}

var result ListExtensionSchemaResponse

return &result, c.decodeJSON(resp, &result)
}

func (c *Client) GetExtensionSchema(id string) (*ExtensionSchema, error) {
resp, err := c.get("/extension_schemas/" + id)
return getExtensionSchemaFromResponse(c, resp, err)
}

func getExtensionSchemaFromResponse(c *Client, resp *http.Response, err error) (*ExtensionSchema, error) {
if err != nil {
return nil, err
}

var target map[string]ExtensionSchema
if dErr := c.decodeJSON(resp, &target); dErr != nil {
return nil, fmt.Errorf("Could not decode JSON response: %v", dErr)
}

rootNode := "extension_schema"
t, nodeOK := target[rootNode]
if !nodeOK {
return nil, fmt.Errorf("JSON response does not have %s field", rootNode)
}

return &t, nil
}
78 changes: 78 additions & 0 deletions extension_schema_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package pagerduty

import (
"net/http"
"testing"
)

func TestExtensionSchema_List(t *testing.T) {
setup()
defer teardown()

mux.HandleFunc("/extension_schemas", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
w.Write([]byte(`{"extension_schemas":[{"id":"1","summary":"foo","send_types":["trigger", "acknowledge", "resolve"]}]}`))

})

var listObj = APIListObject{Limit: 0, Offset: 0, More: false, Total: 0}
var client = &Client{apiEndpoint: server.URL, authToken: "foo", HTTPClient: defaultHTTPClient}
var opts = ListExtensionSchemaOptions{
APIListObject: listObj,
Query: "foo",
}

res, err := client.ListExtensionSchemas(opts)

want := &ListExtensionSchemaResponse{
APIListObject: listObj,
ExtensionSchemas: []ExtensionSchema{
{
APIObject: APIObject{
ID: "1",
Summary: "foo",
},
SendTypes: []string{
"trigger",
"acknowledge",
"resolve",
},
},
},
}

if err != nil {
t.Fatal(err)
}
testEqual(t, want, res)
}

func TestExtensionSchema_Get(t *testing.T) {
setup()
defer teardown()

mux.HandleFunc("/extension_schemas/1", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
w.Write([]byte(`{"extension_schema": {"name": "foo", "id": "1", "send_types": ["trigger", "acknowledge", "resolve"]}}`))
})

var client = &Client{apiEndpoint: server.URL, authToken: "foo", HTTPClient: defaultHTTPClient}

res, err := client.GetExtensionSchema("1")

want := &ExtensionSchema{
APIObject: APIObject{
ID: "1",
},
SendTypes: []string{
"trigger",
"acknowledge",
"resolve",
},
}

if err != nil {
t.Fatal(err)
}
testEqual(t, want, res)
}

0 comments on commit 76aaa2d

Please sign in to comment.