Files
cc-connect/core/webhook_test.go
T
2026-06-02 23:14:41 +08:00

105 lines
3.0 KiB
Go

package core
import (
"bytes"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
)
func TestWebhookServer_AuthBearer(t *testing.T) {
ws := NewWebhookServer(0, "my-secret", "/hook")
r := httptest.NewRequest(http.MethodPost, "/hook", nil)
r.Header.Set("Authorization", "Bearer my-secret")
if !ws.authenticate(r) {
t.Error("expected auth to succeed with correct Bearer token")
}
r.Header.Set("Authorization", "Bearer wrong")
if ws.authenticate(r) {
t.Error("expected auth to fail with wrong Bearer token")
}
}
func TestWebhookServer_AuthHeader(t *testing.T) {
ws := NewWebhookServer(0, "tok123", "/hook")
r := httptest.NewRequest(http.MethodPost, "/hook", nil)
r.Header.Set("X-Webhook-Token", "tok123")
if !ws.authenticate(r) {
t.Error("expected auth to succeed with X-Webhook-Token")
}
}
func TestWebhookServer_AuthQuery(t *testing.T) {
ws := NewWebhookServer(0, "qsecret", "/hook")
r := httptest.NewRequest(http.MethodPost, "/hook?token=qsecret", nil)
if !ws.authenticate(r) {
t.Error("expected auth to succeed with query token")
}
}
func TestWebhookServer_NoTokenRequired(t *testing.T) {
ws := NewWebhookServer(0, "", "/hook")
r := httptest.NewRequest(http.MethodPost, "/hook", nil)
if !ws.authenticate(r) {
t.Error("expected auth to pass when no token configured")
}
}
func TestWebhookServer_HandleHook_MethodNotAllowed(t *testing.T) {
ws := NewWebhookServer(0, "", "/hook")
w := httptest.NewRecorder()
r := httptest.NewRequest(http.MethodGet, "/hook", nil)
ws.handleHook(w, r)
if w.Code != http.StatusMethodNotAllowed {
t.Errorf("expected 405, got %d", w.Code)
}
}
func TestWebhookServer_HandleHook_Unauthorized(t *testing.T) {
ws := NewWebhookServer(0, "secret", "/hook")
w := httptest.NewRecorder()
body, _ := json.Marshal(WebhookRequest{SessionKey: "tg:1:1", Prompt: "hi"})
r := httptest.NewRequest(http.MethodPost, "/hook", bytes.NewReader(body))
ws.handleHook(w, r)
if w.Code != http.StatusUnauthorized {
t.Errorf("expected 401, got %d", w.Code)
}
}
func TestWebhookServer_HandleHook_Validation(t *testing.T) {
ws := NewWebhookServer(0, "", "/hook")
tests := []struct {
name string
body WebhookRequest
code int
}{
{"missing session_key", WebhookRequest{Prompt: "hi"}, http.StatusBadRequest},
{"missing prompt and exec", WebhookRequest{SessionKey: "tg:1:1"}, http.StatusBadRequest},
{"both prompt and exec", WebhookRequest{SessionKey: "tg:1:1", Prompt: "hi", Exec: "ls"}, http.StatusBadRequest},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
w := httptest.NewRecorder()
body, _ := json.Marshal(tt.body)
r := httptest.NewRequest(http.MethodPost, "/hook", bytes.NewReader(body))
ws.handleHook(w, r)
if w.Code != tt.code {
t.Errorf("expected %d, got %d: %s", tt.code, w.Code, w.Body.String())
}
})
}
}
func TestWebhookServer_DefaultValues(t *testing.T) {
ws := NewWebhookServer(0, "", "")
if ws.port != 9111 {
t.Errorf("expected default port 9111, got %d", ws.port)
}
if ws.path != "/hook" {
t.Errorf("expected default path /hook, got %s", ws.path)
}
}