package feishu import ( "context" "encoding/json" "net/http" "net/http/httptest" "strings" "testing" ) func TestSendText(t *testing.T) { var gotText string server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case "/open-apis/auth/v3/tenant_access_token/internal": _, _ = w.Write([]byte(`{"code":0,"tenant_access_token":"test-token","expire":7200}`)) case "/open-apis/im/v1/messages": if r.URL.Query().Get("receive_id_type") != "chat_id" || r.Header.Get("Authorization") != "Bearer test-token" { t.Errorf("unexpected request: %s %s", r.URL.String(), r.Header.Get("Authorization")) } var payload struct { ReceiveID string `json:"receive_id"` MsgType string `json:"msg_type"` Content string `json:"content"` } if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { t.Error(err) } if payload.ReceiveID != "test-chat" || payload.MsgType != "text" { t.Errorf("unexpected payload: %+v", payload) } var content struct { Text string `json:"text"` } if err := json.Unmarshal([]byte(payload.Content), &content); err != nil { t.Error(err) } gotText = content.Text _, _ = w.Write([]byte(`{"code":0,"msg":"success"}`)) default: http.NotFound(w, r) } })) defer server.Close() client := NewClient("test-app", "test-secret", "test-chat") client.baseURL = server.URL message := "连接测试:含引号 \" 和换行\n第二行" if err := client.SendText(context.Background(), message); err != nil { t.Fatal(err) } if gotText != message { t.Fatalf("text mismatch: %q", gotText) } } func TestSendTextRejectsEmpty(t *testing.T) { client := NewClient("test-app", "test-secret", "test-chat") if err := client.SendText(context.Background(), ""); err == nil || !strings.Contains(err.Error(), "text is required") { t.Fatalf("unexpected error: %v", err) } }