Skip to content

Commit

Permalink
Add support for extensions and extension schemas (PagerDuty#19)
Browse files Browse the repository at this point in the history
* Add support for extensions and extension schemas

* Add tests for extensions

* Add extension schema tests
  • Loading branch information
heimweh committed Dec 6, 2017
1 parent 64f5bd2 commit 5536d50
Show file tree
Hide file tree
Showing 6 changed files with 350 additions and 0 deletions.
95 changes: 95 additions & 0 deletions pagerduty/extension.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package pagerduty

import "fmt"

// ExtensionService handles the communication with extension related methods
// of the PagerDuty API.
type ExtensionService service

// Extension represents an extension.
type Extension struct {
Extension *Extension `json:"extension,omitempty"`
ID string `json:"id,omitempty"`
Summary string `json:"summary,omitempty"`
Type string `json:"type,omitempty"`
Self string `json:"self,omitempty"`
HTMLURL string `json:"html_url,omitempty"`
Name string `json:"name"`
EndpointURL string `json:"endpoint_url,omitempty"`
ExtensionObjects []*ServiceReference `json:"extension_objects,omitempty"`
ExtensionSchema *ExtensionSchemaReference `json:"extension_schema"`
}

// ListExtensionsOptions represents options when listing extensions.
type ListExtensionsOptions struct {
ExtensionObjectID string `url:"extension_object_id,omitempty"`
Query string `url:"query,omitempty"`
ExtensionSchemaID string `url:"extension_schema_id,omitempty"`
Include []string `url:"include,omitempty,brackets"`
}

// ListExtensionsResponse represents a list response of extensions.
type ListExtensionsResponse struct {
Limit int `json:"limit,omitempty"`
Extensions []*Extension `json:"extensions,omitempty"`
More bool `json:"more,omitempty"`
Offset int `json:"offset,omitempty"`
Total int `json:"total,omitempty"`
}

// List lists existing extensions.
func (s *ExtensionService) List(o *ListExtensionsOptions) (*ListExtensionsResponse, *Response, error) {
u := "/extensions"
v := new(ListExtensionsResponse)

resp, err := s.client.newRequestDo("GET", u, o, nil, &v)
if err != nil {
return nil, nil, err
}

return v, resp, nil
}

// Create creates a new extension.
func (s *ExtensionService) Create(extension *Extension) (*Extension, *Response, error) {
u := "/extensions"
v := new(Extension)

resp, err := s.client.newRequestDo("POST", u, nil, &Extension{Extension: extension}, v)
if err != nil {
return nil, nil, err
}

return v.Extension, resp, nil
}

// Delete removes an existing extension.
func (s *ExtensionService) Delete(id string) (*Response, error) {
u := fmt.Sprintf("/extensions/%s", id)
return s.client.newRequestDo("DELETE", u, nil, nil, nil)
}

// Get retrieves information about an extension.
func (s *ExtensionService) Get(id string) (*Extension, *Response, error) {
u := fmt.Sprintf("/extensions/%s", id)
v := new(Extension)

resp, err := s.client.newRequestDo("GET", u, nil, nil, &v)
if err != nil {
return nil, nil, err
}

return v.Extension, resp, nil
}

// Update updates an existing extension.
func (s *ExtensionService) Update(id string, extension *Extension) (*Extension, *Response, error) {
u := fmt.Sprintf("/extensions/%s", id)
v := new(Extension)
resp, err := s.client.newRequestDo("PUT", u, nil, &Extension{Extension: extension}, &v)
if err != nil {
return nil, nil, err
}

return v.Extension, resp, nil
}
60 changes: 60 additions & 0 deletions pagerduty/extension_schema.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package pagerduty

import "fmt"

// ExtensionSchemaService handles the communication with extension schemas related methods
// of the PagerDuty API.
type ExtensionSchemaService service

// ExtensionSchema represents an extension schema.
type ExtensionSchema struct {
ExtensionSchema *ExtensionSchema `json:"extension_schema,omitempty"`
Description string `json:"description,omitempty"`
GuideURL string `json:"guide_url,omitempty"`
HTMLURL string `json:"html_url,omitempty"`
IconURL string `json:"icon_url,omitempty"`
ID string `json:"id,omitempty"`
Key string `json:"key,omitempty"`
Label string `json:"label,omitempty"`
LogoURL string `json:"logo_url,omitempty"`
Self string `json:"self,omitempty"`
SendTypes []string `json:"send_types,omitempty"`
Summary string `json:"summary,omitempty"`
Type string `json:"type,omitempty"`
URL string `json:"url,omitempty"`
}

// ListExtensionSchemasResponse represents a list response of extension schemas.
type ListExtensionSchemasResponse struct {
ExtensionSchemas []*ExtensionSchema `json:"extension_schemas,omitempty"`
Limit int `json:"limit,omitempty"`
More bool `json:"more,omitempty"`
Offset int `json:"offset,omitempty"`
Total int `json:"total,omitempty"`
}

// List lists extension schemas.
func (s *ExtensionSchemaService) List() (*ListExtensionSchemasResponse, *Response, error) {
u := "/extension_schemas"
v := new(ListExtensionSchemasResponse)

resp, err := s.client.newRequestDo("GET", u, nil, nil, &v)
if err != nil {
return nil, nil, err
}

return v, resp, nil
}

// Get retrieves information about an extension schema.
func (s *ExtensionSchemaService) Get(id string) (*ExtensionSchema, *Response, error) {
u := fmt.Sprintf("/extension_schemas/%s", id)
v := new(ExtensionSchema)

resp, err := s.client.newRequestDo("GET", u, nil, nil, &v)
if err != nil {
return nil, nil, err
}

return v.ExtensionSchema, resp, nil
}
57 changes: 57 additions & 0 deletions pagerduty/extension_schema_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package pagerduty

import (
"net/http"
"reflect"
"testing"
)

func TestExtensionSchemasList(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"}]}`))
})

resp, _, err := client.ExtensionSchemas.List()
if err != nil {
t.Fatal(err)
}

want := &ListExtensionSchemasResponse{
ExtensionSchemas: []*ExtensionSchema{
{
ID: "1",
},
},
}

if !reflect.DeepEqual(resp, want) {
t.Errorf("returned \n\n%#v want \n\n%#v", resp, want)
}
}

func TestExtensionSchemasGet(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": {"id": "1"}}`))
})

resp, _, err := client.ExtensionSchemas.Get("1")
if err != nil {
t.Fatal(err)
}

want := &ExtensionSchema{
ID: "1",
}

if !reflect.DeepEqual(resp, want) {
t.Errorf("returned \n\n%#v want \n\n%#v", resp, want)
}
}
131 changes: 131 additions & 0 deletions pagerduty/extension_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
package pagerduty

import (
"encoding/json"
"net/http"
"reflect"
"testing"
)

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

mux.HandleFunc("/extensions", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
w.Write([]byte(`{"extensions": [{"id": "1"}]}`))
})

resp, _, err := client.Extensions.List(&ListExtensionsOptions{})
if err != nil {
t.Fatal(err)
}

want := &ListExtensionsResponse{
Extensions: []*Extension{
{
ID: "1",
},
},
}

if !reflect.DeepEqual(resp, want) {
t.Errorf("returned \n\n%#v want \n\n%#v", resp, want)
}
}

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

input := &Extension{Name: "foo"}

mux.HandleFunc("/extensions", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "POST")
v := new(Extension)
json.NewDecoder(r.Body).Decode(v)
if !reflect.DeepEqual(v.Extension, input) {
t.Errorf("Request body = %+v, want %+v", v, input)
}
w.Write([]byte(`{"extension": {"name": "foo", "id": "1"}}`))
})

resp, _, err := client.Extensions.Create(input)
if err != nil {
t.Fatal(err)
}

want := &Extension{
Name: "foo",
ID: "1",
}

if !reflect.DeepEqual(resp, want) {
t.Errorf("returned \n\n%#v want \n\n%#v", resp, want)
}
}

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

mux.HandleFunc("/extensions/1", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "DELETE")
w.WriteHeader(http.StatusNoContent)
})

if _, err := client.Extensions.Delete("1"); err != nil {
t.Fatal(err)
}
}

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

mux.HandleFunc("/extensions/1", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
w.Write([]byte(`{"extension": {"id": "1"}}`))
})

resp, _, err := client.Extensions.Get("1")
if err != nil {
t.Fatal(err)
}

want := &Extension{
ID: "1",
}

if !reflect.DeepEqual(resp, want) {
t.Errorf("returned \n\n%#v want \n\n%#v", resp, want)
}
}

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

input := &Extension{
Name: "foo",
}

mux.HandleFunc("/extensions/1", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "PUT")
w.Write([]byte(`{"extension": {"name": "foo", "id": "1"}}`))
})

resp, _, err := client.Extensions.Update("1", input)
if err != nil {
t.Fatal(err)
}

want := &Extension{
Name: "foo",
ID: "1",
}

if !reflect.DeepEqual(resp, want) {
t.Errorf("returned \n\n%#v want \n\n%#v", resp, want)
}
}
4 changes: 4 additions & 0 deletions pagerduty/pagerduty.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,12 @@ type Client struct {
Abilities *AbilityService
Addons *AddonService
EscalationPolicies *EscalationPolicyService
Extensions *ExtensionService
MaintenanceWindows *MaintenanceWindowService
Schedules *ScheduleService
Services *ServicesService
Teams *TeamService
ExtensionSchemas *ExtensionSchemaService
Users *UserService
Vendors *VendorService
}
Expand Down Expand Up @@ -80,6 +82,8 @@ func NewClient(config *Config) (*Client, error) {
c.Teams = &TeamService{c}
c.Users = &UserService{c}
c.Vendors = &VendorService{c}
c.Extensions = &ExtensionService{c}
c.ExtensionSchemas = &ExtensionSchemaService{c}

return c, nil
}
Expand Down
3 changes: 3 additions & 0 deletions pagerduty/references.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,6 @@ type EscalationTargetReference resourceReference

// VendorReference represents a reference to a vendor
type VendorReference resourceReference

// ExtensionSchemaReference represents a reference to an extension schema
type ExtensionSchemaReference resourceReference

0 comments on commit 5536d50

Please sign in to comment.