From 9f96faa2c274eeb36391ff652f6779a6052becf8 Mon Sep 17 00:00:00 2001 From: Akeda Bagus Date: Thu, 27 Jun 2013 05:49:57 +0700 Subject: [PATCH] Add ListEmails, AddEmails, and DeleteEmails for Users service. This includes tests for relevant methods. Fixes #14. --- github/users.go | 47 +++++++++++++++++++++++++++++ github/users_test.go | 71 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) diff --git a/github/users.go b/github/users.go index 6cc5f9e..d4e7edb 100644 --- a/github/users.go +++ b/github/users.go @@ -40,6 +40,9 @@ type User struct { CreatedAt *time.Time `json:"created_at,omitempty"` } +// UserEmail represents user's email address +type UserEmail string + // Get fetches a user. Passing the empty string will fetch the authenticated // user. // @@ -104,3 +107,47 @@ func (s *UsersService) ListAll(opt *UserListOptions) ([]User, error) { _, err = s.client.Do(req, users) return *users, err } + +// ListEmails lists all authenticated user email addresses +// +// GitHub API docs: http://developer.github.com/v3/users/emails/#list-email-addresses-for-a-user +func (s *UsersService) ListEmails() ([]UserEmail, error) { + u := "user/emails" + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, err + } + + emails := new([]UserEmail) + _, err = s.client.Do(req, emails) + return *emails, err +} + +// AddEmails adds email addresses of authenticated user +// +// GitHub API docs: http://developer.github.com/v3/users/emails/#add-email-addresses +func (s *UsersService) AddEmails(emails *[]UserEmail) (*[]UserEmail, error) { + u := "user/emails" + req, err := s.client.NewRequest("POST", u, emails) + if err != nil { + return nil, err + } + + e := new([]UserEmail) + _, err = s.client.Do(req, e) + return e, err +} + +// DeleteEmails deletes email addresses from authenticated user +// +// GitHub API docs: http://developer.github.com/v3/users/emails/#delete-email-addresses +func (s *UsersService) DeleteEmails(emails *[]UserEmail) error { + u := "user/emails" + req, err := s.client.NewRequest("DELETE", u, emails) + if err != nil { + return err + } + + _, err = s.client.Do(req, nil) + return err +} diff --git a/github/users_test.go b/github/users_test.go index 6a16931..d837efe 100644 --- a/github/users_test.go +++ b/github/users_test.go @@ -109,3 +109,74 @@ func TestUsersService_ListAll(t *testing.T) { t.Errorf("Users.ListAll returned %+v, want %+v", users, want) } } + +func TestUsersService_ListEmails(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/user/emails", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `["user@example.com"]`) + }) + + emails, err := client.Users.ListEmails() + if err != nil { + t.Errorf("Users.ListEmails returned error: %v", err) + } + + want := []UserEmail{"user@example.com"} + if !reflect.DeepEqual(emails, want) { + t.Errorf("Users.ListEmails returned %+v, want %+v", emails, want) + } +} + +func TestUsersService_AddEmails(t *testing.T) { + setup() + defer teardown() + + input := &[]UserEmail{"new@example.com"} + + mux.HandleFunc("/user/emails", func(w http.ResponseWriter, r *http.Request) { + v := &[]UserEmail{} + json.NewDecoder(r.Body).Decode(v) + + testMethod(t, r, "POST") + if !reflect.DeepEqual(v, input) { + t.Errorf("Request body = %+v, want %+v", v, input) + } + + fmt.Fprint(w, `["old@example.com", "new@example.com"]`) + }) + + emails, err := client.Users.AddEmails(input) + if err != nil { + t.Errorf("Users.AddEmails returned error: %v", err) + } + + want := &[]UserEmail{"old@example.com", "new@example.com"} + if !reflect.DeepEqual(emails, want) { + t.Errorf("Users.AddEmails returned %+v, want %+v", emails, want) + } +} + +func TestUsersService_DeleteEmails(t *testing.T) { + setup() + defer teardown() + + input := &[]UserEmail{"user@example.com"} + + mux.HandleFunc("/user/emails", func(w http.ResponseWriter, r *http.Request) { + v := &[]UserEmail{} + json.NewDecoder(r.Body).Decode(v) + + testMethod(t, r, "DELETE") + if !reflect.DeepEqual(v, input) { + t.Errorf("Request body = %+v, want %+v", v, input) + } + }) + + err := client.Users.DeleteEmails(input) + if err != nil { + t.Errorf("Users.DeleteEmails returned error: %v", err) + } +}