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

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