giteabot backport / giteabot (push) Canceled after 0s
giteabot / giteabot (push) Canceled after 0s
release-nightly / nightly-binary (push) Canceled after 0s
release-nightly / nightly-container (push) Canceled after 0s
cache-seeder / gobuild (push) Canceled after 0s
cache-seeder / lint (bindata, lint-backend) (push) Canceled after 0s
release-nightly-snapcraft / build-and-publish (push) Canceled after 0s
Includes direct password setup links in registration emails. Assisted-by: Codex:GPT-5
73 lines
2.2 KiB
Go
73 lines
2.2 KiB
Go
// 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=")
|
|
}
|