portfolio: Fix CryptoID balance issue and assertify tests (#1861)

* portfolio: Fix CryptoID balance issue and assertify tests

* portfolio: Expand context usage, enhance tests and a few other minor improvements

* portfolio: Further improvements and enhance common.IsValidCryptoAddress

* config, portfolio: Use v6.DefaultConfig, switch to context.WithCancel
This commit is contained in:
Adrian Gallagher
2025-03-28 12:41:01 +11:00
committed by GitHub
parent 06afde1460
commit cc05f7e6fd
16 changed files with 723 additions and 845 deletions

View File

@@ -107,7 +107,7 @@ type Config struct {
Currency currency.Config `json:"currencyConfig"`
Communications base.CommunicationsConfig `json:"communications"`
RemoteControl RemoteControlConfig `json:"remoteControl"`
Portfolio portfolio.Base `json:"portfolioAddresses"`
Portfolio *portfolio.Base `json:"portfolioAddresses"`
Exchanges []Exchange `json:"exchanges"`
BankAccounts []banking.Account `json:"bankAccounts"`

View File

@@ -20,7 +20,7 @@ func init() {
// Note: Do not be tempted to use a constant for Duration. Whilst defaults are still written to config, we need to manage default upgrades discretely.
var defaultFuturesTrackingSeekDuration = strconv.FormatInt(int64(time.Hour)*24*365, 10)
var defaultConfig = []byte(`{
var defaultConfigV5 = []byte(`{
"enabled": true,
"verbose": false,
"activelyTrackFuturesPositions": true,
@@ -37,7 +37,7 @@ func (v *Version5) UpgradeConfig(_ context.Context, e []byte) ([]byte, error) {
_, valueType, _, err := jsonparser.Get(e, "orderManager", "enabled")
switch {
case errors.Is(err, jsonparser.KeyPathNotFoundError), valueType == jsonparser.Null:
return jsonparser.Set(e, defaultConfig, "orderManager")
return jsonparser.Set(e, defaultConfigV5, "orderManager")
case err != nil:
return e, err
}

34
config/versions/v6.go Normal file
View File

@@ -0,0 +1,34 @@
package versions
import (
"context"
"errors"
"github.com/buger/jsonparser"
v6 "github.com/thrasher-corp/gocryptotrader/config/versions/v6"
)
// Version6 implements ConfigVersion
type Version6 struct{}
func init() {
Manager.registerVersion(6, &Version6{})
}
// UpgradeConfig checks and upgrades the portfolioAddresses.providers field
func (v *Version6) UpgradeConfig(_ context.Context, e []byte) ([]byte, error) {
_, valueType, _, err := jsonparser.Get(e, "portfolioAddresses", "providers")
switch {
case errors.Is(err, jsonparser.KeyPathNotFoundError), valueType == jsonparser.Null:
return jsonparser.Set(e, v6.DefaultConfig, "portfolioAddresses", "providers")
case err != nil:
return e, err
}
return e, nil
}
// DowngradeConfig removes the portfolioAddresses.providers field
func (v *Version6) DowngradeConfig(_ context.Context, e []byte) ([]byte, error) {
e = jsonparser.Delete(e, "portfolioAddresses", "providers")
return e, nil
}

View File

@@ -0,0 +1,18 @@
package v6
// DefaultConfig is the default config used for the version 6 portfolio providers upgrade
var DefaultConfig = []byte(`[
{
"name": "Ethplorer",
"enabled": true
},
{
"name": "XRPScan",
"enabled": true
},
{
"name": "CryptoID",
"enabled": false,
"apiKey": "Key"
}
]`)

View File

@@ -0,0 +1,52 @@
package versions
import (
"bytes"
"context"
"testing"
"github.com/buger/jsonparser"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
v6 "github.com/thrasher-corp/gocryptotrader/config/versions/v6"
)
var testData = []byte(`{
"portfolioAddresses": {
"addresses": [
{
"Address": "1JCe8z4jJVNXSjohjM4i9Hh813dLCNx2Sy",
"CoinType": "BTC",
"Balance": 0.00108832,
"Description": "",
"WhiteListed": false,
"ColdStorage": false,
"SupportedExchanges": ""
}
]
}
}`)
func TestUpgrade(t *testing.T) {
t.Parallel()
r, err := new(Version6).UpgradeConfig(context.Background(), testData)
require.NoError(t, err, "UpgradeConfig must not error")
require.True(t, bytes.Contains(r, v6.DefaultConfig))
r2, err := new(Version6).UpgradeConfig(context.Background(), r)
require.NoError(t, err, "UpgradeConfig must not error")
assert.Equal(t, r, r2, "UpgradeConfig should not affect an already upgraded config")
}
func TestDowngrade(t *testing.T) {
t.Parallel()
r, err := new(Version6).UpgradeConfig(context.Background(), testData)
require.NoError(t, err, "UpgradeConfig must not error")
require.True(t, bytes.Contains(r, v6.DefaultConfig))
r, err = new(Version6).DowngradeConfig(context.Background(), r)
require.NoError(t, err, "DowngradeConfig must not error")
_, _, _, err = jsonparser.Get(r, "portfolioAddresses", "providers") //nolint:dogsled // Return values not needed
assert.ErrorIs(t, err, jsonparser.KeyPathNotFoundError, "providers should be removed")
}