mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-08-19 17:01:12 +00:00
bug: Forgejo Actions email notifications are opt-in (#8242)
* Add the `notify-email` column / NotifyEmail to ActionRun and set it: * services/actions/workflows.go `Dispatch` * services/actions/schedule_tasks.go `CreateScheduleTask` * services/actions/notifier_helper.go `handleWorkflows` * Only send an email if the workflow has `enable-email-notifications: true` by having `MailActionRun` return immediately if `NotifyEmail` is false. * Ignore or silently fail on `enable-email-notifications: true` parsing errors. Reporting such errors belongs in workflow validation, not when it is evaluated for the notifications. * Add unit and integration tests. Refs: https://codeberg.org/forgejo/forgejo/issues/8187 ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [x] in their respective `*_test.go` for unit tests. - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server. ### Documentation - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] I do not want this change to show in the release notes. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8242 Reviewed-by: Christopher Besch <mail@chris-besch.com> Co-authored-by: Earl Warren <contact@earl-warren.org> Co-committed-by: Earl Warren <contact@earl-warren.org>
This commit is contained in:
parent
9e6f722f94
commit
b2c4fc9f94
11 changed files with 274 additions and 0 deletions
121
services/actions/schedule_tasks_test.go
Normal file
121
services/actions/schedule_tasks_test.go
Normal file
|
@ -0,0 +1,121 @@
|
|||
// Copyright 2025 The Forgejo Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package actions
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
actions_model "forgejo.org/models/actions"
|
||||
repo_model "forgejo.org/models/repo"
|
||||
"forgejo.org/models/unittest"
|
||||
webhook_module "forgejo.org/modules/webhook"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestCreateScheduleTask(t *testing.T) {
|
||||
require.NoError(t, unittest.PrepareTestDatabase())
|
||||
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2, OwnerID: 2})
|
||||
|
||||
assertConstant := func(t *testing.T, cron *actions_model.ActionSchedule, run *actions_model.ActionRun) {
|
||||
t.Helper()
|
||||
assert.Equal(t, cron.Title, run.Title)
|
||||
assert.Equal(t, cron.RepoID, run.RepoID)
|
||||
assert.Equal(t, cron.OwnerID, run.OwnerID)
|
||||
assert.Equal(t, cron.WorkflowID, run.WorkflowID)
|
||||
assert.Equal(t, cron.TriggerUserID, run.TriggerUserID)
|
||||
assert.Equal(t, cron.Ref, run.Ref)
|
||||
assert.Equal(t, cron.CommitSHA, run.CommitSHA)
|
||||
assert.Equal(t, cron.Event, run.Event)
|
||||
assert.Equal(t, cron.EventPayload, run.EventPayload)
|
||||
assert.Equal(t, cron.ID, run.ScheduleID)
|
||||
assert.Equal(t, actions_model.StatusWaiting, run.Status)
|
||||
}
|
||||
|
||||
assertMutable := func(t *testing.T, expected, run *actions_model.ActionRun) {
|
||||
t.Helper()
|
||||
assert.Equal(t, expected.NotifyEmail, run.NotifyEmail)
|
||||
}
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
cron actions_model.ActionSchedule
|
||||
want []actions_model.ActionRun
|
||||
}{
|
||||
{
|
||||
name: "simple",
|
||||
cron: actions_model.ActionSchedule{
|
||||
Title: "scheduletitle1",
|
||||
RepoID: repo.ID,
|
||||
OwnerID: repo.OwnerID,
|
||||
WorkflowID: "some.yml",
|
||||
TriggerUserID: repo.OwnerID,
|
||||
Ref: "branch",
|
||||
CommitSHA: "fakeSHA",
|
||||
Event: webhook_module.HookEventSchedule,
|
||||
EventPayload: "fakepayload",
|
||||
Content: []byte(
|
||||
`
|
||||
name: test
|
||||
on: push
|
||||
jobs:
|
||||
job2:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: true
|
||||
`),
|
||||
},
|
||||
want: []actions_model.ActionRun{
|
||||
{
|
||||
Title: "scheduletitle1",
|
||||
NotifyEmail: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "enable-email-notifications is true",
|
||||
cron: actions_model.ActionSchedule{
|
||||
Title: "scheduletitle2",
|
||||
RepoID: repo.ID,
|
||||
OwnerID: repo.OwnerID,
|
||||
WorkflowID: "some.yml",
|
||||
TriggerUserID: repo.OwnerID,
|
||||
Ref: "branch",
|
||||
CommitSHA: "fakeSHA",
|
||||
Event: webhook_module.HookEventSchedule,
|
||||
EventPayload: "fakepayload",
|
||||
Content: []byte(
|
||||
`
|
||||
name: test
|
||||
enable-email-notifications: true
|
||||
on: push
|
||||
jobs:
|
||||
job2:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: true
|
||||
`),
|
||||
},
|
||||
want: []actions_model.ActionRun{
|
||||
{
|
||||
Title: "scheduletitle2",
|
||||
NotifyEmail: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, testCase := range testCases {
|
||||
t.Run(testCase.name, func(t *testing.T) {
|
||||
require.NoError(t, CreateScheduleTask(t.Context(), &testCase.cron))
|
||||
require.Equal(t, len(testCase.want), unittest.GetCount(t, actions_model.ActionRun{RepoID: repo.ID}))
|
||||
for _, expected := range testCase.want {
|
||||
run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{Title: expected.Title})
|
||||
assertConstant(t, &testCase.cron, run)
|
||||
assertMutable(t, &expected, run)
|
||||
}
|
||||
unittest.AssertSuccessfulDelete(t, actions_model.ActionRun{RepoID: repo.ID})
|
||||
})
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue