rsponse 404 when delete not exist email (#15383)
fix #15357 Signed-off-by: a1012112796 <1012112796@qq.com>
This commit is contained in:
		
							parent
							
								
									9a0858cecf
								
							
						
					
					
						commit
						e375cbfd46
					
				
							
								
								
									
										105
									
								
								integrations/api_user_email_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								integrations/api_user_email_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,105 @@
 | 
				
			|||||||
 | 
					// Copyright 2021 The Gitea Authors. All rights reserved.
 | 
				
			||||||
 | 
					// Use of this source code is governed by a MIT-style
 | 
				
			||||||
 | 
					// license that can be found in the LICENSE file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package integrations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						api "code.gitea.io/gitea/modules/structs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestAPIListEmails(t *testing.T) {
 | 
				
			||||||
 | 
						defer prepareTestEnv(t)()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						normalUsername := "user2"
 | 
				
			||||||
 | 
						session := loginUser(t, normalUsername)
 | 
				
			||||||
 | 
						token := getTokenForLoggedInUser(t, session)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req := NewRequest(t, "GET", "/api/v1/user/emails?token="+token)
 | 
				
			||||||
 | 
						resp := session.MakeRequest(t, req, http.StatusOK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var emails []*api.Email
 | 
				
			||||||
 | 
						DecodeJSON(t, resp, &emails)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.EqualValues(t, []*api.Email{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Email:    "user2@example.com",
 | 
				
			||||||
 | 
								Verified: true,
 | 
				
			||||||
 | 
								Primary:  true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Email:    "user21@example.com",
 | 
				
			||||||
 | 
								Verified: false,
 | 
				
			||||||
 | 
								Primary:  false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}, emails)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestAPIAddEmail(t *testing.T) {
 | 
				
			||||||
 | 
						defer prepareTestEnv(t)()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						normalUsername := "user2"
 | 
				
			||||||
 | 
						session := loginUser(t, normalUsername)
 | 
				
			||||||
 | 
						token := getTokenForLoggedInUser(t, session)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						opts := api.CreateEmailOption{
 | 
				
			||||||
 | 
							Emails: []string{"user101@example.com"},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req := NewRequestWithJSON(t, "POST", "/api/v1/user/emails?token="+token, &opts)
 | 
				
			||||||
 | 
						session.MakeRequest(t, req, http.StatusUnprocessableEntity)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						opts = api.CreateEmailOption{
 | 
				
			||||||
 | 
							Emails: []string{"user22@example.com"},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						req = NewRequestWithJSON(t, "POST", "/api/v1/user/emails?token="+token, &opts)
 | 
				
			||||||
 | 
						resp := session.MakeRequest(t, req, http.StatusCreated)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var emails []*api.Email
 | 
				
			||||||
 | 
						DecodeJSON(t, resp, &emails)
 | 
				
			||||||
 | 
						assert.EqualValues(t, []*api.Email{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Email:    "user22@example.com",
 | 
				
			||||||
 | 
								Verified: true,
 | 
				
			||||||
 | 
								Primary:  false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}, emails)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestAPIDeleteEmail(t *testing.T) {
 | 
				
			||||||
 | 
						defer prepareTestEnv(t)()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						normalUsername := "user2"
 | 
				
			||||||
 | 
						session := loginUser(t, normalUsername)
 | 
				
			||||||
 | 
						token := getTokenForLoggedInUser(t, session)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						opts := api.DeleteEmailOption{
 | 
				
			||||||
 | 
							Emails: []string{"user22@example.com"},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						req := NewRequestWithJSON(t, "DELETE", "/api/v1/user/emails?token="+token, &opts)
 | 
				
			||||||
 | 
						session.MakeRequest(t, req, http.StatusNotFound)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						opts = api.DeleteEmailOption{
 | 
				
			||||||
 | 
							Emails: []string{"user21@example.com"},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						req = NewRequestWithJSON(t, "DELETE", "/api/v1/user/emails?token="+token, &opts)
 | 
				
			||||||
 | 
						session.MakeRequest(t, req, http.StatusNoContent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req = NewRequest(t, "GET", "/api/v1/user/emails?token="+token)
 | 
				
			||||||
 | 
						resp := session.MakeRequest(t, req, http.StatusOK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var emails []*api.Email
 | 
				
			||||||
 | 
						DecodeJSON(t, resp, &emails)
 | 
				
			||||||
 | 
						assert.EqualValues(t, []*api.Email{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Email:    "user2@example.com",
 | 
				
			||||||
 | 
								Verified: true,
 | 
				
			||||||
 | 
								Primary:  true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}, emails)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -222,6 +222,21 @@ func (err ErrEmailInvalid) Error() string {
 | 
				
			|||||||
	return fmt.Sprintf("e-mail invalid [email: %s]", err.Email)
 | 
						return fmt.Sprintf("e-mail invalid [email: %s]", err.Email)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ErrEmailAddressNotExist email address not exist
 | 
				
			||||||
 | 
					type ErrEmailAddressNotExist struct {
 | 
				
			||||||
 | 
						Email string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsErrEmailAddressNotExist checks if an error is an ErrEmailAddressNotExist
 | 
				
			||||||
 | 
					func IsErrEmailAddressNotExist(err error) bool {
 | 
				
			||||||
 | 
						_, ok := err.(ErrEmailAddressNotExist)
 | 
				
			||||||
 | 
						return ok
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (err ErrEmailAddressNotExist) Error() string {
 | 
				
			||||||
 | 
						return fmt.Sprintf("Email address does not exist [email: %s]", err.Email)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ErrOpenIDAlreadyUsed represents a "OpenIDAlreadyUsed" kind of error.
 | 
					// ErrOpenIDAlreadyUsed represents a "OpenIDAlreadyUsed" kind of error.
 | 
				
			||||||
type ErrOpenIDAlreadyUsed struct {
 | 
					type ErrOpenIDAlreadyUsed struct {
 | 
				
			||||||
	OpenID string
 | 
						OpenID string
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,6 @@
 | 
				
			|||||||
package models
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net/mail"
 | 
						"net/mail"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
@ -18,9 +17,6 @@ import (
 | 
				
			|||||||
	"xorm.io/builder"
 | 
						"xorm.io/builder"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ErrEmailAddressNotExist email address not exist
 | 
					 | 
				
			||||||
var ErrEmailAddressNotExist = errors.New("Email address does not exist")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// EmailAddress is the list of all email addresses of a user. Can contain the
 | 
					// EmailAddress is the list of all email addresses of a user. Can contain the
 | 
				
			||||||
// primary email address, but is not obligatory.
 | 
					// primary email address, but is not obligatory.
 | 
				
			||||||
type EmailAddress struct {
 | 
					type EmailAddress struct {
 | 
				
			||||||
@ -243,7 +239,7 @@ func DeleteEmailAddress(email *EmailAddress) (err error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	} else if deleted != 1 {
 | 
						} else if deleted != 1 {
 | 
				
			||||||
		return ErrEmailAddressNotExist
 | 
							return ErrEmailAddressNotExist{Email: email.Email}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -111,6 +111,8 @@ func DeleteEmail(ctx *context.APIContext) {
 | 
				
			|||||||
	// responses:
 | 
						// responses:
 | 
				
			||||||
	//   "204":
 | 
						//   "204":
 | 
				
			||||||
	//     "$ref": "#/responses/empty"
 | 
						//     "$ref": "#/responses/empty"
 | 
				
			||||||
 | 
						//   "404":
 | 
				
			||||||
 | 
						//     "$ref": "#/responses/notFound"
 | 
				
			||||||
	form := web.GetForm(ctx).(*api.DeleteEmailOption)
 | 
						form := web.GetForm(ctx).(*api.DeleteEmailOption)
 | 
				
			||||||
	if len(form.Emails) == 0 {
 | 
						if len(form.Emails) == 0 {
 | 
				
			||||||
		ctx.Status(http.StatusNoContent)
 | 
							ctx.Status(http.StatusNoContent)
 | 
				
			||||||
@ -126,6 +128,10 @@ func DeleteEmail(ctx *context.APIContext) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := models.DeleteEmailAddresses(emails); err != nil {
 | 
						if err := models.DeleteEmailAddresses(emails); err != nil {
 | 
				
			||||||
 | 
							if models.IsErrEmailAddressNotExist(err) {
 | 
				
			||||||
 | 
								ctx.Error(http.StatusNotFound, "DeleteEmailAddresses", err)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		ctx.Error(http.StatusInternalServerError, "DeleteEmailAddresses", err)
 | 
							ctx.Error(http.StatusInternalServerError, "DeleteEmailAddresses", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -10221,6 +10221,9 @@
 | 
				
			|||||||
        "responses": {
 | 
					        "responses": {
 | 
				
			||||||
          "204": {
 | 
					          "204": {
 | 
				
			||||||
            "$ref": "#/responses/empty"
 | 
					            "$ref": "#/responses/empty"
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "404": {
 | 
				
			||||||
 | 
					            "$ref": "#/responses/notFound"
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user