2021-11-11 10:03:30 +03:00
// Copyright 2017 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.
2022-06-15 10:02:00 +03:00
package user_test
2021-11-11 10:03:30 +03:00
import (
"testing"
"code.gitea.io/gitea/models/db"
2021-11-12 17:36:47 +03:00
"code.gitea.io/gitea/models/unittest"
2022-06-15 10:02:00 +03:00
user_model "code.gitea.io/gitea/models/user"
2021-11-28 17:11:58 +03:00
"code.gitea.io/gitea/modules/util"
2021-11-11 10:03:30 +03:00
"github.com/stretchr/testify/assert"
)
func TestGetEmailAddresses ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-11-11 10:03:30 +03:00
2022-06-15 10:02:00 +03:00
emails , _ := user_model . GetEmailAddresses ( int64 ( 1 ) )
2021-11-11 10:03:30 +03:00
if assert . Len ( t , emails , 3 ) {
assert . True ( t , emails [ 0 ] . IsPrimary )
assert . True ( t , emails [ 2 ] . IsActivated )
assert . False ( t , emails [ 2 ] . IsPrimary )
}
2022-06-15 10:02:00 +03:00
emails , _ = user_model . GetEmailAddresses ( int64 ( 2 ) )
2021-11-11 10:03:30 +03:00
if assert . Len ( t , emails , 2 ) {
assert . True ( t , emails [ 0 ] . IsPrimary )
assert . True ( t , emails [ 0 ] . IsActivated )
}
}
func TestIsEmailUsed ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-11-11 10:03:30 +03:00
2022-06-15 10:02:00 +03:00
isExist , _ := user_model . IsEmailUsed ( db . DefaultContext , "" )
2021-11-11 10:03:30 +03:00
assert . True ( t , isExist )
2022-06-15 10:02:00 +03:00
isExist , _ = user_model . IsEmailUsed ( db . DefaultContext , "user11@example.com" )
2021-11-11 10:03:30 +03:00
assert . True ( t , isExist )
2022-06-15 10:02:00 +03:00
isExist , _ = user_model . IsEmailUsed ( db . DefaultContext , "user1234567890@example.com" )
2021-11-11 10:03:30 +03:00
assert . False ( t , isExist )
}
func TestAddEmailAddress ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-11-11 10:03:30 +03:00
2022-06-15 10:02:00 +03:00
assert . NoError ( t , user_model . AddEmailAddress ( db . DefaultContext , & user_model . EmailAddress {
2021-11-11 10:03:30 +03:00
Email : "user1234567890@example.com" ,
LowerEmail : "user1234567890@example.com" ,
IsPrimary : true ,
IsActivated : true ,
} ) )
// ErrEmailAlreadyUsed
2022-06-15 10:02:00 +03:00
err := user_model . AddEmailAddress ( db . DefaultContext , & user_model . EmailAddress {
2021-11-11 10:03:30 +03:00
Email : "user1234567890@example.com" ,
LowerEmail : "user1234567890@example.com" ,
} )
assert . Error ( t , err )
2022-06-15 10:02:00 +03:00
assert . True ( t , user_model . IsErrEmailAlreadyUsed ( err ) )
2021-11-11 10:03:30 +03:00
}
func TestAddEmailAddresses ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-11-11 10:03:30 +03:00
// insert multiple email address
2022-06-15 10:02:00 +03:00
emails := make ( [ ] * user_model . EmailAddress , 2 )
emails [ 0 ] = & user_model . EmailAddress {
2021-11-11 10:03:30 +03:00
Email : "user1234@example.com" ,
LowerEmail : "user1234@example.com" ,
IsActivated : true ,
}
2022-06-15 10:02:00 +03:00
emails [ 1 ] = & user_model . EmailAddress {
2021-11-11 10:03:30 +03:00
Email : "user5678@example.com" ,
LowerEmail : "user5678@example.com" ,
IsActivated : true ,
}
2022-06-15 10:02:00 +03:00
assert . NoError ( t , user_model . AddEmailAddresses ( emails ) )
2021-11-11 10:03:30 +03:00
// ErrEmailAlreadyUsed
2022-06-15 10:02:00 +03:00
err := user_model . AddEmailAddresses ( emails )
2021-11-11 10:03:30 +03:00
assert . Error ( t , err )
2022-06-15 10:02:00 +03:00
assert . True ( t , user_model . IsErrEmailAlreadyUsed ( err ) )
2021-11-11 10:03:30 +03:00
}
func TestDeleteEmailAddress ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-11-11 10:03:30 +03:00
2022-06-15 10:02:00 +03:00
assert . NoError ( t , user_model . DeleteEmailAddress ( & user_model . EmailAddress {
2021-11-11 10:03:30 +03:00
UID : int64 ( 1 ) ,
ID : int64 ( 33 ) ,
Email : "user1-2@example.com" ,
LowerEmail : "user1-2@example.com" ,
} ) )
2022-06-15 10:02:00 +03:00
assert . NoError ( t , user_model . DeleteEmailAddress ( & user_model . EmailAddress {
2021-11-11 10:03:30 +03:00
UID : int64 ( 1 ) ,
Email : "user1-3@example.com" ,
LowerEmail : "user1-3@example.com" ,
} ) )
// Email address does not exist
2022-06-15 10:02:00 +03:00
err := user_model . DeleteEmailAddress ( & user_model . EmailAddress {
2021-11-11 10:03:30 +03:00
UID : int64 ( 1 ) ,
Email : "user1234567890@example.com" ,
LowerEmail : "user1234567890@example.com" ,
} )
assert . Error ( t , err )
}
func TestDeleteEmailAddresses ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-11-11 10:03:30 +03:00
// delete multiple email address
2022-06-15 10:02:00 +03:00
emails := make ( [ ] * user_model . EmailAddress , 2 )
emails [ 0 ] = & user_model . EmailAddress {
2021-11-11 10:03:30 +03:00
UID : int64 ( 2 ) ,
ID : int64 ( 3 ) ,
Email : "user2@example.com" ,
LowerEmail : "user2@example.com" ,
}
2022-06-15 10:02:00 +03:00
emails [ 1 ] = & user_model . EmailAddress {
2021-11-11 10:03:30 +03:00
UID : int64 ( 2 ) ,
Email : "user2-2@example.com" ,
LowerEmail : "user2-2@example.com" ,
}
2022-06-15 10:02:00 +03:00
assert . NoError ( t , user_model . DeleteEmailAddresses ( emails ) )
2021-11-11 10:03:30 +03:00
// ErrEmailAlreadyUsed
2022-06-15 10:02:00 +03:00
err := user_model . DeleteEmailAddresses ( emails )
2021-11-11 10:03:30 +03:00
assert . Error ( t , err )
}
2021-11-28 17:11:58 +03:00
func TestMakeEmailPrimary ( t * testing . T ) {
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-06-15 10:02:00 +03:00
email := & user_model . EmailAddress {
2021-11-28 17:11:58 +03:00
Email : "user567890@example.com" ,
}
2022-06-15 10:02:00 +03:00
err := user_model . MakeEmailPrimary ( email )
2021-11-28 17:11:58 +03:00
assert . Error ( t , err )
2022-06-15 10:02:00 +03:00
assert . EqualError ( t , err , user_model . ErrEmailAddressNotExist { Email : email . Email } . Error ( ) )
2021-11-28 17:11:58 +03:00
2022-06-15 10:02:00 +03:00
email = & user_model . EmailAddress {
2021-11-28 17:11:58 +03:00
Email : "user11@example.com" ,
}
2022-06-15 10:02:00 +03:00
err = user_model . MakeEmailPrimary ( email )
2021-11-28 17:11:58 +03:00
assert . Error ( t , err )
2022-06-15 10:02:00 +03:00
assert . EqualError ( t , err , user_model . ErrEmailNotActivated . Error ( ) )
2021-11-28 17:11:58 +03:00
2022-06-15 10:02:00 +03:00
email = & user_model . EmailAddress {
2021-11-28 17:11:58 +03:00
Email : "user9999999@example.com" ,
}
2022-06-15 10:02:00 +03:00
err = user_model . MakeEmailPrimary ( email )
2021-11-28 17:11:58 +03:00
assert . Error ( t , err )
2022-06-15 10:02:00 +03:00
assert . True ( t , user_model . IsErrUserNotExist ( err ) )
2021-11-28 17:11:58 +03:00
2022-06-15 10:02:00 +03:00
email = & user_model . EmailAddress {
2021-11-28 17:11:58 +03:00
Email : "user101@example.com" ,
}
2022-06-15 10:02:00 +03:00
err = user_model . MakeEmailPrimary ( email )
2021-11-28 17:11:58 +03:00
assert . NoError ( t , err )
2022-06-15 10:02:00 +03:00
user , _ := user_model . GetUserByID ( int64 ( 10 ) )
2021-11-28 17:11:58 +03:00
assert . Equal ( t , "user101@example.com" , user . Email )
}
func TestActivate ( t * testing . T ) {
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-06-15 10:02:00 +03:00
email := & user_model . EmailAddress {
2021-11-28 17:11:58 +03:00
ID : int64 ( 1 ) ,
UID : int64 ( 1 ) ,
Email : "user11@example.com" ,
}
2022-06-15 10:02:00 +03:00
assert . NoError ( t , user_model . ActivateEmail ( email ) )
2021-11-28 17:11:58 +03:00
2022-06-15 10:02:00 +03:00
emails , _ := user_model . GetEmailAddresses ( int64 ( 1 ) )
2021-11-28 17:11:58 +03:00
assert . Len ( t , emails , 3 )
assert . True ( t , emails [ 0 ] . IsActivated )
assert . True ( t , emails [ 0 ] . IsPrimary )
assert . False ( t , emails [ 1 ] . IsPrimary )
assert . True ( t , emails [ 2 ] . IsActivated )
assert . False ( t , emails [ 2 ] . IsPrimary )
}
func TestListEmails ( t * testing . T ) {
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
// Must find all users and their emails
2022-06-15 10:02:00 +03:00
opts := & user_model . SearchEmailOptions {
2021-11-28 17:11:58 +03:00
ListOptions : db . ListOptions {
PageSize : 10000 ,
} ,
}
2022-06-15 10:02:00 +03:00
emails , count , err := user_model . SearchEmails ( opts )
2021-11-28 17:11:58 +03:00
assert . NoError ( t , err )
assert . NotEqual ( t , int64 ( 0 ) , count )
assert . True ( t , count > 5 )
2022-06-15 10:02:00 +03:00
contains := func ( match func ( s * user_model . SearchEmailResult ) bool ) bool {
2021-11-28 17:11:58 +03:00
for _ , v := range emails {
if match ( v ) {
return true
}
}
return false
}
2022-06-15 10:02:00 +03:00
assert . True ( t , contains ( func ( s * user_model . SearchEmailResult ) bool { return s . UID == 18 } ) )
2021-11-28 17:11:58 +03:00
// 'user3' is an organization
2022-06-15 10:02:00 +03:00
assert . False ( t , contains ( func ( s * user_model . SearchEmailResult ) bool { return s . UID == 3 } ) )
2021-11-28 17:11:58 +03:00
// Must find no records
2022-06-15 10:02:00 +03:00
opts = & user_model . SearchEmailOptions { Keyword : "NOTFOUND" }
emails , count , err = user_model . SearchEmails ( opts )
2021-11-28 17:11:58 +03:00
assert . NoError ( t , err )
assert . Equal ( t , int64 ( 0 ) , count )
// Must find users 'user2', 'user28', etc.
2022-06-15 10:02:00 +03:00
opts = & user_model . SearchEmailOptions { Keyword : "user2" }
emails , count , err = user_model . SearchEmails ( opts )
2021-11-28 17:11:58 +03:00
assert . NoError ( t , err )
assert . NotEqual ( t , int64 ( 0 ) , count )
2022-06-15 10:02:00 +03:00
assert . True ( t , contains ( func ( s * user_model . SearchEmailResult ) bool { return s . UID == 2 } ) )
assert . True ( t , contains ( func ( s * user_model . SearchEmailResult ) bool { return s . UID == 27 } ) )
2021-11-28 17:11:58 +03:00
// Must find only primary addresses (i.e. from the `user` table)
2022-06-15 10:02:00 +03:00
opts = & user_model . SearchEmailOptions { IsPrimary : util . OptionalBoolTrue }
emails , _ , err = user_model . SearchEmails ( opts )
2021-11-28 17:11:58 +03:00
assert . NoError ( t , err )
2022-06-15 10:02:00 +03:00
assert . True ( t , contains ( func ( s * user_model . SearchEmailResult ) bool { return s . IsPrimary } ) )
assert . False ( t , contains ( func ( s * user_model . SearchEmailResult ) bool { return ! s . IsPrimary } ) )
2021-11-28 17:11:58 +03:00
// Must find only inactive addresses (i.e. not validated)
2022-06-15 10:02:00 +03:00
opts = & user_model . SearchEmailOptions { IsActivated : util . OptionalBoolFalse }
emails , _ , err = user_model . SearchEmails ( opts )
2021-11-28 17:11:58 +03:00
assert . NoError ( t , err )
2022-06-15 10:02:00 +03:00
assert . True ( t , contains ( func ( s * user_model . SearchEmailResult ) bool { return ! s . IsActivated } ) )
assert . False ( t , contains ( func ( s * user_model . SearchEmailResult ) bool { return s . IsActivated } ) )
2021-11-28 17:11:58 +03:00
// Must find more than one page, but retrieve only one
2022-06-15 10:02:00 +03:00
opts = & user_model . SearchEmailOptions {
2021-11-28 17:11:58 +03:00
ListOptions : db . ListOptions {
PageSize : 5 ,
Page : 1 ,
} ,
}
2022-06-15 10:02:00 +03:00
emails , count , err = user_model . SearchEmails ( opts )
2021-11-28 17:11:58 +03:00
assert . NoError ( t , err )
assert . Len ( t , emails , 5 )
assert . Greater ( t , count , int64 ( len ( emails ) ) )
}
2022-03-14 20:39:54 +03:00
func TestEmailAddressValidate ( t * testing . T ) {
kases := map [ string ] error {
"abc@gmail.com" : nil ,
"132@hotmail.com" : nil ,
"1-3-2@test.org" : nil ,
"1.3.2@test.org" : nil ,
"a_123@test.org.cn" : nil ,
` first.last@iana.org ` : nil ,
` first!last@iana.org ` : nil ,
` first#last@iana.org ` : nil ,
` first$last@iana.org ` : nil ,
` first%last@iana.org ` : nil ,
` first&last@iana.org ` : nil ,
` first'last@iana.org ` : nil ,
` first*last@iana.org ` : nil ,
` first+last@iana.org ` : nil ,
` first/last@iana.org ` : nil ,
` first=last@iana.org ` : nil ,
` first?last@iana.org ` : nil ,
` first^last@iana.org ` : nil ,
"first`last@iana.org" : nil ,
` first { last@iana.org ` : nil ,
` first|last@iana.org ` : nil ,
` first}last@iana.org ` : nil ,
` first~last@iana.org ` : nil ,
2022-06-15 10:02:00 +03:00
` first;last@iana.org ` : user_model . ErrEmailCharIsNotSupported { ` first;last@iana.org ` } ,
".233@qq.com" : user_model . ErrEmailInvalid { ".233@qq.com" } ,
"!233@qq.com" : user_model . ErrEmailInvalid { "!233@qq.com" } ,
"#233@qq.com" : user_model . ErrEmailInvalid { "#233@qq.com" } ,
"$233@qq.com" : user_model . ErrEmailInvalid { "$233@qq.com" } ,
"%233@qq.com" : user_model . ErrEmailInvalid { "%233@qq.com" } ,
"&233@qq.com" : user_model . ErrEmailInvalid { "&233@qq.com" } ,
"'233@qq.com" : user_model . ErrEmailInvalid { "'233@qq.com" } ,
"*233@qq.com" : user_model . ErrEmailInvalid { "*233@qq.com" } ,
"+233@qq.com" : user_model . ErrEmailInvalid { "+233@qq.com" } ,
"/233@qq.com" : user_model . ErrEmailInvalid { "/233@qq.com" } ,
"=233@qq.com" : user_model . ErrEmailInvalid { "=233@qq.com" } ,
"?233@qq.com" : user_model . ErrEmailInvalid { "?233@qq.com" } ,
"^233@qq.com" : user_model . ErrEmailInvalid { "^233@qq.com" } ,
"`233@qq.com" : user_model . ErrEmailInvalid { "`233@qq.com" } ,
"{233@qq.com" : user_model . ErrEmailInvalid { "{233@qq.com" } ,
"|233@qq.com" : user_model . ErrEmailInvalid { "|233@qq.com" } ,
"}233@qq.com" : user_model . ErrEmailInvalid { "}233@qq.com" } ,
"~233@qq.com" : user_model . ErrEmailInvalid { "~233@qq.com" } ,
";233@qq.com" : user_model . ErrEmailCharIsNotSupported { ";233@qq.com" } ,
"Foo <foo@bar.com>" : user_model . ErrEmailCharIsNotSupported { "Foo <foo@bar.com>" } ,
string ( [ ] byte { 0xE2 , 0x84 , 0xAA } ) : user_model . ErrEmailCharIsNotSupported { string ( [ ] byte { 0xE2 , 0x84 , 0xAA } ) } ,
2022-03-14 20:39:54 +03:00
}
for kase , err := range kases {
t . Run ( kase , func ( t * testing . T ) {
2022-06-15 10:02:00 +03:00
assert . EqualValues ( t , err , user_model . ValidateEmail ( kase ) )
2022-03-14 20:39:54 +03:00
} )
}
}