package tradesignal import ( "errors" "strings" "testing" "aiaa-notification-service/internal/config" ) func TestConvertOpen(t *testing.T) { lev := 100 c := NewConverter(map[string]config.StrategyOverride{ "BLONG": {QuantityMultipliers: config.QuantityMultipliers{Open: 100}, Leverage: &lev}, }) event, data, err := c.Convert([]byte(`{ "signalId":"s1","strategyCode":"BLONG","symbol":"BTCUSDT", "side":"LONG","action":"OPEN","quantity":0.01,"price":64000, "leverage":10,"period":"1h","eventTime":"2026-06-23T01:30:00Z" }`)) if err != nil { t.Fatal(err) } if event != "trade.open" { t.Fatalf("event=%q", event) } formatted, _ := data["formatted"].(string) if !strings.Contains(formatted, "周期: 1h") || !strings.Contains(formatted, "开仓数量: 1.00") { t.Fatalf("formatted=\n%s", formatted) } if data["period"] != "1h" || data["strategyCode"] != "BLONG" { t.Fatalf("data=%v", data) } if data["leverage"] != float64(100) && data["leverage"] != 100 { t.Fatalf("leverage=%v", data["leverage"]) } } func TestConvertInvalidJSON(t *testing.T) { _, _, err := NewConverter(nil).Convert([]byte(`{`)) if !errors.Is(err, ErrInvalidSignal) { t.Fatalf("err=%v", err) } } func TestConvertMissingAction(t *testing.T) { _, _, err := NewConverter(nil).Convert([]byte(`{"symbol":"BTCUSDT"}`)) if !errors.Is(err, ErrInvalidSignal) { t.Fatalf("err=%v", err) } }