diff --git a/github/users_emails.go b/github/users_emails.go index be7e0f819ec..67bd210e8d5 100644 --- a/github/users_emails.go +++ b/github/users_emails.go @@ -70,3 +70,28 @@ func (s *UsersService) DeleteEmails(ctx context.Context, emails []string) (*Resp return s.client.Do(ctx, req, nil) } + +// SetEmailVisibility sets the visibility for the primary email address of the authenticated user. +// `visibility` can be "private" or "public". +// +// GitHub API docs: https://docs.github.com/en/rest/users/emails#set-primary-email-visibility-for-the-authenticated-user +func (s *UsersService) SetEmailVisibility(ctx context.Context, visibility string) ([]*UserEmail, *Response, error) { + u := "user/email/visibility" + + updateVisiblilityReq := &UserEmail{ + Visibility: &visibility, + } + + req, err := s.client.NewRequest("PATCH", u, updateVisiblilityReq) + if err != nil { + return nil, nil, err + } + + var e []*UserEmail + resp, err := s.client.Do(ctx, req, &e) + if err != nil { + return nil, resp, err + } + + return e, resp, nil +} diff --git a/github/users_emails_test.go b/github/users_emails_test.go index d40356d8732..ad9d32e9491 100644 --- a/github/users_emails_test.go +++ b/github/users_emails_test.go @@ -140,3 +140,47 @@ func TestUserEmail_Marshal(t *testing.T) { testJSONMarshal(t, u, want) } + +func TestUsersService_SetEmailVisibility(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + input := &UserEmail{Visibility: String("private")} + + mux.HandleFunc("/user/email/visibility", func(w http.ResponseWriter, r *http.Request) { + v := new(UserEmail) + json.NewDecoder(r.Body).Decode(&v) + + testMethod(t, r, "PATCH") + if !cmp.Equal(v, input) { + t.Errorf("Request body = %+v, want %+v", v, input) + } + + fmt.Fprint(w, `[{ + "email": "user@example.com", + "verified": false, + "primary": true, + "visibility": "private" + }]`) + }) + + ctx := context.Background() + emails, _, err := client.Users.SetEmailVisibility(ctx, "private") + if err != nil { + t.Errorf("Users.SetEmailVisibility returned error: %v", err) + } + + want := []*UserEmail{{Email: String("user@example.com"), Verified: Bool(false), Primary: Bool(true), Visibility: String("private")}} + if !cmp.Equal(emails, want) { + t.Errorf("Users.SetEmailVisibility returned %+v, want %+v", emails, want) + } + + const methodName = "SetEmailVisibility" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Users.SetEmailVisibility(ctx, "private") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +}