You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

email_address_test.go 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package user_test
  4. import (
  5. "testing"
  6. "code.gitea.io/gitea/models/db"
  7. "code.gitea.io/gitea/models/unittest"
  8. user_model "code.gitea.io/gitea/models/user"
  9. "code.gitea.io/gitea/modules/util"
  10. "github.com/stretchr/testify/assert"
  11. )
  12. func TestGetEmailAddresses(t *testing.T) {
  13. assert.NoError(t, unittest.PrepareTestDatabase())
  14. emails, _ := user_model.GetEmailAddresses(db.DefaultContext, int64(1))
  15. if assert.Len(t, emails, 3) {
  16. assert.True(t, emails[0].IsPrimary)
  17. assert.True(t, emails[2].IsActivated)
  18. assert.False(t, emails[2].IsPrimary)
  19. }
  20. emails, _ = user_model.GetEmailAddresses(db.DefaultContext, int64(2))
  21. if assert.Len(t, emails, 2) {
  22. assert.True(t, emails[0].IsPrimary)
  23. assert.True(t, emails[0].IsActivated)
  24. }
  25. }
  26. func TestIsEmailUsed(t *testing.T) {
  27. assert.NoError(t, unittest.PrepareTestDatabase())
  28. isExist, _ := user_model.IsEmailUsed(db.DefaultContext, "")
  29. assert.True(t, isExist)
  30. isExist, _ = user_model.IsEmailUsed(db.DefaultContext, "user11@example.com")
  31. assert.True(t, isExist)
  32. isExist, _ = user_model.IsEmailUsed(db.DefaultContext, "user1234567890@example.com")
  33. assert.False(t, isExist)
  34. }
  35. func TestAddEmailAddress(t *testing.T) {
  36. assert.NoError(t, unittest.PrepareTestDatabase())
  37. assert.NoError(t, user_model.AddEmailAddress(db.DefaultContext, &user_model.EmailAddress{
  38. Email: "user1234567890@example.com",
  39. LowerEmail: "user1234567890@example.com",
  40. IsPrimary: true,
  41. IsActivated: true,
  42. }))
  43. // ErrEmailAlreadyUsed
  44. err := user_model.AddEmailAddress(db.DefaultContext, &user_model.EmailAddress{
  45. Email: "user1234567890@example.com",
  46. LowerEmail: "user1234567890@example.com",
  47. })
  48. assert.Error(t, err)
  49. assert.True(t, user_model.IsErrEmailAlreadyUsed(err))
  50. }
  51. func TestAddEmailAddresses(t *testing.T) {
  52. assert.NoError(t, unittest.PrepareTestDatabase())
  53. // insert multiple email address
  54. emails := make([]*user_model.EmailAddress, 2)
  55. emails[0] = &user_model.EmailAddress{
  56. Email: "user1234@example.com",
  57. LowerEmail: "user1234@example.com",
  58. IsActivated: true,
  59. }
  60. emails[1] = &user_model.EmailAddress{
  61. Email: "user5678@example.com",
  62. LowerEmail: "user5678@example.com",
  63. IsActivated: true,
  64. }
  65. assert.NoError(t, user_model.AddEmailAddresses(db.DefaultContext, emails))
  66. // ErrEmailAlreadyUsed
  67. err := user_model.AddEmailAddresses(db.DefaultContext, emails)
  68. assert.Error(t, err)
  69. assert.True(t, user_model.IsErrEmailAlreadyUsed(err))
  70. }
  71. func TestDeleteEmailAddress(t *testing.T) {
  72. assert.NoError(t, unittest.PrepareTestDatabase())
  73. assert.NoError(t, user_model.DeleteEmailAddress(db.DefaultContext, &user_model.EmailAddress{
  74. UID: int64(1),
  75. ID: int64(33),
  76. Email: "user1-2@example.com",
  77. LowerEmail: "user1-2@example.com",
  78. }))
  79. assert.NoError(t, user_model.DeleteEmailAddress(db.DefaultContext, &user_model.EmailAddress{
  80. UID: int64(1),
  81. Email: "user1-3@example.com",
  82. LowerEmail: "user1-3@example.com",
  83. }))
  84. // Email address does not exist
  85. err := user_model.DeleteEmailAddress(db.DefaultContext, &user_model.EmailAddress{
  86. UID: int64(1),
  87. Email: "user1234567890@example.com",
  88. LowerEmail: "user1234567890@example.com",
  89. })
  90. assert.Error(t, err)
  91. }
  92. func TestDeleteEmailAddresses(t *testing.T) {
  93. assert.NoError(t, unittest.PrepareTestDatabase())
  94. // delete multiple email address
  95. emails := make([]*user_model.EmailAddress, 2)
  96. emails[0] = &user_model.EmailAddress{
  97. UID: int64(2),
  98. ID: int64(3),
  99. Email: "user2@example.com",
  100. LowerEmail: "user2@example.com",
  101. }
  102. emails[1] = &user_model.EmailAddress{
  103. UID: int64(2),
  104. Email: "user2-2@example.com",
  105. LowerEmail: "user2-2@example.com",
  106. }
  107. assert.NoError(t, user_model.DeleteEmailAddresses(db.DefaultContext, emails))
  108. // ErrEmailAlreadyUsed
  109. err := user_model.DeleteEmailAddresses(db.DefaultContext, emails)
  110. assert.Error(t, err)
  111. }
  112. func TestMakeEmailPrimary(t *testing.T) {
  113. assert.NoError(t, unittest.PrepareTestDatabase())
  114. email := &user_model.EmailAddress{
  115. Email: "user567890@example.com",
  116. }
  117. err := user_model.MakeEmailPrimary(db.DefaultContext, email)
  118. assert.Error(t, err)
  119. assert.EqualError(t, err, user_model.ErrEmailAddressNotExist{Email: email.Email}.Error())
  120. email = &user_model.EmailAddress{
  121. Email: "user11@example.com",
  122. }
  123. err = user_model.MakeEmailPrimary(db.DefaultContext, email)
  124. assert.Error(t, err)
  125. assert.EqualError(t, err, user_model.ErrEmailNotActivated.Error())
  126. email = &user_model.EmailAddress{
  127. Email: "user9999999@example.com",
  128. }
  129. err = user_model.MakeEmailPrimary(db.DefaultContext, email)
  130. assert.Error(t, err)
  131. assert.True(t, user_model.IsErrUserNotExist(err))
  132. email = &user_model.EmailAddress{
  133. Email: "user101@example.com",
  134. }
  135. err = user_model.MakeEmailPrimary(db.DefaultContext, email)
  136. assert.NoError(t, err)
  137. user, _ := user_model.GetUserByID(db.DefaultContext, int64(10))
  138. assert.Equal(t, "user101@example.com", user.Email)
  139. }
  140. func TestActivate(t *testing.T) {
  141. assert.NoError(t, unittest.PrepareTestDatabase())
  142. email := &user_model.EmailAddress{
  143. ID: int64(1),
  144. UID: int64(1),
  145. Email: "user11@example.com",
  146. }
  147. assert.NoError(t, user_model.ActivateEmail(db.DefaultContext, email))
  148. emails, _ := user_model.GetEmailAddresses(db.DefaultContext, int64(1))
  149. assert.Len(t, emails, 3)
  150. assert.True(t, emails[0].IsActivated)
  151. assert.True(t, emails[0].IsPrimary)
  152. assert.False(t, emails[1].IsPrimary)
  153. assert.True(t, emails[2].IsActivated)
  154. assert.False(t, emails[2].IsPrimary)
  155. }
  156. func TestListEmails(t *testing.T) {
  157. assert.NoError(t, unittest.PrepareTestDatabase())
  158. // Must find all users and their emails
  159. opts := &user_model.SearchEmailOptions{
  160. ListOptions: db.ListOptions{
  161. PageSize: 10000,
  162. },
  163. }
  164. emails, count, err := user_model.SearchEmails(db.DefaultContext, opts)
  165. assert.NoError(t, err)
  166. assert.NotEqual(t, int64(0), count)
  167. assert.True(t, count > 5)
  168. contains := func(match func(s *user_model.SearchEmailResult) bool) bool {
  169. for _, v := range emails {
  170. if match(v) {
  171. return true
  172. }
  173. }
  174. return false
  175. }
  176. assert.True(t, contains(func(s *user_model.SearchEmailResult) bool { return s.UID == 18 }))
  177. // 'org3' is an organization
  178. assert.False(t, contains(func(s *user_model.SearchEmailResult) bool { return s.UID == 3 }))
  179. // Must find no records
  180. opts = &user_model.SearchEmailOptions{Keyword: "NOTFOUND"}
  181. emails, count, err = user_model.SearchEmails(db.DefaultContext, opts)
  182. assert.NoError(t, err)
  183. assert.Equal(t, int64(0), count)
  184. // Must find users 'user2', 'user28', etc.
  185. opts = &user_model.SearchEmailOptions{Keyword: "user2"}
  186. emails, count, err = user_model.SearchEmails(db.DefaultContext, opts)
  187. assert.NoError(t, err)
  188. assert.NotEqual(t, int64(0), count)
  189. assert.True(t, contains(func(s *user_model.SearchEmailResult) bool { return s.UID == 2 }))
  190. assert.True(t, contains(func(s *user_model.SearchEmailResult) bool { return s.UID == 27 }))
  191. // Must find only primary addresses (i.e. from the `user` table)
  192. opts = &user_model.SearchEmailOptions{IsPrimary: util.OptionalBoolTrue}
  193. emails, _, err = user_model.SearchEmails(db.DefaultContext, opts)
  194. assert.NoError(t, err)
  195. assert.True(t, contains(func(s *user_model.SearchEmailResult) bool { return s.IsPrimary }))
  196. assert.False(t, contains(func(s *user_model.SearchEmailResult) bool { return !s.IsPrimary }))
  197. // Must find only inactive addresses (i.e. not validated)
  198. opts = &user_model.SearchEmailOptions{IsActivated: util.OptionalBoolFalse}
  199. emails, _, err = user_model.SearchEmails(db.DefaultContext, opts)
  200. assert.NoError(t, err)
  201. assert.True(t, contains(func(s *user_model.SearchEmailResult) bool { return !s.IsActivated }))
  202. assert.False(t, contains(func(s *user_model.SearchEmailResult) bool { return s.IsActivated }))
  203. // Must find more than one page, but retrieve only one
  204. opts = &user_model.SearchEmailOptions{
  205. ListOptions: db.ListOptions{
  206. PageSize: 5,
  207. Page: 1,
  208. },
  209. }
  210. emails, count, err = user_model.SearchEmails(db.DefaultContext, opts)
  211. assert.NoError(t, err)
  212. assert.Len(t, emails, 5)
  213. assert.Greater(t, count, int64(len(emails)))
  214. }
  215. func TestEmailAddressValidate(t *testing.T) {
  216. kases := map[string]error{
  217. "abc@gmail.com": nil,
  218. "132@hotmail.com": nil,
  219. "1-3-2@test.org": nil,
  220. "1.3.2@test.org": nil,
  221. "a_123@test.org.cn": nil,
  222. `first.last@iana.org`: nil,
  223. `first!last@iana.org`: nil,
  224. `first#last@iana.org`: nil,
  225. `first$last@iana.org`: nil,
  226. `first%last@iana.org`: nil,
  227. `first&last@iana.org`: nil,
  228. `first'last@iana.org`: nil,
  229. `first*last@iana.org`: nil,
  230. `first+last@iana.org`: nil,
  231. `first/last@iana.org`: nil,
  232. `first=last@iana.org`: nil,
  233. `first?last@iana.org`: nil,
  234. `first^last@iana.org`: nil,
  235. "first`last@iana.org": nil,
  236. `first{last@iana.org`: nil,
  237. `first|last@iana.org`: nil,
  238. `first}last@iana.org`: nil,
  239. `first~last@iana.org`: nil,
  240. `first;last@iana.org`: user_model.ErrEmailCharIsNotSupported{`first;last@iana.org`},
  241. ".233@qq.com": user_model.ErrEmailInvalid{".233@qq.com"},
  242. "!233@qq.com": nil,
  243. "#233@qq.com": nil,
  244. "$233@qq.com": nil,
  245. "%233@qq.com": nil,
  246. "&233@qq.com": nil,
  247. "'233@qq.com": nil,
  248. "*233@qq.com": nil,
  249. "+233@qq.com": nil,
  250. "-233@qq.com": user_model.ErrEmailInvalid{"-233@qq.com"},
  251. "/233@qq.com": nil,
  252. "=233@qq.com": nil,
  253. "?233@qq.com": nil,
  254. "^233@qq.com": nil,
  255. "_233@qq.com": nil,
  256. "`233@qq.com": nil,
  257. "{233@qq.com": nil,
  258. "|233@qq.com": nil,
  259. "}233@qq.com": nil,
  260. "~233@qq.com": nil,
  261. ";233@qq.com": user_model.ErrEmailCharIsNotSupported{";233@qq.com"},
  262. "Foo <foo@bar.com>": user_model.ErrEmailCharIsNotSupported{"Foo <foo@bar.com>"},
  263. string([]byte{0xE2, 0x84, 0xAA}): user_model.ErrEmailCharIsNotSupported{string([]byte{0xE2, 0x84, 0xAA})},
  264. }
  265. for kase, err := range kases {
  266. t.Run(kase, func(t *testing.T) {
  267. assert.EqualValues(t, err, user_model.ValidateEmail(kase))
  268. })
  269. }
  270. }