rsponse 404 when delete not exist email (#15383)

fix #15357

Signed-off-by: a1012112796 <1012112796@qq.com>
release/v1.15
a1012112796 2021-04-10 14:12:38 +08:00 committed by GitHub
parent 9a0858cecf
commit e375cbfd46
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 130 additions and 5 deletions

View 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)
}

View File

@ -222,6 +222,21 @@ func (err ErrEmailInvalid) Error() string {
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.
type ErrOpenIDAlreadyUsed struct {
OpenID string

View File

@ -6,7 +6,6 @@
package models
import (
"errors"
"fmt"
"net/mail"
"strings"
@ -18,9 +17,6 @@ import (
"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
// primary email address, but is not obligatory.
type EmailAddress struct {
@ -243,7 +239,7 @@ func DeleteEmailAddress(email *EmailAddress) (err error) {
if err != nil {
return err
} else if deleted != 1 {
return ErrEmailAddressNotExist
return ErrEmailAddressNotExist{Email: email.Email}
}
return nil
}

View File

@ -111,6 +111,8 @@ func DeleteEmail(ctx *context.APIContext) {
// responses:
// "204":
// "$ref": "#/responses/empty"
// "404":
// "$ref": "#/responses/notFound"
form := web.GetForm(ctx).(*api.DeleteEmailOption)
if len(form.Emails) == 0 {
ctx.Status(http.StatusNoContent)
@ -126,6 +128,10 @@ func DeleteEmail(ctx *context.APIContext) {
}
if err := models.DeleteEmailAddresses(emails); err != nil {
if models.IsErrEmailAddressNotExist(err) {
ctx.Error(http.StatusNotFound, "DeleteEmailAddresses", err)
return
}
ctx.Error(http.StatusInternalServerError, "DeleteEmailAddresses", err)
return
}

View File

@ -10221,6 +10221,9 @@
"responses": {
"204": {
"$ref": "#/responses/empty"
},
"404": {
"$ref": "#/responses/notFound"
}
}
}