From 887fde3e89d8fcc0678b248d91adc966ae9caa3f Mon Sep 17 00:00:00 2001 From: nukosuke Date: Sat, 23 Mar 2019 16:31:59 +0900 Subject: [PATCH 1/5] Add GetTrigger, UpdateTrigger and DeleteTrigger --- zendesk/trigger.go | 58 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/zendesk/trigger.go b/zendesk/trigger.go index d7f3eef7..b1bac1fc 100644 --- a/zendesk/trigger.go +++ b/zendesk/trigger.go @@ -2,6 +2,7 @@ package zendesk import ( "encoding/json" + "fmt" "time" ) @@ -41,9 +42,13 @@ type Trigger struct { type TriggerAPI interface { GetTriggers() ([]Trigger, Page, error) CreateTrigger(trigger Trigger) (Trigger, error) + GetTrigger(id int64) (Trigger, error) + UpdateTrigger(id int64, trigger Trigger) (Trigger, error) + DeleteTrigger(id int64) error } // GetTriggers fetch trigger list +// ref: https://developer.zendesk.com/rest_api/docs/support/triggers#getting-triggers func (z *Client) GetTriggers() ([]Trigger, Page, error) { var data struct { Triggers []Trigger `json:"triggers"` @@ -63,7 +68,7 @@ func (z *Client) GetTriggers() ([]Trigger, Page, error) { } // CreateTrigger creates new trigger -// ref: https://developer.zendesk.com/rest_api/docs/core/triggers#create-trigger +// ref: https://developer.zendesk.com/rest_api/docs/support/triggers#create-trigger func (z *Client) CreateTrigger(trigger Trigger) (Trigger, error) { var data, result struct { Trigger Trigger `json:"trigger"` @@ -81,3 +86,54 @@ func (z *Client) CreateTrigger(trigger Trigger) (Trigger, error) { } return result.Trigger, nil } + +// GetTrigger returns the specified ticket form +// ref: https://developer.zendesk.com/rest_api/docs/support/triggers#getting-triggers +func (z *Client) GetTrigger(id int64) (Trigger, error) { + var result struct { + Trigger Trigger `json:"trigger"` + } + + body, err := z.Get(fmt.Sprintf("/triggers/%d.json", id)) + if err != nil { + return Trigger{}, err + } + + err = json.Unmarshal(body, &result) + if err != nil { + return Trigger{}, err + } + return result.Trigger, nil +} + +// UpdateTrigger updates the specified ticket form and returns the updated form +// ref: https://developer.zendesk.com/rest_api/docs/support/triggers#update-trigger +func (z *Client) UpdateTrigger(id int64, form Trigger) (Trigger, error) { + var data, result struct { + Trigger Trigger `json:"trigger"` + } + + data.Trigger = form + body, err := z.Put(fmt.Sprintf("/triggers/%d.json", id), data) + if err != nil { + return Trigger{}, err + } + + err = json.Unmarshal(body, &result) + if err != nil { + return Trigger{}, err + } + + return result.Trigger, nil +} + +// DeleteTrigger deletes the specified ticket form +// ref: https://developer.zendesk.com/rest_api/docs/support/triggers#delete-trigger +func (z *Client) DeleteTrigger(id int64) error { + err := z.Delete(fmt.Sprintf("/triggers/%d.json", id)) + if err != nil { + return err + } + + return nil +} From dfd2321effb1ad1e66bed943fc7265aa816dc6dc Mon Sep 17 00:00:00 2001 From: nukosuke Date: Sat, 23 Mar 2019 16:33:49 +0900 Subject: [PATCH 2/5] Add fixtures for trigger --- fixture/GET/trigger.json | 43 +++++++++++++++++++++++++++++++++++++++ fixture/PUT/triggers.json | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 fixture/GET/trigger.json create mode 100644 fixture/PUT/triggers.json diff --git a/fixture/GET/trigger.json b/fixture/GET/trigger.json new file mode 100644 index 00000000..d33acf80 --- /dev/null +++ b/fixture/GET/trigger.json @@ -0,0 +1,43 @@ +{ + "trigger": { + "url": "https://example.zendesk.com/api/v2/triggers/360056295714.json", + "id": 360056295714, + "title": "Notify requester of received request", + "active": true, + "updated_at": "2018-11-23T16:05:14Z", + "created_at": "2018-11-23T16:05:12Z", + "actions": [ + { + "field": "notification_user", + "value": [ + "requester_id", + "[Request received]", + "Your request ({{ticket.id}}) has been received and is being reviewed by our support staff.\n\nTo add additional comments, reply to this email." + ] + } + ], + "conditions": { + "all": [ + { + "field": "update_type", + "operator": "is", + "value": "Create" + }, + { + "field": "status", + "operator": "is_not", + "value": "solved" + }, + { + "field": "ticket_is_public", + "operator": "is", + "value": "public" + } + ], + "any": [] + }, + "description": null, + "position": 0, + "raw_title": "Notify requester of received request" + } +} diff --git a/fixture/PUT/triggers.json b/fixture/PUT/triggers.json new file mode 100644 index 00000000..d33acf80 --- /dev/null +++ b/fixture/PUT/triggers.json @@ -0,0 +1,43 @@ +{ + "trigger": { + "url": "https://example.zendesk.com/api/v2/triggers/360056295714.json", + "id": 360056295714, + "title": "Notify requester of received request", + "active": true, + "updated_at": "2018-11-23T16:05:14Z", + "created_at": "2018-11-23T16:05:12Z", + "actions": [ + { + "field": "notification_user", + "value": [ + "requester_id", + "[Request received]", + "Your request ({{ticket.id}}) has been received and is being reviewed by our support staff.\n\nTo add additional comments, reply to this email." + ] + } + ], + "conditions": { + "all": [ + { + "field": "update_type", + "operator": "is", + "value": "Create" + }, + { + "field": "status", + "operator": "is_not", + "value": "solved" + }, + { + "field": "ticket_is_public", + "operator": "is", + "value": "public" + } + ], + "any": [] + }, + "description": null, + "position": 0, + "raw_title": "Notify requester of received request" + } +} From fb4e9d0208fbf211a0b9f295d1cd03faf8c2c3fa Mon Sep 17 00:00:00 2001 From: nukosuke Date: Sat, 23 Mar 2019 16:42:19 +0900 Subject: [PATCH 3/5] Add test for trigger --- zendesk/trigger_test.go | 85 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/zendesk/trigger_test.go b/zendesk/trigger_test.go index d4205af1..9a643677 100644 --- a/zendesk/trigger_test.go +++ b/zendesk/trigger_test.go @@ -2,6 +2,7 @@ package zendesk import ( "net/http" + "net/http/httptest" "testing" ) @@ -30,3 +31,87 @@ func TestCreateTrigger(t *testing.T) { t.Fatalf("Failed to send request to create trigger: %s", err) } } + +func TestGetTrigger(t *testing.T) { + mockAPI := newMockAPI(http.MethodGet, "trigger.json") + client := newTestClient(mockAPI) + defer mockAPI.Close() + + trg, err := client.GetTrigger(123) + if err != nil { + t.Fatalf("Failed to get trigger: %s", err) + } + + expectedID := int64(360056295714) + if trg.ID != expectedID { + t.Fatalf("Returned trigger does not have the expected ID %d. Trigger id is %d", expectedID, trg.ID) + } +} + +func TestGetTriggerFailure(t *testing.T) { + mockAPI := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusInternalServerError) + w.Write(nil) + })) + + c := newTestClient(mockAPI) + _, err := c.GetTrigger(1234) + if err == nil { + t.Fatal("Client did not return error when api failed") + } +} + +func TestUpdateTrigger(t *testing.T) { + mockAPI := newMockAPIWithStatus(http.MethodPut, "triggers.json", http.StatusOK) + client := newTestClient(mockAPI) + defer mockAPI.Close() + + trg, err := client.UpdateTrigger(123, Trigger{}) + if err != nil { + t.Fatalf("Failed to get trigger: %s", err) + } + + expectedID := int64(360056295714) + if trg.ID != expectedID { + t.Fatalf("Returned trigger does not have the expected ID %d. Trigger id is %d", expectedID, trg.ID) + } +} + +func TestUpdateTriggerFailure(t *testing.T) { + mockAPI := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusInternalServerError) + w.Write(nil) + })) + + c := newTestClient(mockAPI) + _, err := c.UpdateTrigger(1234, Trigger{}) + if err == nil { + t.Fatal("Client did not return error when api failed") + } +} + +func TestDeleteTrigger(t *testing.T) { + mockAPI := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNoContent) + w.Write(nil) + })) + + c := newTestClient(mockAPI) + err := c.DeleteTrigger(1234) + if err != nil { + t.Fatalf("Failed to delete trigger: %s", err) + } +} + +func TestDeleteTriggerFailure(t *testing.T) { + mockAPI := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusInternalServerError) + w.Write(nil) + })) + + c := newTestClient(mockAPI) + err := c.DeleteTrigger(1234) + if err == nil { + t.Fatal("Client did not return error when api failed") + } +} From a712113bd1e8350f4ee0c24a33c22abbd626de5e Mon Sep 17 00:00:00 2001 From: nukosuke Date: Sat, 23 Mar 2019 16:42:27 +0900 Subject: [PATCH 4/5] Update mock client --- zendesk/mock/client.go | 44 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/zendesk/mock/client.go b/zendesk/mock/client.go index ad09fcbf..f68381dc 100644 --- a/zendesk/mock/client.go +++ b/zendesk/mock/client.go @@ -179,6 +179,20 @@ func (mr *ClientMockRecorder) DeleteTicketForm(arg0 interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteTicketForm", reflect.TypeOf((*Client)(nil).DeleteTicketForm), arg0) } +// DeleteTrigger mocks base method +func (m *Client) DeleteTrigger(arg0 int64) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteTrigger", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteTrigger indicates an expected call of DeleteTrigger +func (mr *ClientMockRecorder) DeleteTrigger(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteTrigger", reflect.TypeOf((*Client)(nil).DeleteTrigger), arg0) +} + // DeleteUpload mocks base method func (m *Client) DeleteUpload(arg0 string) error { m.ctrl.T.Helper() @@ -331,6 +345,21 @@ func (mr *ClientMockRecorder) GetTicketForms() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTicketForms", reflect.TypeOf((*Client)(nil).GetTicketForms)) } +// GetTrigger mocks base method +func (m *Client) GetTrigger(arg0 int64) (zendesk.Trigger, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetTrigger", arg0) + ret0, _ := ret[0].(zendesk.Trigger) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTrigger indicates an expected call of GetTrigger +func (mr *ClientMockRecorder) GetTrigger(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTrigger", reflect.TypeOf((*Client)(nil).GetTrigger), arg0) +} + // GetTriggers mocks base method func (m *Client) GetTriggers() ([]zendesk.Trigger, zendesk.Page, error) { m.ctrl.T.Helper() @@ -423,6 +452,21 @@ func (mr *ClientMockRecorder) UpdateTicketForm(arg0, arg1 interface{}) *gomock.C return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateTicketForm", reflect.TypeOf((*Client)(nil).UpdateTicketForm), arg0, arg1) } +// UpdateTrigger mocks base method +func (m *Client) UpdateTrigger(arg0 int64, arg1 zendesk.Trigger) (zendesk.Trigger, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateTrigger", arg0, arg1) + ret0, _ := ret[0].(zendesk.Trigger) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateTrigger indicates an expected call of UpdateTrigger +func (mr *ClientMockRecorder) UpdateTrigger(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateTrigger", reflect.TypeOf((*Client)(nil).UpdateTrigger), arg0, arg1) +} + // UploadAttachment mocks base method func (m *Client) UploadAttachment(arg0, arg1 string) zendesk.UploadWriter { m.ctrl.T.Helper() From 02d1f78556034feb10a1a1ac4504b20e913ac0e3 Mon Sep 17 00:00:00 2001 From: nukosuke Date: Sat, 23 Mar 2019 19:12:32 +0900 Subject: [PATCH 5/5] Fix comment & var name --- zendesk/trigger.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/zendesk/trigger.go b/zendesk/trigger.go index b1bac1fc..cd4b1e32 100644 --- a/zendesk/trigger.go +++ b/zendesk/trigger.go @@ -87,7 +87,7 @@ func (z *Client) CreateTrigger(trigger Trigger) (Trigger, error) { return result.Trigger, nil } -// GetTrigger returns the specified ticket form +// GetTrigger returns the specified trigger // ref: https://developer.zendesk.com/rest_api/docs/support/triggers#getting-triggers func (z *Client) GetTrigger(id int64) (Trigger, error) { var result struct { @@ -106,14 +106,14 @@ func (z *Client) GetTrigger(id int64) (Trigger, error) { return result.Trigger, nil } -// UpdateTrigger updates the specified ticket form and returns the updated form +// UpdateTrigger updates the specified trigger and returns the updated one // ref: https://developer.zendesk.com/rest_api/docs/support/triggers#update-trigger -func (z *Client) UpdateTrigger(id int64, form Trigger) (Trigger, error) { +func (z *Client) UpdateTrigger(id int64, trigger Trigger) (Trigger, error) { var data, result struct { Trigger Trigger `json:"trigger"` } - data.Trigger = form + data.Trigger = trigger body, err := z.Put(fmt.Sprintf("/triggers/%d.json", id), data) if err != nil { return Trigger{}, err @@ -127,7 +127,7 @@ func (z *Client) UpdateTrigger(id int64, form Trigger) (Trigger, error) { return result.Trigger, nil } -// DeleteTrigger deletes the specified ticket form +// DeleteTrigger deletes the specified trigger // ref: https://developer.zendesk.com/rest_api/docs/support/triggers#delete-trigger func (z *Client) DeleteTrigger(id int64) error { err := z.Delete(fmt.Sprintf("/triggers/%d.json", id))