139 lines
3.3 KiB
Go
139 lines
3.3 KiB
Go
|
|
package feishu
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/json"
|
||
|
|
"os"
|
||
|
|
"path/filepath"
|
||
|
|
"strings"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
larkim "github.com/larksuite/oapi-sdk-go/v3/service/im/v1"
|
||
|
|
)
|
||
|
|
|
||
|
|
func mustEventFromJSON(t *testing.T, raw string) *larkim.P2MessageReceiveV1 {
|
||
|
|
t.Helper()
|
||
|
|
var evt larkim.P2MessageReceiveV1
|
||
|
|
if err := json.Unmarshal([]byte(raw), &evt); err != nil {
|
||
|
|
t.Fatalf("unmarshal event json failed: %v", err)
|
||
|
|
}
|
||
|
|
return &evt
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestParseIncomingText(t *testing.T) {
|
||
|
|
evt := mustEventFromJSON(t, `{
|
||
|
|
"event": {
|
||
|
|
"message": {
|
||
|
|
"message_id": "msg_text_1",
|
||
|
|
"chat_id": "chat_1",
|
||
|
|
"message_type": "text",
|
||
|
|
"content": "{\"text\":\"你好\"}"
|
||
|
|
},
|
||
|
|
"sender": {
|
||
|
|
"sender_type": "user",
|
||
|
|
"sender_id": {"open_id": "u_open_1"}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}`)
|
||
|
|
|
||
|
|
in, ok := parseIncoming(evt)
|
||
|
|
if !ok {
|
||
|
|
t.Fatal("expected text message parse success")
|
||
|
|
}
|
||
|
|
if in.MsgType != "text" {
|
||
|
|
t.Fatalf("expected msg type text, got %s", in.MsgType)
|
||
|
|
}
|
||
|
|
if in.Text != "你好" {
|
||
|
|
t.Fatalf("unexpected text: %q", in.Text)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestParseIncomingFile(t *testing.T) {
|
||
|
|
evt := mustEventFromJSON(t, `{
|
||
|
|
"event": {
|
||
|
|
"message": {
|
||
|
|
"message_id": "msg_file_1",
|
||
|
|
"chat_id": "chat_1",
|
||
|
|
"message_type": "file",
|
||
|
|
"content": "{\"file_key\":\"file_key_123\",\"file_name\":\"report.pdf\"}"
|
||
|
|
},
|
||
|
|
"sender": {
|
||
|
|
"sender_type": "user",
|
||
|
|
"sender_id": {"user_id": "u_id_1"}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}`)
|
||
|
|
|
||
|
|
in, ok := parseIncoming(evt)
|
||
|
|
if !ok {
|
||
|
|
t.Fatal("expected file message parse success")
|
||
|
|
}
|
||
|
|
if in.MsgType != "file" {
|
||
|
|
t.Fatalf("expected msg type file, got %s", in.MsgType)
|
||
|
|
}
|
||
|
|
if in.FileName != "report.pdf" || in.FileKey != "file_key_123" {
|
||
|
|
t.Fatalf("unexpected file meta: name=%q key=%q", in.FileName, in.FileKey)
|
||
|
|
}
|
||
|
|
if !strings.Contains(in.Text, "飞书文件消息") {
|
||
|
|
t.Fatalf("expected synthesized text mentions file message, got: %q", in.Text)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestParseIncomingUnsupportedType(t *testing.T) {
|
||
|
|
evt := mustEventFromJSON(t, `{
|
||
|
|
"event": {
|
||
|
|
"message": {
|
||
|
|
"message_id": "msg_image_1",
|
||
|
|
"chat_id": "chat_1",
|
||
|
|
"message_type": "image",
|
||
|
|
"content": "{\"image_key\":\"img_1\"}"
|
||
|
|
},
|
||
|
|
"sender": {
|
||
|
|
"sender_type": "user",
|
||
|
|
"sender_id": {"open_id": "u_open_1"}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}`)
|
||
|
|
|
||
|
|
_, ok := parseIncoming(evt)
|
||
|
|
if ok {
|
||
|
|
t.Fatal("expected unsupported message type rejected")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestDetectMimeByName(t *testing.T) {
|
||
|
|
if got := detectMimeByName("report.pdf"); !strings.Contains(got, "pdf") {
|
||
|
|
t.Fatalf("expected pdf mime, got: %s", got)
|
||
|
|
}
|
||
|
|
if got := detectMimeByName("unknown.custom"); got != "application/octet-stream" {
|
||
|
|
t.Fatalf("expected octet-stream fallback, got: %s", got)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestSaveIncomingFile(t *testing.T) {
|
||
|
|
dir := t.TempDir()
|
||
|
|
path, err := saveIncomingFile(dir, "report.pdf", []byte("hello"))
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("saveIncomingFile error: %v", err)
|
||
|
|
}
|
||
|
|
b, err := os.ReadFile(path)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("read saved file failed: %v", err)
|
||
|
|
}
|
||
|
|
if string(b) != "hello" {
|
||
|
|
t.Fatalf("unexpected saved content: %q", string(b))
|
||
|
|
}
|
||
|
|
if filepath.Ext(path) != ".pdf" {
|
||
|
|
t.Fatalf("expected .pdf extension, got: %s", path)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestSanitizeFileName(t *testing.T) {
|
||
|
|
got := sanitizeFileName("../bad path/测 试?.pdf")
|
||
|
|
if strings.Contains(got, "/") || strings.Contains(got, "\\") {
|
||
|
|
t.Fatalf("expected sanitized basename only, got: %q", got)
|
||
|
|
}
|
||
|
|
if !strings.HasSuffix(got, ".pdf") {
|
||
|
|
t.Fatalf("expected .pdf suffix, got: %q", got)
|
||
|
|
}
|
||
|
|
}
|