Ctrl K
ComunidadGuías…

server/internal/handlers/webhook_watchtower_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package handlers_test

import (
	"bytes"
	"encoding/json"
	"net/http"
	"net/http/httptest"
	"testing"

	"blackbox/server/internal/handlers"
	"blackbox/shared/types"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestWebhookWatchtower_SavesEntry(t *testing.T) {
	database := newTestDB(t)

	body := `{"Title":"Watchtower Updates","Message":"Updated containers: my-app (sha256:abc123)","Level":"info"}`
	req := httptest.NewRequest(http.MethodPost, "/api/webhooks/watchtower", bytes.NewBufferString(body))
	req.Header.Set("Content-Type", "application/json")
	w := httptest.NewRecorder()

	handlers.WebhookWatchtower(database, nil, testIncidentChannel(t), nil)(w, req)

	assert.Equal(t, http.StatusCreated, w.Code)

	var entries []types.Entry
	require.NoError(t, database.Find(&entries).Error)
	require.Len(t, entries, 1)

	e := entries[0]
	assert.Equal(t, "webhook", e.NodeName)
	assert.Equal(t, "webhook", e.Source)
	assert.Equal(t, "watchtower", e.Service)
	assert.Equal(t, "update", e.Event)
	assert.Equal(t, "Updated containers: my-app (sha256:abc123)", e.Content)
	assert.NotEmpty(t, e.ID)

	var meta map[string]interface{}
	require.NoError(t, json.Unmarshal([]byte(e.Metadata), &meta))
	require.Equal(t, []interface{}{"my-app"}, meta["watchtower.services"])
}

func TestWebhookWatchtower_NormalizesServiceNames(t *testing.T) {
	database := newTestDB(t)

	body := `{"Title":"Watchtower Updates","Message":"Updated containers","Level":"info"}`
	req := httptest.NewRequest(http.MethodPost, "/api/webhooks/watchtower", bytes.NewBufferString(body))
	req.Header.Set("Content-Type", "application/json")
	w := httptest.NewRecorder()

	handlers.WebhookWatchtower(database, nil, testIncidentChannel(t), nil)(w, req)

	require.Equal(t, http.StatusCreated, w.Code)

	var entry types.Entry
	require.NoError(t, database.First(&entry).Error)
	assert.Equal(t, "watchtower", entry.Service)

	body = `{"Title":"Watchtower Updates","Message":"Updated containers: My-App, Other-App, my-app","Level":"info"}`
	req = httptest.NewRequest(http.MethodPost, "/api/webhooks/watchtower", bytes.NewBufferString(body))
	req.Header.Set("Content-Type", "application/json")
	w = httptest.NewRecorder()

	handlers.WebhookWatchtower(database, nil, testIncidentChannel(t), nil)(w, req)

	require.Equal(t, http.StatusCreated, w.Code)

	var entries []types.Entry
	require.NoError(t, database.Where("source = ? AND event = ?", "webhook", "update").Find(&entries).Error)
	require.Len(t, entries, 2)
	for _, candidate := range entries {
		if candidate.Content == "Updated containers: My-App, Other-App, my-app" {
			entry = candidate
			break
		}
	}
	require.Equal(t, "Updated containers: My-App, Other-App, my-app", entry.Content)
	var meta map[string]interface{}
	require.NoError(t, json.Unmarshal([]byte(entry.Metadata), &meta))
	require.Equal(t, []interface{}{"my-app", "other-app"}, meta["watchtower.services"])
}

func TestWebhookWatchtower_RejectsMalformedJSON(t *testing.T) {
	database := newTestDB(t)

	req := httptest.NewRequest(http.MethodPost, "/api/webhooks/watchtower", bytes.NewBufferString("{bad json"))
	req.Header.Set("Content-Type", "application/json")
	w := httptest.NewRecorder()

	handlers.WebhookWatchtower(database, nil, testIncidentChannel(t), nil)(w, req)

	assert.Equal(t, http.StatusBadRequest, w.Code)

	var entries []types.Entry
	require.NoError(t, database.Find(&entries).Error)
	assert.Empty(t, entries)
}