mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-15 15:09:55 +00:00
Test: Internal exchange coverage (#1525)
* Test: Internal exchange coverage * Tests: Rename exchange.TestInstance to Setup This package function is either going to be imported and used as just exchange.Setup, or more likely testexch.Setup. This removes the Stutter of having internal/testing/exchange.TestInstance which is implicit given the package path
This commit is contained in:
@@ -20,7 +20,7 @@ var mockTests = false
|
||||
func TestMain(m *testing.M) {
|
||||
|
||||
b = new(Binance)
|
||||
if err := testexch.TestInstance(b); err != nil {
|
||||
if err := testexch.Setup(b); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ func TestMain(m *testing.M) {
|
||||
}
|
||||
|
||||
b = new(Binance)
|
||||
if err := testexch.TestInstance(b); err != nil {
|
||||
if err := testexch.Setup(b); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ const (
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
k = new(Kraken)
|
||||
if err := testexch.TestInstance(k); err != nil {
|
||||
if err := testexch.Setup(k); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
if apiKey != "" && apiSecret != "" {
|
||||
|
||||
@@ -2736,8 +2736,7 @@ func TestGetOpenInterest(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
nu := new(Kucoin)
|
||||
require.NoError(t, testexch.TestInstance(nu), "TestInstance setup should not error")
|
||||
|
||||
require.NoError(t, testexch.Setup(nu), "Test exchange Setup must not error")
|
||||
_, err := nu.GetOpenInterest(context.Background(), key.PairAsset{
|
||||
Base: currency.ETH.Item,
|
||||
Quote: currency.USDT.Item,
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"log"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
@@ -19,12 +20,19 @@ import (
|
||||
"github.com/thrasher-corp/gocryptotrader/exchanges/mock"
|
||||
"github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues"
|
||||
"github.com/thrasher-corp/gocryptotrader/exchanges/subscription"
|
||||
testutils "github.com/thrasher-corp/gocryptotrader/internal/testing/utils"
|
||||
)
|
||||
|
||||
// TestInstance takes an empty exchange instance and loads config for it from testdata/configtest and connects a NewTestWebsocket
|
||||
func TestInstance(e exchange.IBotExchange) error {
|
||||
// Setup takes an empty exchange instance and loads config for it from testdata/configtest and connects a NewTestWebsocket
|
||||
func Setup(e exchange.IBotExchange) error {
|
||||
cfg := &config.Config{}
|
||||
err := cfg.LoadConfig("../../testdata/configtest.json", true)
|
||||
|
||||
root, err := testutils.RootPathFromCWD()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = cfg.LoadConfig(filepath.Join(root, "testdata", "configtest.json"), true)
|
||||
if err != nil {
|
||||
return fmt.Errorf("LoadConfig() error: %w", err)
|
||||
}
|
||||
@@ -92,7 +100,7 @@ func MockWsInstance[T any, PT interface {
|
||||
tb.Helper()
|
||||
|
||||
e := PT(new(T))
|
||||
require.NoError(tb, TestInstance(e), "TestInstance setup should not error")
|
||||
require.NoError(tb, Setup(e), "Test exchange Setup must not error")
|
||||
|
||||
s := httptest.NewServer(h)
|
||||
|
||||
|
||||
35
internal/testing/exchange/exchange_test.go
Normal file
35
internal/testing/exchange/exchange_test.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package exchange
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/thrasher-corp/gocryptotrader/config"
|
||||
"github.com/thrasher-corp/gocryptotrader/exchanges/binance"
|
||||
"github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues"
|
||||
)
|
||||
|
||||
// TestSetup exercises Setup
|
||||
func TestSetup(t *testing.T) {
|
||||
b := new(binance.Binance)
|
||||
require.NoError(t, Setup(b), "Setup must not error")
|
||||
assert.NotNil(t, b.Websocket, "Websocket should not be nil after Setup")
|
||||
|
||||
e := new(sharedtestvalues.CustomEx)
|
||||
assert.ErrorIs(t, Setup(e), config.ErrExchangeNotFound, "Setup should error correctly on a missing exchange")
|
||||
}
|
||||
|
||||
// TestMockHTTPInstance exercises MockHTTPInstance
|
||||
func TestMockHTTPInstance(t *testing.T) {
|
||||
b := new(binance.Binance)
|
||||
require.NoError(t, Setup(b), "Test exchange Setup must not error")
|
||||
require.NoError(t, MockHTTPInstance(b), "MockHTTPInstance must not error")
|
||||
}
|
||||
|
||||
// TestMockWsInstance exercises MockWsInstance
|
||||
func TestMockWsInstance(t *testing.T) {
|
||||
b := MockWsInstance[binance.Binance](t, CurryWsMockUpgrader(t, func(_ []byte, _ *websocket.Conn) error { return nil }))
|
||||
require.NotNil(t, b, "MockWsInstance must not be nil")
|
||||
}
|
||||
3
internal/testing/exchange/testdata/http.json
vendored
Executable file
3
internal/testing/exchange/testdata/http.json
vendored
Executable file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"routes": null
|
||||
}
|
||||
35
internal/testing/utils/path.go
Normal file
35
internal/testing/utils/path.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package path
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Exported public errors
|
||||
var (
|
||||
ErrRootNotFound = errors.New("could not find root of gocryptotrader")
|
||||
)
|
||||
|
||||
// RootPathFromCWD returns the system path to GoCryptoTrader from the current working directory
|
||||
// Expects to find LICENSE file
|
||||
func RootPathFromCWD() (string, error) {
|
||||
wd, err := os.Getwd()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return RootPath(wd)
|
||||
}
|
||||
|
||||
// RootPath returns the system path to GoCryptoTrader from a sub-directory path
|
||||
func RootPath(p string) (string, error) {
|
||||
parts := strings.Split(p, string(filepath.Separator))
|
||||
for i := len(parts); i > 0; i-- {
|
||||
dir := strings.Join(parts[:i], string(filepath.Separator))
|
||||
if _, err := os.Stat(filepath.Join(dir, "LICENSE")); err == nil {
|
||||
return dir, nil
|
||||
}
|
||||
}
|
||||
return "", ErrRootNotFound
|
||||
}
|
||||
38
internal/testing/utils/path_test.go
Normal file
38
internal/testing/utils/path_test.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package path
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// TestRootPathFromCWD exercises RootPathFromCWD and RootPath
|
||||
func TestRootPathFromCWD(t *testing.T) {
|
||||
r, err := RootPathFromCWD()
|
||||
require.NoError(t, err)
|
||||
_, err = os.Stat(filepath.Join(r, "LICENSE"))
|
||||
require.NoError(t, err, "Must find a LICENSE file")
|
||||
|
||||
// Ensure there are no other license files in sub-directories
|
||||
err = filepath.WalkDir(r, func(p string, d fs.DirEntry, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// Skip the root of the project
|
||||
w, _ := filepath.Split(p)
|
||||
w = filepath.Clean(w)
|
||||
if w == r {
|
||||
return nil
|
||||
}
|
||||
if d.Type().IsRegular() && d.Name() == "LICENSE" {
|
||||
return fmt.Errorf("found an unexpected LICENSE file in a sub-directory: %s", p)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
Reference in New Issue
Block a user