You've already forked agentic-coding-workflow
feat(jobs): WebhookNotifier enqueues webhook.deliver jobs (topic whitelist + disabled short-circuit)
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
//go:build integration
|
||||
|
||||
package jobs_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/yan1h/agent-coding-workflow/internal/infra/clock"
|
||||
"github.com/yan1h/agent-coding-workflow/internal/infra/notify"
|
||||
"github.com/yan1h/agent-coding-workflow/internal/jobs"
|
||||
)
|
||||
|
||||
func TestWebhookNotifier_EnqueuesForWhitelistedTopic(t *testing.T) {
|
||||
t.Parallel()
|
||||
repo, _ := setupRepo(t)
|
||||
ctx := context.Background()
|
||||
n := jobs.NewWebhookNotifier(repo, jobs.WebhookNotifierConfig{
|
||||
Enabled: true,
|
||||
Topics: []string{"workspace.sync_failed"},
|
||||
Backoff: []time.Duration{30 * time.Second},
|
||||
}, clock.Real())
|
||||
|
||||
err := n.Send(ctx, notify.Message{
|
||||
ID: uuid.New(), UserID: uuid.New(), Topic: "workspace.sync_failed",
|
||||
Severity: notify.SeverityError, Title: "fail", Body: "x",
|
||||
CreatedAt: time.Now(),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
got, err := repo.Lease(ctx, "test-lease")
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, got)
|
||||
assert.Equal(t, jobs.TypeWebhookDeliver, got.Type)
|
||||
|
||||
var payload map[string]any
|
||||
require.NoError(t, json.Unmarshal(got.Payload, &payload))
|
||||
assert.Equal(t, "workspace.sync_failed", payload["topic"])
|
||||
}
|
||||
|
||||
func TestWebhookNotifier_DropsNonWhitelistedTopic(t *testing.T) {
|
||||
t.Parallel()
|
||||
repo, _ := setupRepo(t)
|
||||
ctx := context.Background()
|
||||
n := jobs.NewWebhookNotifier(repo, jobs.WebhookNotifierConfig{
|
||||
Enabled: true,
|
||||
Topics: []string{"workspace.sync_failed"},
|
||||
Backoff: []time.Duration{30 * time.Second},
|
||||
}, clock.Real())
|
||||
|
||||
err := n.Send(ctx, notify.Message{
|
||||
ID: uuid.New(), UserID: uuid.New(), Topic: "chat.message_failed",
|
||||
Severity: notify.SeverityError, CreatedAt: time.Now(),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
got, _ := repo.Lease(ctx, "t")
|
||||
assert.Nil(t, got, "non-whitelisted topic must not enqueue")
|
||||
}
|
||||
|
||||
func TestWebhookNotifier_DisabledShortCircuits(t *testing.T) {
|
||||
t.Parallel()
|
||||
repo, _ := setupRepo(t)
|
||||
ctx := context.Background()
|
||||
n := jobs.NewWebhookNotifier(repo, jobs.WebhookNotifierConfig{
|
||||
Enabled: false,
|
||||
Topics: []string{"workspace.sync_failed"},
|
||||
}, clock.Real())
|
||||
err := n.Send(ctx, notify.Message{
|
||||
ID: uuid.New(), UserID: uuid.New(), Topic: "workspace.sync_failed", CreatedAt: time.Now(),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
got, _ := repo.Lease(ctx, "t")
|
||||
assert.Nil(t, got)
|
||||
}
|
||||
|
||||
func TestWebhookNotifier_Name(t *testing.T) {
|
||||
n := jobs.NewWebhookNotifier(nil, jobs.WebhookNotifierConfig{}, clock.Real())
|
||||
assert.Equal(t, notify.ChannelWebhook, n.Name())
|
||||
}
|
||||
Reference in New Issue
Block a user