tests(services/mailer): refactor mail_admin_new_user_test

* use MockVariableValue where appropriate
* split the tests in two with t.Run for clarity
This commit is contained in:
Earl Warren 2024-05-17 16:45:41 +02:00
parent 45a41811de
commit 23bbec4459
WARNING! Although there is a key with this ID in the database it does not verify this commit! This commit is SUSPICIOUS.
GPG key ID: 0579CB2928A78A00
3 changed files with 61 additions and 49 deletions

View file

@ -19,14 +19,11 @@ const (
tplNewUserMail base.TplName = "notify/admin_new_user" tplNewUserMail base.TplName = "notify/admin_new_user"
) )
var sa = SendAsync
// MailNewUser sends notification emails on new user registrations to all admins // MailNewUser sends notification emails on new user registrations to all admins
func MailNewUser(ctx context.Context, u *user_model.User) { func MailNewUser(ctx context.Context, u *user_model.User) {
if !setting.Admin.SendNotificationEmailOnNewUser { if !setting.Admin.SendNotificationEmailOnNewUser {
return return
} }
if setting.MailService == nil { if setting.MailService == nil {
// No mail service configured // No mail service configured
return return
@ -77,5 +74,5 @@ func mailNewUser(ctx context.Context, u *user_model.User, lang string, tos []str
msg.Info = subject msg.Info = subject
msgs = append(msgs, msg) msgs = append(msgs, msg)
} }
sa(msgs...) SendAsync(msgs...)
} }

View file

@ -11,10 +11,12 @@ import (
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/translation" "code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
_ "github.com/mattn/go-sqlite3"
) )
func getTestUsers(t *testing.T) []*user_model.User { func getTestUsers(t *testing.T) []*user_model.User {
@ -45,54 +47,35 @@ func cleanUpUsers(ctx context.Context, users []*user_model.User) {
} }
func TestAdminNotificationMail_test(t *testing.T) { func TestAdminNotificationMail_test(t *testing.T) {
translation.InitLocales(context.Background())
locale := translation.NewLocale("")
key := "mail.admin.new_user.user_info"
translatedKey := locale.Tr(key)
require.NotEqualValues(t, key, translatedKey)
mailService := setting.Mailer{
From: "test@example.com",
Protocol: "dummy",
}
setting.MailService = &mailService
// test with SEND_NOTIFICATION_EMAIL_ON_NEW_USER enabled
setting.Admin.SendNotificationEmailOnNewUser = true
ctx := context.Background() ctx := context.Background()
NewContext(ctx)
users := getTestUsers(t) users := getTestUsers(t)
oldSendAsync := sa
defer func() { t.Run("SendNotificationEmailOnNewUser_true", func(t *testing.T) {
sa = oldSendAsync defer test.MockVariableValue(&setting.Admin.SendNotificationEmailOnNewUser, true)()
cleanUpUsers(ctx, users)
}()
called := false called := false
sa = func(msgs ...*Message) { defer mockMailSettings(func(msgs ...*Message) {
assert.Equal(t, len(msgs), 1, "Test provides only one admin user, so only one email must be sent") assert.Equal(t, len(msgs), 1, "Test provides only one admin user, so only one email must be sent")
assert.Equal(t, msgs[0].To, users[0].Email, "checks if the recipient is the admin of the instance") assert.Equal(t, msgs[0].To, users[0].Email, "checks if the recipient is the admin of the instance")
manageUserURL := setting.AppURL + "admin/users/" + strconv.FormatInt(users[1].ID, 10) manageUserURL := setting.AppURL + "admin/users/" + strconv.FormatInt(users[1].ID, 10)
assert.Contains(t, msgs[0].Body, manageUserURL) assert.Contains(t, msgs[0].Body, manageUserURL)
assert.Contains(t, msgs[0].Body, users[1].HTMLURL()) assert.Contains(t, msgs[0].Body, users[1].HTMLURL())
assert.Contains(t, msgs[0].Body, translatedKey, "the .Locale translates to nothing")
assert.Contains(t, msgs[0].Body, users[1].Name, "user name of the newly created user") assert.Contains(t, msgs[0].Body, users[1].Name, "user name of the newly created user")
for _, untranslated := range []string{"mail.admin", "admin.users"} { assertTranslatedLocale(t, msgs[0].Body, "mail.admin", "admin.users")
assert.NotContains(t, msgs[0].Body, untranslated, "this is an untranslated placeholder prefix")
}
called = true called = true
} })()
MailNewUser(ctx, users[1]) MailNewUser(ctx, users[1])
assert.True(t, called) assert.True(t, called)
})
// test with SEND_NOTIFICATION_EMAIL_ON_NEW_USER disabled; emails shouldn't be sent t.Run("SendNotificationEmailOnNewUser_false", func(t *testing.T) {
setting.Admin.SendNotificationEmailOnNewUser = false defer test.MockVariableValue(&setting.Admin.SendNotificationEmailOnNewUser, false)()
sa = func(msgs ...*Message) { defer mockMailSettings(func(msgs ...*Message) {
assert.Equal(t, 1, 0, "this shouldn't execute. MailNewUser must exit early since SEND_NOTIFICATION_EMAIL_ON_NEW_USER is disabled") assert.Equal(t, 1, 0, "this shouldn't execute. MailNewUser must exit early since SEND_NOTIFICATION_EMAIL_ON_NEW_USER is disabled")
} })()
MailNewUser(ctx, users[1]) MailNewUser(ctx, users[1])
})
cleanUpUsers(ctx, users)
} }

View file

@ -4,13 +4,45 @@
package mailer package mailer
import ( import (
"context"
"testing" "testing"
"code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/models/unittest"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/templates"
"code.gitea.io/gitea/modules/test"
"code.gitea.io/gitea/modules/translation"
_ "code.gitea.io/gitea/models/actions" _ "code.gitea.io/gitea/models/actions"
"github.com/stretchr/testify/assert"
) )
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
unittest.MainTest(m) unittest.MainTest(m)
} }
func assertTranslatedLocale(t *testing.T, message string, prefixes ...string) {
t.Helper()
for _, prefix := range prefixes {
assert.NotContains(t, message, prefix, "there is an untranslated locale prefix")
}
}
func mockMailSettings(send func(msgs ...*Message)) func() {
translation.InitLocales(context.Background())
subjectTemplates, bodyTemplates = templates.Mailer(context.Background())
mailService := setting.Mailer{
From: "test@gitea.com",
}
cleanups := []func(){
test.MockVariableValue(&setting.MailService, &mailService),
test.MockVariableValue(&setting.Domain, "localhost"),
test.MockVariableValue(&SendAsync, send),
}
return func() {
for _, cleanup := range cleanups {
cleanup()
}
}
}