// Copyright 2026 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package mailer import ( "net/url" "regexp" "testing" "gitea.dev/models/auth" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" "gitea.dev/modules/setting" "gitea.dev/modules/test" sender_service "gitea.dev/services/mailer/sender" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestSendRegisterNotifyMailPasswordLink(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) defer test.MockVariableValue(&setting.MailService, &setting.Mailer{})() defer test.MockVariableValue(&setting.AppURL, "https://example.com/")() var sent []*sender_service.Message defer test.MockVariableValue(&SendAsync, func(msgs ...*sender_service.Message) { sent = append(sent, msgs...) })() u := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) SendRegisterNotifyMail(u) require.Len(t, sent, 1) assert.NotContains(t, sent[0].Body, "/user/forgot_password") codePattern := regexp.MustCompile(`user/recover_account\?code=([^"]+)`) match := codePattern.FindStringSubmatch(sent[0].Body) if !assert.Len(t, match, 2) { return } code, err := url.QueryUnescape(match[1]) require.NoError(t, err) verifiedUser := user_model.VerifyUserTimeLimitCode(t.Context(), &user_model.TimeLimitCodeOptions{ Purpose: user_model.TimeLimitCodeResetPassword, }, code) require.NotNil(t, verifiedUser) assert.Equal(t, u.ID, verifiedUser.ID) } func TestSendRegisterNotifyMailExternalAccountUsesForgotPassword(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) defer test.MockVariableValue(&setting.MailService, &setting.Mailer{})() defer test.MockVariableValue(&setting.AppURL, "https://example.com/")() var sent []*sender_service.Message defer test.MockVariableValue(&SendAsync, func(msgs ...*sender_service.Message) { sent = append(sent, msgs...) })() u := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) u.LoginType = auth.LDAP SendRegisterNotifyMail(u) require.Len(t, sent, 1) assert.Contains(t, sent[0].Body, "https://example.com/user/forgot_password") assert.NotContains(t, sent[0].Body, "/user/recover_account?code=") }