mirror of
https://github.com/sipeed/picoclaw.git
synced 2026-06-12 18:08:54 +00:00
667fc85d54
add new field type to Channel struct config.channels refactor to channel_list update config version to 3 update the docs
86 lines
2.3 KiB
Go
86 lines
2.3 KiB
Go
package line
|
|
|
|
import (
|
|
"bytes"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/sipeed/picoclaw/pkg/config"
|
|
)
|
|
|
|
func TestWebhookRejectsOversizedBody(t *testing.T) {
|
|
ch := &LINEChannel{}
|
|
|
|
oversized := bytes.Repeat([]byte("A"), maxWebhookBodySize+1)
|
|
req := httptest.NewRequest(http.MethodPost, "/webhook", bytes.NewReader(oversized))
|
|
rec := httptest.NewRecorder()
|
|
|
|
ch.webhookHandler(rec, req)
|
|
|
|
if rec.Code != http.StatusRequestEntityTooLarge {
|
|
t.Errorf("expected status %d, got %d", http.StatusRequestEntityTooLarge, rec.Code)
|
|
}
|
|
}
|
|
|
|
func TestWebhookAcceptsMaxBodySize(t *testing.T) {
|
|
ch := &LINEChannel{}
|
|
|
|
body := bytes.Repeat([]byte("A"), maxWebhookBodySize)
|
|
req := httptest.NewRequest(http.MethodPost, "/webhook", bytes.NewReader(body))
|
|
rec := httptest.NewRecorder()
|
|
|
|
ch.webhookHandler(rec, req)
|
|
|
|
// Missing signature should be rejected, but the body size should not trigger 413.
|
|
if rec.Code != http.StatusForbidden {
|
|
t.Errorf("expected status %d, got %d", http.StatusForbidden, rec.Code)
|
|
}
|
|
}
|
|
|
|
func TestWebhookRejectsOversizedBodyBeforeSignatureCheck(t *testing.T) {
|
|
ch := &LINEChannel{}
|
|
|
|
oversized := bytes.Repeat([]byte("A"), maxWebhookBodySize+1)
|
|
req := httptest.NewRequest(http.MethodPost, "/webhook", bytes.NewReader(oversized))
|
|
req.Header.Set("X-Line-Signature", "invalidsignature")
|
|
rec := httptest.NewRecorder()
|
|
|
|
ch.webhookHandler(rec, req)
|
|
|
|
if rec.Code != http.StatusRequestEntityTooLarge {
|
|
t.Errorf("expected status %d, got %d", http.StatusRequestEntityTooLarge, rec.Code)
|
|
}
|
|
}
|
|
|
|
func TestWebhookRejectsNonPostMethod(t *testing.T) {
|
|
ch := &LINEChannel{}
|
|
|
|
req := httptest.NewRequest(http.MethodGet, "/webhook", nil)
|
|
rec := httptest.NewRecorder()
|
|
|
|
ch.webhookHandler(rec, req)
|
|
|
|
if rec.Code != http.StatusMethodNotAllowed {
|
|
t.Errorf("expected status %d, got %d", http.StatusMethodNotAllowed, rec.Code)
|
|
}
|
|
}
|
|
|
|
func TestWebhookRejectsInvalidSignature(t *testing.T) {
|
|
ch := &LINEChannel{
|
|
config: &config.LINESettings{},
|
|
}
|
|
|
|
body := `{"events":[]}`
|
|
req := httptest.NewRequest(http.MethodPost, "/webhook", strings.NewReader(body))
|
|
req.Header.Set("X-Line-Signature", "invalidsignature")
|
|
rec := httptest.NewRecorder()
|
|
|
|
ch.webhookHandler(rec, req)
|
|
|
|
if rec.Code != http.StatusForbidden {
|
|
t.Errorf("expected status %d, got %d", http.StatusForbidden, rec.Code)
|
|
}
|
|
}
|