Files
hanko/backend/webhooks/manager_test.go
2025-09-25 19:15:20 +02:00

207 lines
4.9 KiB
Go

package webhooks
import (
"github.com/gofrs/uuid"
"github.com/stretchr/testify/suite"
"github.com/teamhanko/hanko/backend/v2/config"
"github.com/teamhanko/hanko/backend/v2/persistence"
"github.com/teamhanko/hanko/backend/v2/persistence/models"
"github.com/teamhanko/hanko/backend/v2/test"
"github.com/teamhanko/hanko/backend/v2/webhooks/events"
"net/http"
"net/http/httptest"
"testing"
"time"
)
func TestManagerSuite(t *testing.T) {
t.Parallel()
suite.Run(t, new(managerSuite))
}
type managerSuite struct {
test.Suite
}
func (s *managerSuite) TestNewManager() {
cfg := config.Config{}
jwkManager := test.JwkManager{}
manager, err := NewManager(&cfg, s.Storage, jwkManager, nil)
s.NoError(err)
s.NotEmpty(manager)
}
func (s *managerSuite) TestManager_GenerateJWT() {
cfg := config.Config{}
jwkManager := test.JwkManager{}
manager, err := NewManager(&cfg, s.Storage, jwkManager, nil)
testData := "lorem-ipsum"
dataToken, err := manager.GenerateJWT(testData, events.UserCreate)
s.NoError(err)
s.NotEmpty(dataToken)
}
func (s *managerSuite) TestManager_TriggerWithoutHook() {
triggered := false
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
triggered = true
}))
defer server.Close()
cfg := config.Config{}
jwkManager := test.JwkManager{}
manager, err := NewManager(&cfg, s.Storage, jwkManager, nil)
s.Require().NoError(err)
manager.Trigger(s.Storage.GetConnection(), events.UserCreate, "lorem-ipsum")
// give it 1 sec to trigger
time.Sleep(1 * time.Second)
s.False(triggered)
}
func (s *managerSuite) TestManager_TriggerWithConfigHook() {
triggered := false
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
triggered = true
}))
defer server.Close()
hooks := config.Webhooks{config.Webhook{
Callback: server.URL,
Events: events.Events{
events.UserCreate,
},
}}
cfg := config.Config{
Webhooks: config.WebhookSettings{
Enabled: true,
Hooks: hooks,
},
}
jwkManager := test.JwkManager{}
manager, err := NewManager(&cfg, s.Storage, jwkManager, nil)
s.Require().NoError(err)
manager.Trigger(s.Storage.GetConnection(), events.UserCreate, "lorem-ipsum")
// give it 1 sec to trigger
time.Sleep(1 * time.Second)
s.True(triggered)
}
func (s *managerSuite) TestManager_TriggerWithDisabledConfigHook() {
triggered := false
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
triggered = true
}))
defer server.Close()
hooks := config.Webhooks{config.Webhook{
Callback: server.URL,
Events: events.Events{
events.UserCreate,
},
}}
cfg := config.Config{
Webhooks: config.WebhookSettings{
Enabled: false,
Hooks: hooks,
},
}
jwkManager := test.JwkManager{}
manager, err := NewManager(&cfg, s.Storage, jwkManager, nil)
s.Require().NoError(err)
manager.Trigger(s.Storage.GetConnection(), events.UserCreate, "lorem-ipsum")
// give it 1 sec to trigger
time.Sleep(1 * time.Second)
s.False(triggered)
}
func (s *managerSuite) TestManager_TriggerWithDbHook() {
triggered := false
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
triggered = true
}))
defer server.Close()
cfg := config.Config{}
jwkManager := test.JwkManager{}
persister := s.Storage.GetWebhookPersister(nil)
s.createTestDatabaseWebhook(persister, true, server.URL)
manager, err := NewManager(&cfg, s.Storage, jwkManager, nil)
s.Require().NoError(err)
manager.Trigger(s.Storage.GetConnection(), events.UserCreate, "lorem-ipsum")
// give it 1 sec to trigger
time.Sleep(1 * time.Second)
s.True(triggered)
}
func (s *managerSuite) TestManager_TriggerWithDisabledDbHook() {
triggered := false
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
triggered = true
}))
defer server.Close()
cfg := config.Config{}
jwkManager := test.JwkManager{}
persister := s.Storage.GetWebhookPersister(nil)
s.createTestDatabaseWebhook(persister, false, server.URL)
manager, err := NewManager(&cfg, s.Storage, jwkManager, nil)
s.Require().NoError(err)
manager.Trigger(s.Storage.GetConnection(), events.UserCreate, "lorem-ipsum")
// give it 1 sec to trigger
time.Sleep(1 * time.Second)
s.False(triggered)
}
func (s *managerSuite) createTestDatabaseWebhook(persister persistence.WebhookPersister, isEnabled bool, callback string) {
now := time.Now()
hookId := uuid.FromStringOrNil("8b00da9a-cacf-45ea-b25d-c1ce0f0d7da1")
err := persister.Create(
models.Webhook{
ID: hookId,
Callback: callback,
Enabled: isEnabled,
Failures: 0,
ExpiresAt: now.Add(WebhookExpireDuration),
CreatedAt: now,
UpdatedAt: now,
},
models.WebhookEvents{
models.WebhookEvent{
ID: uuid.FromStringOrNil("8b00da9a-cacf-45ea-b25d-c1ce0f0d7da0"),
WebhookID: hookId,
Event: string(events.UserCreate),
CreatedAt: now,
UpdatedAt: now,
},
})
s.Require().NoError(err)
}