From 5536d50d2555892a2cdc778f9717d30d926c4566 Mon Sep 17 00:00:00 2001 From: Alexander Hellbom Date: Wed, 6 Dec 2017 10:33:38 +0100 Subject: [PATCH] Add support for extensions and extension schemas (#19) * Add support for extensions and extension schemas * Add tests for extensions * Add extension schema tests --- pagerduty/extension.go | 95 +++++++++++++++++++++ pagerduty/extension_schema.go | 60 +++++++++++++ pagerduty/extension_schema_test.go | 57 +++++++++++++ pagerduty/extension_test.go | 131 +++++++++++++++++++++++++++++ pagerduty/pagerduty.go | 4 + pagerduty/references.go | 3 + 6 files changed, 350 insertions(+) create mode 100644 pagerduty/extension.go create mode 100644 pagerduty/extension_schema.go create mode 100644 pagerduty/extension_schema_test.go create mode 100644 pagerduty/extension_test.go diff --git a/pagerduty/extension.go b/pagerduty/extension.go new file mode 100644 index 00000000..1f823e54 --- /dev/null +++ b/pagerduty/extension.go @@ -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 +} diff --git a/pagerduty/extension_schema.go b/pagerduty/extension_schema.go new file mode 100644 index 00000000..1fc0a162 --- /dev/null +++ b/pagerduty/extension_schema.go @@ -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 +} diff --git a/pagerduty/extension_schema_test.go b/pagerduty/extension_schema_test.go new file mode 100644 index 00000000..5887384a --- /dev/null +++ b/pagerduty/extension_schema_test.go @@ -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) + } +} diff --git a/pagerduty/extension_test.go b/pagerduty/extension_test.go new file mode 100644 index 00000000..aab8df12 --- /dev/null +++ b/pagerduty/extension_test.go @@ -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) + } +} diff --git a/pagerduty/pagerduty.go b/pagerduty/pagerduty.go index 506b0db8..33232279 100644 --- a/pagerduty/pagerduty.go +++ b/pagerduty/pagerduty.go @@ -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 } @@ -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 } diff --git a/pagerduty/references.go b/pagerduty/references.go index 5222b4bd..e81f326b 100644 --- a/pagerduty/references.go +++ b/pagerduty/references.go @@ -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