Files
cryptoHermes/internal/repo/webapi/coinglass/mapper_test.go
dela b15d763287
Some checks failed
ci / build + vet + guard + race (push) Has been cancelled
fix: map CoinGlass heatmap range bounds
2026-05-25 22:06:21 +08:00

94 lines
2.8 KiB
Go

package coinglass
import (
"encoding/json"
"math"
"testing"
"github.com/stretchr/testify/require"
)
func TestMapLiqHeatMap_FloatToString(t *testing.T) {
cases := []struct {
name string
plaintext string
wantSymbol string
wantMin string
wantMax string
wantErr bool
probeRawKey string
}{
{
name: "real decrypted data object",
plaintext: `{"instrument":{"exName":"Binance","instrumentId":"BTCUSDT"},"liq":[[1,2,3.4]],"prices":[110000,111000],"rangeLow":110234.5,"rangeHigh":118888.0,"updateTime":1779717600600,"y":[]}`,
wantSymbol: "Binance_BTCUSDT",
wantMin: "110234.5",
wantMax: "118888",
probeRawKey: "liq",
},
{
name: "happy path with float number fields",
plaintext: `{"success":true,"code":"0","msg":"","data":{"priceMin":110234.5,"priceMax":118888.0,"grid":[[1,2],[3,4]]}}`,
wantSymbol: "Binance_BTCUSDT",
wantMin: "110234.5",
wantMax: "118888",
probeRawKey: "grid",
},
{
name: "string-typed numbers are passed through unchanged",
plaintext: `{"success":true,"code":"0","msg":"","data":{"priceMin":"99999.99","priceMax":"100000.01"}}`,
wantSymbol: "Binance_BTCUSDT",
wantMin: "99999.99",
wantMax: "100000.01",
},
{
name: "alternate field names (minPrice/maxPrice)",
plaintext: `{"success":true,"code":"0","msg":"","data":{"minPrice":1000.5,"maxPrice":2000.5}}`,
wantSymbol: "Binance_BTCUSDT",
wantMin: "1000.5",
wantMax: "2000.5",
},
{
name: "missing min/max fields → empty strings",
plaintext: `{"success":true,"code":"0","msg":"","data":{"grid":[]}}`,
wantSymbol: "Binance_BTCUSDT",
wantMin: "",
wantMax: "",
},
{
name: "business error propagates",
plaintext: `{"success":false,"code":"40001","msg":"bad params","data":null}`,
wantErr: true,
},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
got, err := MapLiqHeatMap("Binance_BTCUSDT", "5", 1735689600000, []byte(tc.plaintext))
if tc.wantErr {
require.Error(t, err)
return
}
require.NoError(t, err)
require.Equal(t, tc.wantSymbol, got.Symbol)
require.IsType(t, "", got.PriceMin, "PriceMin must be string (G12.4 boundary)")
require.IsType(t, "", got.PriceMax, "PriceMax must be string (G12.4 boundary)")
require.Equal(t, tc.wantMin, got.PriceMin)
require.Equal(t, tc.wantMax, got.PriceMax)
require.NotEmpty(t, got.RawGrid, "RawGrid must carry raw data verbatim")
require.True(t, json.Valid(got.RawGrid), "RawGrid must be valid JSON")
})
}
}
func TestFormatFloat_RejectsNaNAndInf(t *testing.T) {
require.Equal(t, "", formatFloat(math.NaN()))
require.Equal(t, "", formatFloat(math.Inf(1)))
require.Equal(t, "", formatFloat(math.Inf(-1)))
require.Equal(t, "0.0001", formatFloat(0.0001))
require.Equal(t, "118234.567", formatFloat(118234.567))
}