diff --git a/fixture/GET/user.json b/fixture/GET/user.json new file mode 100644 index 00000000..93f33b4c --- /dev/null +++ b/fixture/GET/user.json @@ -0,0 +1,67 @@ +{ + "user": { + "id": 369531345753, + "url": "https://example.zendesk.com/api/v2/users/369531345753.json", + "name": "Sample customer", + "email": "customer@example.com", + "created_at": "2018-11-23T16:05:13Z", + "updated_at": "2018-11-23T16:05:14Z", + "time_zone": "Osaka", + "iana_time_zone": "Asia/Tokyo", + "phone": null, + "shared_phone_number": null, + "photo": { + "url": "https://example.zendesk.com/api/v2/attachments/360255188054.json", + "id": 360255188054, + "file_name": "profile_image_369531345753_9042965.jpg", + "content_url": "https://example.zendesk.com/system/photos/3602/5518/8054/profile_image_369531345753_9042965.jpg", + "mapped_content_url": "https://example.zendesk.com/system/photos/3602/5518/8054/profile_image_369531345753_9042965.jpg", + "content_type": "image/jpeg", + "size": 2587, + "width": 40, + "height": 40, + "inline": false, + "thumbnails": [ + { + "url": "https://example.zendesk.com/api/v2/attachments/360255188074.json", + "id": 360255188074, + "file_name": "profile_image_369531345753_9042965_thumb.jpg", + "content_url": "https://example.zendesk.com/system/photos/3602/5518/8054/profile_image_369531345753_9042965_thumb.jpg", + "mapped_content_url": "https://example.zendesk.com/system/photos/3602/5518/8054/profile_image_369531345753_9042965_thumb.jpg", + "content_type": "image/jpeg", + "size": 1973, + "width": 32, + "height": 32, + "inline": false + } + ] + }, + "locale_id": 1, + "locale": "en-US", + "organization_id": null, + "role": "end-user", + "verified": false, + "external_id": null, + "tags": [], + "alias": null, + "active": true, + "shared": false, + "shared_agent": false, + "last_login_at": null, + "two_factor_auth_enabled": false, + "signature": null, + "details": null, + "notes": null, + "role_type": null, + "custom_role_id": null, + "moderator": false, + "ticket_restriction": "requested", + "only_private_comments": false, + "restricted_agent": true, + "suspended": false, + "chat_only": false, + "default_group_id": null, + "report_csv": false, + "user_fields": {} + } +} \ No newline at end of file diff --git a/fixture/PUT/user.json b/fixture/PUT/user.json new file mode 100644 index 00000000..93f33b4c --- /dev/null +++ b/fixture/PUT/user.json @@ -0,0 +1,67 @@ +{ + "user": { + "id": 369531345753, + "url": "https://example.zendesk.com/api/v2/users/369531345753.json", + "name": "Sample customer", + "email": "customer@example.com", + "created_at": "2018-11-23T16:05:13Z", + "updated_at": "2018-11-23T16:05:14Z", + "time_zone": "Osaka", + "iana_time_zone": "Asia/Tokyo", + "phone": null, + "shared_phone_number": null, + "photo": { + "url": "https://example.zendesk.com/api/v2/attachments/360255188054.json", + "id": 360255188054, + "file_name": "profile_image_369531345753_9042965.jpg", + "content_url": "https://example.zendesk.com/system/photos/3602/5518/8054/profile_image_369531345753_9042965.jpg", + "mapped_content_url": "https://example.zendesk.com/system/photos/3602/5518/8054/profile_image_369531345753_9042965.jpg", + "content_type": "image/jpeg", + "size": 2587, + "width": 40, + "height": 40, + "inline": false, + "thumbnails": [ + { + "url": "https://example.zendesk.com/api/v2/attachments/360255188074.json", + "id": 360255188074, + "file_name": "profile_image_369531345753_9042965_thumb.jpg", + "content_url": "https://example.zendesk.com/system/photos/3602/5518/8054/profile_image_369531345753_9042965_thumb.jpg", + "mapped_content_url": "https://example.zendesk.com/system/photos/3602/5518/8054/profile_image_369531345753_9042965_thumb.jpg", + "content_type": "image/jpeg", + "size": 1973, + "width": 32, + "height": 32, + "inline": false + } + ] + }, + "locale_id": 1, + "locale": "en-US", + "organization_id": null, + "role": "end-user", + "verified": false, + "external_id": null, + "tags": [], + "alias": null, + "active": true, + "shared": false, + "shared_agent": false, + "last_login_at": null, + "two_factor_auth_enabled": false, + "signature": null, + "details": null, + "notes": null, + "role_type": null, + "custom_role_id": null, + "moderator": false, + "ticket_restriction": "requested", + "only_private_comments": false, + "restricted_agent": true, + "suspended": false, + "chat_only": false, + "default_group_id": null, + "report_csv": false, + "user_fields": {} + } +} \ No newline at end of file diff --git a/zendesk/mock/client.go b/zendesk/mock/client.go index fa82a487..98da6a71 100644 --- a/zendesk/mock/client.go +++ b/zendesk/mock/client.go @@ -693,6 +693,21 @@ func (mr *ClientMockRecorder) GetTriggers(arg0, arg1 interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTriggers", reflect.TypeOf((*Client)(nil).GetTriggers), arg0, arg1) } +// GetUser mocks base method +func (m *Client) GetUser(arg0 context.Context, arg1 int64) (zendesk.User, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetUser", arg0, arg1) + ret0, _ := ret[0].(zendesk.User) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetUser indicates an expected call of GetUser +func (mr *ClientMockRecorder) GetUser(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUser", reflect.TypeOf((*Client)(nil).GetUser), arg0, arg1) +} + // GetUserFields mocks base method func (m *Client) GetUserFields(arg0 context.Context, arg1 *zendesk.UserFieldListOptions) ([]zendesk.UserField, zendesk.Page, error) { m.ctrl.T.Helper() @@ -891,6 +906,21 @@ func (mr *ClientMockRecorder) UpdateTrigger(arg0, arg1, arg2 interface{}) *gomoc return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateTrigger", reflect.TypeOf((*Client)(nil).UpdateTrigger), arg0, arg1, arg2) } +// UpdateUser mocks base method +func (m *Client) UpdateUser(arg0 context.Context, arg1 int64, arg2 zendesk.User) (zendesk.User, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateUser", arg0, arg1, arg2) + ret0, _ := ret[0].(zendesk.User) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateUser indicates an expected call of UpdateUser +func (mr *ClientMockRecorder) UpdateUser(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateUser", reflect.TypeOf((*Client)(nil).UpdateUser), arg0, arg1, arg2) +} + // UploadAttachment mocks base method func (m *Client) UploadAttachment(arg0 context.Context, arg1, arg2 string) zendesk.UploadWriter { m.ctrl.T.Helper() diff --git a/zendesk/user.go b/zendesk/user.go index e027b904..fdc93f13 100644 --- a/zendesk/user.go +++ b/zendesk/user.go @@ -3,6 +3,7 @@ package zendesk import ( "context" "encoding/json" + "fmt" "time" ) @@ -81,7 +82,9 @@ func UserRoleText(role int) string { // UserAPI an interface containing all user related methods type UserAPI interface { GetUsers(ctx context.Context, opts *UserListOptions) ([]User, Page, error) + GetUser(ctx context.Context, userId int64) (User, error) CreateUser(ctx context.Context, user User) (User, error) + UpdateUser(ctx context.Context, userId int64, user User) (User, error) } // GetUsers fetch user list @@ -136,3 +139,42 @@ func (z *Client) CreateUser(ctx context.Context, user User) (User, error) { } // TODO: CreateOrUpdateManyUsers(users []User) + +// GetUser get an existing user +// ref: https://developer.zendesk.com/rest_api/docs/support/users#show-user +func (z *Client) GetUser(ctx context.Context, userId int64) (User, error) { + var result struct { + User User `json:"user"` + } + + body, err := z.get(ctx, fmt.Sprintf("/users/%d.json", userId)) + if err != nil { + return User{}, err + } + + err = json.Unmarshal(body, &result) + if err != nil { + return User{}, err + } + return result.User, nil +} + +// UpdateUser update an existing user +// ref: https://developer.zendesk.com/rest_api/docs/support/users#update-user +func (z *Client) UpdateUser(ctx context.Context, userId int64, user User) (User, error) { + var data, result struct { + User User `json:"user"` + } + data.User = user + + body, err := z.put(ctx, fmt.Sprintf("/users/%d.json", userId), data) + if err != nil { + return User{}, err + } + + err = json.Unmarshal(body, &result) + if err != nil { + return User{}, err + } + return result.User, nil +} diff --git a/zendesk/user_test.go b/zendesk/user_test.go index c178ff06..692b92ec 100644 --- a/zendesk/user_test.go +++ b/zendesk/user_test.go @@ -26,7 +26,23 @@ func TestGetUsers(t *testing.T) { } if len(users) != 2 { - t.Fatalf("expected length of triggers is 2, but got %d", len(users)) + t.Fatalf("expected length of userss is 2, but got %d", len(users)) + } +} + +func TestGetUser(t *testing.T) { + mockAPI := newMockAPI(http.MethodGet, "user.json") + client := newTestClient(mockAPI) + defer mockAPI.Close() + + user, err := client.GetUser(ctx, 369531345753) + if err != nil { + t.Fatalf("Failed to get user: %s", err) + } + + expectedID := int64(369531345753) + if user.ID != expectedID { + t.Fatalf("Returned user does not have the expected ID %d. User id is %d", expectedID, user.ID) } } @@ -72,3 +88,19 @@ func TestCreateUser(t *testing.T) { t.Fatal("Failed to create user") } } + +func TestUpdateUser(t *testing.T) { + mockAPI := newMockAPIWithStatus(http.MethodPut, "user.json", http.StatusOK) + client := newTestClient(mockAPI) + defer mockAPI.Close() + + user, err := client.UpdateUser(ctx, 369531345753, User{}) + if err != nil { + t.Fatalf("Failed to update user: %s", err) + } + + expectedID := int64(369531345753) + if user.ID != expectedID { + t.Fatalf("Returned user does not have the expected ID %d. User id is %d", expectedID, user.ID) + } +}