Files
gocryptotrader/exchanges/margin/margin_test.go
Scott 6ee26a7da1 exchanges/margin: Fix marshalling issue (#1812)
* Fixes issue with marshalling margin types

* Update exchanges/order/order_test.go

Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com>

* Update exchanges/margin/margin.go

Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com>

* Update exchanges/order/order_test.go

Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com>

* Update test name

---------

Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com>
2025-03-06 15:17:05 +11:00

126 lines
3.5 KiB
Go

package margin
import (
"fmt"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/thrasher-corp/gocryptotrader/encoding/json"
)
func TestValid(t *testing.T) {
t.Parallel()
require.True(t, Isolated.Valid())
require.True(t, Multi.Valid())
require.True(t, NoMargin.Valid())
require.True(t, SpotIsolated.Valid())
require.False(t, Unset.Valid())
require.False(t, Unknown.Valid())
require.False(t, Type(137).Valid())
}
func TestUnmarshalJSON(t *testing.T) {
t.Parallel()
for name, tc := range map[string]struct {
in string
want Type
err error
}{
"isolated": {`{"margin":"isolated"}`, Isolated, nil},
"cross": {`{"margin":"cross"}`, Multi, nil},
"cash": {`{"margin":"cash"}`, NoMargin, nil},
"spotIsolated": {`{"margin":"spot_isolated"}`, SpotIsolated, nil},
"invalid": {`{"margin":"hello moto"}`, Unknown, ErrInvalidMarginType},
"unset": {`{"margin":""}`, Unset, nil},
"": {`{"margin":""}`, Unset, nil},
} {
t.Run(name, func(t *testing.T) {
t.Parallel()
var alien struct {
M Type `json:"margin"`
}
err := json.Unmarshal([]byte(tc.in), &alien)
assert.ErrorIs(t, err, tc.err)
assert.Equal(t, tc.want, alien.M)
})
}
}
func TestMarshalJSON(t *testing.T) {
t.Parallel()
for _, tc := range []struct {
in Type
want string
}{
{Isolated, fmt.Sprintf(`%q`, isolatedStr)},
{Multi, fmt.Sprintf(`%q`, multiStr)},
{NoMargin, fmt.Sprintf(`%q`, cashStr)},
{SpotIsolated, fmt.Sprintf(`%q`, spotIsolatedStr)},
{Type(uint8(123)), fmt.Sprintf(`%q`, unknownStr)},
{Unset, fmt.Sprintf(`%q`, unsetStr)},
} {
t.Run(tc.want, func(t *testing.T) {
t.Parallel()
resp, err := json.Marshal(tc.in)
require.NoError(t, err)
assert.Equal(t, tc.want, string(resp))
})
}
}
func TestString(t *testing.T) {
t.Parallel()
assert.Equal(t, unknownStr, Unknown.String())
assert.Equal(t, isolatedStr, Isolated.String())
assert.Equal(t, multiStr, Multi.String())
assert.Equal(t, unsetStr, Unset.String())
assert.Equal(t, spotIsolatedStr, SpotIsolated.String())
assert.Equal(t, cashStr, NoMargin.String())
assert.Equal(t, unknownStr, Type(30).String())
assert.Equal(t, "", Unset.String())
}
func TestUpper(t *testing.T) {
t.Parallel()
assert.Equal(t, strings.ToUpper(unknownStr), Unknown.Upper())
assert.Equal(t, strings.ToUpper(isolatedStr), Isolated.Upper())
assert.Equal(t, strings.ToUpper(multiStr), Multi.Upper())
assert.Equal(t, strings.ToUpper(spotIsolatedStr), SpotIsolated.Upper())
assert.Equal(t, strings.ToUpper(cashStr), NoMargin.Upper())
assert.Equal(t, strings.ToUpper(unsetStr), Unset.Upper())
}
func TestIsValidString(t *testing.T) {
t.Parallel()
assert.False(t, IsValidString("lol"))
assert.True(t, IsValidString("spot_isolated"))
assert.True(t, IsValidString("cash"))
assert.True(t, IsValidString("isolated"))
assert.True(t, IsValidString("cross"))
assert.True(t, IsValidString("multi"))
assert.True(t, IsValidString(""))
assert.False(t, IsValidString("unknown"))
}
func TestStringToMarginType(t *testing.T) {
t.Parallel()
for label, v := range map[string]struct {
MarginType Type
Error error
}{
"lol": {Unknown, ErrInvalidMarginType},
"": {Unset, nil},
"cross": {Multi, nil},
"multi": {Multi, nil},
"isolated": {Isolated, nil},
"cash": {NoMargin, nil},
"spot_isolated": {SpotIsolated, nil},
} {
resp, err := StringToMarginType(label)
assert.ErrorIs(t, err, v.Error)
assert.Equal(t, v.MarginType.String(), resp.String())
}
}