package pairing import ( "crypto/ed25519" "crypto/rand" "encoding/base64" "encoding/json" "net/http" "net/http/httptest" "strings" "testing" ) func TestPairWithCodeSendsNormalizedPayload(t *testing.T) { pub, _, err := ed25519.GenerateKey(rand.Reader) if err != nil { t.Fatal(err) } server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/api/v1/agent/pair" || r.Method != http.MethodPost { t.Fatalf("unexpected request: %s %s", r.Method, r.URL.Path) } var body struct { Code string `json:"code"` DeviceName string `json:"deviceName"` PublicKey string `json:"publicKey"` } if err := json.NewDecoder(r.Body).Decode(&body); err != nil { t.Fatal(err) } if body.Code != "AB23CD" || body.DeviceName != "macOS Agent" { t.Fatalf("payload was not normalized: %+v", body) } decoded, err := base64.StdEncoding.DecodeString(body.PublicKey) if err != nil || len(decoded) != ed25519.PublicKeySize { t.Fatalf("invalid public key: %q", body.PublicKey) } w.Header().Set("Content-Type", "application/json") _, _ = w.Write([]byte(`{"code":0,"message":"ok","data":{"deviceId":42}}`)) })) defer server.Close() id, err := PairWithCode(server.URL, " ab23cd ", "", "core", "0.3.0", base64.StdEncoding.EncodeToString(pub)) if err != nil || id != 42 { t.Fatalf("PairWithCode() = %d, %v", id, err) } } func TestPairWithCodeRejectsMissingPublicKey(t *testing.T) { _, err := PairWithCode("http://127.0.0.1:1", "AB23CD", "Mac", "core", "0.3.0", "") if err == nil || !strings.Contains(err.Error(), "公钥") { t.Fatalf("expected actionable public key error, got %v", err) } } func TestPairWithCodePreservesServerMessage(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusBadRequest) _, _ = w.Write([]byte(`{"code":1001,"data":null,"message":"设备公钥格式不合法"}`)) })) defer server.Close() pub, _, _ := ed25519.GenerateKey(rand.Reader) _, err := PairWithCode(server.URL, "AB23CD", "Mac", "core", "0.3.0", base64.StdEncoding.EncodeToString(pub)) if err == nil || !strings.Contains(err.Error(), "设备公钥格式不合法") { t.Fatalf("expected server message, got %v", err) } }