Ctrl K
ComunidadGuías…

internal/rest/webhook_test.go

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

Archivo original ↗Preguntar a KiBot
package rest_test

import (
	"context"
	"encoding/json"
	"net/http"
	"testing"

	"github.com/go-chi/chi/v5"
	"github.com/google/uuid"

	"github.com/sarathsp06/sparrow/internal/rest"
	"github.com/sarathsp06/sparrow/internal/webhooks"
	"github.com/sarathsp06/sparrow/internal/webhooks/store"
)

// createOnlyService returns a fixed stored registration from CreateWebhook.
type createOnlyService struct {
	webhooks.WebhookServiceInterface
	reg    *store.WebhookRegistration
	secret string
}

func (s createOnlyService) CreateWebhook(context.Context, webhooks.WebhookRegistrationRequest) (*store.WebhookRegistration, string, error) {
	return s.reg, s.secret, nil
}

func (s createOnlyService) DecryptSecretHeaders([]byte) (map[string]string, error) {
	return map[string]string{"Authorization": "Bearer upstream"}, nil
}

func (s createOnlyService) DecryptWebhookSecret([]byte) (string, error) { return s.secret, nil }

func (s createOnlyService) WebhookSigningPublicKeyHex([]byte) string { return "" }

// The create response must describe the stored webhook like every later read
// does (headers, masked secret headers), plus the plaintext secret once.
func TestRegisterWebhook_ReturnsStoredRegistration(t *testing.T) {
	svc := createOnlyService{
		reg: &store.WebhookRegistration{
			ID:            uuid.New(),
			Consumer:      "acme",
			URL:           "https://example.com/hook",
			Headers:       map[string]string{"X-Team": "billing"},
			SecretHeaders: []byte("encrypted"),
			WebhookSecret: []byte("encrypted"),
			Active:        true,
			Health:        "unknown",
			SignatureType: store.SignatureTypeHMAC,
		},
		secret: "whsec_plaintext",
	}
	r := chi.NewRouter()
	rest.Mount(r, svc, rest.AccessDeps{}, rest.AIDeps{}, nil)

	rec := do(r, http.MethodPost, "/v1/consumers/acme/webhooks", `{"url":"https://example.com/hook","events":["order.created"]}`)
	if rec.Code != http.StatusCreated {
		t.Fatalf("status = %d, body %s", rec.Code, rec.Body)
	}
	var out rest.WebhookOut
	if err := json.Unmarshal(rec.Body.Bytes(), &out); err != nil {
		t.Fatal(err)
	}
	if out.Headers["X-Team"] != "billing" {
		t.Errorf("headers = %v, want X-Team", out.Headers)
	}
	if out.SecretHeaders["Authorization"] != "••••••" {
		t.Errorf("secret_headers = %v, want Authorization masked", out.SecretHeaders)
	}
	if out.HTTPConfig.WebhookSecret != "whsec_plaintext" {
		t.Errorf("webhook_secret = %q, want the plaintext secret", out.HTTPConfig.WebhookSecret)
	}
	if len(out.Events) != 1 || out.Events[0] != "order.created" {
		t.Errorf("events = %v", out.Events)
	}
}