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.

user_mail_test.go 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package models
  5. import (
  6. "testing"
  7. "code.gitea.io/gitea/modules/util"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. func TestGetEmailAddresses(t *testing.T) {
  11. assert.NoError(t, PrepareTestDatabase())
  12. emails, _ := GetEmailAddresses(int64(1))
  13. if assert.Len(t, emails, 3) {
  14. assert.True(t, emails[0].IsPrimary)
  15. assert.True(t, emails[2].IsActivated)
  16. assert.False(t, emails[2].IsPrimary)
  17. }
  18. emails, _ = GetEmailAddresses(int64(2))
  19. if assert.Len(t, emails, 2) {
  20. assert.True(t, emails[0].IsPrimary)
  21. assert.True(t, emails[0].IsActivated)
  22. }
  23. }
  24. func TestIsEmailUsed(t *testing.T) {
  25. assert.NoError(t, PrepareTestDatabase())
  26. isExist, _ := IsEmailUsed("")
  27. assert.True(t, isExist)
  28. isExist, _ = IsEmailUsed("user11@example.com")
  29. assert.True(t, isExist)
  30. isExist, _ = IsEmailUsed("user1234567890@example.com")
  31. assert.False(t, isExist)
  32. }
  33. func TestAddEmailAddress(t *testing.T) {
  34. assert.NoError(t, PrepareTestDatabase())
  35. assert.NoError(t, AddEmailAddress(&EmailAddress{
  36. Email: "user1234567890@example.com",
  37. LowerEmail: "user1234567890@example.com",
  38. IsPrimary: true,
  39. IsActivated: true,
  40. }))
  41. // ErrEmailAlreadyUsed
  42. err := AddEmailAddress(&EmailAddress{
  43. Email: "user1234567890@example.com",
  44. LowerEmail: "user1234567890@example.com",
  45. })
  46. assert.Error(t, err)
  47. assert.True(t, IsErrEmailAlreadyUsed(err))
  48. }
  49. func TestAddEmailAddresses(t *testing.T) {
  50. assert.NoError(t, PrepareTestDatabase())
  51. // insert multiple email address
  52. emails := make([]*EmailAddress, 2)
  53. emails[0] = &EmailAddress{
  54. Email: "user1234@example.com",
  55. LowerEmail: "user1234@example.com",
  56. IsActivated: true,
  57. }
  58. emails[1] = &EmailAddress{
  59. Email: "user5678@example.com",
  60. LowerEmail: "user5678@example.com",
  61. IsActivated: true,
  62. }
  63. assert.NoError(t, AddEmailAddresses(emails))
  64. // ErrEmailAlreadyUsed
  65. err := AddEmailAddresses(emails)
  66. assert.Error(t, err)
  67. assert.True(t, IsErrEmailAlreadyUsed(err))
  68. }
  69. func TestDeleteEmailAddress(t *testing.T) {
  70. assert.NoError(t, PrepareTestDatabase())
  71. assert.NoError(t, DeleteEmailAddress(&EmailAddress{
  72. UID: int64(1),
  73. ID: int64(33),
  74. Email: "user1-2@example.com",
  75. LowerEmail: "user1-2@example.com",
  76. }))
  77. assert.NoError(t, DeleteEmailAddress(&EmailAddress{
  78. UID: int64(1),
  79. Email: "user1-3@example.com",
  80. LowerEmail: "user1-3@example.com",
  81. }))
  82. // Email address does not exist
  83. err := DeleteEmailAddress(&EmailAddress{
  84. UID: int64(1),
  85. Email: "user1234567890@example.com",
  86. LowerEmail: "user1234567890@example.com",
  87. })
  88. assert.Error(t, err)
  89. }
  90. func TestDeleteEmailAddresses(t *testing.T) {
  91. assert.NoError(t, PrepareTestDatabase())
  92. // delete multiple email address
  93. emails := make([]*EmailAddress, 2)
  94. emails[0] = &EmailAddress{
  95. UID: int64(2),
  96. ID: int64(3),
  97. Email: "user2@example.com",
  98. LowerEmail: "user2@example.com",
  99. }
  100. emails[1] = &EmailAddress{
  101. UID: int64(2),
  102. Email: "user2-2@example.com",
  103. LowerEmail: "user2-2@example.com",
  104. }
  105. assert.NoError(t, DeleteEmailAddresses(emails))
  106. // ErrEmailAlreadyUsed
  107. err := DeleteEmailAddresses(emails)
  108. assert.Error(t, err)
  109. }
  110. func TestMakeEmailPrimary(t *testing.T) {
  111. assert.NoError(t, PrepareTestDatabase())
  112. email := &EmailAddress{
  113. Email: "user567890@example.com",
  114. }
  115. err := MakeEmailPrimary(email)
  116. assert.Error(t, err)
  117. assert.EqualError(t, err, ErrEmailAddressNotExist{email.Email}.Error())
  118. email = &EmailAddress{
  119. Email: "user11@example.com",
  120. }
  121. err = MakeEmailPrimary(email)
  122. assert.Error(t, err)
  123. assert.EqualError(t, err, ErrEmailNotActivated.Error())
  124. email = &EmailAddress{
  125. Email: "user9999999@example.com",
  126. }
  127. err = MakeEmailPrimary(email)
  128. assert.Error(t, err)
  129. assert.True(t, IsErrUserNotExist(err))
  130. email = &EmailAddress{
  131. Email: "user101@example.com",
  132. }
  133. err = MakeEmailPrimary(email)
  134. assert.NoError(t, err)
  135. user, _ := GetUserByID(int64(10))
  136. assert.Equal(t, "user101@example.com", user.Email)
  137. }
  138. func TestActivate(t *testing.T) {
  139. assert.NoError(t, PrepareTestDatabase())
  140. email := &EmailAddress{
  141. ID: int64(1),
  142. UID: int64(1),
  143. Email: "user11@example.com",
  144. }
  145. assert.NoError(t, email.Activate())
  146. emails, _ := GetEmailAddresses(int64(1))
  147. assert.Len(t, emails, 3)
  148. assert.True(t, emails[0].IsActivated)
  149. assert.True(t, emails[0].IsPrimary)
  150. assert.False(t, emails[1].IsPrimary)
  151. assert.True(t, emails[2].IsActivated)
  152. assert.False(t, emails[2].IsPrimary)
  153. }
  154. func TestListEmails(t *testing.T) {
  155. assert.NoError(t, PrepareTestDatabase())
  156. // Must find all users and their emails
  157. opts := &SearchEmailOptions{
  158. ListOptions: ListOptions{
  159. PageSize: 10000,
  160. },
  161. }
  162. emails, count, err := SearchEmails(opts)
  163. assert.NoError(t, err)
  164. assert.NotEqual(t, int64(0), count)
  165. assert.True(t, count > 5)
  166. contains := func(match func(s *SearchEmailResult) bool) bool {
  167. for _, v := range emails {
  168. if match(v) {
  169. return true
  170. }
  171. }
  172. return false
  173. }
  174. assert.True(t, contains(func(s *SearchEmailResult) bool { return s.UID == 18 }))
  175. // 'user3' is an organization
  176. assert.False(t, contains(func(s *SearchEmailResult) bool { return s.UID == 3 }))
  177. // Must find no records
  178. opts = &SearchEmailOptions{Keyword: "NOTFOUND"}
  179. emails, count, err = SearchEmails(opts)
  180. assert.NoError(t, err)
  181. assert.Equal(t, int64(0), count)
  182. // Must find users 'user2', 'user28', etc.
  183. opts = &SearchEmailOptions{Keyword: "user2"}
  184. emails, count, err = SearchEmails(opts)
  185. assert.NoError(t, err)
  186. assert.NotEqual(t, int64(0), count)
  187. assert.True(t, contains(func(s *SearchEmailResult) bool { return s.UID == 2 }))
  188. assert.True(t, contains(func(s *SearchEmailResult) bool { return s.UID == 27 }))
  189. // Must find only primary addresses (i.e. from the `user` table)
  190. opts = &SearchEmailOptions{IsPrimary: util.OptionalBoolTrue}
  191. emails, count, err = SearchEmails(opts)
  192. assert.NoError(t, err)
  193. assert.True(t, contains(func(s *SearchEmailResult) bool { return s.IsPrimary }))
  194. assert.False(t, contains(func(s *SearchEmailResult) bool { return !s.IsPrimary }))
  195. // Must find only inactive addresses (i.e. not validated)
  196. opts = &SearchEmailOptions{IsActivated: util.OptionalBoolFalse}
  197. emails, count, err = SearchEmails(opts)
  198. assert.NoError(t, err)
  199. assert.True(t, contains(func(s *SearchEmailResult) bool { return !s.IsActivated }))
  200. assert.False(t, contains(func(s *SearchEmailResult) bool { return s.IsActivated }))
  201. // Must find more than one page, but retrieve only one
  202. opts = &SearchEmailOptions{
  203. ListOptions: ListOptions{
  204. PageSize: 5,
  205. Page: 1,
  206. },
  207. }
  208. emails, count, err = SearchEmails(opts)
  209. assert.NoError(t, err)
  210. assert.Len(t, emails, 5)
  211. assert.Greater(t, count, int64(len(emails)))
  212. }