Skip to content

Commit

Permalink
Merge pull request #215 from eSchwander/create-or-update-user
Browse files Browse the repository at this point in the history
Adding create or update user api
  • Loading branch information
nukosuke committed Feb 14, 2022
2 parents 3bb0343 + d725a23 commit 85b7708
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 2 deletions.
9 changes: 9 additions & 0 deletions zendesk/mock/client.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 22 additions & 1 deletion zendesk/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ 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)
CreateOrUpdateUser(ctx context.Context, user User) (User, error)
UpdateUser(ctx context.Context, userID int64, user User) (User, error)
GetUserRelated(ctx context.Context, userID int64) (UserRelated, error)
}
Expand Down Expand Up @@ -175,7 +176,7 @@ func (z *Client) GetManyUsers(ctx context.Context, opts *GetManyUsersOptions) ([
//TODO: GetUsersByGroupID, GetUsersByOrganizationID

// CreateUser creates new user
// ref: https://developer.zendesk.com/rest_api/docs/core/triggers#create-trigger
// ref: https://developer.zendesk.com/api-reference/ticketing/users/users/#create-user
func (z *Client) CreateUser(ctx context.Context, user User) (User, error) {
var data, result struct {
User User `json:"user"`
Expand All @@ -194,6 +195,26 @@ func (z *Client) CreateUser(ctx context.Context, user User) (User, error) {
return result.User, nil
}

// CreateOrUpdateUser creates new user or updates a matching user
// ref: https://developer.zendesk.com/api-reference/ticketing/users/users/#create-or-update-user
func (z *Client) CreateOrUpdateUser(ctx context.Context, user User) (User, error) {
var data, result struct {
User User `json:"user"`
}
data.User = user

body, err := z.post(ctx, "/users/create_or_update.json", data)
if err != nil {
return User{}, err
}

err = json.Unmarshal(body, &result)
if err != nil {
return User{}, err
}
return result.User, nil
}

// TODO: CreateOrUpdateManyUsers(users []User)

// GetUser get an existing user
Expand Down
46 changes: 46 additions & 0 deletions zendesk/user_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,52 @@ func TestCreateUser(t *testing.T) {
}
}

func TestCreateOrUpdateUserCreated(t *testing.T) {
mockAPI := newMockAPIWithStatus(http.MethodPost, "users.json", http.StatusCreated)
client := newTestClient(mockAPI)
defer mockAPI.Close()

user, err := client.CreateOrUpdateUser(ctx, User{
Email: "test@example.com",
Name: "testuser",
})
if err != nil {
t.Fatalf("Failed to get valid response: %s", err)
}
if user.ID == 0 {
t.Fatal("Failed to create or update user")
}
}

func TestCreateOrUpdateUserUpdated(t *testing.T) {
mockAPI := newMockAPIWithStatus(http.MethodPost, "users.json", http.StatusOK)
client := newTestClient(mockAPI)
defer mockAPI.Close()

user, err := client.CreateOrUpdateUser(ctx, User{
Email: "test@example.com",
Name: "testuser",
})
if err != nil {
t.Fatalf("Failed to get valid response: %s", err)
}
if user.ID == 0 {
t.Fatal("Failed to create or update user")
}
}

func TestCreateOrUpdateUserFailure(t *testing.T) {
mockAPI := newMockAPIWithStatus(http.MethodPost, "users.json", http.StatusInternalServerError)

client := newTestClient(mockAPI)
defer mockAPI.Close()

_, err := client.CreateOrUpdateUser(ctx, User{})
if err == nil {
t.Fatal("Client did not return error when api failed")
}
}

func TestUpdateUser(t *testing.T) {
mockAPI := newMockAPIWithStatus(http.MethodPut, "user.json", http.StatusOK)
client := newTestClient(mockAPI)
Expand Down
2 changes: 1 addition & 1 deletion zendesk/zendesk.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ func (z *Client) post(ctx context.Context, path string, data interface{}) ([]byt
return nil, err
}

if resp.StatusCode != http.StatusCreated {
if !(resp.StatusCode == http.StatusOK || resp.StatusCode == http.StatusCreated) {
return nil, Error{
body: body,
resp: resp,
Expand Down

0 comments on commit 85b7708

Please sign in to comment.