From 23bbec44591836171e2b8ad3dd2577016fd47e72 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Fri, 17 May 2024 16:45:41 +0200 Subject: [PATCH] tests(services/mailer): refactor mail_admin_new_user_test * use MockVariableValue where appropriate * split the tests in two with t.Run for clarity --- services/mailer/mail_admin_new_user.go | 5 +- services/mailer/mail_admin_new_user_test.go | 73 ++++++++------------- services/mailer/main_test.go | 32 +++++++++ 3 files changed, 61 insertions(+), 49 deletions(-) diff --git a/services/mailer/mail_admin_new_user.go b/services/mailer/mail_admin_new_user.go index aa0571e57c..54287b1b7e 100644 --- a/services/mailer/mail_admin_new_user.go +++ b/services/mailer/mail_admin_new_user.go @@ -19,14 +19,11 @@ const ( tplNewUserMail base.TplName = "notify/admin_new_user" ) -var sa = SendAsync - // MailNewUser sends notification emails on new user registrations to all admins func MailNewUser(ctx context.Context, u *user_model.User) { if !setting.Admin.SendNotificationEmailOnNewUser { return } - if setting.MailService == nil { // No mail service configured return @@ -77,5 +74,5 @@ func mailNewUser(ctx context.Context, u *user_model.User, lang string, tos []str msg.Info = subject msgs = append(msgs, msg) } - sa(msgs...) + SendAsync(msgs...) } diff --git a/services/mailer/mail_admin_new_user_test.go b/services/mailer/mail_admin_new_user_test.go index b89d888ee1..603a8b95c9 100644 --- a/services/mailer/mail_admin_new_user_test.go +++ b/services/mailer/mail_admin_new_user_test.go @@ -11,10 +11,12 @@ import ( "code.gitea.io/gitea/models/db" user_model "code.gitea.io/gitea/models/user" "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/require" + + _ "github.com/mattn/go-sqlite3" ) 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) { - 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() - NewContext(ctx) users := getTestUsers(t) - oldSendAsync := sa - defer func() { - sa = oldSendAsync - cleanUpUsers(ctx, users) - }() - called := false - sa = 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, 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) - assert.Contains(t, msgs[0].Body, manageUserURL) - 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") - for _, untranslated := range []string{"mail.admin", "admin.users"} { - assert.NotContains(t, msgs[0].Body, untranslated, "this is an untranslated placeholder prefix") - } - called = true - } - MailNewUser(ctx, users[1]) - assert.True(t, called) + t.Run("SendNotificationEmailOnNewUser_true", func(t *testing.T) { + defer test.MockVariableValue(&setting.Admin.SendNotificationEmailOnNewUser, true)() - // test with SEND_NOTIFICATION_EMAIL_ON_NEW_USER disabled; emails shouldn't be sent - setting.Admin.SendNotificationEmailOnNewUser = false - sa = 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") - } + called := false + 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, 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) + assert.Contains(t, msgs[0].Body, manageUserURL) + assert.Contains(t, msgs[0].Body, users[1].HTMLURL()) + assert.Contains(t, msgs[0].Body, users[1].Name, "user name of the newly created user") + assertTranslatedLocale(t, msgs[0].Body, "mail.admin", "admin.users") + called = true + })() + MailNewUser(ctx, users[1]) + assert.True(t, called) + }) - MailNewUser(ctx, users[1]) + t.Run("SendNotificationEmailOnNewUser_false", func(t *testing.T) { + defer test.MockVariableValue(&setting.Admin.SendNotificationEmailOnNewUser, false)() + 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") + })() + MailNewUser(ctx, users[1]) + }) + + cleanUpUsers(ctx, users) } diff --git a/services/mailer/main_test.go b/services/mailer/main_test.go index f803c736ca..399d05ac7b 100644 --- a/services/mailer/main_test.go +++ b/services/mailer/main_test.go @@ -4,13 +4,45 @@ package mailer import ( + "context" "testing" "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" + + "github.com/stretchr/testify/assert" ) func TestMain(m *testing.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() + } + } +}