diff --git a/services/mailer/fixtures/TestMailNewRelease/watch.yml b/services/mailer/fixtures/TestMailNewRelease/watch.yml new file mode 100644 index 0000000000..4c488a6f85 --- /dev/null +++ b/services/mailer/fixtures/TestMailNewRelease/watch.yml @@ -0,0 +1,5 @@ +- + id: 1001 + user_id: 11 + repo_id: 41 + mode: 1 diff --git a/services/mailer/mail_release_test.go b/services/mailer/mail_release_test.go new file mode 100644 index 0000000000..4b37afb8cd --- /dev/null +++ b/services/mailer/mail_release_test.go @@ -0,0 +1,122 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package mailer_test + +import ( + "testing" + + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/gitrepo" + "forgejo.org/services/mailer" + release_service "forgejo.org/services/release" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestMailNewRelease(t *testing.T) { + defer unittest.OverrideFixtures("services/mailer/fixtures/TestMailNewRelease")() + defer require.NoError(t, unittest.PrepareTestDatabase()) + + user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + user11 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 11}) + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + + gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + require.NoError(t, err) + defer gitRepo.Close() + + t.Run("Normal", func(t *testing.T) { + called := false + + defer mailer.MockMailSettings(func(msgs ...*mailer.Message) { + assert.Len(t, msgs, 2) + if user1.EmailTo() == msgs[0].To { + assert.Equal(t, user11.EmailTo(), msgs[1].To) + } else { + assert.Equal(t, user11.EmailTo(), msgs[0].To) + assert.Equal(t, user1.EmailTo(), msgs[1].To) + } + + assert.Equal(t, "v0.1 in user2/repo1 released", msgs[0].Subject) + called = true + })() + + require.NoError(t, release_service.CreateRelease(gitRepo, &repo_model.Release{ + RepoID: repo.ID, + Repo: repo, + PublisherID: user2.ID, + Publisher: user2, + TagName: "v0.1", + Target: "master", + Title: "v0.1 is released", + Note: "v0.1 is released", + }, "", []*release_service.AttachmentChange{})) + + assert.True(t, called) + }) + + t.Run("Non-active user", func(t *testing.T) { + _, err := db.GetEngine(db.DefaultContext).Exec("UPDATE user SET is_active=false WHERE id=11") + require.NoError(t, err) + + t.Cleanup(func() { + _, err := db.GetEngine(db.DefaultContext).Exec("UPDATE user SET is_active=true WHERE id=11") + require.NoError(t, err) + }) + called := false + + defer mailer.MockMailSettings(func(msgs ...*mailer.Message) { + assert.Len(t, msgs, 1) + assert.Equal(t, user1.EmailTo(), msgs[0].To) + + assert.Equal(t, "v0.2 in user2/repo1 released", msgs[0].Subject) + called = true + })() + + require.NoError(t, release_service.CreateRelease(gitRepo, &repo_model.Release{ + RepoID: repo.ID, + Repo: repo, + PublisherID: user2.ID, + Publisher: user2, + TagName: "v0.2", + Target: "master", + Title: "v0.2 is released", + Note: "v0.2 is released", + }, "", []*release_service.AttachmentChange{})) + + assert.True(t, called) + }) + + t.Run("No permissions for releases", func(t *testing.T) { + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 41}) + + gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + require.NoError(t, err) + defer gitRepo.Close() + + called := false + + defer mailer.MockMailSettings(func(msgs ...*mailer.Message) { + called = true + })() + + require.NoError(t, release_service.CreateRelease(gitRepo, &repo_model.Release{ + RepoID: repo.ID, + Repo: repo, + PublisherID: user2.ID, + Publisher: user2, + TagName: "v0.2", + Target: "master", + Title: "v0.2 is released", + Note: "v0.2 is released", + }, "", []*release_service.AttachmentChange{})) + + assert.False(t, called) + }) +} diff --git a/services/mailer/main_test.go b/services/mailer/main_test.go index 9ef71dbdb3..aaa43b0b67 100644 --- a/services/mailer/main_test.go +++ b/services/mailer/main_test.go @@ -12,6 +12,7 @@ import ( "forgejo.org/modules/templates" "forgejo.org/modules/test" "forgejo.org/modules/translation" + notify_service "forgejo.org/services/notify" _ "forgejo.org/models/actions" @@ -35,6 +36,7 @@ func MockMailSettings(send func(msgs ...*Message)) func() { mailService := setting.Mailer{ From: "test@gitea.com", } + notify_service.RegisterNotifier(NewNotifier()) cleanups := []func(){ test.MockVariableValue(&setting.MailService, &mailService), test.MockVariableValue(&setting.Domain, "localhost"),