Files
gocryptotrader/config/versions/v4/v4_test.go
Gareth Kirwan 1bf3433d61 Config: Refactor version packages (#1887)
* Config: Move config versions to separate pacakges

* Config: Move version tests to blackbox texts

* Config: Protect registerVersion from overflow

* Config: Protect against version already registered
2025-04-22 12:13:01 +10:00

88 lines
3.8 KiB
Go

package v4_test
import (
"bytes"
"context"
"testing"
"github.com/buger/jsonparser"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
v4 "github.com/thrasher-corp/gocryptotrader/config/versions/v4"
)
func TestExchanges(t *testing.T) {
t.Parallel()
assert.Equal(t, []string{"*"}, new(v4.Version).Exchanges())
}
func TestUpgradeExchange(t *testing.T) {
t.Parallel()
_, err := new(v4.Version).UpgradeExchange(context.Background(), []byte{})
require.ErrorContains(t, err, `error upgrading assetTypes`)
_, err = new(v4.Version).UpgradeExchange(context.Background(), []byte(`{}`))
require.ErrorContains(t, err, `error upgrading currencyPairs.pairs`)
in := []byte(`{"name":"Cracken","currencyPairs":{"assetTypes":["spot"],"pairs":{"spot":{"enabled":"BTC-AUD","available":"BTC-AUD"},"futures":{"assetEnabled":true},"options":{},"margin":{"assetEnabled":null}}}}`)
out, err := new(v4.Version).UpgradeExchange(context.Background(), in)
require.NoError(t, err)
require.NotEmpty(t, out)
_, _, _, err = jsonparser.Get(out, "currencyPairs", "assetTypes") //nolint:dogsled // Ignored return values really not needed
assert.ErrorIs(t, err, jsonparser.KeyPathNotFoundError, "assetTypes should be removed")
e, err := jsonparser.GetBoolean(out, "currencyPairs", "pairs", "spot", "assetEnabled")
require.NoError(t, err, "Must find assetEnabled for spot")
assert.True(t, e, "assetEnabled should be set to true")
e, err = jsonparser.GetBoolean(out, "currencyPairs", "pairs", "futures", "assetEnabled")
require.NoError(t, err, "Must find assetEnabled for futures")
assert.True(t, e, "assetEnabled should be set to true")
e, err = jsonparser.GetBoolean(out, "currencyPairs", "pairs", "options", "assetEnabled")
require.NoError(t, err, "Must find assetEnabled for options")
assert.False(t, e, "assetEnabled should be set to false")
e, err = jsonparser.GetBoolean(out, "currencyPairs", "pairs", "margin", "assetEnabled")
require.NoError(t, err, "Must find assetEnabled for margin")
assert.False(t, e, "assetEnabled should be set to false")
out2, err := new(v4.Version).UpgradeExchange(context.Background(), out)
require.NoError(t, err, "Must not error on re-upgrading")
assert.Equal(t, out, out2, "Should not affect an already upgraded config")
in = []byte(`{"name":"Cracken","currencyPairs":{"assetTypes":["spot"],"pairs":{"spot":{"assetEnabled":{}}}}}`)
_, err = new(v4.Version).UpgradeExchange(context.Background(), in)
require.NoError(t, err)
in = []byte(`{"name":"Cracken","currencyPairs":{"assetTypes":["spot"],"pairs":{"margin":{"assetEnabled":{}}}}}`)
_, err = new(v4.Version).UpgradeExchange(context.Background(), in)
require.ErrorIs(t, err, jsonparser.UnknownValueTypeError)
require.ErrorContains(t, err, "`margin`")
require.ErrorContains(t, err, "`object`")
}
func TestDowngradeExchange(t *testing.T) {
t.Parallel()
in := []byte(`{"name":"Cracken","currencyPairs":{"pairs":{"spot":{"enabled":"BTC-AUD","available":"BTC-AUD","assetEnabled":true},"futures":{"assetEnabled":false},"options":{},"options_combo":{"assetEnabled":true}}}}`)
out, err := new(v4.Version).DowngradeExchange(context.Background(), in)
require.NoError(t, err)
require.NotEmpty(t, out)
v, vT, _, err := jsonparser.Get(out, "currencyPairs", "assetTypes")
require.NoError(t, err, "assetTypes must be found")
require.Equal(t, jsonparser.Array, vT, "assetTypes must be an array")
require.Equal(t, `["spot","options_combo"]`, string(v), "assetTypes must be correct")
assetEnabledFn := func(k, v []byte, _ jsonparser.ValueType, _ int) error {
_, err = jsonparser.GetBoolean(v, "assetEnabled")
require.ErrorIsf(t, err, jsonparser.KeyPathNotFoundError, "assetEnabled must be removed from %s", k)
return nil
}
err = jsonparser.ObjectEach(bytes.Clone(out), assetEnabledFn, "currencyPairs", "pairs")
require.NoError(t, err, "Must not error visiting currencyPairs")
}