86 lines
2.5 KiB
Go
86 lines
2.5 KiB
Go
package coinglass
|
|
|
|
import (
|
|
"encoding/json"
|
|
"math"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestMapLiqHeatMap_FloatToString(t *testing.T) {
|
|
cases := []struct {
|
|
name string
|
|
envelope string
|
|
wantSymbol string
|
|
wantMin string
|
|
wantMax string
|
|
wantErr bool
|
|
probeRawKey string
|
|
}{
|
|
{
|
|
name: "happy path with float number fields",
|
|
envelope: `{"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",
|
|
envelope: `{"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)",
|
|
envelope: `{"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",
|
|
envelope: `{"success":true,"code":"0","msg":"","data":{"grid":[]}}`,
|
|
wantSymbol: "Binance_BTCUSDT",
|
|
wantMin: "",
|
|
wantMax: "",
|
|
},
|
|
{
|
|
name: "business error propagates",
|
|
envelope: `{"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.envelope))
|
|
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))
|
|
}
|