ae25409e56
Motivation: 统一 crypto-strategy 与 trade-signal 两类交易信号的模板字段,使同一套通知模板可复用;字段缺失或为空时不再导致渲染报错或输出空行,通知内容更整洁。 Changes: * 渲染器缺失字段改为按空值处理,新增 line 函数实现空值整行省略 * crypto-strategy 信号补充止盈价、止损价、平均价、收益额等模板字段 * trade-signal 信号保留原始报文中的额外字段以适配统一模板 * 修复结构化日志将 error 作为值直接输出导致的格式问题
65 lines
1.7 KiB
Go
65 lines
1.7 KiB
Go
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 TestConvertKeepsExtraJSONFields(t *testing.T) {
|
|
_, data, err := NewConverter(nil).Convert([]byte(`{
|
|
"action":"OPEN","symbol":"BTCUSDT","price":63014.61,
|
|
"totalAvgPx":63014.61,"investmentAmount":100095.24
|
|
}`))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if data["totalAvgPx"] != 63014.61 {
|
|
t.Fatalf("totalAvgPx=%v", data["totalAvgPx"])
|
|
}
|
|
}
|
|
|
|
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)
|
|
}
|
|
}
|