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") } }