2026-07-02 10:53:44 +08:00

76 lines
2.5 KiB
Go

package dingtalk
import (
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"time"
)
func TestSendMarkdownSignsRequestAndSendsPayload(t *testing.T) {
var captured struct {
Query map[string]string
Body markdownPayload
}
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
captured.Query = map[string]string{
"access_token": r.URL.Query().Get("access_token"),
"timestamp": r.URL.Query().Get("timestamp"),
"sign": r.URL.Query().Get("sign"),
}
if err := json.NewDecoder(r.Body).Decode(&captured.Body); err != nil {
t.Fatalf("decode request body: %v", err)
}
_, _ = w.Write([]byte(`{"errcode":0,"errmsg":"ok"}`))
}))
defer server.Close()
client, err := New(Config{
WebhookURL: server.URL + "?access_token=token",
Secret: "SEC_TEST",
AtMobiles: []string{" 13800138000 ", ""},
AtAll: false,
}, server.Client())
if err != nil {
t.Fatalf("New() error = %v", err)
}
client.now = func() time.Time { return time.UnixMilli(1710000000123).UTC() }
if err := client.SendMarkdown(context.Background(), MarkdownMessage{Title: "财务申请", Text: "### 财务申请待审核"}); err != nil {
t.Fatalf("SendMarkdown() error = %v", err)
}
if captured.Query["access_token"] != "token" {
t.Fatalf("access token mismatch: %q", captured.Query["access_token"])
}
if captured.Query["timestamp"] != "1710000000123" {
t.Fatalf("timestamp mismatch: %q", captured.Query["timestamp"])
}
if captured.Query["sign"] != sign(1710000000123, "SEC_TEST") {
t.Fatalf("sign mismatch: %q", captured.Query["sign"])
}
if captured.Body.MsgType != "markdown" || captured.Body.Markdown.Title != "财务申请" || captured.Body.Markdown.Text == "" {
t.Fatalf("markdown payload mismatch: %+v", captured.Body)
}
if len(captured.Body.At.AtMobiles) != 1 || captured.Body.At.AtMobiles[0] != "13800138000" {
t.Fatalf("at mobiles mismatch: %+v", captured.Body.At.AtMobiles)
}
}
func TestSendMarkdownReturnsDingTalkError(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, _ = w.Write([]byte(`{"errcode":310000,"errmsg":"keywords not in content"}`))
}))
defer server.Close()
client, err := New(Config{WebhookURL: server.URL}, server.Client())
if err != nil {
t.Fatalf("New() error = %v", err)
}
if err := client.SendMarkdown(context.Background(), MarkdownMessage{Title: "财务申请", Text: "text"}); err == nil {
t.Fatal("SendMarkdown() error = nil, want dingtalk errcode")
}
}