Engine: Protocol Features, coverage, types, BTC markets websocket (#368)

* Attempts to update orderbook so it doesn't need to sort

* Reverts the ws ob stuff. Gets rid of sorting because it happens later. Adds some exchange features

* update existing feature lists. Expands list definition to match my emotions

* Adds bithumb bitmex and bitstamp. adds a couple more types

* Features for you, features for me, features for bittrex, btcmarkets, btse, coinbasepro, coinut, exmo, gateio and gemini

* Features for hitbtc, huobi, itbit, kraken, lakebtc, lbank, localbitcoins, okcoin, okex, poloniex, yobit, zb

* Who can forget good old alphapoint?

* Adds btcmarksets websocket :glitch_crab: fixes alphapoint features

* Adds extra data not in the documentation :/

* Replaces websocket features by using protocol features. However, it breaks it due to import cycles. I'm not sure what I'll do just yet

* Removes import cycle via duplicate structs.

* Increases coverage of config with `TestCheckCurrencyConfigValues`. Moves all currency pair package types into their own files or places it at the bottom of files if necessary

* Increase coverage in code.go

* One way of determining a test has failed, is when to it fails. Removed redundant explanation

* Increases code coverage of conversion

* Lint fixes

* Fixes orderbook tests

* Re-adds sorting because its important to still have the internal pre-processed orderbook to be representative of a real orderbook

* Secret lints that did not show up via Windows linting

* Adds protocol package to contain exchange features

* Fixes protocol implementation

* Fixes ws tests

* Addresses the following: Removes st-st-stutters in config types, changes GetAvailableForexProviders -> GetSupportedForexProviders, removes errors from tests where error is nil, removes orderbook setup when not necessary, removes import newlines, removes false bools from declaration, changes should of to should have

* imports and casing

* Fixes two more nil error checks
This commit is contained in:
Scott
2019-10-22 10:56:20 +11:00
committed by Adrian Gallagher
parent ec0ed1c1e5
commit ccfcdf26aa
156 changed files with 5228 additions and 4337 deletions

View File

@@ -6,13 +6,13 @@ func TestEncryptOrDecrypt(t *testing.T) {
reValue := EncryptOrDecrypt(true) reValue := EncryptOrDecrypt(true)
if reValue != "encrypted" { if reValue != "encrypted" {
t.Error( t.Error(
"Test failed - Tools/Config/Config_test.go - EncryptOrDecrypt Error", "Tools/Config/Config_test.go - EncryptOrDecrypt Error",
) )
} }
reValue = EncryptOrDecrypt(false) reValue = EncryptOrDecrypt(false)
if reValue != "decrypted" { if reValue != "decrypted" {
t.Error( t.Error(
"Test failed - Tools/Config/Config_test.go - EncryptOrDecrypt Error", "Tools/Config/Config_test.go - EncryptOrDecrypt Error",
) )
} }
} }

View File

@@ -24,7 +24,7 @@ func TestSetup(t *testing.T) {
cfg.LoadConfig("../../testdata/configtest.json") cfg.LoadConfig("../../testdata/configtest.json")
{{.Name}}Config, err := cfg.GetExchangeConfig("{{.CapitalName}}") {{.Name}}Config, err := cfg.GetExchangeConfig("{{.CapitalName}}")
if err != nil { if err != nil {
t.Error("Test Failed - {{.CapitalName}} Setup() init error") t.Error("{{.CapitalName}} Setup() init error")
} }
{{.Name}}Config.API.AuthenticatedSupport = true {{.Name}}Config.API.AuthenticatedSupport = true

View File

@@ -76,7 +76,7 @@ func SendWebsocketEvent(event string, reqData interface{}, result *WebsocketEven
func main() { func main() {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig(config.ConfigFile, true) err := cfg.LoadConfig(config.File, true)
if err != nil { if err != nil {
log.Fatalf("Failed to load config file: %s", err) log.Fatalf("Failed to load config file: %s", err)
} }

View File

@@ -16,13 +16,13 @@ func TestIsEnabled(t *testing.T) {
expected := "Enabled" expected := "Enabled"
actual := IsEnabled(true) actual := IsEnabled(true)
if actual != expected { if actual != expected {
t.Errorf("Test failed. Expected %s. Actual %s", expected, actual) t.Errorf("Expected %s. Actual %s", expected, actual)
} }
expected = "Disabled" expected = "Disabled"
actual = IsEnabled(false) actual = IsEnabled(false)
if actual != expected { if actual != expected {
t.Errorf("Test failed. Expected %s. Actual %s", expected, actual) t.Errorf("Expected %s. Actual %s", expected, actual)
} }
} }
@@ -30,44 +30,44 @@ func TestIsValidCryptoAddress(t *testing.T) {
t.Parallel() t.Parallel()
b, err := IsValidCryptoAddress("1Mz7153HMuxXTuR2R1t78mGSdzaAtNbBWX", "bTC") b, err := IsValidCryptoAddress("1Mz7153HMuxXTuR2R1t78mGSdzaAtNbBWX", "bTC")
if err != nil && !b { if err != nil && !b {
t.Errorf("Test Failed - Common IsValidCryptoAddress error: %s", err) t.Errorf("Common IsValidCryptoAddress error: %s", err)
} }
b, err = IsValidCryptoAddress("0Mz7153HMuxXTuR2R1t78mGSdzaAtNbBWX", "btc") b, err = IsValidCryptoAddress("0Mz7153HMuxXTuR2R1t78mGSdzaAtNbBWX", "btc")
if err == nil && b { if err == nil && b {
t.Error("Test Failed - Common IsValidCryptoAddress error") t.Error("Common IsValidCryptoAddress error")
} }
b, err = IsValidCryptoAddress("1Mz7153HMuxXTuR2R1t78mGSdzaAtNbBWX", "lTc") b, err = IsValidCryptoAddress("1Mz7153HMuxXTuR2R1t78mGSdzaAtNbBWX", "lTc")
if err == nil && b { if err == nil && b {
t.Error("Test Failed - Common IsValidCryptoAddress error") t.Error("Common IsValidCryptoAddress error")
} }
b, err = IsValidCryptoAddress("3CDJNfdWX8m2NwuGUV3nhXHXEeLygMXoAj", "ltc") b, err = IsValidCryptoAddress("3CDJNfdWX8m2NwuGUV3nhXHXEeLygMXoAj", "ltc")
if err != nil && !b { if err != nil && !b {
t.Errorf("Test Failed - Common IsValidCryptoAddress error: %s", err) t.Errorf("Common IsValidCryptoAddress error: %s", err)
} }
b, err = IsValidCryptoAddress("NCDJNfdWX8m2NwuGUV3nhXHXEeLygMXoAj", "lTc") b, err = IsValidCryptoAddress("NCDJNfdWX8m2NwuGUV3nhXHXEeLygMXoAj", "lTc")
if err == nil && b { if err == nil && b {
t.Error("Test Failed - Common IsValidCryptoAddress error") t.Error("Common IsValidCryptoAddress error")
} }
b, err = IsValidCryptoAddress( b, err = IsValidCryptoAddress(
"0xb794f5ea0ba39494ce839613fffba74279579268", "0xb794f5ea0ba39494ce839613fffba74279579268",
"eth", "eth",
) )
if err != nil && b { if err != nil && b {
t.Errorf("Test Failed - Common IsValidCryptoAddress error: %s", err) t.Errorf("Common IsValidCryptoAddress error: %s", err)
} }
b, err = IsValidCryptoAddress( b, err = IsValidCryptoAddress(
"xxb794f5ea0ba39494ce839613fffba74279579268", "xxb794f5ea0ba39494ce839613fffba74279579268",
"eTh", "eTh",
) )
if err == nil && b { if err == nil && b {
t.Error("Test Failed - Common IsValidCryptoAddress error") t.Error("Common IsValidCryptoAddress error")
} }
b, err = IsValidCryptoAddress( b, err = IsValidCryptoAddress(
"xxb794f5ea0ba39494ce839613fffba74279579268", "xxb794f5ea0ba39494ce839613fffba74279579268",
"ding", "ding",
) )
if err == nil && b { if err == nil && b {
t.Error("Test Failed - Common IsValidCryptoAddress error") t.Error("Common IsValidCryptoAddress error")
} }
} }
@@ -78,7 +78,7 @@ func TestStringSliceDifference(t *testing.T) {
expectedOutput := []string{"hello moto"} expectedOutput := []string{"hello moto"}
actualResult := StringSliceDifference(originalInputOne, originalInputTwo) actualResult := StringSliceDifference(originalInputOne, originalInputTwo)
if reflect.DeepEqual(expectedOutput, actualResult) { if reflect.DeepEqual(expectedOutput, actualResult) {
t.Errorf("Test failed. Expected '%s'. Actual '%s'", t.Errorf("Expected '%s'. Actual '%s'",
expectedOutput, actualResult) expectedOutput, actualResult)
} }
} }
@@ -92,12 +92,12 @@ func TestStringDataContains(t *testing.T) {
expectedOutputTwo := false expectedOutputTwo := false
actualResult := StringDataContains(originalHaystack, originalNeedle) actualResult := StringDataContains(originalHaystack, originalNeedle)
if actualResult != expectedOutput { if actualResult != expectedOutput {
t.Errorf("Test failed. Expected '%v'. Actual '%v'", t.Errorf("Expected '%v'. Actual '%v'",
expectedOutput, actualResult) expectedOutput, actualResult)
} }
actualResult = StringDataContains(originalHaystack, anotherNeedle) actualResult = StringDataContains(originalHaystack, anotherNeedle)
if actualResult != expectedOutputTwo { if actualResult != expectedOutputTwo {
t.Errorf("Test failed. Expected '%v'. Actual '%v'", t.Errorf("Expected '%v'. Actual '%v'",
expectedOutput, actualResult) expectedOutput, actualResult)
} }
} }
@@ -111,12 +111,12 @@ func TestStringDataCompare(t *testing.T) {
expectedOutputTwo := false expectedOutputTwo := false
actualResult := StringDataCompare(originalHaystack, originalNeedle) actualResult := StringDataCompare(originalHaystack, originalNeedle)
if actualResult != expectedOutput { if actualResult != expectedOutput {
t.Errorf("Test failed. Expected '%v'. Actual '%v'", t.Errorf("Expected '%v'. Actual '%v'",
expectedOutput, actualResult) expectedOutput, actualResult)
} }
actualResult = StringDataCompare(originalHaystack, anotherNeedle) actualResult = StringDataCompare(originalHaystack, anotherNeedle)
if actualResult != expectedOutputTwo { if actualResult != expectedOutputTwo {
t.Errorf("Test failed. Expected '%v'. Actual '%v'", t.Errorf("Expected '%v'. Actual '%v'",
expectedOutput, actualResult) expectedOutput, actualResult)
} }
} }
@@ -130,13 +130,13 @@ func TestStringDataCompareUpper(t *testing.T) {
expectedOutputTwo := false expectedOutputTwo := false
actualResult := StringDataCompareInsensitive(originalHaystack, originalNeedle) actualResult := StringDataCompareInsensitive(originalHaystack, originalNeedle)
if actualResult != expectedOutput { if actualResult != expectedOutput {
t.Errorf("Test failed. Expected '%v'. Actual '%v'", t.Errorf("Expected '%v'. Actual '%v'",
expectedOutput, actualResult) expectedOutput, actualResult)
} }
actualResult = StringDataCompareInsensitive(originalHaystack, anotherNeedle) actualResult = StringDataCompareInsensitive(originalHaystack, anotherNeedle)
if actualResult != expectedOutputTwo { if actualResult != expectedOutputTwo {
t.Errorf("Test failed. Expected '%v'. Actual '%v'", t.Errorf("Expected '%v'. Actual '%v'",
expectedOutput, actualResult) expectedOutput, actualResult)
} }
} }
@@ -150,12 +150,12 @@ func TestStringDataContainsUpper(t *testing.T) {
expectedOutputTwo := false expectedOutputTwo := false
actualResult := StringDataContainsInsensitive(originalHaystack, originalNeedle) actualResult := StringDataContainsInsensitive(originalHaystack, originalNeedle)
if actualResult != expectedOutput { if actualResult != expectedOutput {
t.Errorf("Test failed. Expected '%v'. Actual '%v'", t.Errorf("Expected '%v'. Actual '%v'",
expectedOutput, actualResult) expectedOutput, actualResult)
} }
actualResult = StringDataContainsInsensitive(originalHaystack, anotherNeedle) actualResult = StringDataContainsInsensitive(originalHaystack, anotherNeedle)
if actualResult != expectedOutputTwo { if actualResult != expectedOutputTwo {
t.Errorf("Test failed. Expected '%v'. Actual '%v'", t.Errorf("Expected '%v'. Actual '%v'",
expectedOutput, actualResult) expectedOutput, actualResult)
} }
} }
@@ -163,13 +163,13 @@ func TestStringDataContainsUpper(t *testing.T) {
func TestYesOrNo(t *testing.T) { func TestYesOrNo(t *testing.T) {
t.Parallel() t.Parallel()
if !YesOrNo("y") { if !YesOrNo("y") {
t.Error("Test failed - Common YesOrNo Error.") t.Error("Common YesOrNo Error.")
} }
if !YesOrNo("yes") { if !YesOrNo("yes") {
t.Error("Test failed - Common YesOrNo Error.") t.Error("Common YesOrNo Error.")
} }
if YesOrNo("ding") { if YesOrNo("ding") {
t.Error("Test failed - Common YesOrNo Error.") t.Error("Common YesOrNo Error.")
} }
} }
@@ -187,42 +187,42 @@ func TestSendHTTPRequest(t *testing.T) {
strings.NewReader(""), strings.NewReader(""),
) )
if err == nil { if err == nil {
t.Error("Test failed. ") t.Error("Expected error 'invalid HTTP method specified'")
} }
_, err = SendHTTPRequest( _, err = SendHTTPRequest(
methodPost, "https://www.google.com", headers, methodPost, "https://www.google.com", headers,
strings.NewReader(""), strings.NewReader(""),
) )
if err != nil { if err != nil {
t.Errorf("Test failed. %s ", err) t.Error(err)
} }
_, err = SendHTTPRequest( _, err = SendHTTPRequest(
methodGet, "https://www.google.com", headers, methodGet, "https://www.google.com", headers,
strings.NewReader(""), strings.NewReader(""),
) )
if err != nil { if err != nil {
t.Errorf("Test failed. %s ", err) t.Error(err)
} }
_, err = SendHTTPRequest( _, err = SendHTTPRequest(
methodDelete, "https://www.google.com", headers, methodDelete, "https://www.google.com", headers,
strings.NewReader(""), strings.NewReader(""),
) )
if err != nil { if err != nil {
t.Errorf("Test failed. %s ", err) t.Error(err)
} }
_, err = SendHTTPRequest( _, err = SendHTTPRequest(
methodGet, ":missingprotocolscheme", headers, methodGet, ":missingprotocolscheme", headers,
strings.NewReader(""), strings.NewReader(""),
) )
if err == nil { if err == nil {
t.Error("Test failed. Common HTTPRequest accepted missing protocol") t.Error("Common HTTPRequest accepted missing protocol")
} }
_, err = SendHTTPRequest( _, err = SendHTTPRequest(
methodGet, "test://unsupportedprotocolscheme", headers, methodGet, "test://unsupportedprotocolscheme", headers,
strings.NewReader(""), strings.NewReader(""),
) )
if err == nil { if err == nil {
t.Error("Test failed. Common HTTPRequest accepted invalid protocol") t.Error("Common HTTPRequest accepted invalid protocol")
} }
} }
@@ -243,23 +243,23 @@ func TestSendHTTPGetRequest(t *testing.T) {
err := SendHTTPGetRequest(ethURL, true, true, &result) err := SendHTTPGetRequest(ethURL, true, true, &result)
if err != nil { if err != nil {
t.Errorf("Test failed - common SendHTTPGetRequest error: %s", err) t.Errorf("common SendHTTPGetRequest error: %s", err)
} }
err = SendHTTPGetRequest("DINGDONG", true, false, &result) err = SendHTTPGetRequest("DINGDONG", true, false, &result)
if err == nil { if err == nil {
t.Error("Test failed - common SendHTTPGetRequest error") t.Error("common SendHTTPGetRequest error")
} }
err = SendHTTPGetRequest(ethURL, false, false, &result) err = SendHTTPGetRequest(ethURL, false, false, &result)
if err != nil { if err != nil {
t.Errorf("Test failed - common SendHTTPGetRequest error: %s", err) t.Errorf("common SendHTTPGetRequest error: %s", err)
} }
err = SendHTTPGetRequest("https://httpstat.us/202", false, false, &result) err = SendHTTPGetRequest("https://httpstat.us/202", false, false, &result)
if err == nil { if err == nil {
t.Error("Test failed = common SendHTTPGetRequest error: Ignored unexpected status code") t.Error("= common SendHTTPGetRequest error: Ignored unexpected status code")
} }
err = SendHTTPGetRequest(ethURL, true, false, &badresult) err = SendHTTPGetRequest(ethURL, true, false, &badresult)
if err == nil { if err == nil {
t.Error("Test failed - common SendHTTPGetRequest error: Unmarshalled into bad type") t.Error("common SendHTTPGetRequest error: Unmarshalled into bad type")
} }
} }
@@ -282,14 +282,14 @@ func TestJSONEncode(t *testing.T) {
bitey, err := JSONEncode(v) bitey, err := JSONEncode(v)
if err != nil { if err != nil {
t.Errorf("Test failed - common JSONEncode error: %s", err) t.Errorf("common JSONEncode error: %s", err)
} }
if string(bitey) != expectOutputString { if string(bitey) != expectOutputString {
t.Error("Test failed - common JSONEncode error") t.Error("common JSONEncode error")
} }
_, err = JSONEncode("WigWham") _, err = JSONEncode("WigWham")
if err != nil { if err != nil {
t.Errorf("Test failed - common JSONEncode error: %s", err) t.Errorf("common JSONEncode error: %s", err)
} }
} }
@@ -299,7 +299,7 @@ func TestJSONDecode(t *testing.T) {
result := "Not a memory address" result := "Not a memory address"
err := JSONDecode(data, result) err := JSONDecode(data, result)
if err == nil { if err == nil {
t.Error("Test failed. Common JSONDecode, unmarshalled when address not supplied") t.Error("Common JSONDecode, unmarshalled when address not supplied")
} }
type test struct { type test struct {
@@ -314,7 +314,7 @@ func TestJSONDecode(t *testing.T) {
data = []byte(`{"status":1,"data":null}`) data = []byte(`{"status":1,"data":null}`)
err = JSONDecode(data, &v) err = JSONDecode(data, &v)
if err != nil || v.Status != 1 { if err != nil || v.Status != 1 {
t.Errorf("Test failed. Common JSONDecode. Data: %v \nError: %s", t.Errorf("Common JSONDecode. Data: %v \nError: %s",
v, err) v, err)
} }
} }
@@ -329,7 +329,7 @@ func TestEncodeURLValues(t *testing.T) {
output := EncodeURLValues(urlstring, values) output := EncodeURLValues(urlstring, values)
if output != expectedOutput { if output != expectedOutput {
t.Error("Test Failed - common EncodeURLValues error") t.Error("common EncodeURLValues error")
} }
} }
@@ -341,12 +341,12 @@ func TestExtractHost(t *testing.T) {
actualResult := ExtractHost(address) actualResult := ExtractHost(address)
if expectedOutput != actualResult { if expectedOutput != actualResult {
t.Errorf( t.Errorf(
"Test failed. Expected '%s'. Actual '%s'.", expectedOutput, actualResult) "Expected '%s'. Actual '%s'.", expectedOutput, actualResult)
} }
actualResultTwo := ExtractHost(addresstwo) actualResultTwo := ExtractHost(addresstwo)
if expectedOutput != actualResultTwo { if expectedOutput != actualResultTwo {
t.Errorf( t.Errorf(
"Test failed. Expected '%s'. Actual '%s'.", expectedOutput, actualResult) "Expected '%s'. Actual '%s'.", expectedOutput, actualResult)
} }
address = "192.168.1.100:1337" address = "192.168.1.100:1337"
@@ -354,7 +354,7 @@ func TestExtractHost(t *testing.T) {
actualResult = ExtractHost(address) actualResult = ExtractHost(address)
if expectedOutput != actualResult { if expectedOutput != actualResult {
t.Errorf( t.Errorf(
"Test failed. Expected '%s'. Actual '%s'.", expectedOutput, actualResult) "Expected '%s'. Actual '%s'.", expectedOutput, actualResult)
} }
} }
@@ -365,7 +365,7 @@ func TestExtractPort(t *testing.T) {
actualResult := ExtractPort(address) actualResult := ExtractPort(address)
if expectedOutput != actualResult { if expectedOutput != actualResult {
t.Errorf( t.Errorf(
"Test failed. Expected '%d'. Actual '%d'.", expectedOutput, actualResult) "Expected '%d'. Actual '%d'.", expectedOutput, actualResult)
} }
} }
@@ -378,11 +378,11 @@ func TestOutputCSV(t *testing.T) {
err := OutputCSV(path, data) err := OutputCSV(path, data)
if err != nil { if err != nil {
t.Errorf("Test failed - common OutputCSV error: %s", err) t.Errorf("common OutputCSV error: %s", err)
} }
err = OutputCSV("/:::notapath:::", data) err = OutputCSV("/:::notapath:::", data)
if err == nil { if err == nil {
t.Error("Test failed - common OutputCSV, tried writing to invalid path") t.Error("common OutputCSV, tried writing to invalid path")
} }
} }
@@ -397,7 +397,7 @@ func TestGetURIPath(t *testing.T) {
for testInput, expectedOutput := range testTable { for testInput, expectedOutput := range testTable {
actualOutput := GetURIPath(testInput) actualOutput := GetURIPath(testInput)
if actualOutput != expectedOutput { if actualOutput != expectedOutput {
t.Errorf("Test failed. Expected '%s'. Actual '%s'.", t.Errorf("Expected '%s'. Actual '%s'.",
expectedOutput, actualOutput) expectedOutput, actualOutput)
} }
} }
@@ -407,7 +407,7 @@ func TestGetExecutablePath(t *testing.T) {
t.Parallel() t.Parallel()
_, err := GetExecutablePath() _, err := GetExecutablePath()
if err != nil { if err != nil {
t.Errorf("Test failed. Common GetExecutablePath. Error: %s", err) t.Errorf("Common GetExecutablePath. Error: %s", err)
} }
} }

View File

@@ -12,20 +12,20 @@ func TestFloatFromString(t *testing.T) {
actualOutput, err := FloatFromString(testString) actualOutput, err := FloatFromString(testString)
if actualOutput != expectedOutput || err != nil { if actualOutput != expectedOutput || err != nil {
t.Errorf("Test failed. Common FloatFromString. Expected '%v'. Actual '%v'. Error: %s", t.Errorf("Common FloatFromString. Expected '%v'. Actual '%v'. Error: %s",
expectedOutput, actualOutput, err) expectedOutput, actualOutput, err)
} }
var testByte []byte var testByte []byte
_, err = FloatFromString(testByte) _, err = FloatFromString(testByte)
if err == nil { if err == nil {
t.Error("Test failed. Common FloatFromString. Converted non-string.") t.Error("Common FloatFromString. Converted non-string.")
} }
testString = " something unconvertible " testString = " something unconvertible "
_, err = FloatFromString(testString) _, err = FloatFromString(testString)
if err == nil { if err == nil {
t.Error("Test failed. Common FloatFromString. Converted invalid syntax.") t.Error("Common FloatFromString. Converted invalid syntax.")
} }
} }
@@ -36,20 +36,20 @@ func TestIntFromString(t *testing.T) {
actualOutput, err := IntFromString(testString) actualOutput, err := IntFromString(testString)
if actualOutput != expectedOutput || err != nil { if actualOutput != expectedOutput || err != nil {
t.Errorf("Test failed. Common IntFromString. Expected '%v'. Actual '%v'. Error: %s", t.Errorf("Common IntFromString. Expected '%v'. Actual '%v'. Error: %s",
expectedOutput, actualOutput, err) expectedOutput, actualOutput, err)
} }
var testByte []byte var testByte []byte
_, err = IntFromString(testByte) _, err = IntFromString(testByte)
if err == nil { if err == nil {
t.Error("Test failed. Common IntFromString. Converted non-string.") t.Error("Common IntFromString. Converted non-string.")
} }
testString = "1.41421356237" testString = "1.41421356237"
_, err = IntFromString(testString) _, err = IntFromString(testString)
if err == nil { if err == nil {
t.Error("Test failed. Common IntFromString. Converted invalid syntax.") t.Error("Common IntFromString. Converted invalid syntax.")
} }
} }
@@ -60,20 +60,20 @@ func TestInt64FromString(t *testing.T) {
actualOutput, err := Int64FromString(testString) actualOutput, err := Int64FromString(testString)
if actualOutput != expectedOutput || err != nil { if actualOutput != expectedOutput || err != nil {
t.Errorf("Test failed. Common Int64FromString. Expected '%v'. Actual '%v'. Error: %s", t.Errorf("Common Int64FromString. Expected '%v'. Actual '%v'. Error: %s",
expectedOutput, actualOutput, err) expectedOutput, actualOutput, err)
} }
var testByte []byte var testByte []byte
_, err = Int64FromString(testByte) _, err = Int64FromString(testByte)
if err == nil { if err == nil {
t.Error("Test failed. Common Int64FromString. Converted non-string.") t.Error("Common Int64FromString. Converted non-string.")
} }
testString = "1.41421356237" testString = "1.41421356237"
_, err = Int64FromString(testString) _, err = Int64FromString(testString)
if err == nil { if err == nil {
t.Error("Test failed. Common Int64FromString. Converted invalid syntax.") t.Error("Common Int64FromString. Converted invalid syntax.")
} }
} }
@@ -84,14 +84,14 @@ func TestTimeFromUnixTimestampFloat(t *testing.T) {
actualOutput, err := TimeFromUnixTimestampFloat(testTimestamp) actualOutput, err := TimeFromUnixTimestampFloat(testTimestamp)
if actualOutput.UTC().String() != expectedOutput.UTC().String() || err != nil { if actualOutput.UTC().String() != expectedOutput.UTC().String() || err != nil {
t.Errorf("Test failed. Common TimeFromUnixTimestampFloat. Expected '%v'. Actual '%v'. Error: %s", t.Errorf("Common TimeFromUnixTimestampFloat. Expected '%v'. Actual '%v'. Error: %s",
expectedOutput, actualOutput, err) expectedOutput, actualOutput, err)
} }
testString := "Time" testString := "Time"
_, err = TimeFromUnixTimestampFloat(testString) _, err = TimeFromUnixTimestampFloat(testString)
if err == nil { if err == nil {
t.Error("Test failed. Common TimeFromUnixTimestampFloat. Converted invalid syntax.") t.Error("Common TimeFromUnixTimestampFloat. Converted invalid syntax.")
} }
} }
@@ -103,7 +103,7 @@ func TestUnixTimestampToTime(t *testing.T) {
actualResult := UnixTimestampToTime(testTime) actualResult := UnixTimestampToTime(testTime)
if tm.String() != actualResult.String() { if tm.String() != actualResult.String() {
t.Errorf( t.Errorf(
"Test failed. Expected '%s'. Actual '%s'.", expectedOutput, actualResult) "Expected '%s'. Actual '%s'.", expectedOutput, actualResult)
} }
} }
@@ -118,11 +118,11 @@ func TestUnixTimestampStrToTime(t *testing.T) {
} }
if actualResult.UTC().String() != expectedOutput { if actualResult.UTC().String() != expectedOutput {
t.Errorf( t.Errorf(
"Test failed. Expected '%s'. Actual '%s'.", expectedOutput, actualResult) "Expected '%s'. Actual '%s'.", expectedOutput, actualResult)
} }
actualResult, err = UnixTimestampStrToTime(incorrectTime) actualResult, err = UnixTimestampStrToTime(incorrectTime)
if err == nil { if err == nil {
t.Error("Test failed. Common UnixTimestampStrToTime error") t.Error("Common UnixTimestampStrToTime error")
} }
} }
@@ -133,7 +133,7 @@ func TestUnixMillis(t *testing.T) {
actualOutput := UnixMillis(testTime) actualOutput := UnixMillis(testTime)
if actualOutput != expectedOutput { if actualOutput != expectedOutput {
t.Errorf("Test failed. Common UnixMillis. Expected '%d'. Actual '%d'.", t.Errorf("Common UnixMillis. Expected '%d'. Actual '%d'.",
expectedOutput, actualOutput) expectedOutput, actualOutput)
} }
} }
@@ -145,7 +145,7 @@ func TestRecvWindow(t *testing.T) {
actualOutput := RecvWindow(testTime) actualOutput := RecvWindow(testTime)
if actualOutput != expectedOutput { if actualOutput != expectedOutput {
t.Errorf("Test failed. Common RecvWindow. Expected '%d'. Actual '%d'", t.Errorf("Common RecvWindow. Expected '%d'. Actual '%d'",
expectedOutput, actualOutput) expectedOutput, actualOutput)
} }
} }

View File

@@ -11,7 +11,7 @@ func TestHexEncodeToString(t *testing.T) {
expectedOutput := "737472696e67" expectedOutput := "737472696e67"
actualResult := HexEncodeToString(originalInput) actualResult := HexEncodeToString(originalInput)
if actualResult != expectedOutput { if actualResult != expectedOutput {
t.Errorf("Test failed. Expected '%s'. Actual '%s'", t.Errorf("Expected '%s'. Actual '%s'",
expectedOutput, actualResult) expectedOutput, actualResult)
} }
} }
@@ -22,13 +22,13 @@ func TestBase64Decode(t *testing.T) {
expectedOutput := []byte("hello") expectedOutput := []byte("hello")
actualResult, err := Base64Decode(originalInput) actualResult, err := Base64Decode(originalInput)
if !bytes.Equal(actualResult, expectedOutput) { if !bytes.Equal(actualResult, expectedOutput) {
t.Errorf("Test failed. Expected '%s'. Actual '%s'. Error: %s", t.Errorf("Expected '%s'. Actual '%s'. Error: %s",
expectedOutput, actualResult, err) expectedOutput, actualResult, err)
} }
_, err = Base64Decode("-") _, err = Base64Decode("-")
if err == nil { if err == nil {
t.Error("Test failed. Bad base64 string failed returned nil error") t.Error("Bad base64 string failed returned nil error")
} }
} }
@@ -38,7 +38,7 @@ func TestBase64Encode(t *testing.T) {
expectedOutput := "aGVsbG8=" expectedOutput := "aGVsbG8="
actualResult := Base64Encode(originalInput) actualResult := Base64Encode(originalInput)
if actualResult != expectedOutput { if actualResult != expectedOutput {
t.Errorf("Test failed. Expected '%s'. Actual '%s'", t.Errorf("Expected '%s'. Actual '%s'",
expectedOutput, actualResult) expectedOutput, actualResult)
} }
} }
@@ -48,7 +48,7 @@ func TestGetRandomSalt(t *testing.T) {
_, err := GetRandomSalt(nil, -1) _, err := GetRandomSalt(nil, -1)
if err == nil { if err == nil {
t.Fatal("Test failed. Expected err on negative salt length") t.Fatal("Expected err on negative salt length")
} }
salt, err := GetRandomSalt(nil, 10) salt, err := GetRandomSalt(nil, 10)
@@ -57,7 +57,7 @@ func TestGetRandomSalt(t *testing.T) {
} }
if len(salt) != 10 { if len(salt) != 10 {
t.Fatal("Test failed. Expected salt of len=10") t.Fatal("Expected salt of len=10")
} }
salt, err = GetRandomSalt([]byte("RAWR"), 12) salt, err = GetRandomSalt([]byte("RAWR"), 12)
@@ -66,7 +66,7 @@ func TestGetRandomSalt(t *testing.T) {
} }
if len(salt) != 16 { if len(salt) != 16 {
t.Fatal("Test failed. Expected salt of len=16") t.Fatal("Expected salt of len=16")
} }
} }
@@ -77,7 +77,7 @@ func TestGetMD5(t *testing.T) {
actualOutput := GetMD5(originalString) actualOutput := GetMD5(originalString)
actualStr := HexEncodeToString(actualOutput) actualStr := HexEncodeToString(actualOutput)
if !bytes.Equal(expectedOutput, []byte(actualStr)) { if !bytes.Equal(expectedOutput, []byte(actualStr)) {
t.Errorf("Test failed. Expected '%s'. Actual '%s'", t.Errorf("Expected '%s'. Actual '%s'",
expectedOutput, []byte(actualStr)) expectedOutput, []byte(actualStr))
} }
@@ -92,7 +92,7 @@ func TestGetSHA512(t *testing.T) {
actualOutput := GetSHA512(originalString) actualOutput := GetSHA512(originalString)
actualStr := HexEncodeToString(actualOutput) actualStr := HexEncodeToString(actualOutput)
if !bytes.Equal(expectedOutput, []byte(actualStr)) { if !bytes.Equal(expectedOutput, []byte(actualStr)) {
t.Errorf("Test failed. Expected '%x'. Actual '%x'", t.Errorf("Expected '%x'. Actual '%x'",
expectedOutput, []byte(actualStr)) expectedOutput, []byte(actualStr))
} }
} }
@@ -106,7 +106,7 @@ func TestGetSHA256(t *testing.T) {
actualOutput := GetSHA256(originalString) actualOutput := GetSHA256(originalString)
actualStr := HexEncodeToString(actualOutput) actualStr := HexEncodeToString(actualOutput)
if !bytes.Equal(expectedOutput, []byte(actualStr)) { if !bytes.Equal(expectedOutput, []byte(actualStr)) {
t.Errorf("Test failed. Expected '%x'. Actual '%x'", expectedOutput, t.Errorf("Expected '%x'. Actual '%x'", expectedOutput,
[]byte(actualStr)) []byte(actualStr))
} }
} }
@@ -138,31 +138,31 @@ func TestGetHMAC(t *testing.T) {
sha1 := GetHMAC(HashSHA1, []byte("Hello,World"), []byte("1234")) sha1 := GetHMAC(HashSHA1, []byte("Hello,World"), []byte("1234"))
if string(sha1) != string(expectedSha1) { if string(sha1) != string(expectedSha1) {
t.Errorf("Test failed. Common GetHMAC error: Expected '%x'. Actual '%x'", t.Errorf("Common GetHMAC error: Expected '%x'. Actual '%x'",
expectedSha1, sha1, expectedSha1, sha1,
) )
} }
sha256 := GetHMAC(HashSHA256, []byte("Hello,World"), []byte("1234")) sha256 := GetHMAC(HashSHA256, []byte("Hello,World"), []byte("1234"))
if string(sha256) != string(expectedsha256) { if string(sha256) != string(expectedsha256) {
t.Errorf("Test failed. Common GetHMAC error: Expected '%x'. Actual '%x'", t.Errorf("Common GetHMAC error: Expected '%x'. Actual '%x'",
expectedsha256, sha256, expectedsha256, sha256,
) )
} }
sha512 := GetHMAC(HashSHA512, []byte("Hello,World"), []byte("1234")) sha512 := GetHMAC(HashSHA512, []byte("Hello,World"), []byte("1234"))
if string(sha512) != string(expectedsha512) { if string(sha512) != string(expectedsha512) {
t.Errorf("Test failed. Common GetHMAC error: Expected '%x'. Actual '%x'", t.Errorf("Common GetHMAC error: Expected '%x'. Actual '%x'",
expectedsha512, sha512, expectedsha512, sha512,
) )
} }
sha512384 := GetHMAC(HashSHA512_384, []byte("Hello,World"), []byte("1234")) sha512384 := GetHMAC(HashSHA512_384, []byte("Hello,World"), []byte("1234"))
if string(sha512384) != string(expectedsha512384) { if string(sha512384) != string(expectedsha512384) {
t.Errorf("Test failed. Common GetHMAC error: Expected '%x'. Actual '%x'", t.Errorf("Common GetHMAC error: Expected '%x'. Actual '%x'",
expectedsha512384, sha512384, expectedsha512384, sha512384,
) )
} }
md5 := GetHMAC(HashMD5, []byte("Hello World"), []byte("1234")) md5 := GetHMAC(HashMD5, []byte("Hello World"), []byte("1234"))
if string(md5) != string(expectedmd5) { if string(md5) != string(expectedmd5) {
t.Errorf("Test failed. Common GetHMAC error: Expected '%x'. Actual '%x'", t.Errorf("Common GetHMAC error: Expected '%x'. Actual '%x'",
expectedmd5, md5, expectedmd5, md5,
) )
} }
@@ -174,7 +174,7 @@ func TestSha1Tohex(t *testing.T) {
expectedResult := "fcfbfcd7d31d994ef660f6972399ab5d7a890149" expectedResult := "fcfbfcd7d31d994ef660f6972399ab5d7a890149"
actualResult := Sha1ToHex("Testing Sha1ToHex") actualResult := Sha1ToHex("Testing Sha1ToHex")
if actualResult != expectedResult { if actualResult != expectedResult {
t.Errorf("Test failed. Expected '%s'. Actual '%s'", t.Errorf("Expected '%s'. Actual '%s'",
expectedResult, actualResult) expectedResult, actualResult)
} }
} }

View File

@@ -10,7 +10,7 @@ func TestCalculateFee(t *testing.T) {
actualResult := CalculateFee(originalInput, fee) actualResult := CalculateFee(originalInput, fee)
if expectedOutput != actualResult { if expectedOutput != actualResult {
t.Errorf( t.Errorf(
"Test failed. Expected '%f'. Actual '%f'.", expectedOutput, actualResult) "Expected '%f'. Actual '%f'.", expectedOutput, actualResult)
} }
} }
@@ -22,7 +22,7 @@ func TestCalculateAmountWithFee(t *testing.T) {
actualResult := CalculateAmountWithFee(originalInput, fee) actualResult := CalculateAmountWithFee(originalInput, fee)
if expectedOutput != actualResult { if expectedOutput != actualResult {
t.Errorf( t.Errorf(
"Test failed. Expected '%f'. Actual '%f'.", expectedOutput, actualResult) "Expected '%f'. Actual '%f'.", expectedOutput, actualResult)
} }
} }
@@ -34,7 +34,7 @@ func TestCalculatePercentageGainOrLoss(t *testing.T) {
actualResult := CalculatePercentageGainOrLoss(originalInput, secondInput) actualResult := CalculatePercentageGainOrLoss(originalInput, secondInput)
if expectedOutput != actualResult { if expectedOutput != actualResult {
t.Errorf( t.Errorf(
"Test failed. Expected '%f'. Actual '%f'.", expectedOutput, actualResult) "Expected '%f'. Actual '%f'.", expectedOutput, actualResult)
} }
} }
@@ -46,7 +46,7 @@ func TestCalculatePercentageDifference(t *testing.T) {
actualResult := CalculatePercentageDifference(originalInput, secondAmount) actualResult := CalculatePercentageDifference(originalInput, secondAmount)
if expectedOutput != actualResult { if expectedOutput != actualResult {
t.Errorf( t.Errorf(
"Test failed. Expected '%f'. Actual '%f'.", expectedOutput, actualResult) "Expected '%f'. Actual '%f'.", expectedOutput, actualResult)
} }
} }
@@ -60,7 +60,7 @@ func TestCalculateNetProfit(t *testing.T) {
actualResult := CalculateNetProfit(amount, priceThen, priceNow, costs) actualResult := CalculateNetProfit(amount, priceThen, priceNow, costs)
if expectedOutput != actualResult { if expectedOutput != actualResult {
t.Errorf( t.Errorf(
"Test failed. Expected '%f'. Actual '%f'.", expectedOutput, actualResult) "Expected '%f'. Actual '%f'.", expectedOutput, actualResult)
} }
} }
@@ -74,7 +74,7 @@ func TestRoundFloat(t *testing.T) {
for testInput, expectedOutput := range testTable { for testInput, expectedOutput := range testTable {
actualOutput := RoundFloat(testInput, 2) actualOutput := RoundFloat(testInput, 2)
if actualOutput != expectedOutput { if actualOutput != expectedOutput {
t.Errorf("Test failed. RoundFloat Expected '%f'. Actual '%f'.", t.Errorf("RoundFloat Expected '%f'. Actual '%f'.",
expectedOutput, actualOutput) expectedOutput, actualOutput)
} }
} }

View File

@@ -19,19 +19,19 @@ func TestStart(t *testing.T) {
func TestIsEnabled(t *testing.T) { func TestIsEnabled(t *testing.T) {
if !b.IsEnabled() { if !b.IsEnabled() {
t.Error("test failed - base IsEnabled() error") t.Error("base IsEnabled() error")
} }
} }
func TestIsConnected(t *testing.T) { func TestIsConnected(t *testing.T) {
if !b.IsConnected() { if !b.IsConnected() {
t.Error("test failed - base IsConnected() error") t.Error("base IsConnected() error")
} }
} }
func TestGetName(t *testing.T) { func TestGetName(t *testing.T) {
if b.GetName() != "test" { if b.GetName() != "test" {
t.Error("test failed - base GetName() error") t.Error("base GetName() error")
} }
} }

View File

@@ -23,7 +23,7 @@ func TestNewComm(t *testing.T) {
} }
if len(communications.IComm) != 4 { if len(communications.IComm) != 4 {
t.Errorf("Test failed, communications NewComm, expected len 4, got len %d", t.Errorf("communications NewComm, expected len 4, got len %d",
len(communications.IComm)) len(communications.IComm))
} }
} }

View File

@@ -54,7 +54,7 @@ func TestSetup(t *testing.T) {
func TestConnect(t *testing.T) { func TestConnect(t *testing.T) {
err := s.Connect() err := s.Connect()
if err == nil { if err == nil {
t.Error("test failed - slack Connect() error cannot be nil") t.Error("slack Connect() error cannot be nil")
} }
} }
@@ -62,7 +62,7 @@ func TestPushEvent(t *testing.T) {
t.Parallel() t.Parallel()
err := s.PushEvent(base.Event{}) err := s.PushEvent(base.Event{})
if err == nil { if err == nil {
t.Error("test failed - slack PushEvent() error cannot be nil") t.Error("slack PushEvent() error cannot be nil")
} }
} }
@@ -70,7 +70,7 @@ func TestBuildURL(t *testing.T) {
t.Parallel() t.Parallel()
v := s.BuildURL("lol123") v := s.BuildURL("lol123")
if v != "https://slack.com/api/rtm.start?token=lol123" { if v != "https://slack.com/api/rtm.start?token=lol123" {
t.Error("test failed - slack BuildURL() error") t.Error("slack BuildURL() error")
} }
} }
@@ -101,14 +101,14 @@ func TestGetChannelsString(t *testing.T) {
} }
} }
if !testpassed { if !testpassed {
t.Error("test failed - slack GetChannelsString() error") t.Error("slack GetChannelsString() error")
} }
} }
func TestGetUsernameByID(t *testing.T) { func TestGetUsernameByID(t *testing.T) {
username := s.GetUsernameByID("1337") username := s.GetUsernameByID("1337")
if username != "" { if username != "" {
t.Error("test failed - slack GetUsernameByID() error") t.Error("slack GetUsernameByID() error")
} }
s.Details.Users = append(s.Details.Users, struct { s.Details.Users = append(s.Details.Users, struct {
@@ -141,7 +141,7 @@ func TestGetUsernameByID(t *testing.T) {
username = s.GetUsernameByID("1337") username = s.GetUsernameByID("1337")
if username != "cranktakular" { if username != "cranktakular" {
t.Error("test failed - slack GetUsernameByID() error") t.Error("slack GetUsernameByID() error")
} }
} }
@@ -149,7 +149,7 @@ func TestGetUsernameByID(t *testing.T) {
func TestGetIDByName(t *testing.T) { func TestGetIDByName(t *testing.T) {
id, err := s.GetIDByName("batman") id, err := s.GetIDByName("batman")
if err == nil || id != "" { if err == nil || id != "" {
t.Error("test failed - slack GetIDByName() error") t.Error("slack GetIDByName() error")
} }
s.Details.Groups = append(s.Details.Groups, group{ s.Details.Groups = append(s.Details.Groups, group{
@@ -158,7 +158,7 @@ func TestGetIDByName(t *testing.T) {
}) })
id, err = s.GetIDByName("this is a group") id, err = s.GetIDByName("this is a group")
if err != nil || id != "210314" { if err != nil || id != "210314" {
t.Errorf("test failed - slack GetIDByName() Expected '210314' Actual '%s' Error: %s", t.Errorf("slack GetIDByName() Expected '210314' Actual '%s' Error: %s",
id, err) id, err)
} }
} }
@@ -166,7 +166,7 @@ func TestGetIDByName(t *testing.T) {
func TestGetGroupIDByName(t *testing.T) { func TestGetGroupIDByName(t *testing.T) {
id, err := s.GetGroupIDByName("batman") id, err := s.GetGroupIDByName("batman")
if err == nil || id != "" { if err == nil || id != "" {
t.Error("test failed - slack GetGroupIDByName() error") t.Error("slack GetGroupIDByName() error")
} }
s.Details.Groups = append(s.Details.Groups, group{ s.Details.Groups = append(s.Details.Groups, group{
@@ -175,7 +175,7 @@ func TestGetGroupIDByName(t *testing.T) {
}) })
id, err = s.GetGroupIDByName("another group") id, err = s.GetGroupIDByName("another group")
if err != nil || id != "11223344" { if err != nil || id != "11223344" {
t.Errorf("test failed - slack GetGroupIDByName() Expected '11223344' Actual '%s' Error: %s", t.Errorf("slack GetGroupIDByName() Expected '11223344' Actual '%s' Error: %s",
id, err) id, err)
} }
@@ -184,7 +184,7 @@ func TestGetGroupIDByName(t *testing.T) {
func TestGetChannelIDByName(t *testing.T) { func TestGetChannelIDByName(t *testing.T) {
id, err := s.GetChannelIDByName("1337") id, err := s.GetChannelIDByName("1337")
if err == nil || id != "" { if err == nil || id != "" {
t.Error("test failed - slack GetChannelIDByName() error") t.Error("slack GetChannelIDByName() error")
} }
s.Details.Channels = append(s.Details.Channels, struct { s.Details.Channels = append(s.Details.Channels, struct {
@@ -208,7 +208,7 @@ func TestGetChannelIDByName(t *testing.T) {
id, err = s.GetChannelIDByName("Slack Test") id, err = s.GetChannelIDByName("Slack Test")
if err != nil || id != "2048" { if err != nil || id != "2048" {
t.Errorf("test failed - slack GetChannelIDByName() Expected '2048' Actual '%s' Error: %s", t.Errorf("slack GetChannelIDByName() Expected '2048' Actual '%s' Error: %s",
id, err) id, err)
} }
} }
@@ -216,7 +216,7 @@ func TestGetChannelIDByName(t *testing.T) {
func TestGetUsersInGroup(t *testing.T) { func TestGetUsersInGroup(t *testing.T) {
username := s.GetUsersInGroup("supergroup") username := s.GetUsersInGroup("supergroup")
if len(username) != 0 { if len(username) != 0 {
t.Error("test failed - slack GetUsersInGroup() error") t.Error("slack GetUsersInGroup() error")
} }
s.Details.Groups = append(s.Details.Groups, group{ s.Details.Groups = append(s.Details.Groups, group{
@@ -227,7 +227,7 @@ func TestGetUsersInGroup(t *testing.T) {
username = s.GetUsersInGroup("three guys") username = s.GetUsersInGroup("three guys")
if len(username) != 3 { if len(username) != 3 {
t.Errorf("test failed - slack GetUsersInGroup() Expected '3' Actual '%s'", t.Errorf("slack GetUsersInGroup() Expected '3' Actual '%s'",
username) username)
} }
} }
@@ -235,14 +235,14 @@ func TestGetUsersInGroup(t *testing.T) {
func TestNewConnection(t *testing.T) { func TestNewConnection(t *testing.T) {
err := s.NewConnection() err := s.NewConnection()
if err == nil { if err == nil {
t.Error("test failed - slack NewConnection() error") t.Error("slack NewConnection() error")
} }
} }
func TestWebsocketConnect(t *testing.T) { func TestWebsocketConnect(t *testing.T) {
err := s.WebsocketConnect() err := s.WebsocketConnect()
if err == nil { if err == nil {
t.Error("test failed - slack WebsocketConnect() error") t.Error("slack WebsocketConnect() error")
} }
} }
@@ -253,13 +253,13 @@ func TestHandlePresenceChange(t *testing.T) {
err := s.handlePresenceChange([]byte(`{"malformedjson}`)) err := s.handlePresenceChange([]byte(`{"malformedjson}`))
if err == nil { if err == nil {
t.Error("test failed - slack handlePresenceChange(), unmarshalled malformed json") t.Error("slack handlePresenceChange(), unmarshalled malformed json")
} }
data, _ := common.JSONEncode(pres) data, _ := common.JSONEncode(pres)
err = s.handlePresenceChange(data) err = s.handlePresenceChange(data)
if err != nil { if err != nil {
t.Errorf("test failed - slack handlePresenceChange() Error: %s", err) t.Errorf("slack handlePresenceChange() Error: %s", err)
} }
} }
@@ -269,7 +269,7 @@ func TestHandleMessageResponse(t *testing.T) {
err := s.handleMessageResponse(nil, data) err := s.handleMessageResponse(nil, data)
if err.Error() != "reply to is != 0" { if err.Error() != "reply to is != 0" {
t.Errorf("test failed - slack handleMessageResponse(), Incorrect Error: %s", t.Errorf("slack handleMessageResponse(), Incorrect Error: %s",
err) err)
} }
@@ -277,7 +277,7 @@ func TestHandleMessageResponse(t *testing.T) {
err = s.handleMessageResponse([]byte(`{"malformedjson}`), data) err = s.handleMessageResponse([]byte(`{"malformedjson}`), data)
if err == nil { if err == nil {
t.Error("test failed - slack handleMessageResponse(), unmarshalled malformed json") t.Error("slack handleMessageResponse(), unmarshalled malformed json")
} }
var msg Message var msg Message
@@ -287,7 +287,7 @@ func TestHandleMessageResponse(t *testing.T) {
err = s.handleMessageResponse(resp, data) err = s.handleMessageResponse(resp, data)
if err != nil { if err != nil {
t.Error("test failed - slack HandleMessage(), Sent message through nil websocket") t.Error("slack HandleMessage(), Sent message through nil websocket")
} }
msg.Text = "!notacommand" msg.Text = "!notacommand"
@@ -295,7 +295,7 @@ func TestHandleMessageResponse(t *testing.T) {
err = s.handleMessageResponse(resp, data) err = s.handleMessageResponse(resp, data)
if err == nil { if err == nil {
t.Errorf("test failed - slack handleMessageResponse() Error: %s", err) t.Errorf("slack handleMessageResponse() Expected error")
} }
} }
@@ -303,13 +303,13 @@ func TestHandleErrorResponse(t *testing.T) {
var data WebsocketResponse var data WebsocketResponse
err := s.handleErrorResponse(data) err := s.handleErrorResponse(data)
if err == nil { if err == nil {
t.Error("test failed - slack handleErrorResponse() Ignored strange input") t.Error("slack handleErrorResponse() Ignored strange input")
} }
data.Error.Msg = "Socket URL has expired" data.Error.Msg = "Socket URL has expired"
err = s.handleErrorResponse(data) err = s.handleErrorResponse(data)
if err == nil { if err == nil {
t.Error("test failed - slack handleErrorResponse() Didn't error on nil websocket") t.Error("slack handleErrorResponse() Didn't error on nil websocket")
} }
} }
@@ -320,7 +320,7 @@ func TestHandleHelloResponse(t *testing.T) {
func TestHandleReconnectResponse(t *testing.T) { func TestHandleReconnectResponse(t *testing.T) {
err := s.handleReconnectResponse([]byte(`{"malformedjson}`)) err := s.handleReconnectResponse([]byte(`{"malformedjson}`))
if err == nil { if err == nil {
t.Error("test failed - slack handleReconnectResponse(), unmarshalled malformed json") t.Error("slack handleReconnectResponse(), unmarshalled malformed json")
} }
var testURL struct { var testURL struct {
@@ -332,7 +332,7 @@ func TestHandleReconnectResponse(t *testing.T) {
err = s.handleReconnectResponse(data) err = s.handleReconnectResponse(data)
if err != nil || s.ReconnectURL != "https://www.thrasher.io" { if err != nil || s.ReconnectURL != "https://www.thrasher.io" {
t.Errorf("test failed - slack handleReconnectResponse() Expected 'https://www.thrasher.io' Actual '%s' Error: %s", t.Errorf("slack handleReconnectResponse() Expected 'https://www.thrasher.io' Actual '%s' Error: %s",
s.ReconnectURL, err) s.ReconnectURL, err)
} }
} }
@@ -340,7 +340,7 @@ func TestHandleReconnectResponse(t *testing.T) {
func TestWebsocketSend(t *testing.T) { func TestWebsocketSend(t *testing.T) {
err := s.WebsocketSend("test", "Hello World!") err := s.WebsocketSend("test", "Hello World!")
if err == nil { if err == nil {
t.Error("test failed - slack WebsocketSend(), Sent message through nil websocket") t.Error("slack WebsocketSend(), Sent message through nil websocket")
} }
} }
@@ -348,16 +348,16 @@ func TestHandleMessage(t *testing.T) {
msg := &Message{} msg := &Message{}
err := s.HandleMessage(msg) err := s.HandleMessage(msg)
if err == nil { if err == nil {
t.Error("test failed - slack HandleMessage(), Sent message through nil websocket") t.Error("slack HandleMessage(), Sent message through nil websocket")
} }
msg.Text = cmdStatus msg.Text = cmdStatus
err = s.HandleMessage(msg) err = s.HandleMessage(msg)
if err == nil { if err == nil {
t.Error("test failed - slack HandleMessage(), Sent message through nil websocket") t.Error("slack HandleMessage(), Sent message through nil websocket")
} }
msg.Text = cmdHelp msg.Text = cmdHelp
err = s.HandleMessage(msg) err = s.HandleMessage(msg)
if err == nil { if err == nil {
t.Error("test failed - slack HandleMessage(), Sent message through nil websocket") t.Error("slack HandleMessage(), Sent message through nil websocket")
} }
} }

View File

@@ -22,82 +22,82 @@ func TestSetup(t *testing.T) {
func TestConnect(t *testing.T) { func TestConnect(t *testing.T) {
err := s.Connect() err := s.Connect()
if err != nil { if err != nil {
t.Error("test failed - SMSGlobal Connect() error", err) t.Error("SMSGlobal Connect() error", err)
} }
} }
func TestPushEvent(t *testing.T) { func TestPushEvent(t *testing.T) {
err := s.PushEvent(base.Event{}) err := s.PushEvent(base.Event{})
if err != nil { if err != nil {
t.Error("test failed - SMSGlobal PushEvent() error", err) t.Error("SMSGlobal PushEvent() error", err)
} }
} }
func TestGetEnabledContacts(t *testing.T) { func TestGetEnabledContacts(t *testing.T) {
v := s.GetEnabledContacts() v := s.GetEnabledContacts()
if v != 1 { if v != 1 {
t.Error("test failed - SMSGlobal GetEnabledContacts() error") t.Error("SMSGlobal GetEnabledContacts() error")
} }
} }
func TestGetContactByNumber(t *testing.T) { func TestGetContactByNumber(t *testing.T) {
_, err := s.GetContactByNumber("1231424") _, err := s.GetContactByNumber("1231424")
if err != nil { if err != nil {
t.Error("test failed - SMSGlobal GetContactByNumber() error", err) t.Error("SMSGlobal GetContactByNumber() error", err)
} }
_, err = s.GetContactByNumber("basketball") _, err = s.GetContactByNumber("basketball")
if err == nil { if err == nil {
t.Error("test failed - SMSGlobal GetContactByNumber() error") t.Error("SMSGlobal GetContactByNumber() error")
} }
} }
func TestGetContactByName(t *testing.T) { func TestGetContactByName(t *testing.T) {
_, err := s.GetContactByName("StyleGherkin") _, err := s.GetContactByName("StyleGherkin")
if err != nil { if err != nil {
t.Error("test failed - SMSGlobal GetContactByName() error", err) t.Error("SMSGlobal GetContactByName() error", err)
} }
_, err = s.GetContactByName("blah") _, err = s.GetContactByName("blah")
if err == nil { if err == nil {
t.Error("test failed - SMSGlobal GetContactByName() error") t.Error("SMSGlobal GetContactByName() error")
} }
} }
func TestAddContact(t *testing.T) { func TestAddContact(t *testing.T) {
err := s.AddContact(Contact{Name: "bra", Number: "2876", Enabled: true}) err := s.AddContact(Contact{Name: "bra", Number: "2876", Enabled: true})
if err != nil { if err != nil {
t.Error("test failed - SMSGlobal AddContact() error", err) t.Error("SMSGlobal AddContact() error", err)
} }
err = s.AddContact(Contact{Name: "StyleGherkin", Number: "1231424", Enabled: true}) err = s.AddContact(Contact{Name: "StyleGherkin", Number: "1231424", Enabled: true})
if err == nil { if err == nil {
t.Error("test failed - SMSGlobal AddContact() error") t.Error("SMSGlobal AddContact() error")
} }
err = s.AddContact(Contact{Name: "", Number: "", Enabled: true}) err = s.AddContact(Contact{Name: "", Number: "", Enabled: true})
if err == nil { if err == nil {
t.Error("test failed - SMSGlobal AddContact() error") t.Error("SMSGlobal AddContact() error")
} }
} }
func TestRemoveContact(t *testing.T) { func TestRemoveContact(t *testing.T) {
err := s.RemoveContact(Contact{Name: "StyleGherkin", Number: "1231424", Enabled: true}) err := s.RemoveContact(Contact{Name: "StyleGherkin", Number: "1231424", Enabled: true})
if err != nil { if err != nil {
t.Error("test failed - SMSGlobal RemoveContact() error", err) t.Error("SMSGlobal RemoveContact() error", err)
} }
err = s.RemoveContact(Contact{Name: "frieda", Number: "243453", Enabled: true}) err = s.RemoveContact(Contact{Name: "frieda", Number: "243453", Enabled: true})
if err == nil { if err == nil {
t.Error("test failed - SMSGlobal RemoveContact() error", err) t.Error("SMSGlobal RemoveContact() Expected error")
} }
} }
func TestSendMessageToAll(t *testing.T) { func TestSendMessageToAll(t *testing.T) {
err := s.SendMessageToAll("Hello,World!") err := s.SendMessageToAll("Hello,World!")
if err != nil { if err != nil {
t.Error("test failed - SMSGlobal SendMessageToAll() error", err) t.Error("SMSGlobal SendMessageToAll() error", err)
} }
} }
func TestSendMessage(t *testing.T) { func TestSendMessage(t *testing.T) {
err := s.SendMessage("1337", "Hello!") err := s.SendMessage("1337", "Hello!")
if err != nil { if err != nil {
t.Error("test failed - SMSGlobal SendMessage() error", err) t.Error("SMSGlobal SendMessage() error", err)
} }
} }

View File

@@ -22,24 +22,24 @@ func TestSetup(t *testing.T) {
func TestConnect(t *testing.T) { func TestConnect(t *testing.T) {
err := s.Connect() err := s.Connect()
if err != nil { if err != nil {
t.Error("test failed - smtpservice Connect() error", err) t.Error("smtpservice Connect() error", err)
} }
} }
func TestPushEvent(t *testing.T) { func TestPushEvent(t *testing.T) {
err := s.PushEvent(base.Event{}) err := s.PushEvent(base.Event{})
if err == nil { if err == nil {
t.Error("test failed - smtpservice PushEvent() error cannot be nil") t.Error("smtpservice PushEvent() error cannot be nil")
} }
} }
func TestSend(t *testing.T) { func TestSend(t *testing.T) {
err := s.Send("", "") err := s.Send("", "")
if err == nil { if err == nil {
t.Error("test failed - smtpservice Send() error cannot be nil") t.Error("smtpservice Send() error cannot be nil")
} }
err = s.Send("subject", "alertmessage") err = s.Send("subject", "alertmessage")
if err == nil { if err == nil {
t.Error("test failed - smtpservice Send() error cannot be nil") t.Error("smtpservice Send() error cannot be nil")
} }
} }

View File

@@ -22,7 +22,7 @@ func TestSetup(t *testing.T) {
commsCfg := cfg.GetCommunicationsConfig() commsCfg := cfg.GetCommunicationsConfig()
T.Setup(&commsCfg) T.Setup(&commsCfg)
if T.Name != "Telegram" || T.Enabled || T.Token != "testest" || T.Verbose { if T.Name != "Telegram" || T.Enabled || T.Token != "testest" || T.Verbose {
t.Error("test failed - telegram Setup() error, unexpected setup values", t.Error("telegram Setup() error, unexpected setup values",
T.Name, T.Name,
T.Enabled, T.Enabled,
T.Token, T.Token,
@@ -33,19 +33,19 @@ func TestSetup(t *testing.T) {
func TestConnect(t *testing.T) { func TestConnect(t *testing.T) {
err := T.Connect() err := T.Connect()
if err == nil { if err == nil {
t.Error("test failed - telegram Connect() error") t.Error("telegram Connect() error")
} }
} }
func TestPushEvent(t *testing.T) { func TestPushEvent(t *testing.T) {
err := T.PushEvent(base.Event{}) err := T.PushEvent(base.Event{})
if err != nil { if err != nil {
t.Error("test failed - telegram PushEvent() error", err) t.Error("telegram PushEvent() error", err)
} }
T.AuthorisedClients = append(T.AuthorisedClients, 1337) T.AuthorisedClients = append(T.AuthorisedClients, 1337)
err = T.PushEvent(base.Event{}) err = T.PushEvent(base.Event{})
if err.Error() != testErrNotFound { if err.Error() != testErrNotFound {
t.Errorf("test failed - telegram PushEvent() error, expected 'Not found' got '%s'", t.Errorf("telegram PushEvent() error, expected 'Not found' got '%s'",
err) err)
} }
} }
@@ -55,27 +55,27 @@ func TestHandleMessages(t *testing.T) {
chatID := int64(1337) chatID := int64(1337)
err := T.HandleMessages(cmdHelp, chatID) err := T.HandleMessages(cmdHelp, chatID)
if err.Error() != testErrNotFound { if err.Error() != testErrNotFound {
t.Errorf("test failed - telegram HandleMessages() error, expected 'Not found' got '%s'", t.Errorf("telegram HandleMessages() error, expected 'Not found' got '%s'",
err) err)
} }
err = T.HandleMessages(cmdStart, chatID) err = T.HandleMessages(cmdStart, chatID)
if err.Error() != testErrNotFound { if err.Error() != testErrNotFound {
t.Errorf("test failed - telegram HandleMessages() error, expected 'Not found' got '%s'", t.Errorf("telegram HandleMessages() error, expected 'Not found' got '%s'",
err) err)
} }
err = T.HandleMessages(cmdStatus, chatID) err = T.HandleMessages(cmdStatus, chatID)
if err.Error() != testErrNotFound { if err.Error() != testErrNotFound {
t.Errorf("test failed - telegram HandleMessages() error, expected 'Not found' got '%s'", t.Errorf("telegram HandleMessages() error, expected 'Not found' got '%s'",
err) err)
} }
err = T.HandleMessages(cmdSettings, chatID) err = T.HandleMessages(cmdSettings, chatID)
if err.Error() != testErrNotFound { if err.Error() != testErrNotFound {
t.Errorf("test failed - telegram HandleMessages() error, expected 'Not found' got '%s'", t.Errorf("telegram HandleMessages() error, expected 'Not found' got '%s'",
err) err)
} }
err = T.HandleMessages("Not a command", chatID) err = T.HandleMessages("Not a command", chatID)
if err.Error() != testErrNotFound { if err.Error() != testErrNotFound {
t.Errorf("test failed - telegram HandleMessages() error, expected 'Not found' got '%s'", t.Errorf("telegram HandleMessages() error, expected 'Not found' got '%s'",
err) err)
} }
} }
@@ -84,7 +84,7 @@ func TestGetUpdates(t *testing.T) {
t.Parallel() t.Parallel()
_, err := T.GetUpdates() _, err := T.GetUpdates()
if err != nil { if err != nil {
t.Error("test failed - telegram GetUpdates() error", err) t.Error("telegram GetUpdates() error", err)
} }
} }
@@ -92,7 +92,7 @@ func TestTestConnection(t *testing.T) {
t.Parallel() t.Parallel()
err := T.TestConnection() err := T.TestConnection()
if err.Error() != testErrNotFound { if err.Error() != testErrNotFound {
t.Errorf("test failed - telegram TestConnection() error, expected 'Not found' got '%s'", t.Errorf("telegram TestConnection() error, expected 'Not found' got '%s'",
err) err)
} }
} }
@@ -101,7 +101,7 @@ func TestSendMessage(t *testing.T) {
t.Parallel() t.Parallel()
err := T.SendMessage("Test message", int64(1337)) err := T.SendMessage("Test message", int64(1337))
if err.Error() != testErrNotFound { if err.Error() != testErrNotFound {
t.Errorf("test failed - telegram SendMessage() error, expected 'Not found' got '%s'", t.Errorf("telegram SendMessage() error, expected 'Not found' got '%s'",
err) err)
} }
} }
@@ -110,6 +110,6 @@ func TestSendHTTPRequest(t *testing.T) {
t.Parallel() t.Parallel()
err := T.SendHTTPRequest("0.0.0.0", nil, nil) err := T.SendHTTPRequest("0.0.0.0", nil, nil)
if err == nil { if err == nil {
t.Error("test failed - telegram SendHTTPRequest() error") t.Error("telegram SendHTTPRequest() error")
} }
} }

View File

@@ -13,7 +13,6 @@ import (
"runtime" "runtime"
"strconv" "strconv"
"strings" "strings"
"sync"
"time" "time"
"github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common"
@@ -27,67 +26,6 @@ import (
log "github.com/thrasher-corp/gocryptotrader/logger" log "github.com/thrasher-corp/gocryptotrader/logger"
) )
// Constants declared here are filename strings and test strings
const (
FXProviderFixer = "fixer"
EncryptedConfigFile = "config.dat"
ConfigFile = "config.json"
ConfigTestFile = "../testdata/configtest.json"
configFileEncryptionPrompt = 0
configFileEncryptionEnabled = 1
configFileEncryptionDisabled = -1
configPairsLastUpdatedWarningThreshold = 30 // 30 days
configDefaultHTTPTimeout = time.Second * 15
configDefaultWebsocketResponseCheckTimeout = time.Millisecond * 30
configDefaultWebsocketResponseMaxLimit = time.Second * 7
configDefaultWebsocketOrderbookBufferLimit = 5
configDefaultWebsocketTrafficTimeout = time.Second * 30
configMaxAuthFailures = 3
defaultNTPAllowedDifference = 50000000
defaultNTPAllowedNegativeDifference = 50000000
DefaultAPIKey = "Key"
DefaultAPISecret = "Secret"
DefaultAPIClientID = "ClientID"
)
// Constants here hold some messages
const (
ErrExchangeNameEmpty = "exchange #%d name is empty"
ErrExchangeAvailablePairsEmpty = "exchange %s available pairs is empty"
ErrExchangeEnabledPairsEmpty = "exchange %s enabled pairs is empty"
ErrExchangeBaseCurrenciesEmpty = "exchange %s base currencies is empty"
ErrExchangeNotFound = "exchange %s not found"
ErrNoEnabledExchanges = "no exchanges enabled"
ErrCryptocurrenciesEmpty = "cryptocurrencies variable is empty"
ErrFailureOpeningConfig = "fatal error opening %s file. Error: %s"
ErrCheckingConfigValues = "fatal error checking config values. Error: %s"
ErrSavingConfigBytesMismatch = "config file %q bytes comparison doesn't match, read %s expected %s"
WarningWebserverCredentialValuesEmpty = "webserver support disabled due to empty Username/Password values"
WarningWebserverListenAddressInvalid = "webserver support disabled due to invalid listen address"
WarningExchangeAuthAPIDefaultOrEmptyValues = "exchange %s authenticated API support disabled due to default/empty APIKey/Secret/ClientID values"
WarningPairsLastUpdatedThresholdExceeded = "exchange %s last manual update of available currency pairs has exceeded %d days. Manual update required!"
)
// Constants here define unset default values displayed in the config.json
// file
const (
APIURLNonDefaultMessage = "NON_DEFAULT_HTTP_LINK_TO_EXCHANGE_API"
WebsocketURLNonDefaultMessage = "NON_DEFAULT_HTTP_LINK_TO_WEBSOCKET_EXCHANGE_API"
DefaultUnsetAPIKey = "Key"
DefaultUnsetAPISecret = "Secret"
DefaultUnsetAccountPlan = "accountPlan"
DefaultForexProviderExchangeRatesAPI = "ExchangeRates"
)
// Variables here are used for configuration
var (
Cfg Config
IsInitialSetup bool
testBypass bool
m sync.Mutex
)
// GetCurrencyConfig returns currency configurations // GetCurrencyConfig returns currency configurations
func (c *Config) GetCurrencyConfig() CurrencyConfig { func (c *Config) GetCurrencyConfig() CurrencyConfig {
return c.Currency return c.Currency
@@ -982,14 +920,14 @@ func (c *Config) CheckExchangeConfigValues() error {
} }
if !c.Exchanges[i].Features.Supports.RESTCapabilities.AutoPairUpdates && !c.Exchanges[i].Features.Supports.WebsocketCapabilities.AutoPairUpdates { if !c.Exchanges[i].Features.Supports.RESTCapabilities.AutoPairUpdates && !c.Exchanges[i].Features.Supports.WebsocketCapabilities.AutoPairUpdates {
lastUpdated := convert.UnixTimestampToTime(c.Exchanges[i].CurrencyPairs.LastUpdated) lastUpdated := convert.UnixTimestampToTime(c.Exchanges[i].CurrencyPairs.LastUpdated)
lastUpdated = lastUpdated.AddDate(0, 0, configPairsLastUpdatedWarningThreshold) lastUpdated = lastUpdated.AddDate(0, 0, pairsLastUpdatedWarningThreshold)
if lastUpdated.Unix() <= time.Now().Unix() { if lastUpdated.Unix() <= time.Now().Unix() {
log.Warnf(log.ExchangeSys, WarningPairsLastUpdatedThresholdExceeded, c.Exchanges[i].Name, configPairsLastUpdatedWarningThreshold) log.Warnf(log.ExchangeSys, WarningPairsLastUpdatedThresholdExceeded, c.Exchanges[i].Name, pairsLastUpdatedWarningThreshold)
} }
} }
if c.Exchanges[i].HTTPTimeout <= 0 { if c.Exchanges[i].HTTPTimeout <= 0 {
log.Warnf(log.ExchangeSys, "Exchange %s HTTP Timeout value not set, defaulting to %v.\n", c.Exchanges[i].Name, configDefaultHTTPTimeout) log.Warnf(log.ExchangeSys, "Exchange %s HTTP Timeout value not set, defaulting to %v.\n", c.Exchanges[i].Name, defaultHTTPTimeout)
c.Exchanges[i].HTTPTimeout = configDefaultHTTPTimeout c.Exchanges[i].HTTPTimeout = defaultHTTPTimeout
} }
if c.Exchanges[i].HTTPRateLimiter != nil { if c.Exchanges[i].HTTPRateLimiter != nil {
@@ -1016,24 +954,24 @@ func (c *Config) CheckExchangeConfigValues() error {
if c.Exchanges[i].WebsocketResponseCheckTimeout <= 0 { if c.Exchanges[i].WebsocketResponseCheckTimeout <= 0 {
log.Warnf(log.ExchangeSys, "Exchange %s Websocket response check timeout value not set, defaulting to %v.", log.Warnf(log.ExchangeSys, "Exchange %s Websocket response check timeout value not set, defaulting to %v.",
c.Exchanges[i].Name, configDefaultWebsocketResponseCheckTimeout) c.Exchanges[i].Name, defaultWebsocketResponseCheckTimeout)
c.Exchanges[i].WebsocketResponseCheckTimeout = configDefaultWebsocketResponseCheckTimeout c.Exchanges[i].WebsocketResponseCheckTimeout = defaultWebsocketResponseCheckTimeout
} }
if c.Exchanges[i].WebsocketResponseMaxLimit <= 0 { if c.Exchanges[i].WebsocketResponseMaxLimit <= 0 {
log.Warnf(log.ExchangeSys, "Exchange %s Websocket response max limit value not set, defaulting to %v.", log.Warnf(log.ExchangeSys, "Exchange %s Websocket response max limit value not set, defaulting to %v.",
c.Exchanges[i].Name, configDefaultWebsocketResponseMaxLimit) c.Exchanges[i].Name, defaultWebsocketResponseMaxLimit)
c.Exchanges[i].WebsocketResponseMaxLimit = configDefaultWebsocketResponseMaxLimit c.Exchanges[i].WebsocketResponseMaxLimit = defaultWebsocketResponseMaxLimit
} }
if c.Exchanges[i].WebsocketTrafficTimeout <= 0 { if c.Exchanges[i].WebsocketTrafficTimeout <= 0 {
log.Warnf(log.ExchangeSys, "Exchange %s Websocket response traffic timeout value not set, defaulting to %v.", log.Warnf(log.ExchangeSys, "Exchange %s Websocket response traffic timeout value not set, defaulting to %v.",
c.Exchanges[i].Name, configDefaultWebsocketTrafficTimeout) c.Exchanges[i].Name, defaultWebsocketTrafficTimeout)
c.Exchanges[i].WebsocketTrafficTimeout = configDefaultWebsocketTrafficTimeout c.Exchanges[i].WebsocketTrafficTimeout = defaultWebsocketTrafficTimeout
} }
if c.Exchanges[i].WebsocketOrderbookBufferLimit <= 0 { if c.Exchanges[i].WebsocketOrderbookBufferLimit <= 0 {
log.Warnf(log.ExchangeSys, "Exchange %s Websocket orderbook buffer limit value not set, defaulting to %v.", log.Warnf(log.ExchangeSys, "Exchange %s Websocket orderbook buffer limit value not set, defaulting to %v.",
c.Exchanges[i].Name, configDefaultWebsocketOrderbookBufferLimit) c.Exchanges[i].Name, defaultWebsocketOrderbookBufferLimit)
c.Exchanges[i].WebsocketOrderbookBufferLimit = configDefaultWebsocketOrderbookBufferLimit c.Exchanges[i].WebsocketOrderbookBufferLimit = defaultWebsocketOrderbookBufferLimit
} }
err := c.CheckPairConsistency(c.Exchanges[i].Name) err := c.CheckPairConsistency(c.Exchanges[i].Name)
if err != nil { if err != nil {
@@ -1065,10 +1003,7 @@ func (c *Config) CheckExchangeConfigValues() error {
// CheckCurrencyConfigValues checks to see if the currency config values are correct or not // CheckCurrencyConfigValues checks to see if the currency config values are correct or not
func (c *Config) CheckCurrencyConfigValues() error { func (c *Config) CheckCurrencyConfigValues() error {
fxProviders := forexprovider.GetAvailableForexProviders() fxProviders := forexprovider.GetSupportedForexProviders()
if len(fxProviders) == 0 {
return errors.New("no forex providers available")
}
if len(fxProviders) != len(c.Currency.ForexProviders) { if len(fxProviders) != len(c.Currency.ForexProviders) {
for x := range fxProviders { for x := range fxProviders {
@@ -1088,27 +1023,25 @@ func (c *Config) CheckCurrencyConfigValues() error {
count := 0 count := 0
for i := range c.Currency.ForexProviders { for i := range c.Currency.ForexProviders {
if c.Currency.ForexProviders[i].Enabled { if c.Currency.ForexProviders[i].Enabled {
if c.Currency.ForexProviders[i].APIKey == DefaultUnsetAPIKey && c.Currency.ForexProviders[i].Name != DefaultForexProviderExchangeRatesAPI { if c.Currency.ForexProviders[i].Name == "CurrencyConverter" &&
c.Currency.ForexProviders[i].PrimaryProvider &&
(c.Currency.ForexProviders[i].APIKey == "" ||
c.Currency.ForexProviders[i].APIKey == DefaultUnsetAPIKey) {
log.Warnln(log.Global, "CurrencyConverter forex provider no longer supports unset API key requests. Switching to ExchangeRates FX provider..")
c.Currency.ForexProviders[i].Enabled = false
c.Currency.ForexProviders[i].PrimaryProvider = false
c.Currency.ForexProviders[i].APIKey = DefaultUnsetAPIKey
c.Currency.ForexProviders[i].APIKeyLvl = -1
continue
}
if c.Currency.ForexProviders[i].APIKey == DefaultUnsetAPIKey &&
c.Currency.ForexProviders[i].Name != DefaultForexProviderExchangeRatesAPI {
log.Warnf(log.Global, "%s enabled forex provider API key not set. Please set this in your config.json file\n", c.Currency.ForexProviders[i].Name) log.Warnf(log.Global, "%s enabled forex provider API key not set. Please set this in your config.json file\n", c.Currency.ForexProviders[i].Name)
c.Currency.ForexProviders[i].Enabled = false c.Currency.ForexProviders[i].Enabled = false
c.Currency.ForexProviders[i].PrimaryProvider = false c.Currency.ForexProviders[i].PrimaryProvider = false
continue continue
} }
if c.Currency.ForexProviders[i].Name == "CurrencyConverter" {
if c.Currency.ForexProviders[i].Enabled &&
c.Currency.ForexProviders[i].PrimaryProvider &&
(c.Currency.ForexProviders[i].APIKey == "" ||
c.Currency.ForexProviders[i].APIKey == DefaultUnsetAPIKey) {
log.Warnln(log.Global, "CurrencyConverter forex provider no longer supports unset API key requests. Switching to ExchangeRates FX provider..")
c.Currency.ForexProviders[i].Enabled = false
c.Currency.ForexProviders[i].PrimaryProvider = false
c.Currency.ForexProviders[i].APIKey = DefaultUnsetAPIKey
c.Currency.ForexProviders[i].APIKeyLvl = -1
continue
}
}
if c.Currency.ForexProviders[i].APIKeyLvl == -1 && c.Currency.ForexProviders[i].Name != DefaultForexProviderExchangeRatesAPI { if c.Currency.ForexProviders[i].APIKeyLvl == -1 && c.Currency.ForexProviders[i].Name != DefaultForexProviderExchangeRatesAPI {
log.Warnf(log.Global, "%s APIKey Level not set, functions limited. Please set this in your config.json file\n", log.Warnf(log.Global, "%s APIKey Level not set, functions limited. Please set this in your config.json file\n",
c.Currency.ForexProviders[i].Name) c.Currency.ForexProviders[i].Name)
@@ -1406,7 +1339,7 @@ func GetFilePath(file string) (string, error) {
} }
if flag.Lookup("test.v") != nil && !testBypass { if flag.Lookup("test.v") != nil && !testBypass {
return ConfigTestFile, nil return TestFile, nil
} }
exePath, err := common.GetExecutablePath() exePath, err := common.GetExecutablePath()
@@ -1415,8 +1348,8 @@ func GetFilePath(file string) (string, error) {
} }
oldDirs := []string{ oldDirs := []string{
filepath.Join(exePath, ConfigFile), filepath.Join(exePath, File),
filepath.Join(exePath, EncryptedConfigFile), filepath.Join(exePath, EncryptedFile),
} }
newDir := common.GetDefaultDataDir(runtime.GOOS) newDir := common.GetDefaultDataDir(runtime.GOOS)
@@ -1425,8 +1358,8 @@ func GetFilePath(file string) (string, error) {
return "", err return "", err
} }
newDirs := []string{ newDirs := []string{
filepath.Join(newDir, ConfigFile), filepath.Join(newDir, File),
filepath.Join(newDir, EncryptedConfigFile), filepath.Join(newDir, EncryptedFile),
} }
// First upgrade the old dir config file if it exists to the corresponding // First upgrade the old dir config file if it exists to the corresponding
@@ -1522,23 +1455,23 @@ func (c *Config) ReadConfig(configPath string, dryrun bool) error {
return err return err
} }
if c.EncryptConfig == configFileEncryptionDisabled { if c.EncryptConfig == fileEncryptionDisabled {
return nil return nil
} }
if c.EncryptConfig == configFileEncryptionPrompt { if c.EncryptConfig == fileEncryptionPrompt {
m.Lock() m.Lock()
IsInitialSetup = true IsInitialSetup = true
m.Unlock() m.Unlock()
if c.PromptForConfigEncryption(configPath, dryrun) { if c.PromptForConfigEncryption(configPath, dryrun) {
c.EncryptConfig = configFileEncryptionEnabled c.EncryptConfig = fileEncryptionEnabled
return c.SaveConfig(defaultPath, dryrun) return c.SaveConfig(defaultPath, dryrun)
} }
} }
} else { } else {
errCounter := 0 errCounter := 0
for { for {
if errCounter >= configMaxAuthFailures { if errCounter >= maxAuthFailures {
return errors.New("failed to decrypt config after 3 attempts") return errors.New("failed to decrypt config after 3 attempts")
} }
key, err := PromptForConfigKey(IsInitialSetup) key, err := PromptForConfigKey(IsInitialSetup)
@@ -1559,7 +1492,7 @@ func (c *Config) ReadConfig(configPath string, dryrun bool) error {
err = ConfirmConfigJSON(data, &c) err = ConfirmConfigJSON(data, &c)
if err != nil { if err != nil {
if errCounter < configMaxAuthFailures { if errCounter < maxAuthFailures {
log.Error(log.ConfigMgr, "Invalid password.") log.Error(log.ConfigMgr, "Invalid password.")
} }
errCounter++ errCounter++
@@ -1587,7 +1520,7 @@ func (c *Config) SaveConfig(configPath string, dryrun bool) error {
return err return err
} }
if c.EncryptConfig == configFileEncryptionEnabled { if c.EncryptConfig == fileEncryptionEnabled {
var key []byte var key []byte
if IsInitialSetup { if IsInitialSetup {
@@ -1678,8 +1611,8 @@ func (c *Config) CheckConfig() error {
} }
if c.GlobalHTTPTimeout <= 0 { if c.GlobalHTTPTimeout <= 0 {
log.Warnf(log.ConfigMgr, "Global HTTP Timeout value not set, defaulting to %v.\n", configDefaultHTTPTimeout) log.Warnf(log.ConfigMgr, "Global HTTP Timeout value not set, defaulting to %v.\n", defaultHTTPTimeout)
c.GlobalHTTPTimeout = configDefaultHTTPTimeout c.GlobalHTTPTimeout = defaultHTTPTimeout
} }
if c.NTPClient.Level != 0 { if c.NTPClient.Level != 0 {

View File

@@ -43,7 +43,7 @@ func (c *Config) PromptForConfigEncryption(configPath string, dryrun bool) bool
} }
if !common.YesOrNo(input) { if !common.YesOrNo(input) {
c.EncryptConfig = configFileEncryptionDisabled c.EncryptConfig = fileEncryptionDisabled
err := c.SaveConfig(configPath, dryrun) err := c.SaveConfig(configPath, dryrun)
if err != nil { if err != nil {
log.Errorf(log.ConfigMgr, "cannot save config %s", err) log.Errorf(log.ConfigMgr, "cannot save config %s", err)

View File

@@ -9,7 +9,7 @@ func TestPromptForConfigEncryption(t *testing.T) {
t.Parallel() t.Parallel()
if Cfg.PromptForConfigEncryption("", true) { if Cfg.PromptForConfigEncryption("", true) {
t.Error("Test failed. PromptForConfigEncryption return incorrect bool") t.Error("PromptForConfigEncryption return incorrect bool")
} }
} }
@@ -18,25 +18,25 @@ func TestPromptForConfigKey(t *testing.T) {
byteyBite, err := PromptForConfigKey(true) byteyBite, err := PromptForConfigKey(true)
if err == nil && len(byteyBite) > 1 { if err == nil && len(byteyBite) > 1 {
t.Errorf("Test failed. PromptForConfigKey: %s", err) t.Errorf("PromptForConfigKey: %s", err)
} }
_, err = PromptForConfigKey(false) _, err = PromptForConfigKey(false)
if err == nil { if err == nil {
t.Fatal(err) t.Error("Expected error")
} }
} }
func TestEncryptConfigFile(t *testing.T) { func TestEncryptConfigFile(t *testing.T) {
_, err := EncryptConfigFile([]byte("test"), nil) _, err := EncryptConfigFile([]byte("test"), nil)
if err == nil { if err == nil {
t.Fatal("Test failed. Expected different result") t.Fatal("Expected error")
} }
sessionDK = []byte("a") sessionDK = []byte("a")
_, err = EncryptConfigFile([]byte("test"), nil) _, err = EncryptConfigFile([]byte("test"), nil)
if err == nil { if err == nil {
t.Fatal("Test failed. Expected different result") t.Fatal("Expected error")
} }
sessionDK, err = makeNewSessionDK([]byte("asdf")) sessionDK, err = makeNewSessionDK([]byte("asdf"))
@@ -60,17 +60,17 @@ func TestDecryptConfigFile(t *testing.T) {
_, err = DecryptConfigFile(result, nil) _, err = DecryptConfigFile(result, nil)
if err == nil { if err == nil {
t.Fatal("Test failed. Expected different result") t.Fatal("Expected error")
} }
_, err = DecryptConfigFile([]byte("test"), nil) _, err = DecryptConfigFile([]byte("test"), nil)
if err == nil { if err == nil {
t.Fatal("Test failed. Expected different result") t.Fatal("Expected error")
} }
_, err = DecryptConfigFile([]byte("test"), []byte("AAAAAAAAAAAAAAAA")) _, err = DecryptConfigFile([]byte("test"), []byte("AAAAAAAAAAAAAAAA"))
if err == nil { if err == nil {
t.Fatalf("Test failed. Expected %s", errAESBlockSize) t.Fatalf("Expected %s", errAESBlockSize)
} }
result, err = EncryptConfigFile([]byte("test"), []byte("key")) result, err = EncryptConfigFile([]byte("test"), []byte("key"))
@@ -86,14 +86,14 @@ func TestDecryptConfigFile(t *testing.T) {
func TestConfirmConfigJSON(t *testing.T) { func TestConfirmConfigJSON(t *testing.T) {
var result interface{} var result interface{}
testConfirmJSON, err := ioutil.ReadFile(ConfigTestFile) testConfirmJSON, err := ioutil.ReadFile(TestFile)
if err != nil { if err != nil {
t.Errorf("Test failed. testConfirmJSON: %s", err) t.Errorf("testConfirmJSON: %s", err)
} }
err = ConfirmConfigJSON(testConfirmJSON, &result) err = ConfirmConfigJSON(testConfirmJSON, &result)
if err != nil || result == nil { if err != nil || result == nil {
t.Errorf("Test failed. testConfirmJSON: %s", err) t.Errorf("testConfirmJSON: %s", err)
} }
} }
@@ -102,7 +102,7 @@ func TestConfirmECS(t *testing.T) {
ECStest := []byte(EncryptConfirmString) ECStest := []byte(EncryptConfirmString)
if !ConfirmECS(ECStest) { if !ConfirmECS(ECStest) {
t.Errorf("Test failed. TestConfirmECS: Error finding ECS.") t.Errorf("TestConfirmECS: Error finding ECS.")
} }
} }
@@ -113,7 +113,7 @@ func TestRemoveECS(t *testing.T) {
isremoved := RemoveECS(ECStest) isremoved := RemoveECS(ECStest)
if string(isremoved) != "" { if string(isremoved) != "" {
t.Errorf("Test failed. TestConfirmECS: Error ECS not deleted.") t.Errorf("TestConfirmECS: Error ECS not deleted.")
} }
} }
@@ -122,6 +122,6 @@ func TestMakeNewSessionDK(t *testing.T) {
_, err := makeNewSessionDK(nil) _, err := makeNewSessionDK(nil)
if err == nil { if err == nil {
t.Fatal("Test failed. makeNewSessionDK passed with nil key") t.Fatal("makeNewSessionDK passed with nil key")
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -3,15 +3,77 @@ package config
import ( import (
"fmt" "fmt"
"strings" "strings"
"sync"
"time" "time"
"github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/currency/forexprovider/base" "github.com/thrasher-corp/gocryptotrader/currency/forexprovider/base"
"github.com/thrasher-corp/gocryptotrader/database" "github.com/thrasher-corp/gocryptotrader/database"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
log "github.com/thrasher-corp/gocryptotrader/logger" log "github.com/thrasher-corp/gocryptotrader/logger"
"github.com/thrasher-corp/gocryptotrader/portfolio" "github.com/thrasher-corp/gocryptotrader/portfolio"
) )
// Constants declared here are filename strings and test strings
const (
FXProviderFixer = "fixer"
EncryptedFile = "config.dat"
File = "config.json"
TestFile = "../testdata/configtest.json"
fileEncryptionPrompt = 0
fileEncryptionEnabled = 1
fileEncryptionDisabled = -1
pairsLastUpdatedWarningThreshold = 30 // 30 days
defaultHTTPTimeout = time.Second * 15
defaultWebsocketResponseCheckTimeout = time.Millisecond * 30
defaultWebsocketResponseMaxLimit = time.Second * 7
defaultWebsocketOrderbookBufferLimit = 5
defaultWebsocketTrafficTimeout = time.Second * 30
maxAuthFailures = 3
defaultNTPAllowedDifference = 50000000
defaultNTPAllowedNegativeDifference = 50000000
DefaultAPIKey = "Key"
DefaultAPISecret = "Secret"
DefaultAPIClientID = "ClientID"
)
// Constants here hold some messages
const (
ErrExchangeNameEmpty = "exchange #%d name is empty"
ErrExchangeAvailablePairsEmpty = "exchange %s available pairs is empty"
ErrExchangeEnabledPairsEmpty = "exchange %s enabled pairs is empty"
ErrExchangeBaseCurrenciesEmpty = "exchange %s base currencies is empty"
ErrExchangeNotFound = "exchange %s not found"
ErrNoEnabledExchanges = "no exchanges enabled"
ErrCryptocurrenciesEmpty = "cryptocurrencies variable is empty"
ErrFailureOpeningConfig = "fatal error opening %s file. Error: %s"
ErrCheckingConfigValues = "fatal error checking config values. Error: %s"
ErrSavingConfigBytesMismatch = "config file %q bytes comparison doesn't match, read %s expected %s"
WarningWebserverCredentialValuesEmpty = "webserver support disabled due to empty Username/Password values"
WarningWebserverListenAddressInvalid = "webserver support disabled due to invalid listen address"
WarningExchangeAuthAPIDefaultOrEmptyValues = "exchange %s authenticated API support disabled due to default/empty APIKey/Secret/ClientID values"
WarningPairsLastUpdatedThresholdExceeded = "exchange %s last manual update of available currency pairs has exceeded %d days. Manual update required!"
)
// Constants here define unset default values displayed in the config.json
// file
const (
APIURLNonDefaultMessage = "NON_DEFAULT_HTTP_LINK_TO_EXCHANGE_API"
WebsocketURLNonDefaultMessage = "NON_DEFAULT_HTTP_LINK_TO_WEBSOCKET_EXCHANGE_API"
DefaultUnsetAPIKey = "Key"
DefaultUnsetAPISecret = "Secret"
DefaultUnsetAccountPlan = "accountPlan"
DefaultForexProviderExchangeRatesAPI = "ExchangeRates"
)
// Variables here are used for configuration
var (
Cfg Config
IsInitialSetup bool
testBypass bool
m sync.Mutex
)
// Config is the overarching object that holds all the information for // Config is the overarching object that holds all the information for
// prestart management of Portfolio, Communications, Webserver and Enabled // prestart management of Portfolio, Communications, Webserver and Enabled
// Exchanges // Exchanges
@@ -313,39 +375,12 @@ type TelegramConfig struct {
VerificationToken string `json:"verificationToken"` VerificationToken string `json:"verificationToken"`
} }
// ProtocolFeaturesConfig holds all variables for the exchanges supported features
// for a protocol (e.g REST or Websocket)
type ProtocolFeaturesConfig struct {
TickerBatching bool `json:"tickerBatching,omitempty"`
AutoPairUpdates bool `json:"autoPairUpdates,omitempty"`
AccountBalance bool `json:"accountBalance,omitempty"`
CryptoDeposit bool `json:"cryptoDeposit,omitempty"`
CryptoWithdrawal uint32 `json:"cryptoWithdrawal,omitempty"`
FiatWithdraw bool `json:"fiatWithdraw,omitempty"`
GetOrder bool `json:"getOrder,omitempty"`
GetOrders bool `json:"getOrders,omitempty"`
CancelOrders bool `json:"cancelOrders,omitempty"`
CancelOrder bool `json:"cancelOrder,omitempty"`
SubmitOrder bool `json:"submitOrder,omitempty"`
SubmitOrders bool `json:"submitOrders,omitempty"`
ModifyOrder bool `json:"modifyOrder,omitempty"`
DepositHistory bool `json:"depositHistory,omitempty"`
WithdrawalHistory bool `json:"withdrawalHistory,omitempty"`
TradeHistory bool `json:"tradeHistory,omitempty"`
UserTradeHistory bool `json:"userTradeHistory,omitempty"`
TradeFee bool `json:"tradeFee,omitempty"`
FiatDepositFee bool `json:"fiatDepositFee,omitempty"`
FiatWithdrawalFee bool `json:"fiatWithdrawalFee,omitempty"`
CryptoDepositFee bool `json:"cryptoDepositFee,omitempty"`
CryptoWithdrawalFee bool `json:"cryptoWithdrawalFee,omitempty"`
}
// FeaturesSupportedConfig stores the exchanges supported features // FeaturesSupportedConfig stores the exchanges supported features
type FeaturesSupportedConfig struct { type FeaturesSupportedConfig struct {
REST bool `json:"restAPI"` REST bool `json:"restAPI"`
RESTCapabilities ProtocolFeaturesConfig `json:"restCapabilities,omitempty"` RESTCapabilities protocol.Features `json:"restCapabilities,omitempty"`
Websocket bool `json:"websocketAPI"` Websocket bool `json:"websocketAPI"`
WebsocketCapabilities ProtocolFeaturesConfig `json:"websocketCapabilities,omitempty"` WebsocketCapabilities protocol.Features `json:"websocketCapabilities,omitempty"`
} }
// FeaturesEnabledConfig stores the exchanges enabled features // FeaturesEnabledConfig stores the exchanges enabled features

View File

@@ -9,22 +9,22 @@ func TestConnection(t *testing.T) {
faultyHost := []string{"faultyHost"} faultyHost := []string{"faultyHost"}
_, err := New(faultyDomain, nil, 100000) _, err := New(faultyDomain, nil, 100000)
if err == nil { if err == nil {
t.Fatal("Test Failed - New error cannot be nil") t.Fatal("New error cannot be nil")
} }
_, err = New(DefaultDNSList, nil, 100000) _, err = New(DefaultDNSList, nil, 100000)
if err != nil { if err != nil {
t.Fatal("Test Failed - New error", err) t.Fatal("New error", err)
} }
_, err = New(nil, faultyHost, 100000) _, err = New(nil, faultyHost, 100000)
if err != nil { if err != nil {
t.Fatal("Test Failed - New error cannot be nil", err) t.Fatal("New error cannot be nil", err)
} }
c, err := New(nil, nil, 0) c, err := New(nil, nil, 0)
if err != nil { if err != nil {
t.Fatal("Test Failed - New error", err) t.Fatal("New error", err)
} }
if !c.IsConnected() { if !c.IsConnected() {

File diff suppressed because it is too large Load Diff

View File

@@ -8,31 +8,31 @@ import (
func TestRoleString(t *testing.T) { func TestRoleString(t *testing.T) {
if Unset.String() != UnsetRollString { if Unset.String() != UnsetRollString {
t.Errorf("Test Failed - Role String() error expected %s but received %s", t.Errorf("Role String() error expected %s but received %s",
UnsetRollString, UnsetRollString,
Unset) Unset)
} }
if Fiat.String() != FiatCurrencyString { if Fiat.String() != FiatCurrencyString {
t.Errorf("Test Failed - Role String() error expected %s but received %s", t.Errorf("Role String() error expected %s but received %s",
FiatCurrencyString, FiatCurrencyString,
Fiat) Fiat)
} }
if Cryptocurrency.String() != CryptocurrencyString { if Cryptocurrency.String() != CryptocurrencyString {
t.Errorf("Test Failed - Role String() error expected %s but received %s", t.Errorf("Role String() error expected %s but received %s",
CryptocurrencyString, CryptocurrencyString,
Cryptocurrency) Cryptocurrency)
} }
if Token.String() != TokenString { if Token.String() != TokenString {
t.Errorf("Test Failed - Role String() error expected %s but received %s", t.Errorf("Role String() error expected %s but received %s",
TokenString, TokenString,
Token) Token)
} }
if Contract.String() != ContractString { if Contract.String() != ContractString {
t.Errorf("Test Failed - Role String() error expected %s but received %s", t.Errorf("Role String() error expected %s but received %s",
ContractString, ContractString,
Contract) Contract)
} }
@@ -40,7 +40,7 @@ func TestRoleString(t *testing.T) {
var random Role = 1 << 7 var random Role = 1 << 7
if random.String() != "UNKNOWN" { if random.String() != "UNKNOWN" {
t.Errorf("Test Failed - Role String() error expected %s but received %s", t.Errorf("Role String() error expected %s but received %s",
"UNKNOWN", "UNKNOWN",
random) random)
} }
@@ -49,17 +49,18 @@ func TestRoleString(t *testing.T) {
func TestRoleMarshalJSON(t *testing.T) { func TestRoleMarshalJSON(t *testing.T) {
d, err := common.JSONEncode(Fiat) d, err := common.JSONEncode(Fiat)
if err != nil { if err != nil {
t.Error("Test Failed - Role MarshalJSON() error", err) t.Error("Role MarshalJSON() error", err)
} }
expected := `"fiatCurrency"` expected := `"fiatCurrency"`
if string(d) != expected { if string(d) != expected {
t.Errorf("Test Failed - Role MarshalJSON() error expected %s but received %s", t.Errorf("Role MarshalJSON() error expected %s but received %s",
expected, expected,
string(d)) string(d))
} }
} }
// TestRoleUnmarshalJSON logic test
func TestRoleUnmarshalJSON(t *testing.T) { func TestRoleUnmarshalJSON(t *testing.T) {
type AllTheRoles struct { type AllTheRoles struct {
RoleOne Role `json:"RoleOne"` RoleOne Role `json:"RoleOne"`
@@ -80,136 +81,158 @@ func TestRoleUnmarshalJSON(t *testing.T) {
e, err := common.JSONEncode(1337) e, err := common.JSONEncode(1337)
if err != nil { if err != nil {
t.Fatal("Test Failed - Role UnmarshalJSON() error", err) t.Fatal("Role UnmarshalJSON() error", err)
} }
var incoming AllTheRoles var incoming AllTheRoles
err = common.JSONDecode(e, &incoming) err = common.JSONDecode(e, &incoming)
if err == nil { if err == nil {
t.Fatal("Test Failed - Role UnmarshalJSON() error", err) t.Fatal("Role UnmarshalJSON() Expected error")
} }
e, err = common.JSONEncode(outgoing) e, err = common.JSONEncode(outgoing)
if err != nil { if err != nil {
t.Fatal("Test Failed - Role UnmarshalJSON() error", err) t.Fatal("Role UnmarshalJSON() error", err)
} }
err = common.JSONDecode(e, &incoming) err = common.JSONDecode(e, &incoming)
if err != nil { if err != nil {
t.Fatal("Test Failed - Role UnmarshalJSON() error", err) t.Fatal("Role UnmarshalJSON() error", err)
} }
if incoming.RoleOne != Unset { if incoming.RoleOne != Unset {
t.Errorf("Test Failed - Role String() error expected %s but received %s", t.Errorf("Role String() error expected %s but received %s",
Unset, Unset,
incoming.RoleOne) incoming.RoleOne)
} }
if incoming.RoleTwo != Cryptocurrency { if incoming.RoleTwo != Cryptocurrency {
t.Errorf("Test Failed - Role String() error expected %s but received %s", t.Errorf("Role String() error expected %s but received %s",
Cryptocurrency, Cryptocurrency,
incoming.RoleTwo) incoming.RoleTwo)
} }
if incoming.RoleThree != Fiat { if incoming.RoleThree != Fiat {
t.Errorf("Test Failed - Role String() error expected %s but received %s", t.Errorf("Role String() error expected %s but received %s",
Fiat, Fiat,
incoming.RoleThree) incoming.RoleThree)
} }
if incoming.RoleFour != Token { if incoming.RoleFour != Token {
t.Errorf("Test Failed - Role String() error expected %s but received %s", t.Errorf("Role String() error expected %s but received %s",
Token, Token,
incoming.RoleFour) incoming.RoleFour)
} }
if incoming.RoleFive != Contract { if incoming.RoleFive != Contract {
t.Errorf("Test Failed - Role String() error expected %s but received %s", t.Errorf("Role String() error expected %s but received %s",
Contract, Contract,
incoming.RoleFive) incoming.RoleFive)
} }
if incoming.RoleUnknown != Unset { if incoming.RoleUnknown != Unset {
t.Errorf("Test Failed - Role String() error expected %s but received %s", t.Errorf("Role String() error expected %s but received %s",
incoming.RoleFive, incoming.RoleFive,
incoming.RoleUnknown) incoming.RoleUnknown)
} }
var unhandled Role
err = unhandled.UnmarshalJSON([]byte("\"ThisIsntReal\""))
if err == nil {
t.Error("Expected unmarshall error")
}
} }
func TestBaseCode(t *testing.T) { func TestBaseCode(t *testing.T) {
var main BaseCodes var main BaseCodes
if main.HasData() { if main.HasData() {
t.Errorf("Test Failed - BaseCode HasData() error expected false but received %v", t.Errorf("BaseCode HasData() error expected false but received %v",
main.HasData()) main.HasData())
} }
catsCode := main.Register("CATS") catsCode := main.Register("CATS")
if !main.HasData() { if !main.HasData() {
t.Errorf("Test Failed - BaseCode HasData() error expected true but received %v", t.Errorf("BaseCode HasData() error expected true but received %v",
main.HasData()) main.HasData())
} }
if !main.Register("CATS").Match(catsCode) { if !main.Register("CATS").Match(catsCode) {
t.Errorf("Test Failed - BaseCode Match() error expected true but received %v", t.Errorf("BaseCode Match() error expected true but received %v",
false) false)
} }
if main.Register("DOGS").Match(catsCode) { if main.Register("DOGS").Match(catsCode) {
t.Errorf("Test Failed - BaseCode Match() error expected false but received %v", t.Errorf("BaseCode Match() error expected false but received %v",
true) true)
} }
loadedCurrencies := main.GetCurrencies() loadedCurrencies := main.GetCurrencies()
if loadedCurrencies.Contains(main.Register("OWLS")) { if loadedCurrencies.Contains(main.Register("OWLS")) {
t.Errorf("Test Failed - BaseCode Contains() error expected false but received %v", t.Errorf("BaseCode Contains() error expected false but received %v",
true) true)
} }
if !loadedCurrencies.Contains(catsCode) { if !loadedCurrencies.Contains(catsCode) {
t.Errorf("Test Failed - BaseCode Contains() error expected true but received %v", t.Errorf("BaseCode Contains() error expected true but received %v",
false) false)
} }
err := main.UpdateContract("Bitcoin Perpetual", "XBTUSD", "Bitmex") err := main.UpdateContract("Bitcoin Perpetual", "XBTUSD", "Bitmex")
if err != nil { if err != nil {
t.Error("Test Failed - BaseCode UpdateContract error", err) t.Error("BaseCode UpdateContract error", err)
} }
err = main.UpdateCryptocurrency("Bitcoin", "BTC", 1337) err = main.UpdateCryptocurrency("Bitcoin", "BTC", 1337)
if err != nil { if err != nil {
t.Error("Test Failed - BaseCode UpdateContract error", err) t.Error("BaseCode UpdateContract error", err)
}
err = main.UpdateFiatCurrency("Unreal Dollar", "AUD", 1111)
if err != nil {
t.Error("BaseCode UpdateContract error", err)
}
if main.Items[5].FullName != "Unreal Dollar" {
t.Error("Expected fullname to update for AUD")
} }
err = main.UpdateFiatCurrency("Australian Dollar", "AUD", 1336) err = main.UpdateFiatCurrency("Australian Dollar", "AUD", 1336)
if err != nil { if err != nil {
t.Error("Test Failed - BaseCode UpdateContract error", err) t.Error("BaseCode UpdateContract error", err)
}
main.Items[5].Role = Unset
err = main.UpdateFiatCurrency("Australian Dollar", "AUD", 1336)
if err != nil {
t.Error("BaseCode UpdateContract error", err)
}
if main.Items[5].Role != Fiat {
t.Error("Expected role to change to Fiat")
} }
err = main.UpdateToken("Populous", "PPT", "ETH", 1335) err = main.UpdateToken("Populous", "PPT", "ETH", 1335)
if err != nil { if err != nil {
t.Error("Test Failed - BaseCode UpdateContract error", err) t.Error("BaseCode UpdateContract error", err)
} }
contract := main.Register("XBTUSD") contract := main.Register("XBTUSD")
if contract.IsFiatCurrency() { if contract.IsFiatCurrency() {
t.Errorf("Test Failed - BaseCode IsFiatCurrency() error expected false but received %v", t.Errorf("BaseCode IsFiatCurrency() error expected false but received %v",
true) true)
} }
if contract.IsCryptocurrency() { if contract.IsCryptocurrency() {
t.Errorf("Test Failed - BaseCode IsFiatCurrency() error expected false but received %v", t.Errorf("BaseCode IsFiatCurrency() error expected false but received %v",
true) true)
} }
if contract.IsDefaultFiatCurrency() { if contract.IsDefaultFiatCurrency() {
t.Errorf("Test Failed - BaseCode IsDefaultFiatCurrency() error expected false but received %v", t.Errorf("BaseCode IsDefaultFiatCurrency() error expected false but received %v",
true) true)
} }
if contract.IsDefaultFiatCurrency() { if contract.IsDefaultFiatCurrency() {
t.Errorf("Test Failed - BaseCode IsFiatCurrency() error expected false but received %v", t.Errorf("BaseCode IsFiatCurrency() error expected false but received %v",
true) true)
} }
@@ -220,50 +243,101 @@ func TestBaseCode(t *testing.T) {
Symbol: "ADA", Symbol: "ADA",
}) })
if err != nil { if err != nil {
t.Error("Test Failed - BaseCode LoadItem() error", err) t.Error("BaseCode LoadItem() error", err)
} }
full, err := main.GetFullCurrencyData() full, err := main.GetFullCurrencyData()
if err != nil { if err != nil {
t.Error("Test Failed - BaseCode GetFullCurrencyData error", err) t.Error("BaseCode GetFullCurrencyData error", err)
} }
if len(full.Contracts) != 1 { if len(full.Contracts) != 1 {
t.Errorf("Test Failed - BaseCode GetFullCurrencyData() error expected 1 but received %v", t.Errorf("BaseCode GetFullCurrencyData() error expected 1 but received %v",
len(full.Contracts)) len(full.Contracts))
} }
if len(full.Cryptocurrency) != 2 { if len(full.Cryptocurrency) != 2 {
t.Errorf("Test Failed - BaseCode GetFullCurrencyData() error expected 1 but received %v", t.Errorf("BaseCode GetFullCurrencyData() error expected 1 but received %v",
len(full.Cryptocurrency)) len(full.Cryptocurrency))
} }
if len(full.FiatCurrency) != 1 { if len(full.FiatCurrency) != 1 {
t.Errorf("Test Failed - BaseCode GetFullCurrencyData() error expected 1 but received %v", t.Errorf("BaseCode GetFullCurrencyData() error expected 1 but received %v",
len(full.FiatCurrency)) len(full.FiatCurrency))
} }
if len(full.Token) != 1 { if len(full.Token) != 1 {
t.Errorf("Test Failed - BaseCode GetFullCurrencyData() error expected 1 but received %v", t.Errorf("BaseCode GetFullCurrencyData() error expected 1 but received %v",
len(full.Token)) len(full.Token))
} }
if len(full.UnsetCurrency) != 3 { if len(full.UnsetCurrency) != 3 {
t.Errorf("Test Failed - BaseCode GetFullCurrencyData() error expected 3 but received %v", t.Errorf("BaseCode GetFullCurrencyData() error expected 3 but received %v",
len(full.UnsetCurrency)) len(full.UnsetCurrency))
} }
if !full.LastMainUpdate.IsZero() { if !full.LastMainUpdate.IsZero() {
t.Errorf("Test Failed - BaseCode GetFullCurrencyData() error expected 0 but received %s", t.Errorf("BaseCode GetFullCurrencyData() error expected 0 but received %s",
full.LastMainUpdate) full.LastMainUpdate)
} }
err = main.LoadItem(&Item{
ID: 0,
FullName: "Cardano",
Role: Role(99),
Symbol: "ADA",
})
if err != nil {
t.Error("BaseCode LoadItem() error", err)
}
_, err = main.GetFullCurrencyData()
if err == nil {
t.Error("Expected 'Role undefined'")
}
main.Items[0].FullName = "Hello"
err = main.UpdateCryptocurrency("MEWOW", "CATS", 1338)
if err != nil {
t.Error("BaseCode UpdateContract error", err)
}
if main.Items[0].FullName != "MEWOW" {
t.Error("Fullname not updated")
}
err = main.UpdateCryptocurrency("MEWOW", "CATS", 1338)
if err != nil {
t.Error("BaseCode UpdateContract error", err)
}
main.Items[0].Role = Cryptocurrency
err = main.UpdateCryptocurrency("MEWOW", "CATS", 3)
if err != nil {
t.Error("BaseCode UpdateContract error", err)
}
if main.Items[0].ID != 3 {
t.Error("ID not updated")
}
main.Items[0].Role = Unset
err = main.UpdateCryptocurrency("MEWOW", "CATS", 1338)
if err != nil {
t.Error("BaseCode UpdateContract error", err)
}
if main.Items[0].ID != 1338 {
t.Error("ID not updated")
}
main.Items[0].Role = Token
err = main.UpdateCryptocurrency("MEWOW", "CATS", 3)
if err == nil {
t.Error("Expecting cryptocurrency to already exist")
}
} }
func TestCodeString(t *testing.T) { func TestCodeString(t *testing.T) {
expected := "TEST" expected := "TEST"
cc := NewCode("TEST") cc := NewCode("TEST")
if cc.String() != expected { if cc.String() != expected {
t.Errorf("Test Failed - Currency Code String() error expected %s but received %s", t.Errorf("Currency Code String() error expected %s but received %s",
expected, cc) expected, cc)
} }
} }
@@ -272,7 +346,7 @@ func TestCodeLower(t *testing.T) {
expected := "test" expected := "test"
cc := NewCode("TEST") cc := NewCode("TEST")
if cc.Lower().String() != expected { if cc.Lower().String() != expected {
t.Errorf("Test Failed - Currency Code Lower() error expected %s but received %s", t.Errorf("Currency Code Lower() error expected %s but received %s",
expected, expected,
cc.Lower()) cc.Lower())
} }
@@ -282,7 +356,7 @@ func TestCodeUpper(t *testing.T) {
expected := "TEST" expected := "TEST"
cc := NewCode("test") cc := NewCode("test")
if cc.Upper().String() != expected { if cc.Upper().String() != expected {
t.Errorf("Test Failed - Currency Code Upper() error expected %s but received %s", t.Errorf("Currency Code Upper() error expected %s but received %s",
expected, expected,
cc.Upper()) cc.Upper())
} }
@@ -293,21 +367,21 @@ func TestCodeUnmarshalJSON(t *testing.T) {
expected := "BRO" expected := "BRO"
encoded, err := common.JSONEncode(expected) encoded, err := common.JSONEncode(expected)
if err != nil { if err != nil {
t.Fatal("Test Failed - Currency Code UnmarshalJSON error", err) t.Fatal("Currency Code UnmarshalJSON error", err)
} }
err = common.JSONDecode(encoded, &unmarshalHere) err = common.JSONDecode(encoded, &unmarshalHere)
if err != nil { if err != nil {
t.Fatal("Test Failed - Currency Code UnmarshalJSON error", err) t.Fatal("Currency Code UnmarshalJSON error", err)
} }
err = common.JSONDecode(encoded, &unmarshalHere) err = common.JSONDecode(encoded, &unmarshalHere)
if err != nil { if err != nil {
t.Fatal("Test Failed - Currency Code UnmarshalJSON error", err) t.Fatal("Currency Code UnmarshalJSON error", err)
} }
if unmarshalHere.String() != expected { if unmarshalHere.String() != expected {
t.Errorf("Test Failed - Currency Code Upper() error expected %s but received %s", t.Errorf("Currency Code Upper() error expected %s but received %s",
expected, expected,
unmarshalHere) unmarshalHere)
} }
@@ -324,11 +398,11 @@ func TestCodeMarshalJSON(t *testing.T) {
encoded, err := common.JSONEncode(quickstruct) encoded, err := common.JSONEncode(quickstruct)
if err != nil { if err != nil {
t.Fatal("Test Failed - Currency Code UnmarshalJSON error", err) t.Fatal("Currency Code UnmarshalJSON error", err)
} }
if string(encoded) != expectedJSON { if string(encoded) != expectedJSON {
t.Errorf("Test Failed - Currency Code Upper() error expected %s but received %s", t.Errorf("Currency Code Upper() error expected %s but received %s",
expectedJSON, expectedJSON,
string(encoded)) string(encoded))
} }
@@ -341,42 +415,42 @@ func TestCodeMarshalJSON(t *testing.T) {
encoded, err = common.JSONEncode(quickstruct) encoded, err = common.JSONEncode(quickstruct)
if err != nil { if err != nil {
t.Fatal("Test Failed - Currency Code UnmarshalJSON error", err) t.Fatal("Currency Code UnmarshalJSON error", err)
} }
newExpectedJSON := `{"sweetCodes":""}` newExpectedJSON := `{"sweetCodes":""}`
if string(encoded) != newExpectedJSON { if string(encoded) != newExpectedJSON {
t.Errorf("Test Failed - Currency Code Upper() error expected %s but received %s", t.Errorf("Currency Code Upper() error expected %s but received %s",
newExpectedJSON, string(encoded)) newExpectedJSON, string(encoded))
} }
} }
func TestIsDefaultCurrency(t *testing.T) { func TestIsDefaultCurrency(t *testing.T) {
if !USD.IsDefaultFiatCurrency() { if !USD.IsDefaultFiatCurrency() {
t.Errorf("Test Failed. TestIsDefaultCurrency Cannot match currency %s.", t.Errorf("TestIsDefaultCurrency Cannot match currency %s.",
USD) USD)
} }
if !AUD.IsDefaultFiatCurrency() { if !AUD.IsDefaultFiatCurrency() {
t.Errorf("Test Failed. TestIsDefaultCurrency Cannot match currency, %s.", t.Errorf("TestIsDefaultCurrency Cannot match currency, %s.",
AUD) AUD)
} }
if LTC.IsDefaultFiatCurrency() { if LTC.IsDefaultFiatCurrency() {
t.Errorf("Test Failed. TestIsDefaultCurrency Function return is incorrect with, %s.", t.Errorf("TestIsDefaultCurrency Function return is incorrect with, %s.",
LTC) LTC)
} }
} }
func TestIsDefaultCryptocurrency(t *testing.T) { func TestIsDefaultCryptocurrency(t *testing.T) {
if !BTC.IsDefaultCryptocurrency() { if !BTC.IsDefaultCryptocurrency() {
t.Errorf("Test Failed. TestIsDefaultCryptocurrency cannot match currency, %s.", t.Errorf("TestIsDefaultCryptocurrency cannot match currency, %s.",
BTC) BTC)
} }
if !LTC.IsDefaultCryptocurrency() { if !LTC.IsDefaultCryptocurrency() {
t.Errorf("Test Failed. TestIsDefaultCryptocurrency cannot match currency, %s.", t.Errorf("TestIsDefaultCryptocurrency cannot match currency, %s.",
LTC) LTC)
} }
if AUD.IsDefaultCryptocurrency() { if AUD.IsDefaultCryptocurrency() {
t.Errorf("Test Failed. TestIsDefaultCryptocurrency function return is incorrect with, %s.", t.Errorf("TestIsDefaultCryptocurrency function return is incorrect with, %s.",
AUD) AUD)
} }
} }
@@ -384,30 +458,30 @@ func TestIsDefaultCryptocurrency(t *testing.T) {
func TestIsFiatCurrency(t *testing.T) { func TestIsFiatCurrency(t *testing.T) {
if !USD.IsFiatCurrency() { if !USD.IsFiatCurrency() {
t.Errorf( t.Errorf(
"Test Failed. TestIsFiatCurrency cannot match currency, %s.", USD) "TestIsFiatCurrency cannot match currency, %s.", USD)
} }
if !CNY.IsFiatCurrency() { if !CNY.IsFiatCurrency() {
t.Errorf( t.Errorf(
"Test Failed. TestIsFiatCurrency cannot match currency, %s.", CNY) "TestIsFiatCurrency cannot match currency, %s.", CNY)
} }
if LINO.IsFiatCurrency() { if LINO.IsFiatCurrency() {
t.Errorf( t.Errorf(
"Test Failed. TestIsFiatCurrency cannot match currency, %s.", LINO, "TestIsFiatCurrency cannot match currency, %s.", LINO,
) )
} }
} }
func TestIsCryptocurrency(t *testing.T) { func TestIsCryptocurrency(t *testing.T) {
if !BTC.IsCryptocurrency() { if !BTC.IsCryptocurrency() {
t.Errorf("Test Failed. TestIsFiatCurrency cannot match currency, %s.", t.Errorf("TestIsFiatCurrency cannot match currency, %s.",
BTC) BTC)
} }
if !LTC.IsCryptocurrency() { if !LTC.IsCryptocurrency() {
t.Errorf("Test Failed. TestIsFiatCurrency cannot match currency, %s.", t.Errorf("TestIsFiatCurrency cannot match currency, %s.",
LTC) LTC)
} }
if AUD.IsCryptocurrency() { if AUD.IsCryptocurrency() {
t.Errorf("Test Failed. TestIsFiatCurrency cannot match currency, %s.", t.Errorf("TestIsFiatCurrency cannot match currency, %s.",
AUD) AUD)
} }
} }
@@ -419,7 +493,7 @@ func TestItemString(t *testing.T) {
} }
if newItem.String() != expected { if newItem.String() != expected {
t.Errorf("Test Failed - Item String() error expected %s but received %s", t.Errorf("Item String() error expected %s but received %s",
expected, expected,
&newItem) &newItem)
} }

1655
currency/code_types.go Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -18,53 +18,6 @@ import (
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
) )
// Coinmarketcap account plan bitmasks, url and enpoint consts
const (
Basic uint8 = 1 << iota
Hobbyist
Startup
Standard
Professional
Enterprise
baseURL = "https://pro-api.coinmarketcap.com"
sandboxURL = "https://sandbox-api.coinmarketcap.com"
version = "/v1/"
endpointCryptocurrencyInfo = "cryptocurrency/info"
endpointCryptocurrencyMap = "cryptocurrency/map"
endpointCryptocurrencyHistoricalListings = "cryptocurrency/listings/historical"
endpointCryptocurrencyLatestListings = "cryptocurrency/listings/latest"
endpointCryptocurrencyMarketPairs = "cryptocurrency/market-pairs/latest"
endpointOHLCVHistorical = "cryptocurrency/ohlcv/historical"
endpointOHLCVLatest = "cryptocurrency/ohlcv/latest"
endpointGetMarketQuotesHistorical = "cryptocurrency/quotes/historical"
endpointGetMarketQuotesLatest = "cryptocurrency/quotes/latest"
endpointExchangeInfo = "exchange/info"
endpointExchangeMap = "exchange/map"
endpointExchangeMarketPairsLatest = "exchange/market-pairs/latest"
endpointExchangeMarketQuoteHistorical = "exchange/quotes/historical"
endpointExchangeMarketQuoteLatest = "exchange/quotes/latest"
endpointGlobalQuoteHistorical = "global-metrics/quotes/historical"
endpointGlobalQuoteLatest = "global-metrics/quotes/latest"
endpointPriceConversion = "tools/price-conversion"
authrate = 0
defaultTimeOut = time.Second * 15
)
// Coinmarketcap is the overarching type across this package
type Coinmarketcap struct {
Verbose bool
Enabled bool
Name string
APIkey string
APIUrl string
APIVersion string
Plan uint8
Requester *request.Requester
}
// SetDefaults sets default values for the exchange // SetDefaults sets default values for the exchange
func (c *Coinmarketcap) SetDefaults() { func (c *Coinmarketcap) SetDefaults() {
c.Name = "CoinMarketCap" c.Name = "CoinMarketCap"

View File

@@ -58,32 +58,32 @@ func TestCheckAccountPlan(t *testing.T) {
if areAPICredtionalsSet(Basic) { if areAPICredtionalsSet(Basic) {
err := c.CheckAccountPlan(Enterprise) err := c.CheckAccountPlan(Enterprise)
if err == nil { if err == nil {
t.Error("Test Failed - CheckAccountPlan() error cannot be nil") t.Error("CheckAccountPlan() error cannot be nil")
} }
err = c.CheckAccountPlan(Professional) err = c.CheckAccountPlan(Professional)
if err == nil { if err == nil {
t.Error("Test Failed - CheckAccountPlan() error cannot be nil") t.Error("CheckAccountPlan() error cannot be nil")
} }
err = c.CheckAccountPlan(Standard) err = c.CheckAccountPlan(Standard)
if err == nil { if err == nil {
t.Error("Test Failed - CheckAccountPlan() error cannot be nil") t.Error("CheckAccountPlan() error cannot be nil")
} }
err = c.CheckAccountPlan(Hobbyist) err = c.CheckAccountPlan(Hobbyist)
if err == nil { if err == nil {
t.Error("Test Failed - CheckAccountPlan() error cannot be nil") t.Error("CheckAccountPlan() error cannot be nil")
} }
err = c.CheckAccountPlan(Startup) err = c.CheckAccountPlan(Startup)
if err == nil { if err == nil {
t.Error("Test Failed - CheckAccountPlan() error cannot be nil") t.Error("CheckAccountPlan() error cannot be nil")
} }
err = c.CheckAccountPlan(Basic) err = c.CheckAccountPlan(Basic)
if err != nil { if err != nil {
t.Error("Test Failed - CheckAccountPlan() error", err) t.Error("CheckAccountPlan() error", err)
} }
} }
} }
@@ -94,11 +94,11 @@ func TestGetCryptocurrencyInfo(t *testing.T) {
_, err := c.GetCryptocurrencyInfo(1) _, err := c.GetCryptocurrencyInfo(1)
if areAPICredtionalsSet(Basic) { if areAPICredtionalsSet(Basic) {
if err != nil { if err != nil {
t.Error("Test Failed - GetCryptocurrencyInfo() error", err) t.Error("GetCryptocurrencyInfo() error", err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetCryptocurrencyInfo() error cannot be nil") t.Error("GetCryptocurrencyInfo() error cannot be nil")
} }
} }
} }
@@ -109,11 +109,11 @@ func TestGetCryptocurrencyIDMap(t *testing.T) {
_, err := c.GetCryptocurrencyIDMap() _, err := c.GetCryptocurrencyIDMap()
if areAPICredtionalsSet(Basic) { if areAPICredtionalsSet(Basic) {
if err != nil { if err != nil {
t.Error("Test Failed - GetCryptocurrencyIDMap() error", err) t.Error("GetCryptocurrencyIDMap() error", err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetCryptocurrencyIDMap() error cannot be nil") t.Error("GetCryptocurrencyIDMap() error cannot be nil")
} }
} }
} }
@@ -123,7 +123,7 @@ func TestGetCryptocurrencyHistoricalListings(t *testing.T) {
TestSetup(t) TestSetup(t)
_, err := c.GetCryptocurrencyHistoricalListings() _, err := c.GetCryptocurrencyHistoricalListings()
if err == nil { if err == nil {
t.Error("Test Failed - GetCryptocurrencyHistoricalListings() error cannot be nil") t.Error("GetCryptocurrencyHistoricalListings() error cannot be nil")
} }
} }
@@ -133,11 +133,11 @@ func TestGetCryptocurrencyLatestListing(t *testing.T) {
_, err := c.GetCryptocurrencyLatestListing(0, 0) _, err := c.GetCryptocurrencyLatestListing(0, 0)
if areAPICredtionalsSet(Basic) { if areAPICredtionalsSet(Basic) {
if err != nil { if err != nil {
t.Error("Test Failed - GetCryptocurrencyLatestListing() error", err) t.Error("GetCryptocurrencyLatestListing() error", err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetCryptocurrencyLatestListing() error cannot be nil") t.Error("GetCryptocurrencyLatestListing() error cannot be nil")
} }
} }
} }
@@ -148,12 +148,12 @@ func TestGetCryptocurrencyLatestMarketPairs(t *testing.T) {
_, err := c.GetCryptocurrencyLatestMarketPairs(1, 0, 0) _, err := c.GetCryptocurrencyLatestMarketPairs(1, 0, 0)
if areAPICredtionalsSet(Standard) { if areAPICredtionalsSet(Standard) {
if err != nil { if err != nil {
t.Error("Test Failed - GetCryptocurrencyLatestMarketPairs() error", t.Error("GetCryptocurrencyLatestMarketPairs() error",
err) err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetCryptocurrencyLatestMarketPairs() error cannot be nil") t.Error("GetCryptocurrencyLatestMarketPairs() error cannot be nil")
} }
} }
} }
@@ -164,12 +164,12 @@ func TestGetCryptocurrencyOHLCHistorical(t *testing.T) {
_, err := c.GetCryptocurrencyOHLCHistorical(1, time.Now(), time.Now()) _, err := c.GetCryptocurrencyOHLCHistorical(1, time.Now(), time.Now())
if areAPICredtionalsSet(Standard) { if areAPICredtionalsSet(Standard) {
if err != nil { if err != nil {
t.Error("Test Failed - GetCryptocurrencyOHLCHistorical() error", t.Error("GetCryptocurrencyOHLCHistorical() error",
err) err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetCryptocurrencyOHLCHistorical() error cannot be nil") t.Error("GetCryptocurrencyOHLCHistorical() error cannot be nil")
} }
} }
} }
@@ -180,12 +180,12 @@ func TestGetCryptocurrencyOHLCLatest(t *testing.T) {
_, err := c.GetCryptocurrencyOHLCLatest(1) _, err := c.GetCryptocurrencyOHLCLatest(1)
if areAPICredtionalsSet(Startup) { if areAPICredtionalsSet(Startup) {
if err != nil { if err != nil {
t.Error("Test Failed - GetCryptocurrencyOHLCLatest() error", t.Error("GetCryptocurrencyOHLCLatest() error",
err) err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetCryptocurrencyOHLCLatest() error cannot be nil") t.Error("GetCryptocurrencyOHLCLatest() error cannot be nil")
} }
} }
} }
@@ -196,12 +196,12 @@ func TestGetCryptocurrencyLatestQuotes(t *testing.T) {
_, err := c.GetCryptocurrencyLatestQuotes(1) _, err := c.GetCryptocurrencyLatestQuotes(1)
if areAPICredtionalsSet(Basic) { if areAPICredtionalsSet(Basic) {
if err != nil { if err != nil {
t.Error("Test Failed - GetCryptocurrencyLatestQuotes() error", t.Error("GetCryptocurrencyLatestQuotes() error",
err) err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetCryptocurrencyLatestQuotes() error cannot be nil") t.Error("GetCryptocurrencyLatestQuotes() error cannot be nil")
} }
} }
} }
@@ -212,12 +212,12 @@ func TestGetCryptocurrencyHistoricalQuotes(t *testing.T) {
_, err := c.GetCryptocurrencyHistoricalQuotes(1, time.Now(), time.Now()) _, err := c.GetCryptocurrencyHistoricalQuotes(1, time.Now(), time.Now())
if areAPICredtionalsSet(Standard) { if areAPICredtionalsSet(Standard) {
if err != nil { if err != nil {
t.Error("Test Failed - GetCryptocurrencyHistoricalQuotes() error", t.Error("GetCryptocurrencyHistoricalQuotes() error",
err) err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetCryptocurrencyHistoricalQuotes() error cannot be nil") t.Error("GetCryptocurrencyHistoricalQuotes() error cannot be nil")
} }
} }
} }
@@ -228,12 +228,12 @@ func TestGetExchangeInfo(t *testing.T) {
_, err := c.GetExchangeInfo(1) _, err := c.GetExchangeInfo(1)
if areAPICredtionalsSet(Startup) { if areAPICredtionalsSet(Startup) {
if err != nil { if err != nil {
t.Error("Test Failed - GetExchangeInfo() error", t.Error("GetExchangeInfo() error",
err) err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetExchangeInfo() error cannot be nil") t.Error("GetExchangeInfo() error cannot be nil")
} }
} }
} }
@@ -244,12 +244,12 @@ func TestGetExchangeMap(t *testing.T) {
_, err := c.GetExchangeMap(0, 0) _, err := c.GetExchangeMap(0, 0)
if areAPICredtionalsSet(Startup) { if areAPICredtionalsSet(Startup) {
if err != nil { if err != nil {
t.Error("Test Failed - GetExchangeMap() error", t.Error("GetExchangeMap() error",
err) err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetExchangeMap() error cannot be nil") t.Error("GetExchangeMap() error cannot be nil")
} }
} }
} }
@@ -260,7 +260,7 @@ func TestGetExchangeHistoricalListings(t *testing.T) {
_, err := c.GetExchangeHistoricalListings() _, err := c.GetExchangeHistoricalListings()
if err == nil { if err == nil {
// TODO: update this once the feature above is implemented // TODO: update this once the feature above is implemented
t.Error("Test Failed - GetExchangeHistoricalListings() error cannot be nil") t.Error("GetExchangeHistoricalListings() error cannot be nil")
} }
} }
@@ -270,7 +270,7 @@ func TestGetExchangeLatestListings(t *testing.T) {
_, err := c.GetExchangeLatestListings() _, err := c.GetExchangeLatestListings()
if err == nil { if err == nil {
// TODO: update this once the feature above is implemented // TODO: update this once the feature above is implemented
t.Error("Test Failed - GetExchangeHistoricalListings() error cannot be nil") t.Error("GetExchangeHistoricalListings() error cannot be nil")
} }
} }
@@ -280,12 +280,12 @@ func TestGetExchangeLatestMarketPairs(t *testing.T) {
_, err := c.GetExchangeLatestMarketPairs(1, 0, 0) _, err := c.GetExchangeLatestMarketPairs(1, 0, 0)
if areAPICredtionalsSet(Standard) { if areAPICredtionalsSet(Standard) {
if err != nil { if err != nil {
t.Error("Test Failed - GetExchangeLatestMarketPairs() error", t.Error("GetExchangeLatestMarketPairs() error",
err) err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetExchangeLatestMarketPairs() error cannot be nil") t.Error("GetExchangeLatestMarketPairs() error cannot be nil")
} }
} }
} }
@@ -296,12 +296,12 @@ func TestGetExchangeLatestQuotes(t *testing.T) {
_, err := c.GetExchangeLatestQuotes(1) _, err := c.GetExchangeLatestQuotes(1)
if areAPICredtionalsSet(Standard) { if areAPICredtionalsSet(Standard) {
if err != nil { if err != nil {
t.Error("Test Failed - GetExchangeLatestQuotes() error", t.Error("GetExchangeLatestQuotes() error",
err) err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetExchangeLatestQuotes() error cannot be nil") t.Error("GetExchangeLatestQuotes() error cannot be nil")
} }
} }
} }
@@ -312,12 +312,12 @@ func TestGetExchangeHistoricalQuotes(t *testing.T) {
_, err := c.GetExchangeHistoricalQuotes(1, time.Now(), time.Now()) _, err := c.GetExchangeHistoricalQuotes(1, time.Now(), time.Now())
if areAPICredtionalsSet(Standard) { if areAPICredtionalsSet(Standard) {
if err != nil { if err != nil {
t.Error("Test Failed - GetExchangeHistoricalQuotes() error", t.Error("GetExchangeHistoricalQuotes() error",
err) err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetExchangeHistoricalQuotes() error cannot be nil") t.Error("GetExchangeHistoricalQuotes() error cannot be nil")
} }
} }
} }
@@ -328,12 +328,12 @@ func TestGetGlobalMeticLatestQuotes(t *testing.T) {
_, err := c.GetGlobalMeticLatestQuotes() _, err := c.GetGlobalMeticLatestQuotes()
if areAPICredtionalsSet(Basic) { if areAPICredtionalsSet(Basic) {
if err != nil { if err != nil {
t.Error("Test Failed - GetGlobalMeticLatestQuotes() error", t.Error("GetGlobalMeticLatestQuotes() error",
err) err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetGlobalMeticLatestQuotes() error cannot be nil") t.Error("GetGlobalMeticLatestQuotes() error cannot be nil")
} }
} }
} }
@@ -344,12 +344,12 @@ func TestGetGlobalMeticHistoricalQuotes(t *testing.T) {
_, err := c.GetGlobalMeticHistoricalQuotes(time.Now(), time.Now()) _, err := c.GetGlobalMeticHistoricalQuotes(time.Now(), time.Now())
if areAPICredtionalsSet(Standard) { if areAPICredtionalsSet(Standard) {
if err != nil { if err != nil {
t.Error("Test Failed - GetGlobalMeticHistoricalQuotes() error", t.Error("GetGlobalMeticHistoricalQuotes() error",
err) err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetGlobalMeticHistoricalQuotes() error cannot be nil") t.Error("GetGlobalMeticHistoricalQuotes() error cannot be nil")
} }
} }
} }
@@ -360,12 +360,12 @@ func TestGetPriceConversion(t *testing.T) {
_, err := c.GetPriceConversion(0, 1, time.Now()) _, err := c.GetPriceConversion(0, 1, time.Now())
if areAPICredtionalsSet(Hobbyist) { if areAPICredtionalsSet(Hobbyist) {
if err != nil { if err != nil {
t.Error("Test Failed - GetPriceConversion() error", t.Error("GetPriceConversion() error",
err) err)
} }
} else { } else {
if err == nil { if err == nil {
t.Error("Test Failed - GetPriceConversion() error cannot be nil") t.Error("GetPriceConversion() error cannot be nil")
} }
} }
} }
@@ -375,38 +375,38 @@ func TestSetAccountPlan(t *testing.T) {
for _, plan := range accPlans { for _, plan := range accPlans {
err := c.SetAccountPlan(plan) err := c.SetAccountPlan(plan)
if err != nil { if err != nil {
t.Error("Test Failed - SetAccountPlan() error", err) t.Error("SetAccountPlan() error", err)
} }
switch plan { switch plan {
case "basic": case "basic":
if c.Plan != Basic { if c.Plan != Basic {
t.Error("Test Failed - SetAccountPlan() error basic plan not set correctly") t.Error("SetAccountPlan() error basic plan not set correctly")
} }
case "startup": case "startup":
if c.Plan != Startup { if c.Plan != Startup {
t.Error("Test Failed - SetAccountPlan() error startup plan not set correctly") t.Error("SetAccountPlan() error startup plan not set correctly")
} }
case "hobbyist": case "hobbyist":
if c.Plan != Hobbyist { if c.Plan != Hobbyist {
t.Error("Test Failed - SetAccountPlan() error hobbyist plan not set correctly") t.Error("SetAccountPlan() error hobbyist plan not set correctly")
} }
case "standard": case "standard":
if c.Plan != Standard { if c.Plan != Standard {
t.Error("Test Failed - SetAccountPlan() error standard plan not set correctly") t.Error("SetAccountPlan() error standard plan not set correctly")
} }
case "professional": case "professional":
if c.Plan != Professional { if c.Plan != Professional {
t.Error("Test Failed - SetAccountPlan() error professional plan not set correctly") t.Error("SetAccountPlan() error professional plan not set correctly")
} }
case "enterprise": case "enterprise":
if c.Plan != Enterprise { if c.Plan != Enterprise {
t.Error("Test Failed - SetAccountPlan() error enterprise plan not set correctly") t.Error("SetAccountPlan() error enterprise plan not set correctly")
} }
} }
} }
if err := c.SetAccountPlan("bra"); err == nil { if err := c.SetAccountPlan("bra"); err == nil {
t.Error("Test Failed - SetAccountPlan() error cannot be nil") t.Error("SetAccountPlan() error cannot be nil")
} }
} }

View File

@@ -1,6 +1,57 @@
package coinmarketcap package coinmarketcap
import "time" import (
"time"
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
)
// Coinmarketcap account plan bitmasks, url and enpoint consts
const (
Basic uint8 = 1 << iota
Hobbyist
Startup
Standard
Professional
Enterprise
baseURL = "https://pro-api.coinmarketcap.com"
sandboxURL = "https://sandbox-api.coinmarketcap.com"
version = "/v1/"
endpointCryptocurrencyInfo = "cryptocurrency/info"
endpointCryptocurrencyMap = "cryptocurrency/map"
endpointCryptocurrencyHistoricalListings = "cryptocurrency/listings/historical"
endpointCryptocurrencyLatestListings = "cryptocurrency/listings/latest"
endpointCryptocurrencyMarketPairs = "cryptocurrency/market-pairs/latest"
endpointOHLCVHistorical = "cryptocurrency/ohlcv/historical"
endpointOHLCVLatest = "cryptocurrency/ohlcv/latest"
endpointGetMarketQuotesHistorical = "cryptocurrency/quotes/historical"
endpointGetMarketQuotesLatest = "cryptocurrency/quotes/latest"
endpointExchangeInfo = "exchange/info"
endpointExchangeMap = "exchange/map"
endpointExchangeMarketPairsLatest = "exchange/market-pairs/latest"
endpointExchangeMarketQuoteHistorical = "exchange/quotes/historical"
endpointExchangeMarketQuoteLatest = "exchange/quotes/latest"
endpointGlobalQuoteHistorical = "global-metrics/quotes/historical"
endpointGlobalQuoteLatest = "global-metrics/quotes/latest"
endpointPriceConversion = "tools/price-conversion"
authrate = 0
defaultTimeOut = time.Second * 15
)
// Coinmarketcap is the overarching type across this package
type Coinmarketcap struct {
Verbose bool
Enabled bool
Name string
APIkey string
APIUrl string
APIVersion string
Plan uint8
Requester *request.Requester
}
// Settings defines the current settings from configuration file // Settings defines the current settings from configuration file
type Settings struct { type Settings struct {

View File

@@ -254,11 +254,6 @@ func (c *ConversionRates) GetFullRates() Conversions {
// Conversions define a list of conversion data // Conversions define a list of conversion data
type Conversions []Conversion type Conversions []Conversion
// Slice exposes the underlying Conversion slice type
func (c Conversions) Slice() []Conversion {
return c
}
// NewConversionFromString splits a string from a foreign exchange provider // NewConversionFromString splits a string from a foreign exchange provider
func NewConversionFromString(p string) (Conversion, error) { func NewConversionFromString(p string) (Conversion, error) {
return NewConversionFromStrings(p[:3], p[3:]) return NewConversionFromStrings(p[:3], p[3:])
@@ -302,7 +297,7 @@ func (c Conversion) String() string {
return c.From.String() + c.To.String() return c.From.String() + c.To.String()
} }
// GetRate returns system rate if availabled // GetRate returns system rate if available
func (c Conversion) GetRate() (float64, error) { func (c Conversion) GetRate() (float64, error) {
c.mtx.Lock() c.mtx.Lock()
defer c.mtx.Unlock() defer c.mtx.Unlock()

View File

@@ -1,6 +1,7 @@
package currency package currency
import ( import (
"fmt"
"strings" "strings"
"testing" "testing"
) )
@@ -9,10 +10,10 @@ func TestNewConversionFromString(t *testing.T) {
expected := "AUDUSD" expected := "AUDUSD"
conv, err := NewConversionFromString(expected) conv, err := NewConversionFromString(expected)
if err != nil { if err != nil {
t.Error("Test Failed - NewConversionFromString() error", err) t.Error(err)
} }
if conv.String() != expected { if conv.String() != expected {
t.Errorf("Test Failed - NewConversion() error expected %s but received %s", t.Errorf("NewConversion() error expected %s but received %s",
expected, expected,
conv) conv)
} }
@@ -20,10 +21,10 @@ func TestNewConversionFromString(t *testing.T) {
newexpected := strings.ToLower(expected) newexpected := strings.ToLower(expected)
conv, err = NewConversionFromString(newexpected) conv, err = NewConversionFromString(newexpected)
if err != nil { if err != nil {
t.Error("Test Failed - NewConversionFromString() error", err) t.Error(err)
} }
if conv.String() != newexpected { if conv.String() != newexpected {
t.Errorf("Test Failed - NewConversion() error expected %s but received %s", t.Errorf("NewConversion() error expected %s but received %s",
newexpected, newexpected,
conv) conv)
} }
@@ -36,11 +37,11 @@ func TestNewConversionFromStrings(t *testing.T) {
conv, err := NewConversionFromStrings(from, to) conv, err := NewConversionFromStrings(from, to)
if err != nil { if err != nil {
t.Error("Test Failed - NewConversionFromString() error", err) t.Error(err)
} }
if conv.String() != expected { if conv.String() != expected {
t.Errorf("Test Failed - NewConversion() error expected %s but received %s", t.Errorf("NewConversion() error expected %s but received %s",
expected, expected,
conv) conv)
} }
@@ -53,11 +54,11 @@ func TestNewConversion(t *testing.T) {
conv, err := NewConversion(from, to) conv, err := NewConversion(from, to)
if err != nil { if err != nil {
t.Error("Test Failed - NewConversionFromCode() error", err) t.Error(err)
} }
if conv.String() != expected { if conv.String() != expected {
t.Errorf("Test Failed - NewConversion() error expected %s but received %s", t.Errorf("NewConversion() error expected %s but received %s",
expected, expected,
conv) conv)
} }
@@ -69,18 +70,18 @@ func TestConversionIsInvalid(t *testing.T) {
conv, err := NewConversion(from, to) conv, err := NewConversion(from, to)
if err != nil { if err != nil {
t.Fatal("Test Failed - NewConversion() error", err) t.Fatal(err)
} }
if conv.IsInvalid() { if conv.IsInvalid() {
t.Errorf("Test Failed - IsInvalid() error expected false but received %v", t.Errorf("IsInvalid() error expected false but received %v",
conv.IsInvalid()) conv.IsInvalid())
} }
to = AUD to = AUD
conv, err = NewConversion(from, to) conv, err = NewConversion(from, to)
if err == nil { if err == nil {
t.Fatal("Test Failed - NewConversion() error", err) t.Error("Expected error")
} }
} }
@@ -90,18 +91,18 @@ func TestConversionIsFiatPair(t *testing.T) {
conv, err := NewConversion(from, to) conv, err := NewConversion(from, to)
if err != nil { if err != nil {
t.Fatal("Test Failed - NewConversion() error", err) t.Fatal(err)
} }
if !conv.IsFiat() { if !conv.IsFiat() {
t.Errorf("Test Failed - IsFiatPair() error expected true but received %v", t.Errorf("IsFiatPair() error expected true but received %v",
conv.IsFiat()) conv.IsFiat())
} }
to = LTC to = LTC
conv, err = NewConversion(from, to) conv, err = NewConversion(from, to)
if err == nil { if err == nil {
t.Fatal("Test Failed - NewConversion() error", err) t.Error("Expected error")
} }
} }
@@ -109,7 +110,7 @@ func TestConversionsRatesSystem(t *testing.T) {
var SuperDuperConversionSystem ConversionRates var SuperDuperConversionSystem ConversionRates
if SuperDuperConversionSystem.HasData() { if SuperDuperConversionSystem.HasData() {
t.Fatalf("Test Failed - HasData() error expected false but received %v", t.Fatalf("HasData() error expected false but received %v",
SuperDuperConversionSystem.HasData()) SuperDuperConversionSystem.HasData())
} }
@@ -141,16 +142,16 @@ func TestConversionsRatesSystem(t *testing.T) {
err := SuperDuperConversionSystem.Update(testmap) err := SuperDuperConversionSystem.Update(testmap)
if err != nil { if err != nil {
t.Fatal("Test Failed - Update() error", err) t.Fatal(err)
} }
err = SuperDuperConversionSystem.Update(nil) err = SuperDuperConversionSystem.Update(nil)
if err == nil { if err == nil {
t.Fatal("Test Failed - Update() error cannot be nil") t.Fatal("Update() error cannot be nil")
} }
if !SuperDuperConversionSystem.HasData() { if !SuperDuperConversionSystem.HasData() {
t.Fatalf("Test Failed - HasData() error expected true but received %v", t.Fatalf("HasData() error expected true but received %v",
SuperDuperConversionSystem.HasData()) SuperDuperConversionSystem.HasData())
} }
@@ -161,7 +162,7 @@ func TestConversionsRatesSystem(t *testing.T) {
r := *p * 1000 r := *p * 1000
expectedRate := 1396.9317581 expectedRate := 1396.9317581
if r != expectedRate { if r != expectedRate {
t.Errorf("Test Failed - Convert() error expected %.13f but received %.13f", t.Errorf("Convert() error expected %.13f but received %.13f",
expectedRate, expectedRate,
r) r)
} }
@@ -169,8 +170,78 @@ func TestConversionsRatesSystem(t *testing.T) {
inverseR := *pi * expectedRate inverseR := *pi * expectedRate
expectedInverseRate := float64(1000) expectedInverseRate := float64(1000)
if inverseR != expectedInverseRate { if inverseR != expectedInverseRate {
t.Errorf("Test Failed - Convert() error expected %.13f but received %.13f", t.Errorf("Convert() error expected %.13f but received %.13f",
expectedInverseRate, expectedInverseRate,
inverseR) inverseR)
} }
} }
func TestGetRate(t *testing.T) {
from := NewCode("AUD")
to := NewCode("USD")
c, err := NewConversion(from, to)
if err != nil {
t.Error(err)
}
rate, err := c.GetRate()
if err != nil {
t.Error(err)
}
if rate == 0 {
t.Error("Rate not set")
}
inv, err := c.GetInversionRate()
if err != nil {
t.Error(err)
}
if inv == 0 {
t.Error("Inverted rate not set")
}
conv, err := c.Convert(1)
if err != nil {
t.Error(err)
}
if rate != conv {
t.Errorf("Incorrect rate %v %v", rate, conv)
}
invConv, err := c.ConvertInverse(1)
if err != nil {
t.Error(err)
}
if inv != invConv {
t.Errorf("Incorrect rate %v %v", conv, invConv)
}
var convs ConversionRates
var convRate float64
_, err = convs.GetRate(BTC, USDT)
if err == nil {
t.Errorf("Expected %s", fmt.Errorf("rate not found for from %s to %s conversion",
BTC,
USD))
}
convRate, err = convs.GetRate(USDT, USD)
if err != nil {
t.Error(err)
}
if convRate != 1 {
t.Errorf("Expected rate to be 1")
}
convRate, err = convs.GetRate(RUR, RUB)
if err != nil {
t.Error(err)
}
if convRate != 1 {
t.Errorf("Expected rate to be 1")
}
convRate, err = convs.GetRate(RUB, RUR)
if err != nil {
t.Error(err)
}
if convRate != 1 {
t.Errorf("Expected rate to be 1")
}
}

View File

@@ -88,11 +88,6 @@ func (c Currencies) Match(other Currencies) bool {
return true return true
} }
// Slice exposes the underlying type
func (c Currencies) Slice() []Code {
return c
}
// HasData checks to see if Currencies type has actual currencies // HasData checks to see if Currencies type has actual currencies
func (c Currencies) HasData() bool { func (c Currencies) HasData() bool {
return len(c) != 0 return len(c) != 0

View File

@@ -11,21 +11,21 @@ func TestCurrenciesUnmarshalJSON(t *testing.T) {
expected := "btc,usd,ltc,bro,things" expected := "btc,usd,ltc,bro,things"
encoded, err := common.JSONEncode(expected) encoded, err := common.JSONEncode(expected)
if err != nil { if err != nil {
t.Fatal("Test Failed - Currencies UnmarshalJSON() error", err) t.Fatal("Currencies UnmarshalJSON() error", err)
} }
err = common.JSONDecode(encoded, &unmarshalHere) err = common.JSONDecode(encoded, &unmarshalHere)
if err != nil { if err != nil {
t.Fatal("Test Failed - Currencies UnmarshalJSON() error", err) t.Fatal("Currencies UnmarshalJSON() error", err)
} }
err = common.JSONDecode(encoded, &unmarshalHere) err = common.JSONDecode(encoded, &unmarshalHere)
if err != nil { if err != nil {
t.Fatal("Test Failed - Currencies UnmarshalJSON() error", err) t.Fatal("Currencies UnmarshalJSON() error", err)
} }
if unmarshalHere.Join() != expected { if unmarshalHere.Join() != expected {
t.Errorf("Test Failed - Currencies UnmarshalJSON() error expected %s but received %s", t.Errorf("Currencies UnmarshalJSON() error expected %s but received %s",
expected, unmarshalHere.Join()) expected, unmarshalHere.Join())
} }
} }
@@ -39,12 +39,12 @@ func TestCurrenciesMarshalJSON(t *testing.T) {
encoded, err := common.JSONEncode(quickStruct) encoded, err := common.JSONEncode(quickStruct)
if err != nil { if err != nil {
t.Fatal("Test Failed - Currencies MarshalJSON() error", err) t.Fatal("Currencies MarshalJSON() error", err)
} }
expected := `{"amazingCurrencies":"btc,usd,ltc,bro,things"}` expected := `{"amazingCurrencies":"btc,usd,ltc,bro,things"}`
if string(encoded) != expected { if string(encoded) != expected {
t.Errorf("Test Failed - Currencies MarshalJSON() error expected %s but received %s", t.Errorf("Currencies MarshalJSON() error expected %s but received %s",
expected, string(encoded)) expected, string(encoded))
} }
} }

View File

@@ -7,12 +7,12 @@ import (
func TestGetDefaultExchangeRates(t *testing.T) { func TestGetDefaultExchangeRates(t *testing.T) {
rates, err := GetDefaultExchangeRates() rates, err := GetDefaultExchangeRates()
if err != nil { if err != nil {
t.Error("Test failed - GetDefaultExchangeRates() err", err) t.Error("GetDefaultExchangeRates() err", err)
} }
for _, val := range rates { for _, val := range rates {
if !val.IsFiat() { if !val.IsFiat() {
t.Errorf("Test failed - GetDefaultExchangeRates() %s is not fiat pair", t.Errorf("GetDefaultExchangeRates() %s is not fiat pair",
val) val)
} }
} }
@@ -21,12 +21,12 @@ func TestGetDefaultExchangeRates(t *testing.T) {
func TestGetExchangeRates(t *testing.T) { func TestGetExchangeRates(t *testing.T) {
rates, err := GetExchangeRates() rates, err := GetExchangeRates()
if err != nil { if err != nil {
t.Error("Test failed - GetExchangeRates() err", err) t.Error("GetExchangeRates() err", err)
} }
for _, val := range rates { for _, val := range rates {
if !val.IsFiat() { if !val.IsFiat() {
t.Errorf("Test failed - GetExchangeRates() %s is not fiat pair", t.Errorf("GetExchangeRates() %s is not fiat pair",
val) val)
} }
} }
@@ -35,23 +35,23 @@ func TestGetExchangeRates(t *testing.T) {
func TestUpdateBaseCurrency(t *testing.T) { func TestUpdateBaseCurrency(t *testing.T) {
err := UpdateBaseCurrency(AUD) err := UpdateBaseCurrency(AUD)
if err != nil { if err != nil {
t.Error("Test failed - UpdateBaseCurrency() err", err) t.Error("UpdateBaseCurrency() err", err)
} }
err = UpdateBaseCurrency(LTC) err = UpdateBaseCurrency(LTC)
if err == nil { if err == nil {
t.Error("Test failed - UpdateBaseCurrency() cannot be nil") t.Error("UpdateBaseCurrency() error cannot be nil")
} }
if GetBaseCurrency() != AUD { if GetBaseCurrency() != AUD {
t.Errorf("Test failed - GetBaseCurrency() expected %s but received %s", t.Errorf("GetBaseCurrency() expected %s but received %s",
AUD, GetBaseCurrency()) AUD, GetBaseCurrency())
} }
} }
func TestGetDefaultBaseCurrency(t *testing.T) { func TestGetDefaultBaseCurrency(t *testing.T) {
if GetDefaultBaseCurrency() != USD { if GetDefaultBaseCurrency() != USD {
t.Errorf("Test failed - GetDefaultBaseCurrency() expected %s but received %s", t.Errorf("GetDefaultBaseCurrency() expected %s but received %s",
USD, GetDefaultBaseCurrency()) USD, GetDefaultBaseCurrency())
} }
} }
@@ -59,7 +59,7 @@ func TestGetDefaultBaseCurrency(t *testing.T) {
func TestGetDefaulCryptoCurrencies(t *testing.T) { func TestGetDefaulCryptoCurrencies(t *testing.T) {
expected := Currencies{BTC, LTC, ETH, DOGE, DASH, XRP, XMR} expected := Currencies{BTC, LTC, ETH, DOGE, DASH, XRP, XMR}
if !GetDefaultCryptocurrencies().Match(expected) { if !GetDefaultCryptocurrencies().Match(expected) {
t.Errorf("Test failed - GetDefaultCryptocurrencies() expected %s but received %s", t.Errorf("GetDefaultCryptocurrencies() expected %s but received %s",
expected, GetDefaultCryptocurrencies()) expected, GetDefaultCryptocurrencies())
} }
} }
@@ -67,7 +67,7 @@ func TestGetDefaulCryptoCurrencies(t *testing.T) {
func TestGetDefaultFiatCurrencies(t *testing.T) { func TestGetDefaultFiatCurrencies(t *testing.T) {
expected := Currencies{USD, AUD, EUR, CNY} expected := Currencies{USD, AUD, EUR, CNY}
if !GetDefaultFiatCurrencies().Match(expected) { if !GetDefaultFiatCurrencies().Match(expected) {
t.Errorf("Test failed - GetDefaultFiatCurrencies() expected %s but received %s", t.Errorf("GetDefaultFiatCurrencies() expected %s but received %s",
expected, GetDefaultFiatCurrencies()) expected, GetDefaultFiatCurrencies())
} }
} }
@@ -77,14 +77,14 @@ func TestUpdateCurrencies(t *testing.T) {
UpdateCurrencies(fiat, false) UpdateCurrencies(fiat, false)
rFiat := GetFiatCurrencies() rFiat := GetFiatCurrencies()
if !rFiat.Contains(HKN) || !rFiat.Contains(JPY) { if !rFiat.Contains(HKN) || !rFiat.Contains(JPY) {
t.Error("Test failed - UpdateCurrencies() currencies did not update") t.Error("UpdateCurrencies() currencies did not update")
} }
crypto := Currencies{ZAR, ZCAD, B2} crypto := Currencies{ZAR, ZCAD, B2}
UpdateCurrencies(crypto, true) UpdateCurrencies(crypto, true)
rCrypto := GetCryptocurrencies() rCrypto := GetCryptocurrencies()
if !rCrypto.Contains(ZAR) || !rCrypto.Contains(ZCAD) || !rCrypto.Contains(B2) { if !rCrypto.Contains(ZAR) || !rCrypto.Contains(ZCAD) || !rCrypto.Contains(B2) {
t.Error("Test failed - UpdateCurrencies() currencies did not update") t.Error("UpdateCurrencies() currencies did not update")
} }
} }
@@ -100,7 +100,7 @@ func TestConvertCurrency(t *testing.T) {
} }
if r != 100 { if r != 100 {
t.Errorf("Test Failed - ConvertCurrency error, incorrect rate return %2.f but received %2.f", t.Errorf("ConvertCurrency error, incorrect rate return %2.f but received %2.f",
100.00, r) 100.00, r)
} }

View File

@@ -4,6 +4,21 @@ import (
"time" "time"
) )
// GetName returns name of provider
func (b *Base) GetName() string {
return b.Name
}
// IsEnabled returns true if enabled
func (b *Base) IsEnabled() bool {
return b.Enabled
}
// IsPrimaryProvider returns true if primary provider
func (b *Base) IsPrimaryProvider() bool {
return b.PrimaryProvider
}
// DefaultTimeOut is the default timeout for foreign exchange providers // DefaultTimeOut is the default timeout for foreign exchange providers
const DefaultTimeOut = time.Second * 15 const DefaultTimeOut = time.Second * 15
@@ -22,18 +37,3 @@ type Settings struct {
type Base struct { type Base struct {
Settings `json:"settings"` Settings `json:"settings"`
} }
// GetName returns name of provider
func (b *Base) GetName() string {
return b.Name
}
// IsEnabled returns true if enabled
func (b *Base) IsEnabled() bool {
return b.Enabled
}
// IsPrimaryProvider returns true if primary provider
func (b *Base) IsPrimaryProvider() bool {
return b.PrimaryProvider
}

View File

@@ -14,29 +14,6 @@ import (
log "github.com/thrasher-corp/gocryptotrader/logger" log "github.com/thrasher-corp/gocryptotrader/logger"
) )
// const declarations consist of endpoints
const (
APIEndpointURL = "https://currencyconverterapi.com/api/"
APIEndpointFreeURL = "https://free.currencyconverterapi.com/api/"
APIEndpointVersion = "v5"
APIEndpointConvert = "convert"
APIEndpointCurrencies = "currencies"
APIEndpointCountries = "countries"
APIEndpointUsage = "usage"
defaultAPIKey = "Key"
authRate = 0
unAuthRate = 0
)
// CurrencyConverter stores the struct for the CurrencyConverter API
type CurrencyConverter struct {
base.Base
Requester *request.Requester
}
// Setup sets appropriate values for CurrencyLayer // Setup sets appropriate values for CurrencyLayer
func (c *CurrencyConverter) Setup(config base.Settings) error { func (c *CurrencyConverter) Setup(config base.Settings) error {
c.Name = config.Name c.Name = config.Name

View File

@@ -65,7 +65,7 @@ func TestConvertMany(t *testing.T) {
currencies = []string{"USD_AUD", "USD_EUR", "USD_GBP"} currencies = []string{"USD_AUD", "USD_EUR", "USD_GBP"}
_, err = c.ConvertMany(currencies) _, err = c.ConvertMany(currencies)
if err == nil { if err == nil {
t.Fatal("non error on supplying 3 or more currencies using the free API") t.Fatal("Expected error from on supplying 3 or more currencies using the free API")
} }
} }

View File

@@ -1,5 +1,33 @@
package currencyconverter package currencyconverter
import (
"github.com/thrasher-corp/gocryptotrader/currency/forexprovider/base"
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
)
// const declarations consist of endpoints
const (
APIEndpointURL = "https://currencyconverterapi.com/api/"
APIEndpointFreeURL = "https://free.currencyconverterapi.com/api/"
APIEndpointVersion = "v5"
APIEndpointConvert = "convert"
APIEndpointCurrencies = "currencies"
APIEndpointCountries = "countries"
APIEndpointUsage = "usage"
defaultAPIKey = "Key"
authRate = 0
unAuthRate = 0
)
// CurrencyConverter stores the struct for the CurrencyConverter API
type CurrencyConverter struct {
base.Base
Requester *request.Requester
}
// Error stores the error message // Error stores the error message
type Error struct { type Error struct {
Status int `json:"status"` Status int `json:"status"`

View File

@@ -26,34 +26,6 @@ import (
log "github.com/thrasher-corp/gocryptotrader/logger" log "github.com/thrasher-corp/gocryptotrader/logger"
) )
// const declarations consist of endpoints and APIKey privileges
const (
AccountFree = iota
AccountBasic
AccountPro
AccountEnterprise
APIEndpointURL = "http://apilayer.net/api/"
APIEndpointURLSSL = "https://apilayer.net/api/"
APIEndpointList = "list"
APIEndpointLive = "live"
APIEndpointHistorical = "historical"
APIEndpointConversion = "convert"
APIEndpointTimeframe = "timeframe"
APIEndpointChange = "change"
authRate = 0
unAuthRate = 0
)
// CurrencyLayer is a foreign exchange rate provider at
// https://currencylayer.com NOTE default base currency is USD when using a free
// account. Has automatic upgrade to a SSL connection.
type CurrencyLayer struct {
base.Base
Requester *request.Requester
}
// Setup sets appropriate values for CurrencyLayer // Setup sets appropriate values for CurrencyLayer
func (c *CurrencyLayer) Setup(config base.Settings) error { func (c *CurrencyLayer) Setup(config base.Settings) error {
if config.APIKeyLvl < 0 || config.APIKeyLvl > 3 { if config.APIKeyLvl < 0 || config.APIKeyLvl > 3 {

View File

@@ -48,7 +48,7 @@ func areAPIKeysSet() bool {
func TestGetRates(t *testing.T) { func TestGetRates(t *testing.T) {
err := setup() err := setup()
if err != nil { if err != nil {
t.Skip("Test Failed - CurrencyLayer GetRates error", err) t.Skip("CurrencyLayer GetRates error", err)
} }
_, err = c.GetRates("USD", "AUD") _, err = c.GetRates("USD", "AUD")
if areAPIKeysSet() && err != nil { if areAPIKeysSet() && err != nil {
@@ -61,7 +61,7 @@ func TestGetRates(t *testing.T) {
func TestGetSupportedCurrencies(t *testing.T) { func TestGetSupportedCurrencies(t *testing.T) {
err := setup() err := setup()
if err != nil { if err != nil {
t.Fatal("Test Failed - CurrencyLayer GetSupportedCurrencies error", err) t.Fatal("CurrencyLayer GetSupportedCurrencies error", err)
} }
_, err = c.GetSupportedCurrencies() _, err = c.GetSupportedCurrencies()
if areAPIKeysSet() && err != nil { if areAPIKeysSet() && err != nil {
@@ -74,7 +74,7 @@ func TestGetSupportedCurrencies(t *testing.T) {
func TestGetliveData(t *testing.T) { func TestGetliveData(t *testing.T) {
err := setup() err := setup()
if err != nil { if err != nil {
t.Fatal("Test Failed - CurrencyLayer GetliveData error", err) t.Fatal("CurrencyLayer GetliveData error", err)
} }
_, err = c.GetliveData("AUD", "USD") _, err = c.GetliveData("AUD", "USD")
if areAPIKeysSet() && err != nil { if areAPIKeysSet() && err != nil {
@@ -87,7 +87,7 @@ func TestGetliveData(t *testing.T) {
func TestGetHistoricalData(t *testing.T) { func TestGetHistoricalData(t *testing.T) {
err := setup() err := setup()
if err != nil { if err != nil {
t.Fatal("Test Failed - CurrencyLayer GetHistoricalData error", err) t.Fatal("CurrencyLayer GetHistoricalData error", err)
} }
_, err = c.GetHistoricalData("2016-12-15", []string{"AUD"}, "USD") _, err = c.GetHistoricalData("2016-12-15", []string{"AUD"}, "USD")
if areAPIKeysSet() && err != nil { if areAPIKeysSet() && err != nil {
@@ -100,7 +100,7 @@ func TestGetHistoricalData(t *testing.T) {
func TestConvert(t *testing.T) { func TestConvert(t *testing.T) {
err := setup() err := setup()
if err != nil { if err != nil {
t.Fatal("Test Failed - CurrencyLayer Convert error", err) t.Fatal("CurrencyLayer Convert error", err)
} }
_, err = c.Convert("USD", "AUD", "", 1) _, err = c.Convert("USD", "AUD", "", 1)
if areAPIKeysSet() && err != nil && c.APIKeyLvl >= AccountBasic { if areAPIKeysSet() && err != nil && c.APIKeyLvl >= AccountBasic {
@@ -113,7 +113,7 @@ func TestConvert(t *testing.T) {
func TestQueryTimeFrame(t *testing.T) { func TestQueryTimeFrame(t *testing.T) {
err := setup() err := setup()
if err != nil { if err != nil {
t.Fatal("Test Failed - CurrencyLayer QueryTimeFrame error", err) t.Fatal("CurrencyLayer QueryTimeFrame error", err)
} }
_, err = c.QueryTimeFrame("2010-12-0", "2010-12-5", "USD", []string{"AUD"}) _, err = c.QueryTimeFrame("2010-12-0", "2010-12-5", "USD", []string{"AUD"})
if areAPIKeysSet() && err != nil && c.APIKeyLvl >= AccountPro { if areAPIKeysSet() && err != nil && c.APIKeyLvl >= AccountPro {
@@ -126,7 +126,7 @@ func TestQueryTimeFrame(t *testing.T) {
func TestQueryCurrencyChange(t *testing.T) { func TestQueryCurrencyChange(t *testing.T) {
err := setup() err := setup()
if err != nil { if err != nil {
t.Fatal("Test Failed - CurrencyLayer QueryCurrencyChange() error", err) t.Fatal("CurrencyLayer QueryCurrencyChange() error", err)
} }
_, err = c.QueryCurrencyChange("2010-12-0", "2010-12-5", "USD", []string{"AUD"}) _, err = c.QueryCurrencyChange("2010-12-0", "2010-12-5", "USD", []string{"AUD"})
if areAPIKeysSet() && err != nil && c.APIKeyLvl == AccountEnterprise { if areAPIKeysSet() && err != nil && c.APIKeyLvl == AccountEnterprise {

View File

@@ -1,5 +1,38 @@
package currencylayer package currencylayer
import (
"github.com/thrasher-corp/gocryptotrader/currency/forexprovider/base"
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
)
// const declarations consist of endpoints and APIKey privileges
const (
AccountFree = iota
AccountBasic
AccountPro
AccountEnterprise
APIEndpointURL = "http://apilayer.net/api/"
APIEndpointURLSSL = "https://apilayer.net/api/"
APIEndpointList = "list"
APIEndpointLive = "live"
APIEndpointHistorical = "historical"
APIEndpointConversion = "convert"
APIEndpointTimeframe = "timeframe"
APIEndpointChange = "change"
authRate = 0
unAuthRate = 0
)
// CurrencyLayer is a foreign exchange rate provider at
// https://currencylayer.com NOTE default base currency is USD when using a free
// account. Has automatic upgrade to a SSL connection.
type CurrencyLayer struct {
base.Base
Requester *request.Requester
}
// Error Defines the response error if an error occurred // Error Defines the response error if an error occurred
type Error struct { type Error struct {
Code int `json:"code"` Code int `json:"code"`

View File

@@ -14,24 +14,6 @@ import (
log "github.com/thrasher-corp/gocryptotrader/logger" log "github.com/thrasher-corp/gocryptotrader/logger"
) )
const (
exchangeRatesAPI = "https://api.exchangeratesapi.io"
exchangeRatesLatest = "latest"
exchangeRatesHistory = "history"
exchangeRatesSupportedCurrencies = "EUR,CHF,USD,BRL,ISK,PHP,KRW,BGN,MXN," +
"RON,CAD,SGD,NZD,THB,HKD,JPY,NOK,HRK,ILS,GBP,DKK,HUF,MYR,RUB,TRY,IDR," +
"ZAR,INR,AUD,CZK,SEK,CNY,PLN"
authRate = 0
unAuthRate = 0
)
// ExchangeRates stores the struct for the ExchangeRatesAPI API
type ExchangeRates struct {
base.Base
Requester *request.Requester
}
// Setup sets appropriate values for CurrencyLayer // Setup sets appropriate values for CurrencyLayer
func (e *ExchangeRates) Setup(config base.Settings) error { func (e *ExchangeRates) Setup(config base.Settings) error {
e.Name = config.Name e.Name = config.Name

View File

@@ -1,5 +1,28 @@
package exchangerates package exchangerates
import (
"github.com/thrasher-corp/gocryptotrader/currency/forexprovider/base"
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
)
const (
exchangeRatesAPI = "https://api.exchangeratesapi.io"
exchangeRatesLatest = "latest"
exchangeRatesHistory = "history"
exchangeRatesSupportedCurrencies = "EUR,CHF,USD,BRL,ISK,PHP,KRW,BGN,MXN," +
"RON,CAD,SGD,NZD,THB,HKD,JPY,NOK,HRK,ILS,GBP,DKK,HUF,MYR,RUB,TRY,IDR," +
"ZAR,INR,AUD,CZK,SEK,CNY,PLN"
authRate = 0
unAuthRate = 0
)
// ExchangeRates stores the struct for the ExchangeRatesAPI API
type ExchangeRates struct {
base.Base
Requester *request.Requester
}
// Rates holds the latest forex rates info // Rates holds the latest forex rates info
type Rates struct { type Rates struct {
Base string `json:"base"` Base string `json:"base"`

View File

@@ -22,32 +22,6 @@ import (
log "github.com/thrasher-corp/gocryptotrader/logger" log "github.com/thrasher-corp/gocryptotrader/logger"
) )
const (
fixerAPIFree = iota
fixerAPIBasic
fixerAPIProfessional
fixerAPIProfessionalPlus
fixerAPIEnterprise
fixerAPI = "http://data.fixer.io/api/"
fixerAPISSL = "https://data.fixer.io/api/"
fixerAPILatest = "latest"
fixerAPIConvert = "convert"
fixerAPITimeSeries = "timeseries"
fixerAPIFluctuation = "fluctuation"
fixerSupportedCurrencies = "symbols"
authRate = 0
unAuthRate = 0
)
// Fixer is a foreign exchange rate provider at https://fixer.io/
// NOTE DEFAULT BASE CURRENCY IS EUR upgrade to basic to change
type Fixer struct {
base.Base
Requester *request.Requester
}
// Setup sets appropriate values for fixer object // Setup sets appropriate values for fixer object
func (f *Fixer) Setup(config base.Settings) error { func (f *Fixer) Setup(config base.Settings) error {
if config.APIKeyLvl < 0 || config.APIKeyLvl > 4 { if config.APIKeyLvl < 0 || config.APIKeyLvl > 4 {

View File

@@ -22,7 +22,7 @@ func setup(t *testing.T) {
if !isSetup { if !isSetup {
err := f.Setup(base.Settings{}) err := f.Setup(base.Settings{})
if err != nil { if err != nil {
t.Fatal("Test Failed - Setup error", err) t.Fatal("Setup error", err)
} }
isSetup = true isSetup = true
} }
@@ -32,7 +32,7 @@ func TestGetRates(t *testing.T) {
setup(t) setup(t)
_, err := f.GetRates("EUR", "AUD") _, err := f.GetRates("EUR", "AUD")
if err == nil { if err == nil {
t.Error("test failed - fixer GetRates() error", err) t.Error("fixer GetRates() Expected error")
} }
} }
@@ -40,7 +40,7 @@ func TestGetLatestRates(t *testing.T) {
setup(t) setup(t)
_, err := f.GetLatestRates("EUR", "AUD") _, err := f.GetLatestRates("EUR", "AUD")
if err == nil { if err == nil {
t.Error("test failed - fixer GetLatestRates() error", err) t.Error("fixer GetLatestRates() Expected error")
} }
} }
@@ -48,7 +48,7 @@ func TestGetHistoricalRates(t *testing.T) {
setup(t) setup(t)
_, err := f.GetHistoricalRates("2013-12-24", "EUR", []string{"AUD,KRW"}) _, err := f.GetHistoricalRates("2013-12-24", "EUR", []string{"AUD,KRW"})
if err == nil { if err == nil {
t.Error("test failed - fixer GetHistoricalRates() error", err) t.Error("fixer GetHistoricalRates() Expected error")
} }
} }
@@ -56,7 +56,7 @@ func TestConvertCurrency(t *testing.T) {
setup(t) setup(t)
_, err := f.ConvertCurrency("AUD", "EUR", "", 1337) _, err := f.ConvertCurrency("AUD", "EUR", "", 1337)
if err == nil { if err == nil {
t.Error("test failed - fixer ConvertCurrency() error", err) t.Error("fixer ConvertCurrency() Expected error")
} }
} }
@@ -64,7 +64,7 @@ func TestGetTimeSeriesData(t *testing.T) {
setup(t) setup(t)
_, err := f.GetTimeSeriesData("2013-12-24", "2013-12-25", "EUR", []string{"AUD,KRW"}) _, err := f.GetTimeSeriesData("2013-12-24", "2013-12-25", "EUR", []string{"AUD,KRW"})
if err == nil { if err == nil {
t.Error("test failed - fixer GetTimeSeriesData() error", err) t.Error("fixer GetTimeSeriesData() Expected error")
} }
} }
@@ -72,6 +72,6 @@ func TestGetFluctuationData(t *testing.T) {
setup(t) setup(t)
_, err := f.GetFluctuationData("2013-12-24", "2013-12-25", "EUR", []string{"AUD,KRW"}) _, err := f.GetFluctuationData("2013-12-24", "2013-12-25", "EUR", []string{"AUD,KRW"})
if err == nil { if err == nil {
t.Error("test failed - fixer GetFluctuationData() error", err) t.Error("fixer GetFluctuationData() Expected error")
} }
} }

View File

@@ -1,5 +1,36 @@
package fixer package fixer
import (
"github.com/thrasher-corp/gocryptotrader/currency/forexprovider/base"
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
)
const (
fixerAPIFree = iota
fixerAPIBasic
fixerAPIProfessional
fixerAPIProfessionalPlus
fixerAPIEnterprise
fixerAPI = "http://data.fixer.io/api/"
fixerAPISSL = "https://data.fixer.io/api/"
fixerAPILatest = "latest"
fixerAPIConvert = "convert"
fixerAPITimeSeries = "timeseries"
fixerAPIFluctuation = "fluctuation"
fixerSupportedCurrencies = "symbols"
authRate = 0
unAuthRate = 0
)
// Fixer is a foreign exchange rate provider at https://fixer.io/
// NOTE DEFAULT BASE CURRENCY IS EUR upgrade to basic to change
type Fixer struct {
base.Base
Requester *request.Requester
}
// Rates contains the data fields for the currencies you have requested. // Rates contains the data fields for the currencies you have requested.
type Rates struct { type Rates struct {
Success bool `json:"success"` Success bool `json:"success"`

View File

@@ -13,13 +13,8 @@ import (
"github.com/thrasher-corp/gocryptotrader/currency/forexprovider/openexchangerates" "github.com/thrasher-corp/gocryptotrader/currency/forexprovider/openexchangerates"
) )
// ForexProviders is a foreign exchange handler type // GetSupportedForexProviders returns a list of supported forex providers
type ForexProviders struct { func GetSupportedForexProviders() []string {
base.FXHandler
}
// GetAvailableForexProviders returns a list of supported forex providers
func GetAvailableForexProviders() []string {
return []string{"CurrencyConverter", return []string{"CurrencyConverter",
"CurrencyLayer", "CurrencyLayer",
"ExchangeRates", "ExchangeRates",
@@ -135,3 +130,8 @@ func StartFXService(fxProviders []base.Settings) (*ForexProviders, error) {
return handler, nil return handler, nil
} }
// ForexProviders is a foreign exchange handler type
type ForexProviders struct {
base.FXHandler
}

View File

@@ -23,45 +23,6 @@ import (
log "github.com/thrasher-corp/gocryptotrader/logger" log "github.com/thrasher-corp/gocryptotrader/logger"
) )
// These consts contain endpoint information
const (
APIDeveloperAccess = iota
APIEnterpriseAccess
APIUnlimitedAccess
APIURL = "https://openexchangerates.org/api/"
APIEndpointLatest = "latest.json"
APIEndpointHistorical = "historical/%s.json"
APIEndpointCurrencies = "currencies.json"
APIEndpointTimeSeries = "time-series.json"
APIEndpointConvert = "convert/%s/%s/%s"
APIEndpointOHLC = "ohlc.json"
APIEndpointUsage = "usage.json"
oxrSupportedCurrencies = "AED,AFN,ALL,AMD,ANG,AOA,ARS,AUD,AWG,AZN,BAM,BBD," +
"BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BTC,BTN,BWP,BYN,BYR,BZD,CAD,CDF," +
"CHF,CLF,CLP,CNH,CNY,COP,CRC,CUC,CUP,CVE,CZK,DJF,DKK,DOP,DZD,EEK,EGP," +
"ERN,ETB,EUR,FJD,FKP,GBP,GEL,GGP,GHS,GIP,GMD,GNF,GTQ,GYD,HKD,HNL,HRK," +
"HTG,HUF,IDR,ILS,IMP,INR,IQD,IRR,ISK,JEP,JMD,JOD,JPY,KES,KGS,KHR,KMF," +
"KPW,KRW,KWD,KYD,KZT,LAK,LBP,LKR,LRD,LSL,LYD,MAD,MDL,MGA,MKD,MMK,MNT," +
"MOP,MRO,MRU,MTL,MUR,MVR,MWK,MXN,MYR,MZN,NAD,NGN,NIO,NOK,NPR,NZD,OMR," +
"PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SDG,SEK," +
"SGD,SHP,SLL,SOS,SRD,SSP,STD,STN,SVC,SYP,SZL,THB,TJS,TMT,TND,TOP,TRY," +
"TTD,TWD,TZS,UAH,UGX,USD,UYU,UZS,VEF,VND,VUV,WST,XAF,XAG,XAU,XCD,XDR," +
"XOF,XPD,XPF,XPT,YER,ZAR,ZMK,ZMW"
authRate = 0
unAuthRate = 0
)
// OXR is a foreign exchange rate provider at https://openexchangerates.org/
// this is the overarching type across this package
// DOCs : https://docs.openexchangerates.org/docs
type OXR struct {
base.Base
Requester *request.Requester
}
// Setup sets values for the OXR object // Setup sets values for the OXR object
func (o *OXR) Setup(config base.Settings) error { func (o *OXR) Setup(config base.Settings) error {
if config.APIKeyLvl < 0 || config.APIKeyLvl > 2 { if config.APIKeyLvl < 0 || config.APIKeyLvl > 2 {

View File

@@ -31,7 +31,7 @@ func TestGetRates(t *testing.T) {
} }
_, err := o.GetRates("USD", "AUD") _, err := o.GetRates("USD", "AUD")
if err == nil { if err == nil {
t.Error("test failed - GetRates() error", err) t.Error("GetRates() Expected error")
} }
} }
@@ -41,7 +41,7 @@ func TestGetLatest(t *testing.T) {
} }
_, err := o.GetLatest("USD", "AUD", false, false) _, err := o.GetLatest("USD", "AUD", false, false)
if err == nil { if err == nil {
t.Error("test failed - GetLatest() error", err) t.Error("GetLatest() Expected error")
} }
} }
@@ -51,7 +51,7 @@ func TestGetHistoricalRates(t *testing.T) {
} }
_, err := o.GetHistoricalRates("2017-12-01", "USD", []string{"CNH", "AUD", "ANG"}, false, false) _, err := o.GetHistoricalRates("2017-12-01", "USD", []string{"CNH", "AUD", "ANG"}, false, false)
if err == nil { if err == nil {
t.Error("test failed - GetRates() error", err) t.Error("GetRates() Expected error")
} }
} }
@@ -61,7 +61,7 @@ func TestGetCurrencies(t *testing.T) {
} }
_, err := o.GetCurrencies(true, true, true) _, err := o.GetCurrencies(true, true, true)
if err != nil { if err != nil {
t.Error("test failed - GetCurrencies() error", err) t.Error("GetCurrencies() error", err)
} }
} }
@@ -71,7 +71,7 @@ func TestGetTimeSeries(t *testing.T) {
} }
_, err := o.GetTimeSeries("USD", "2017-12-01", "2017-12-02", []string{"CNH", "AUD", "ANG"}, false, false) _, err := o.GetTimeSeries("USD", "2017-12-01", "2017-12-02", []string{"CNH", "AUD", "ANG"}, false, false)
if err == nil { if err == nil {
t.Error("test failed - GetTimeSeries() error", err) t.Error("GetTimeSeries() Expected error")
} }
} }
@@ -81,7 +81,7 @@ func TestConvertCurrency(t *testing.T) {
} }
_, err := o.ConvertCurrency(1337, "USD", "AUD") _, err := o.ConvertCurrency(1337, "USD", "AUD")
if err == nil { if err == nil {
t.Error("test failed - ConvertCurrency() error", err) t.Error("ConvertCurrency() Expected error")
} }
} }
@@ -91,7 +91,7 @@ func TestGetOHLC(t *testing.T) {
} }
_, err := o.GetOHLC("2017-07-17T08:30:00Z", "1m", "USD", []string{"AUD"}, false) _, err := o.GetOHLC("2017-07-17T08:30:00Z", "1m", "USD", []string{"AUD"}, false)
if err == nil { if err == nil {
t.Error("test failed - GetOHLC() error", err) t.Error("GetOHLC() Expected error")
} }
} }
@@ -101,6 +101,6 @@ func TestGetUsageStats(t *testing.T) {
} }
_, err := o.GetUsageStats(false) _, err := o.GetUsageStats(false)
if err == nil { if err == nil {
t.Error("test failed - GetUsageStats() error", err) t.Error("GetUsageStats() Expected error")
} }
} }

View File

@@ -1,5 +1,49 @@
package openexchangerates package openexchangerates
import (
"github.com/thrasher-corp/gocryptotrader/currency/forexprovider/base"
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
)
// These consts contain endpoint information
const (
APIDeveloperAccess = iota
APIEnterpriseAccess
APIUnlimitedAccess
APIURL = "https://openexchangerates.org/api/"
APIEndpointLatest = "latest.json"
APIEndpointHistorical = "historical/%s.json"
APIEndpointCurrencies = "currencies.json"
APIEndpointTimeSeries = "time-series.json"
APIEndpointConvert = "convert/%s/%s/%s"
APIEndpointOHLC = "ohlc.json"
APIEndpointUsage = "usage.json"
oxrSupportedCurrencies = "AED,AFN,ALL,AMD,ANG,AOA,ARS,AUD,AWG,AZN,BAM,BBD," +
"BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BTC,BTN,BWP,BYN,BYR,BZD,CAD,CDF," +
"CHF,CLF,CLP,CNH,CNY,COP,CRC,CUC,CUP,CVE,CZK,DJF,DKK,DOP,DZD,EEK,EGP," +
"ERN,ETB,EUR,FJD,FKP,GBP,GEL,GGP,GHS,GIP,GMD,GNF,GTQ,GYD,HKD,HNL,HRK," +
"HTG,HUF,IDR,ILS,IMP,INR,IQD,IRR,ISK,JEP,JMD,JOD,JPY,KES,KGS,KHR,KMF," +
"KPW,KRW,KWD,KYD,KZT,LAK,LBP,LKR,LRD,LSL,LYD,MAD,MDL,MGA,MKD,MMK,MNT," +
"MOP,MRO,MRU,MTL,MUR,MVR,MWK,MXN,MYR,MZN,NAD,NGN,NIO,NOK,NPR,NZD,OMR," +
"PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SDG,SEK," +
"SGD,SHP,SLL,SOS,SRD,SSP,STD,STN,SVC,SYP,SZL,THB,TJS,TMT,TND,TOP,TRY," +
"TTD,TWD,TZS,UAH,UGX,USD,UYU,UZS,VEF,VND,VUV,WST,XAF,XAG,XAU,XCD,XDR," +
"XOF,XPD,XPF,XPT,YER,ZAR,ZMK,ZMW"
authRate = 0
unAuthRate = 0
)
// OXR is a foreign exchange rate provider at https://openexchangerates.org/
// this is the overarching type across this package
// DOCs : https://docs.openexchangerates.org/docs
type OXR struct {
base.Base
Requester *request.Requester
}
// Latest holds latest rate data // Latest holds latest rate data
type Latest struct { type Latest struct {
Disclaimer string `json:"disclaimer"` Disclaimer string `json:"disclaimer"`

View File

@@ -29,11 +29,11 @@ func TestGetAssetTypes(t *testing.T) {
a := p.GetAssetTypes() a := p.GetAssetTypes()
if len(a) == 0 { if len(a) == 0 {
t.Errorf("Test failed. GetAssetTypes shouldn't be nil") t.Errorf("GetAssetTypes shouldn't be nil")
} }
if !a.Contains(asset.Spot) { if !a.Contains(asset.Spot) {
t.Errorf("Test failed. AssetTypeSpot should be in the assets list") t.Errorf("AssetTypeSpot should be in the assets list")
} }
} }
@@ -41,11 +41,11 @@ func TestGet(t *testing.T) {
initTest() initTest()
if p.Get(asset.Spot) == nil { if p.Get(asset.Spot) == nil {
t.Error("Test failed. Spot assets shouldn't be nil") t.Error("Spot assets shouldn't be nil")
} }
if p.Get(asset.Futures) != nil { if p.Get(asset.Futures) != nil {
t.Error("Test Failed. Futures should be nil") t.Error("Futures should be nil")
} }
} }
@@ -65,7 +65,7 @@ func TestStore(t *testing.T) {
) )
if p.Get(asset.Futures) == nil { if p.Get(asset.Futures) == nil {
t.Error("Test failed. Futures assets shouldn't be nil") t.Error("Futures assets shouldn't be nil")
} }
} }
@@ -80,12 +80,12 @@ func TestDelete(t *testing.T) {
) )
p.Delete(asset.UpsideProfitContract) p.Delete(asset.UpsideProfitContract)
if p.Get(asset.Spot) == nil { if p.Get(asset.Spot) == nil {
t.Error("Test failed. AssetTypeSpot should exist") t.Error("AssetTypeSpot should exist")
} }
p.Delete(asset.Spot) p.Delete(asset.Spot)
if p.Get(asset.Spot) != nil { if p.Get(asset.Spot) != nil {
t.Error("Test failed. Delete should have deleted AssetTypeSpot") t.Error("Delete should have deleted AssetTypeSpot")
} }
} }

View File

@@ -87,13 +87,6 @@ func NewPairFromFormattedPairs(currencyPair string, pairs Pairs, pairFmt PairFor
return NewPairFromString(currencyPair) return NewPairFromString(currencyPair)
} }
// Pair holds currency pair information
type Pair struct {
Delimiter string `json:"delimiter"`
Base Code `json:"base"`
Quote Code `json:"quote"`
}
// String returns a currency pair string // String returns a currency pair string
func (p Pair) String() string { func (p Pair) String() string {
return p.Base.String() + p.Delimiter + p.Quote.String() return p.Base.String() + p.Delimiter + p.Quote.String()
@@ -203,3 +196,10 @@ func (p Pair) IsEmpty() bool {
func (p Pair) ContainsCurrency(c Code) bool { func (p Pair) ContainsCurrency(c Code) bool {
return p.Base.Item == c.Item || p.Quote.Item == c.Item return p.Base.Item == c.Item || p.Quote.Item == c.Item
} }
// Pair holds currency pair information
type Pair struct {
Delimiter string `json:"delimiter"`
Base Code `json:"base"`
Quote Code `json:"quote"`
}

View File

@@ -17,7 +17,7 @@ func TestLower(t *testing.T) {
actual := pair.Lower() actual := pair.Lower()
expected := NewPairFromString(defaultPair).Lower() expected := NewPairFromString(defaultPair).Lower()
if actual != expected { if actual != expected {
t.Errorf("Test failed. Lower(): %s was not equal to expected value: %s", t.Errorf("Lower(): %s was not equal to expected value: %s",
actual, expected) actual, expected)
} }
} }
@@ -28,7 +28,7 @@ func TestUpper(t *testing.T) {
actual := pair.Upper() actual := pair.Upper()
expected := NewPairFromString(defaultPair) expected := NewPairFromString(defaultPair)
if actual != expected { if actual != expected {
t.Errorf("Test failed. Upper(): %s was not equal to expected value: %s", t.Errorf("Upper(): %s was not equal to expected value: %s",
actual, expected) actual, expected)
} }
} }
@@ -39,21 +39,21 @@ func TestPairUnmarshalJSON(t *testing.T) {
encoded, err := common.JSONEncode(configPair) encoded, err := common.JSONEncode(configPair)
if err != nil { if err != nil {
t.Fatal("Test Failed - Pair UnmarshalJSON() error", err) t.Fatal("Pair UnmarshalJSON() error", err)
} }
err = common.JSONDecode(encoded, &unmarshalHere) err = common.JSONDecode(encoded, &unmarshalHere)
if err != nil { if err != nil {
t.Fatal("Test Failed - Pair UnmarshalJSON() error", err) t.Fatal("Pair UnmarshalJSON() error", err)
} }
err = common.JSONDecode(encoded, &unmarshalHere) err = common.JSONDecode(encoded, &unmarshalHere)
if err != nil { if err != nil {
t.Fatal("Test Failed - Pair UnmarshalJSON() error", err) t.Fatal("Pair UnmarshalJSON() error", err)
} }
if !unmarshalHere.Equal(configPair) { if !unmarshalHere.Equal(configPair) {
t.Errorf("Test Failed - Pairs UnmarshalJSON() error expected %s but received %s", t.Errorf("Pairs UnmarshalJSON() error expected %s but received %s",
configPair, unmarshalHere) configPair, unmarshalHere)
} }
} }
@@ -67,43 +67,43 @@ func TestPairMarshalJSON(t *testing.T) {
encoded, err := common.JSONEncode(quickstruct) encoded, err := common.JSONEncode(quickstruct)
if err != nil { if err != nil {
t.Fatal("Test Failed - Pair MarshalJSON() error", err) t.Fatal("Pair MarshalJSON() error", err)
} }
expected := `{"superPair":"BTC-USD"}` expected := `{"superPair":"BTC-USD"}`
if string(encoded) != expected { if string(encoded) != expected {
t.Errorf("Test Failed - Pair MarshalJSON() error expected %s but received %s", t.Errorf("Pair MarshalJSON() error expected %s but received %s",
expected, string(encoded)) expected, string(encoded))
} }
} }
func TestIsCryptoPair(t *testing.T) { func TestIsCryptoPair(t *testing.T) {
if !NewPair(BTC, LTC).IsCryptoPair() { if !NewPair(BTC, LTC).IsCryptoPair() {
t.Error("Test Failed. TestIsCryptoPair. Expected true result") t.Error("TestIsCryptoPair. Expected true result")
} }
if NewPair(BTC, USD).IsCryptoPair() { if NewPair(BTC, USD).IsCryptoPair() {
t.Error("Test Failed. TestIsCryptoPair. Expected false result") t.Error("TestIsCryptoPair. Expected false result")
} }
} }
func TestIsCryptoFiatPair(t *testing.T) { func TestIsCryptoFiatPair(t *testing.T) {
if !NewPair(BTC, USD).IsCryptoFiatPair() { if !NewPair(BTC, USD).IsCryptoFiatPair() {
t.Error("Test Failed. TestIsCryptoPair. Expected true result") t.Error("TestIsCryptoPair. Expected true result")
} }
if NewPair(BTC, LTC).IsCryptoFiatPair() { if NewPair(BTC, LTC).IsCryptoFiatPair() {
t.Error("Test Failed. TestIsCryptoPair. Expected false result") t.Error("TestIsCryptoPair. Expected false result")
} }
} }
func TestIsFiatPair(t *testing.T) { func TestIsFiatPair(t *testing.T) {
if !NewPair(AUD, USD).IsFiatPair() { if !NewPair(AUD, USD).IsFiatPair() {
t.Error("Test Failed. TestIsFiatPair. Expected true result") t.Error("TestIsFiatPair. Expected true result")
} }
if NewPair(BTC, AUD).IsFiatPair() { if NewPair(BTC, AUD).IsFiatPair() {
t.Error("Test Failed. TestIsFiatPair. Expected false result") t.Error("TestIsFiatPair. Expected false result")
} }
} }
@@ -113,7 +113,7 @@ func TestString(t *testing.T) {
actual := defaultPair actual := defaultPair
expected := pair.String() expected := pair.String()
if actual != expected { if actual != expected {
t.Errorf("Test failed. String(): %s was not equal to expected value: %s", t.Errorf("String(): %s was not equal to expected value: %s",
actual, expected) actual, expected)
} }
} }
@@ -125,7 +125,7 @@ func TestFirstCurrency(t *testing.T) {
expected := BTC expected := BTC
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. GetFirstCurrency(): %s was not equal to expected value: %s", "GetFirstCurrency(): %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -138,7 +138,7 @@ func TestSecondCurrency(t *testing.T) {
expected := USD expected := USD
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. GetSecondCurrency(): %s was not equal to expected value: %s", "GetSecondCurrency(): %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -151,7 +151,7 @@ func TestPair(t *testing.T) {
expected := defaultPair expected := defaultPair
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Pair(): %s was not equal to expected value: %s", "Pair(): %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -164,7 +164,7 @@ func TestDisplay(t *testing.T) {
expected := defaultPairWDelimiter expected := defaultPairWDelimiter
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Pair(): %s was not equal to expected value: %s", "Pair(): %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -173,7 +173,7 @@ func TestDisplay(t *testing.T) {
expected = "btcusd" expected = "btcusd"
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Pair(): %s was not equal to expected value: %s", "Pair(): %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -182,7 +182,7 @@ func TestDisplay(t *testing.T) {
expected = "BTC~USD" expected = "BTC~USD"
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Pair(): %s was not equal to expected value: %s", "Pair(): %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -196,7 +196,7 @@ func TestEquall(t *testing.T) {
expected := true expected := true
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Equal(): %v was not equal to expected value: %v", "Equal(): %v was not equal to expected value: %v",
actual, expected, actual, expected,
) )
} }
@@ -206,7 +206,7 @@ func TestEquall(t *testing.T) {
expected = false expected = false
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Equal(): %v was not equal to expected value: %v", "Equal(): %v was not equal to expected value: %v",
actual, expected, actual, expected,
) )
} }
@@ -216,7 +216,7 @@ func TestEquall(t *testing.T) {
expected = false expected = false
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Equal(): %v was not equal to expected value: %v", "Equal(): %v was not equal to expected value: %v",
actual, expected, actual, expected,
) )
} }
@@ -230,7 +230,7 @@ func TestEqualIncludeReciprocal(t *testing.T) {
expected := true expected := true
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Equal(): %v was not equal to expected value: %v", "Equal(): %v was not equal to expected value: %v",
actual, expected, actual, expected,
) )
} }
@@ -240,7 +240,7 @@ func TestEqualIncludeReciprocal(t *testing.T) {
expected = false expected = false
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Equal(): %v was not equal to expected value: %v", "Equal(): %v was not equal to expected value: %v",
actual, expected, actual, expected,
) )
} }
@@ -250,7 +250,7 @@ func TestEqualIncludeReciprocal(t *testing.T) {
expected = true expected = true
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Equal(): %v was not equal to expected value: %v", "Equal(): %v was not equal to expected value: %v",
actual, expected, actual, expected,
) )
} }
@@ -263,7 +263,7 @@ func TestSwap(t *testing.T) {
expected := "USDBTC" expected := "USDBTC"
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. TestSwap: %s was not equal to expected value: %s", "TestSwap: %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -273,12 +273,12 @@ func TestEmpty(t *testing.T) {
t.Parallel() t.Parallel()
pair := NewPair(BTC, USD) pair := NewPair(BTC, USD)
if pair.IsEmpty() { if pair.IsEmpty() {
t.Error("Test failed. Empty() returned true when the pair was initialised") t.Error("Empty() returned true when the pair was initialised")
} }
p := NewPair(NewCode(""), NewCode("")) p := NewPair(NewCode(""), NewCode(""))
if !p.IsEmpty() { if !p.IsEmpty() {
t.Error("Test failed. Empty() returned true when the pair wasn't initialised") t.Error("Empty() returned true when the pair wasn't initialised")
} }
} }
@@ -289,7 +289,7 @@ func TestNewPair(t *testing.T) {
expected := defaultPair expected := defaultPair
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Pair(): %s was not equal to expected value: %s", "Pair(): %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -302,7 +302,7 @@ func TestNewPairWithDelimiter(t *testing.T) {
expected := "BTC-test-USD" expected := "BTC-test-USD"
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Pair(): %s was not equal to expected value: %s", "Pair(): %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -312,7 +312,7 @@ func TestNewPairWithDelimiter(t *testing.T) {
expected = defaultPair expected = defaultPair
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Pair(): %s was not equal to expected value: %s", "Pair(): %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -325,7 +325,7 @@ func TestNewPairDelimiter(t *testing.T) {
expected := defaultPairWDelimiter expected := defaultPairWDelimiter
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Pair(): %s was not equal to expected value: %s", "Pair(): %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -334,7 +334,7 @@ func TestNewPairDelimiter(t *testing.T) {
expected = "-" expected = "-"
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Delmiter: %s was not equal to expected value: %s", "Delmiter: %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -349,7 +349,7 @@ func TestNewPairFromIndex(t *testing.T) {
pair, err := NewPairFromIndex(currency, index) pair, err := NewPairFromIndex(currency, index)
if err != nil { if err != nil {
t.Error("test failed - NewPairFromIndex() error", err) t.Error("NewPairFromIndex() error", err)
} }
pair.Delimiter = "-" pair.Delimiter = "-"
@@ -358,7 +358,7 @@ func TestNewPairFromIndex(t *testing.T) {
expected := defaultPairWDelimiter expected := defaultPairWDelimiter
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Pair(): %s was not equal to expected value: %s", "Pair(): %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -367,7 +367,7 @@ func TestNewPairFromIndex(t *testing.T) {
pair, err = NewPairFromIndex(currency, index) pair, err = NewPairFromIndex(currency, index)
if err != nil { if err != nil {
t.Error("test failed - NewPairFromIndex() error", err) t.Error("NewPairFromIndex() error", err)
} }
pair.Delimiter = "-" pair.Delimiter = "-"
@@ -376,7 +376,7 @@ func TestNewPairFromIndex(t *testing.T) {
expected = "DOGE-BTC" expected = "DOGE-BTC"
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Pair(): %s was not equal to expected value: %s", "Pair(): %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -390,7 +390,7 @@ func TestNewPairFromString(t *testing.T) {
expected := defaultPairWDelimiter expected := defaultPairWDelimiter
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Pair(): %s was not equal to expected value: %s", "Pair(): %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -401,7 +401,7 @@ func TestNewPairFromString(t *testing.T) {
expected = defaultPair expected = defaultPair
if actual != expected { if actual != expected {
t.Errorf( t.Errorf(
"Test failed. Pair(): %s was not equal to expected value: %s", "Pair(): %s was not equal to expected value: %s",
actual, expected, actual, expected,
) )
} }
@@ -416,18 +416,18 @@ func TestNewPairFromFormattedPairs(t *testing.T) {
p := NewPairFromFormattedPairs("BTCUSDT", pairs, PairFormat{Uppercase: true}) p := NewPairFromFormattedPairs("BTCUSDT", pairs, PairFormat{Uppercase: true})
if p.String() != "BTC-USDT" { if p.String() != "BTC-USDT" {
t.Error("Test failed. TestNewPairFromFormattedPairs: Expected currency was not found") t.Error("TestNewPairFromFormattedPairs: Expected currency was not found")
} }
p = NewPairFromFormattedPairs("btcusdt", pairs, PairFormat{Uppercase: false}) p = NewPairFromFormattedPairs("btcusdt", pairs, PairFormat{Uppercase: false})
if p.String() != "BTC-USDT" { if p.String() != "BTC-USDT" {
t.Error("Test failed. TestNewPairFromFormattedPairs: Expected currency was not found") t.Error("TestNewPairFromFormattedPairs: Expected currency was not found")
} }
// Now a wrong one, will default to NewPairFromString // Now a wrong one, will default to NewPairFromString
p = NewPairFromFormattedPairs("ethusdt", pairs, PairFormat{}) p = NewPairFromFormattedPairs("ethusdt", pairs, PairFormat{})
if p.String() != "ethusdt" && p.Base.String() != "eth" { if p.String() != "ethusdt" && p.Base.String() != "eth" {
t.Error("Test failed. TestNewPairFromFormattedPairs: Expected currency was not found") t.Error("TestNewPairFromFormattedPairs: Expected currency was not found")
} }
} }
@@ -435,48 +435,48 @@ func TestContainsCurrency(t *testing.T) {
p := NewPair(BTC, USD) p := NewPair(BTC, USD)
if !p.ContainsCurrency(BTC) { if !p.ContainsCurrency(BTC) {
t.Error("Test failed. TestContainsCurrency: Expected currency was not found") t.Error("TestContainsCurrency: Expected currency was not found")
} }
if p.ContainsCurrency(ETH) { if p.ContainsCurrency(ETH) {
t.Error("Test failed. TestContainsCurrency: Non-existent currency was found") t.Error("TestContainsCurrency: Non-existent currency was found")
} }
} }
func TestFormatPairs(t *testing.T) { func TestFormatPairs(t *testing.T) {
newP, err := FormatPairs([]string{""}, "-", "") newP, err := FormatPairs([]string{""}, "-", "")
if err != nil { if err != nil {
t.Error("Test Failed - FormatPairs() error", err) t.Error("FormatPairs() error", err)
} }
if len(newP) > 0 { if len(newP) > 0 {
t.Error("Test failed. TestFormatPairs: Empty string returned a valid pair") t.Error("TestFormatPairs: Empty string returned a valid pair")
} }
newP, err = FormatPairs([]string{defaultPairWDelimiter}, "-", "") newP, err = FormatPairs([]string{defaultPairWDelimiter}, "-", "")
if err != nil { if err != nil {
t.Error("Test Failed - FormatPairs() error", err) t.Error("FormatPairs() error", err)
} }
if newP[0].String() != defaultPairWDelimiter { if newP[0].String() != defaultPairWDelimiter {
t.Error("Test failed. TestFormatPairs: Expected pair was not found") t.Error("TestFormatPairs: Expected pair was not found")
} }
newP, err = FormatPairs([]string{defaultPair}, "", "BTC") newP, err = FormatPairs([]string{defaultPair}, "", "BTC")
if err != nil { if err != nil {
t.Error("Test Failed - FormatPairs() error", err) t.Error("FormatPairs() error", err)
} }
if newP[0].String() != defaultPair { if newP[0].String() != defaultPair {
t.Error("Test failed. TestFormatPairs: Expected pair was not found") t.Error("TestFormatPairs: Expected pair was not found")
} }
newP, err = FormatPairs([]string{"ETHUSD"}, "", "") newP, err = FormatPairs([]string{"ETHUSD"}, "", "")
if err != nil { if err != nil {
t.Error("Test Failed - FormatPairs() error", err) t.Error("FormatPairs() error", err)
} }
if newP[0].String() != "ETHUSD" { if newP[0].String() != "ETHUSD" {
t.Error("Test failed. TestFormatPairs: Expected pair was not found") t.Error("TestFormatPairs: Expected pair was not found")
} }
} }
@@ -492,12 +492,12 @@ func TestCopyPairFormat(t *testing.T) {
result := CopyPairFormat(testPair, pairs, false) result := CopyPairFormat(testPair, pairs, false)
if result.String() != defaultPairWDelimiter { if result.String() != defaultPairWDelimiter {
t.Error("Test failed. TestCopyPairFormat: Expected pair was not found") t.Error("TestCopyPairFormat: Expected pair was not found")
} }
result = CopyPairFormat(NewPair(ETH, USD), pairs, true) result = CopyPairFormat(NewPair(ETH, USD), pairs, true)
if result.String() != "" { if result.String() != "" {
t.Error("Test failed. TestCopyPairFormat: Unexpected non empty pair returned") t.Error("TestCopyPairFormat: Unexpected non empty pair returned")
} }
} }
@@ -507,26 +507,26 @@ func TestFindPairDifferences(t *testing.T) {
// Test new pair update // Test new pair update
newPairs, removedPairs := pairList.FindDifferences(NewPairsFromStrings([]string{"DASH-USD"})) newPairs, removedPairs := pairList.FindDifferences(NewPairsFromStrings([]string{"DASH-USD"}))
if len(newPairs) != 1 && len(removedPairs) != 3 { if len(newPairs) != 1 && len(removedPairs) != 3 {
t.Error("Test failed. TestFindPairDifferences: Unexpected values") t.Error("TestFindPairDifferences: Unexpected values")
} }
// Test that we don't allow empty strings for new pairs // Test that we don't allow empty strings for new pairs
newPairs, removedPairs = pairList.FindDifferences(NewPairsFromStrings([]string{""})) newPairs, removedPairs = pairList.FindDifferences(NewPairsFromStrings([]string{""}))
if len(newPairs) != 0 && len(removedPairs) != 3 { if len(newPairs) != 0 && len(removedPairs) != 3 {
t.Error("Test failed. TestFindPairDifferences: Unexpected values") t.Error("TestFindPairDifferences: Unexpected values")
} }
// Test that we don't allow empty strings for new pairs // Test that we don't allow empty strings for new pairs
newPairs, removedPairs = NewPairsFromStrings([]string{""}).FindDifferences(pairList) newPairs, removedPairs = NewPairsFromStrings([]string{""}).FindDifferences(pairList)
if len(newPairs) != 3 && len(removedPairs) != 0 { if len(newPairs) != 3 && len(removedPairs) != 0 {
t.Error("Test failed. TestFindPairDifferences: Unexpected values") t.Error("TestFindPairDifferences: Unexpected values")
} }
// Test that the supplied pair lists are the same, so // Test that the supplied pair lists are the same, so
// no newPairs or removedPairs // no newPairs or removedPairs
newPairs, removedPairs = pairList.FindDifferences(pairList) newPairs, removedPairs = pairList.FindDifferences(pairList)
if len(newPairs) != 0 && len(removedPairs) != 0 { if len(newPairs) != 0 && len(removedPairs) != 0 {
t.Error("Test failed. TestFindPairDifferences: Unexpected values") t.Error("TestFindPairDifferences: Unexpected values")
} }
} }
@@ -538,7 +538,7 @@ func TestPairsToStringArray(t *testing.T) {
actual := pairs.Strings() actual := pairs.Strings()
if actual[0] != expected[0] { if actual[0] != expected[0] {
t.Error("Test failed. TestPairsToStringArray: Unexpected values") t.Error("TestPairsToStringArray: Unexpected values")
} }
} }
@@ -547,7 +547,7 @@ func TestRandomPairFromPairs(t *testing.T) {
var emptyPairs Pairs var emptyPairs Pairs
result := emptyPairs.GetRandomPair() result := emptyPairs.GetRandomPair()
if !result.IsEmpty() { if !result.IsEmpty() {
t.Error("Test failed. TestRandomPairFromPairs: Unexpected values") t.Error("TestRandomPairFromPairs: Unexpected values")
} }
// Test that a populated pairs array returns a non-empty currency pair // Test that a populated pairs array returns a non-empty currency pair
@@ -556,7 +556,7 @@ func TestRandomPairFromPairs(t *testing.T) {
result = pairs.GetRandomPair() result = pairs.GetRandomPair()
if result.IsEmpty() { if result.IsEmpty() {
t.Error("Test failed. TestRandomPairFromPairs: Unexpected values") t.Error("TestRandomPairFromPairs: Unexpected values")
} }
// Test that a populated pairs array over a number of attempts returns ALL // Test that a populated pairs array over a number of attempts returns ALL
@@ -574,7 +574,7 @@ func TestRandomPairFromPairs(t *testing.T) {
for x := range pairs { for x := range pairs {
_, ok := expectedResults[pairs[x].String()] _, ok := expectedResults[pairs[x].String()]
if !ok { if !ok {
t.Error("Test failed. TestRandomPairFromPairs: Unexpected values") t.Error("TestRandomPairFromPairs: Unexpected values")
} }
} }
} }
@@ -582,6 +582,6 @@ func TestRandomPairFromPairs(t *testing.T) {
func TestIsInvalid(t *testing.T) { func TestIsInvalid(t *testing.T) {
p := NewPair(LTC, LTC) p := NewPair(LTC, LTC)
if !p.IsInvalid() { if !p.IsInvalid() {
t.Error("Test Failed - IsInvalid() error expect true but received false") t.Error("IsInvalid() error expect true but received false")
} }
} }

View File

@@ -22,9 +22,6 @@ func NewPairsFromStrings(pairs []string) Pairs {
return ps return ps
} }
// Pairs defines a list of pairs
type Pairs []Pair
// Strings returns a slice of strings referring to each currency pair // Strings returns a slice of strings referring to each currency pair
func (p Pairs) Strings() []string { func (p Pairs) Strings() []string {
var list []string var list []string
@@ -186,3 +183,6 @@ func (p Pairs) GetRandomPair() Pair {
return p[rand.Intn(pairsLen)] return p[rand.Intn(pairsLen)]
} }
// Pairs defines a list of pairs
type Pairs []Pair

View File

@@ -11,7 +11,7 @@ func TestPairsUpper(t *testing.T) {
expected := "BTC_USD,BTC_AUD,BTC_LTC" expected := "BTC_USD,BTC_AUD,BTC_LTC"
if pairs.Upper().Join() != expected { if pairs.Upper().Join() != expected {
t.Errorf("Test Failed - Pairs Join() error expected %s but received %s", t.Errorf("Pairs Join() error expected %s but received %s",
expected, pairs.Join()) expected, pairs.Join())
} }
} }
@@ -22,7 +22,7 @@ func TestPairsString(t *testing.T) {
for i, p := range pairs { for i, p := range pairs {
if p.String() != expected[i] { if p.String() != expected[i] {
t.Errorf("Test Failed - Pairs String() error expected %s but received %s", t.Errorf("Pairs String() error expected %s but received %s",
expected, p.String()) expected, p.String())
} }
} }
@@ -33,7 +33,7 @@ func TestPairsJoin(t *testing.T) {
expected := "btc_usd,btc_aud,btc_ltc" expected := "btc_usd,btc_aud,btc_ltc"
if pairs.Join() != expected { if pairs.Join() != expected {
t.Errorf("Test Failed - Pairs Join() error expected %s but received %s", t.Errorf("Pairs Join() error expected %s but received %s",
expected, pairs.Join()) expected, pairs.Join())
} }
} }
@@ -43,25 +43,25 @@ func TestPairsFormat(t *testing.T) {
expected := "BTC-USD,BTC-AUD,BTC-LTC" expected := "BTC-USD,BTC-AUD,BTC-LTC"
if pairs.Format("-", "", true).Join() != expected { if pairs.Format("-", "", true).Join() != expected {
t.Errorf("Test Failed - Pairs Join() error expected %s but received %s", t.Errorf("Pairs Join() error expected %s but received %s",
expected, pairs.Format("-", "", true).Join()) expected, pairs.Format("-", "", true).Join())
} }
expected = "btc:usd,btc:aud,btc:ltc" expected = "btc:usd,btc:aud,btc:ltc"
if pairs.Format(":", "", false).Join() != expected { if pairs.Format(":", "", false).Join() != expected {
t.Errorf("Test Failed - Pairs Join() error expected %s but received %s", t.Errorf("Pairs Join() error expected %s but received %s",
expected, pairs.Format(":", "", false).Join()) expected, pairs.Format(":", "", false).Join())
} }
if pairs.Format(":", "KRW", false).Join() != "" { if pairs.Format(":", "KRW", false).Join() != "" {
t.Errorf("Test Failed - Pairs Join() error expected %s but received %s", t.Errorf("Pairs Join() error expected %s but received %s",
expected, pairs.Format(":", "KRW", true).Join()) expected, pairs.Format(":", "KRW", true).Join())
} }
pairs = NewPairsFromStrings([]string{"DASHKRW", "BTCKRW"}) pairs = NewPairsFromStrings([]string{"DASHKRW", "BTCKRW"})
expected = "dash-krw,btc-krw" expected = "dash-krw,btc-krw"
if pairs.Format("-", "KRW", false).Join() != expected { if pairs.Format("-", "KRW", false).Join() != expected {
t.Errorf("Test Failed - Pairs Join() error expected %s but received %s", t.Errorf("Pairs Join() error expected %s but received %s",
expected, pairs.Format("-", "KRW", false).Join()) expected, pairs.Format("-", "KRW", false).Join())
} }
} }
@@ -72,21 +72,21 @@ func TestPairsUnmarshalJSON(t *testing.T) {
encoded, err := common.JSONEncode(configPairs) encoded, err := common.JSONEncode(configPairs)
if err != nil { if err != nil {
t.Fatal("Test Failed - Pairs UnmarshalJSON() error", err) t.Fatal("Pairs UnmarshalJSON() error", err)
} }
err = common.JSONDecode(encoded, &unmarshalHere) err = common.JSONDecode(encoded, &unmarshalHere)
if err != nil { if err != nil {
t.Fatal("Test Failed - Pairs UnmarshalJSON() error", err) t.Fatal("Pairs UnmarshalJSON() error", err)
} }
err = common.JSONDecode(encoded, &unmarshalHere) err = common.JSONDecode(encoded, &unmarshalHere)
if err != nil { if err != nil {
t.Fatal("Test Failed - Pairs UnmarshalJSON() error", err) t.Fatal("Pairs UnmarshalJSON() error", err)
} }
if unmarshalHere.Join() != configPairs { if unmarshalHere.Join() != configPairs {
t.Errorf("Test Failed - Pairs UnmarshalJSON() error expected %s but received %s", t.Errorf("Pairs UnmarshalJSON() error expected %s but received %s",
configPairs, unmarshalHere.Join()) configPairs, unmarshalHere.Join())
} }
} }
@@ -100,12 +100,12 @@ func TestPairsMarshalJSON(t *testing.T) {
encoded, err := common.JSONEncode(quickstruct) encoded, err := common.JSONEncode(quickstruct)
if err != nil { if err != nil {
t.Fatal("Test Failed - Pairs MarshalJSON() error", err) t.Fatal("Pairs MarshalJSON() error", err)
} }
expected := `{"soManyPairs":"btc_usd,btc_aud,btc_ltc"}` expected := `{"soManyPairs":"btc_usd,btc_aud,btc_ltc"}`
if string(encoded) != expected { if string(encoded) != expected {
t.Errorf("Test Failed - Pairs MarshalJSON() error expected %s but received %s", t.Errorf("Pairs MarshalJSON() error expected %s but received %s",
expected, string(encoded)) expected, string(encoded))
} }
} }
@@ -119,7 +119,7 @@ func TestRemovePairsByFilter(t *testing.T) {
pairs = pairs.RemovePairsByFilter(USDT) pairs = pairs.RemovePairsByFilter(USDT)
if pairs.Contains(NewPair(LTC, USDT), true) { if pairs.Contains(NewPair(LTC, USDT), true) {
t.Error("Test failed. TestRemovePairsByFilter unexpected result") t.Error("TestRemovePairsByFilter unexpected result")
} }
} }
@@ -133,7 +133,7 @@ func TestRemove(t *testing.T) {
p := NewPair(BTC, USD) p := NewPair(BTC, USD)
pairs = pairs.Remove(p) pairs = pairs.Remove(p)
if pairs.Contains(p, true) || len(pairs) != 2 { if pairs.Contains(p, true) || len(pairs) != 2 {
t.Error("Test failed. TestRemove unexpected result") t.Error("TestRemove unexpected result")
} }
} }
@@ -148,13 +148,13 @@ func TestAdd(t *testing.T) {
p := NewPair(BTC, USDT) p := NewPair(BTC, USDT)
pairs = pairs.Add(p) pairs = pairs.Add(p)
if !pairs.Contains(p, true) || len(pairs) != 4 { if !pairs.Contains(p, true) || len(pairs) != 4 {
t.Error("Test failed. TestAdd unexpected result") t.Error("TestAdd unexpected result")
} }
// Now test adding a pair which already exists // Now test adding a pair which already exists
pairs = pairs.Add(p) pairs = pairs.Add(p)
if len(pairs) != 4 { if len(pairs) != 4 {
t.Error("Test failed. TestAdd unexpected result") t.Error("TestAdd unexpected result")
} }
} }
@@ -165,10 +165,10 @@ func TestContains(t *testing.T) {
} }
if !pairs.Contains(NewPair(BTC, USD), true) { if !pairs.Contains(NewPair(BTC, USD), true) {
t.Errorf("Test failed. TestContains: Expected pair was not found") t.Errorf("TestContains: Expected pair was not found")
} }
if pairs.Contains(NewPair(ETH, USD), false) { if pairs.Contains(NewPair(ETH, USD), false) {
t.Errorf("Test failed. TestContains: Non-existent pair was found") t.Errorf("TestContains: Non-existent pair was found")
} }
} }

View File

@@ -6,7 +6,6 @@ import (
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"path/filepath" "path/filepath"
"sync"
"time" "time"
"github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common"
@@ -16,75 +15,10 @@ import (
log "github.com/thrasher-corp/gocryptotrader/logger" log "github.com/thrasher-corp/gocryptotrader/logger"
) )
// CurrencyFileUpdateDelay defines the rate at which the currency.json file is
// updated
const (
DefaultCurrencyFileDelay = 168 * time.Hour
DefaultForeignExchangeDelay = 1 * time.Minute
DefaultStorageFile = "currency.json"
)
func init() { func init() {
storage.SetDefaults() storage.SetDefaults()
} }
// storage is an overarching type that keeps track of and updates currency,
// currency exchange rates and pairs
var storage Storage
// Storage contains the loaded storage currencies supported on available crypto
// or fiat marketplaces
// NOTE: All internal currencies are upper case
type Storage struct {
// FiatCurrencies defines the running fiat currencies in the currency
// storage
fiatCurrencies Currencies
// Cryptocurrencies defines the running cryptocurrencies in the currency
// storage
cryptocurrencies Currencies
// CurrencyCodes is a full basket of currencies either crypto, fiat, ico or
// contract being tracked by the currency storage system
currencyCodes BaseCodes
// Main converting currency
baseCurrency Code
// FXRates defines a protected conversion rate map
fxRates ConversionRates
// DefaultBaseCurrency is the base currency used for conversion
defaultBaseCurrency Code
// DefaultFiatCurrencies has the default minimum of FIAT values
defaultFiatCurrencies Currencies
// DefaultCryptoCurrencies has the default minimum of crytpocurrency values
defaultCryptoCurrencies Currencies
// FiatExchangeMarkets defines an interface to access FX data for fiat
// currency rates
fiatExchangeMarkets *forexprovider.ForexProviders
// CurrencyAnalysis defines a full market analysis suite to receieve and
// define different fiat currencies, cryptocurrencies and markets
currencyAnalysis *coinmarketcap.Coinmarketcap
// Path defines the main folder to dump and find currency JSON
path string
// Update delay variables
currencyFileUpdateDelay time.Duration
foreignExchangeUpdateDelay time.Duration
mtx sync.Mutex
wg sync.WaitGroup
shutdownC chan struct{}
updaterRunning bool
Verbose bool
}
// SetDefaults sets storage defaults for basic package functionality // SetDefaults sets storage defaults for basic package functionality
func (s *Storage) SetDefaults() { func (s *Storage) SetDefaults() {
s.defaultBaseCurrency = USD s.defaultBaseCurrency = USD

View File

@@ -8,7 +8,7 @@ func TestRunUpdater(t *testing.T) {
emptyMainConfig := MainConfiguration{} emptyMainConfig := MainConfiguration{}
err := newStorage.RunUpdater(BotOverrides{}, &emptyMainConfig, "", false) err := newStorage.RunUpdater(BotOverrides{}, &emptyMainConfig, "", false)
if err == nil { if err == nil {
t.Fatal("Test Failed storage RunUpdater() error cannot be nil") t.Fatal("storage RunUpdater() error cannot be nil")
} }
mainConfig := MainConfiguration{ mainConfig := MainConfiguration{
@@ -18,11 +18,11 @@ func TestRunUpdater(t *testing.T) {
err = newStorage.RunUpdater(BotOverrides{}, &mainConfig, "", false) err = newStorage.RunUpdater(BotOverrides{}, &mainConfig, "", false)
if err == nil { if err == nil {
t.Fatal("Test Failed storage RunUpdater() error cannot be nil") t.Fatal("storage RunUpdater() error cannot be nil")
} }
err = newStorage.RunUpdater(BotOverrides{}, &mainConfig, "/bla", false) err = newStorage.RunUpdater(BotOverrides{}, &mainConfig, "/bla", false)
if err != nil { if err != nil {
t.Fatal("Test Failed storage RunUpdater() error", err) t.Fatal("storage RunUpdater() error", err)
} }
} }

62
currency/storage_types.go Normal file
View File

@@ -0,0 +1,62 @@
package currency
import (
"sync"
"time"
"github.com/thrasher-corp/gocryptotrader/currency/coinmarketcap"
"github.com/thrasher-corp/gocryptotrader/currency/forexprovider"
)
// CurrencyFileUpdateDelay defines the rate at which the currency.json file is
// updated
const (
DefaultCurrencyFileDelay = 168 * time.Hour
DefaultForeignExchangeDelay = 1 * time.Minute
DefaultStorageFile = "currency.json"
)
// storage is an overarching type that keeps track of and updates currency,
// currency exchange rates and pairs
var storage Storage
// Storage contains the loaded storage currencies supported on available crypto
// or fiat marketplaces
// NOTE: All internal currencies are upper case
type Storage struct {
// FiatCurrencies defines the running fiat currencies in the currency
// storage
fiatCurrencies Currencies
// Cryptocurrencies defines the running cryptocurrencies in the currency
// storage
cryptocurrencies Currencies
// CurrencyCodes is a full basket of currencies either crypto, fiat, ico or
// contract being tracked by the currency storage system
currencyCodes BaseCodes
// Main converting currency
baseCurrency Code
// FXRates defines a protected conversion rate map
fxRates ConversionRates
// DefaultBaseCurrency is the base currency used for conversion
defaultBaseCurrency Code
// DefaultFiatCurrencies has the default minimum of FIAT values
defaultFiatCurrencies Currencies
// DefaultCryptoCurrencies has the default minimum of crytpocurrency values
defaultCryptoCurrencies Currencies
// FiatExchangeMarkets defines an interface to access FX data for fiat
// currency rates
fiatExchangeMarkets *forexprovider.ForexProviders
// CurrencyAnalysis defines a full market analysis suite to receieve and
// define different fiat currencies, cryptocurrencies and markets
currencyAnalysis *coinmarketcap.Coinmarketcap
// Path defines the main folder to dump and find currency JSON
path string
// Update delay variables
currencyFileUpdateDelay time.Duration
foreignExchangeUpdateDelay time.Duration
mtx sync.Mutex
wg sync.WaitGroup
shutdownC chan struct{}
updaterRunning bool
Verbose bool
}

View File

@@ -2,6 +2,15 @@ package currency
import "errors" import "errors"
// GetSymbolByCurrencyName returns a currency symbol
func GetSymbolByCurrencyName(currency Code) (string, error) {
result, ok := symbols[currency.Item]
if !ok {
return "", errors.New("currency symbol not found")
}
return result, nil
}
// symbols map holds the currency name and symbol mappings // symbols map holds the currency name and symbol mappings
var symbols = map[*Item]string{ var symbols = map[*Item]string{
ALL.Item: "Lek", ALL.Item: "Lek",
@@ -116,12 +125,3 @@ var symbols = map[*Item]string{
YER.Item: "﷼", YER.Item: "﷼",
ZWD.Item: "Z$", ZWD.Item: "Z$",
} }
// GetSymbolByCurrencyName returns a currency symbol
func GetSymbolByCurrencyName(currency Code) (string, error) {
result, ok := symbols[currency.Item]
if !ok {
return "", errors.New("currency symbol not found")
}
return result, nil
}

View File

@@ -6,16 +6,16 @@ func TestGetSymbolByCurrencyName(t *testing.T) {
expected := "₩" expected := "₩"
actual, err := GetSymbolByCurrencyName(KPW) actual, err := GetSymbolByCurrencyName(KPW)
if err != nil { if err != nil {
t.Errorf("Test failed. TestGetSymbolByCurrencyName error: %s", err) t.Errorf("TestGetSymbolByCurrencyName error: %s", err)
} }
if actual != expected { if actual != expected {
t.Errorf("Test failed. TestGetSymbolByCurrencyName differing values") t.Errorf("TestGetSymbolByCurrencyName differing values")
} }
_, err = GetSymbolByCurrencyName(Code{}) _, err = GetSymbolByCurrencyName(Code{})
if err == nil { if err == nil {
t.Errorf("Test failed. TestGetSymbolByCurrencyNam returned nil on non-existent currency") t.Errorf("TestGetSymbolByCurrencyNam returned nil on non-existent currency")
} }
} }

View File

@@ -1,5 +1,15 @@
package currency package currency
// GetTranslation returns similar strings for a particular currency if not found
// returns the code back
func GetTranslation(currency Code) (Code, bool) {
val, ok := translations[currency]
if !ok {
return currency, ok
}
return val, ok
}
var translations = map[Code]Code{ var translations = map[Code]Code{
BTC: XBT, BTC: XBT,
ETH: XETH, ETH: XETH,
@@ -10,13 +20,3 @@ var translations = map[Code]Code{
XDG: DOGE, XDG: DOGE,
USDT: USD, USDT: USD,
} }
// GetTranslation returns similar strings for a particular currency if not found
// returns the code back
func GetTranslation(currency Code) (Code, bool) {
val, ok := translations[currency]
if !ok {
return currency, ok
}
return val, ok
}

View File

@@ -116,9 +116,9 @@ func TestDispatcher(t *testing.T) {
t.Error("error cannot be nil") t.Error("error cannot be nil")
} }
id, errrrrrrrr := dispatcher.getNewID() id, err := dispatcher.getNewID()
if errrrrrrrr != nil { if err != nil {
t.Error(errrrrrrrr) t.Error(err)
} }
err = dispatcher.publish(id, &payload) err = dispatcher.publish(id, &payload)
@@ -159,18 +159,18 @@ func TestDispatcher(t *testing.T) {
randomChan := make(chan interface{}) randomChan := make(chan interface{})
err = dispatcher.unsubscribe(someID, randomChan) err = dispatcher.unsubscribe(someID, randomChan)
if err == nil { if err == nil {
t.Error(err) t.Error("Expected error")
} }
err = dispatcher.unsubscribe(id, randomChan) err = dispatcher.unsubscribe(id, randomChan)
if err == nil { if err == nil {
t.Error(err) t.Error("Expected error")
} }
close(randomChan) close(randomChan)
err = dispatcher.unsubscribe(id, randomChan) err = dispatcher.unsubscribe(id, randomChan)
if err == nil { if err == nil {
t.Error(err) t.Error("Expected error")
} }
} }

View File

@@ -16,7 +16,7 @@ func SetupTest(t *testing.T) {
Bot.Config = &config.Cfg Bot.Config = &config.Cfg
err := Bot.Config.LoadConfig("", true) err := Bot.Config.LoadConfig("", true)
if err != nil { if err != nil {
t.Fatalf("Test failed. SetupTest: Failed to load config: %s", err) t.Fatalf("SetupTest: Failed to load config: %s", err)
} }
testSetup = true testSetup = true
} }
@@ -26,7 +26,7 @@ func SetupTest(t *testing.T) {
} }
err := LoadExchange("Bitfinex", false, nil) err := LoadExchange("Bitfinex", false, nil)
if err != nil { if err != nil {
t.Errorf("Test failed. SetupTest: Failed to load exchange: %s", err) t.Errorf("SetupTest: Failed to load exchange: %s", err)
} }
} }
@@ -37,7 +37,7 @@ func CleanupTest(t *testing.T) {
err := UnloadExchange("Bitfinex") err := UnloadExchange("Bitfinex")
if err != nil { if err != nil {
t.Fatalf("Test failed. CleanupTest: Failed to unload exchange: %s", t.Fatalf("CleanupTest: Failed to unload exchange: %s",
err) err)
} }
} }
@@ -46,11 +46,11 @@ func TestCheckExchangeExists(t *testing.T) {
SetupTest(t) SetupTest(t)
if !CheckExchangeExists("Bitfinex") { if !CheckExchangeExists("Bitfinex") {
t.Errorf("Test failed. TestGetExchangeExists: Unable to find exchange") t.Errorf("TestGetExchangeExists: Unable to find exchange")
} }
if CheckExchangeExists("Asdsad") { if CheckExchangeExists("Asdsad") {
t.Errorf("Test failed. TestGetExchangeExists: Non-existent exchange found") t.Errorf("TestGetExchangeExists: Non-existent exchange found")
} }
CleanupTest(t) CleanupTest(t)
@@ -61,26 +61,26 @@ func TestGetExchangeByName(t *testing.T) {
exch := GetExchangeByName("Bitfinex") exch := GetExchangeByName("Bitfinex")
if exch == nil { if exch == nil {
t.Errorf("Test failed. TestGetExchangeByName: Failed to get exchange") t.Errorf("TestGetExchangeByName: Failed to get exchange")
} }
if !exch.IsEnabled() { if !exch.IsEnabled() {
t.Errorf("Test failed. TestGetExchangeByName: Unexpected result") t.Errorf("TestGetExchangeByName: Unexpected result")
} }
exch.SetEnabled(false) exch.SetEnabled(false)
bfx := GetExchangeByName("Bitfinex") bfx := GetExchangeByName("Bitfinex")
if bfx.IsEnabled() { if bfx.IsEnabled() {
t.Errorf("Test failed. TestGetExchangeByName: Unexpected result") t.Errorf("TestGetExchangeByName: Unexpected result")
} }
if exch.GetName() != "Bitfinex" { if exch.GetName() != "Bitfinex" {
t.Errorf("Test failed. TestGetExchangeByName: Unexpected result") t.Errorf("TestGetExchangeByName: Unexpected result")
} }
exch = GetExchangeByName("Asdasd") exch = GetExchangeByName("Asdasd")
if exch != nil { if exch != nil {
t.Errorf("Test failed. TestGetExchangeByName: Non-existent exchange found") t.Errorf("TestGetExchangeByName: Non-existent exchange found")
} }
CleanupTest(t) CleanupTest(t)
@@ -91,13 +91,13 @@ func TestReloadExchange(t *testing.T) {
err := ReloadExchange("asdf") err := ReloadExchange("asdf")
if err != ErrExchangeNotFound { if err != ErrExchangeNotFound {
t.Errorf("Test failed. TestReloadExchange: Incorrect result: %s", t.Errorf("TestReloadExchange: Incorrect result: %s",
err) err)
} }
err = ReloadExchange("Bitfinex") err = ReloadExchange("Bitfinex")
if err != nil { if err != nil {
t.Errorf("Test failed. TestReloadExchange: Incorrect result: %s", t.Errorf("TestReloadExchange: Incorrect result: %s",
err) err)
} }
@@ -105,7 +105,7 @@ func TestReloadExchange(t *testing.T) {
err = ReloadExchange("asdf") err = ReloadExchange("asdf")
if err != ErrNoExchangesLoaded { if err != ErrNoExchangesLoaded {
t.Errorf("Test failed. TestReloadExchange: Incorrect result: %s", t.Errorf("TestReloadExchange: Incorrect result: %s",
err) err)
} }
} }
@@ -115,19 +115,19 @@ func TestUnloadExchange(t *testing.T) {
err := UnloadExchange("asdf") err := UnloadExchange("asdf")
if err != ErrExchangeNotFound { if err != ErrExchangeNotFound {
t.Errorf("Test failed. TestUnloadExchange: Incorrect result: %s", t.Errorf("TestUnloadExchange: Incorrect result: %s",
err) err)
} }
err = UnloadExchange("Bitfinex") err = UnloadExchange("Bitfinex")
if err != nil { if err != nil {
t.Errorf("Test failed. TestUnloadExchange: Failed to get exchange. %s", t.Errorf("TestUnloadExchange: Failed to get exchange. %s",
err) err)
} }
err = UnloadExchange("asdf") err = UnloadExchange("asdf")
if err != ErrNoExchangesLoaded { if err != ErrNoExchangesLoaded {
t.Errorf("Test failed. TestUnloadExchange: Incorrect result: %s", t.Errorf("TestUnloadExchange: Incorrect result: %s",
err) err)
} }

View File

@@ -31,7 +31,7 @@ func SetupTestHelpers(t *testing.T) {
Bot.Config = &config.Cfg Bot.Config = &config.Cfg
err := Bot.Config.LoadConfig("../testdata/configtest.json", true) err := Bot.Config.LoadConfig("../testdata/configtest.json", true)
if err != nil { if err != nil {
t.Fatalf("Test failed. SetupTest: Failed to load config: %s", err) t.Fatalf("SetupTest: Failed to load config: %s", err)
} }
testSetup = true testSetup = true
} }
@@ -428,7 +428,7 @@ func TestGetSpecificTicker(t *testing.T) {
&ticker.Price{Pair: p, Last: 1000}, &ticker.Price{Pair: p, Last: 1000},
asset.Spot) asset.Spot)
if err != nil { if err != nil {
t.Fatal("Test failed. ProcessTicker error", err) t.Fatal("ProcessTicker error", err)
} }
tick, err := GetSpecificTicker(currency.NewPairFromStrings("BTC", "USD"), "Bitstamp", tick, err := GetSpecificTicker(currency.NewPairFromStrings("BTC", "USD"), "Bitstamp",
@@ -587,6 +587,6 @@ func TestGetCryptocurrenciesByExchange(t *testing.T) {
_, err := GetCryptocurrenciesByExchange("Bitfinex", false, false, asset.Spot) _, err := GetCryptocurrenciesByExchange("Bitfinex", false, false, asset.Spot)
if err != nil { if err != nil {
t.Fatalf("Test failed. Err %s", err) t.Fatalf("Err %s", err)
} }
} }

View File

@@ -15,7 +15,7 @@ func loadConfig(t *testing.T) *config.Config {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("", true) err := cfg.LoadConfig("", true)
if err != nil { if err != nil {
t.Error("Test failed. GetCurrencyConfig LoadConfig error", err) t.Error("GetCurrencyConfig LoadConfig error", err)
} }
return cfg return cfg
} }
@@ -25,7 +25,7 @@ func makeHTTPGetRequest(t *testing.T, response interface{}) *http.Response {
err := RESTfulJSONResponse(w, response) err := RESTfulJSONResponse(w, response)
if err != nil { if err != nil {
t.Error("Test failed. Failed to make response.", err) t.Error("Failed to make response.", err)
} }
return w.Result() return w.Result()
} }
@@ -37,17 +37,17 @@ func TestConfigAllJsonResponse(t *testing.T) {
body, err := ioutil.ReadAll(resp.Body) body, err := ioutil.ReadAll(resp.Body)
resp.Body.Close() resp.Body.Close()
if err != nil { if err != nil {
t.Error("Test failed. Body not readable", err) t.Error("Body not readable", err)
} }
var responseConfig config.Config var responseConfig config.Config
jsonErr := json.Unmarshal(body, &responseConfig) jsonErr := json.Unmarshal(body, &responseConfig)
if jsonErr != nil { if jsonErr != nil {
t.Error("Test failed. Response not parseable as json", err) t.Error("Response not parseable as json", err)
} }
if reflect.DeepEqual(responseConfig, cfg) { if reflect.DeepEqual(responseConfig, cfg) {
t.Error("Test failed. Json not equal to config") t.Error("Json not equal to config")
} }
} }
@@ -62,7 +62,7 @@ func TestInvalidHostRequest(t *testing.T) {
newRouter(true).ServeHTTP(resp, req) newRouter(true).ServeHTTP(resp, req)
if status := resp.Code; status != http.StatusNotFound { if status := resp.Code; status != http.StatusNotFound {
t.Errorf("Test failed. Response returned wrong status code expected %v got %v", http.StatusNotFound, status) t.Errorf("Response returned wrong status code expected %v got %v", http.StatusNotFound, status)
} }
} }
@@ -77,6 +77,6 @@ func TestValidHostRequest(t *testing.T) {
newRouter(true).ServeHTTP(resp, req) newRouter(true).ServeHTTP(resp, req)
if status := resp.Code; status != http.StatusOK { if status := resp.Code; status != http.StatusOK {
t.Errorf("Test failed. Response returned wrong status code expected %v got %v", http.StatusOK, status) t.Errorf("Response returned wrong status code expected %v got %v", http.StatusOK, status)
} }
} }

View File

@@ -16,7 +16,7 @@ func TestNewCurrencyPairSyncer(t *testing.T) {
Bot.Config = &config.Cfg Bot.Config = &config.Cfg
err := Bot.Config.LoadConfig("", true) err := Bot.Config.LoadConfig("", true)
if err != nil { if err != nil {
t.Fatalf("Test failed. TestNewExchangeSyncer: Failed to load config: %s", err) t.Fatalf("TestNewExchangeSyncer: Failed to load config: %s", err)
} }
Bot.Settings.DisableExchangeAutoPairUpdates = true Bot.Settings.DisableExchangeAutoPairUpdates = true

View File

@@ -21,10 +21,10 @@ func TestSetDefaults(t *testing.T) {
SetDefaults.SetDefaults() SetDefaults.SetDefaults()
if SetDefaults.API.Endpoints.URL != "https://sim3.alphapoint.com:8400" { if SetDefaults.API.Endpoints.URL != "https://sim3.alphapoint.com:8400" {
t.Error("Test Failed - SetDefaults: String Incorrect -", SetDefaults.API.Endpoints.URL) t.Error("SetDefaults: String Incorrect -", SetDefaults.API.Endpoints.URL)
} }
if SetDefaults.API.Endpoints.WebsocketURL != "wss://sim3.alphapoint.com:8401/v1/GetTicker/" { if SetDefaults.API.Endpoints.WebsocketURL != "wss://sim3.alphapoint.com:8401/v1/GetTicker/" {
t.Error("Test Failed - SetDefaults: String Incorrect -", SetDefaults.API.Endpoints.WebsocketURL) t.Error("SetDefaults: String Incorrect -", SetDefaults.API.Endpoints.WebsocketURL)
} }
} }
@@ -50,12 +50,12 @@ func TestGetTicker(t *testing.T) {
if onlineTest { if onlineTest {
ticker, err = alpha.GetTicker("BTCUSD") ticker, err = alpha.GetTicker("BTCUSD")
if err != nil { if err != nil {
t.Fatal("Test Failed - Alphapoint GetTicker init error: ", err) t.Fatal("Alphapoint GetTicker init error: ", err)
} }
_, err = alpha.GetTicker("wigwham") _, err = alpha.GetTicker("wigwham")
if err == nil { if err == nil {
t.Error("Test Failed - Alphapoint GetTicker error") t.Error("Alphapoint GetTicker Expected error")
} }
} else { } else {
mockResp := []byte( mockResp := []byte(
@@ -64,16 +64,16 @@ func TestGetTicker(t *testing.T) {
err = common.JSONDecode(mockResp, &ticker) err = common.JSONDecode(mockResp, &ticker)
if err != nil { if err != nil {
t.Fatal("Test Failed - Alphapoint GetTicker unmarshalling error: ", err) t.Fatal("Alphapoint GetTicker unmarshalling error: ", err)
} }
if ticker.Last != 249.76 { if ticker.Last != 249.76 {
t.Error("Test failed - Alphapoint GetTicker expected last = 249.76") t.Error("Alphapoint GetTicker expected last = 249.76")
} }
} }
if ticker.Last < 0 { if ticker.Last < 0 {
t.Error("Test failed - Alphapoint GetTicker last < 0") t.Error("Alphapoint GetTicker last < 0")
} }
} }
@@ -87,12 +87,12 @@ func TestGetTrades(t *testing.T) {
if onlineTest { if onlineTest {
trades, err = alpha.GetTrades("BTCUSD", 0, 10) trades, err = alpha.GetTrades("BTCUSD", 0, 10)
if err != nil { if err != nil {
t.Fatalf("Test Failed - Init error: %s", err) t.Fatalf("Init error: %s", err)
} }
_, err = alpha.GetTrades("wigwham", 0, 10) _, err = alpha.GetTrades("wigwham", 0, 10)
if err == nil { if err == nil {
t.Fatal("Test Failed - GetTrades error") t.Fatal("GetTrades Expected error")
} }
} else { } else {
mockResp := []byte( mockResp := []byte(
@@ -101,20 +101,20 @@ func TestGetTrades(t *testing.T) {
err = common.JSONDecode(mockResp, &trades) err = common.JSONDecode(mockResp, &trades)
if err != nil { if err != nil {
t.Fatal("Test Failed - GetTrades unmarshalling error: ", err) t.Fatal("GetTrades unmarshalling error: ", err)
} }
} }
if !trades.IsAccepted { if !trades.IsAccepted {
t.Error("Test Failed - GetTrades IsAccepted failed") t.Error("GetTrades IsAccepted failed")
} }
if trades.Count <= 0 { if trades.Count <= 0 {
t.Error("Test failed - GetTrades trades count is <= 0") t.Error("GetTrades trades count is <= 0")
} }
if trades.Instrument != "BTCUSD" { if trades.Instrument != "BTCUSD" {
t.Error("Test failed - GetTrades instrument is != BTCUSD") t.Error("GetTrades instrument is != BTCUSD")
} }
} }
@@ -128,11 +128,11 @@ func TestGetTradesByDate(t *testing.T) {
if onlineTest { if onlineTest {
trades, err = alpha.GetTradesByDate("BTCUSD", 1414799400, 1414800000) trades, err = alpha.GetTradesByDate("BTCUSD", 1414799400, 1414800000)
if err != nil { if err != nil {
t.Errorf("Test Failed - Init error: %s", err) t.Errorf("Init error: %s", err)
} }
_, err = alpha.GetTradesByDate("wigwham", 1414799400, 1414800000) _, err = alpha.GetTradesByDate("wigwham", 1414799400, 1414800000)
if err == nil { if err == nil {
t.Error("Test Failed - GetTradesByDate error") t.Error("GetTradesByDate Expected error")
} }
} else { } else {
mockResp := []byte( mockResp := []byte(
@@ -141,27 +141,27 @@ func TestGetTradesByDate(t *testing.T) {
err = common.JSONDecode(mockResp, &trades) err = common.JSONDecode(mockResp, &trades)
if err != nil { if err != nil {
t.Fatal("Test Failed - GetTradesByDate unmarshalling error: ", err) t.Fatal("GetTradesByDate unmarshalling error: ", err)
} }
} }
if trades.DateTimeUTC < 0 { if trades.DateTimeUTC < 0 {
t.Error("Test Failed - Alphapoint trades.Count value is negative") t.Error("Alphapoint trades.Count value is negative")
} }
if trades.EndDate < 0 { if trades.EndDate < 0 {
t.Error("Test Failed - Alphapoint trades.DateTimeUTC value is negative") t.Error("Alphapoint trades.DateTimeUTC value is negative")
} }
if trades.Instrument != "BTCUSD" { if trades.Instrument != "BTCUSD" {
t.Error("Test Failed - Alphapoint trades.Instrument value is incorrect") t.Error("Alphapoint trades.Instrument value is incorrect")
} }
if !trades.IsAccepted { if !trades.IsAccepted {
t.Error("Test Failed - Alphapoint trades.IsAccepted value is true") t.Error("Alphapoint trades.IsAccepted value is true")
} }
if len(trades.RejectReason) > 0 { if len(trades.RejectReason) > 0 {
t.Error("Test Failed - Alphapoint trades.IsAccepted value has been returned") t.Error("Alphapoint trades.IsAccepted value has been returned")
} }
if trades.StartDate < 0 { if trades.StartDate < 0 {
t.Error("Test Failed - Alphapoint trades.StartIndex value is negative") t.Error("Alphapoint trades.StartIndex value is negative")
} }
} }
@@ -175,12 +175,12 @@ func TestGetOrderbook(t *testing.T) {
if onlineTest { if onlineTest {
orderBook, err = alpha.GetOrderbook("BTCUSD") orderBook, err = alpha.GetOrderbook("BTCUSD")
if err != nil { if err != nil {
t.Errorf("Test Failed - Init error: %s", err) t.Errorf("Init error: %s", err)
} }
_, err = alpha.GetOrderbook("wigwham") _, err = alpha.GetOrderbook("wigwham")
if err == nil { if err == nil {
t.Error("Test Failed - GetOrderbook() error") t.Error("GetOrderbook() Expected error")
} }
} else { } else {
mockResp := []byte( mockResp := []byte(
@@ -189,24 +189,24 @@ func TestGetOrderbook(t *testing.T) {
err = common.JSONDecode(mockResp, &orderBook) err = common.JSONDecode(mockResp, &orderBook)
if err != nil { if err != nil {
t.Fatal("Test Failed - TestGetOrderbook unmarshalling error: ", err) t.Fatal("TestGetOrderbook unmarshalling error: ", err)
} }
if orderBook.Bids[0].Quantity != 725 { if orderBook.Bids[0].Quantity != 725 {
t.Error("Test Failed - TestGetOrderbook Bids[0].Quantity != 725") t.Error("TestGetOrderbook Bids[0].Quantity != 725")
} }
} }
if !orderBook.IsAccepted { if !orderBook.IsAccepted {
t.Error("Test Failed - Alphapoint orderBook.IsAccepted value is negative") t.Error("Alphapoint orderBook.IsAccepted value is negative")
} }
if len(orderBook.Asks) == 0 { if len(orderBook.Asks) == 0 {
t.Error("Test Failed - Alphapoint orderBook.Asks has len 0") t.Error("Alphapoint orderBook.Asks has len 0")
} }
if len(orderBook.Bids) == 0 { if len(orderBook.Bids) == 0 {
t.Error("Test Failed - Alphapoint orderBook.Bids has len 0") t.Error("Alphapoint orderBook.Bids has len 0")
} }
} }
@@ -220,7 +220,7 @@ func TestGetProductPairs(t *testing.T) {
if onlineTest { if onlineTest {
products, err = alpha.GetProductPairs() products, err = alpha.GetProductPairs()
if err != nil { if err != nil {
t.Errorf("Test Failed - Init error: %s", err) t.Errorf("Init error: %s", err)
} }
} else { } else {
mockResp := []byte( mockResp := []byte(
@@ -229,24 +229,24 @@ func TestGetProductPairs(t *testing.T) {
err = common.JSONDecode(mockResp, &products) err = common.JSONDecode(mockResp, &products)
if err != nil { if err != nil {
t.Fatal("Test Failed - TestGetProductPairs unmarshalling error: ", err) t.Fatal("TestGetProductPairs unmarshalling error: ", err)
} }
if products.ProductPairs[0].Name != "LTCUSD" { if products.ProductPairs[0].Name != "LTCUSD" {
t.Error("Test Failed - Alphapoint ProductPairs 0 != LTCUSD") t.Error("Alphapoint ProductPairs 0 != LTCUSD")
} }
if products.ProductPairs[1].Product1Label != "BTC" { if products.ProductPairs[1].Product1Label != "BTC" {
t.Error("Test Failed - Alphapoint ProductPairs 1 != BTC") t.Error("Alphapoint ProductPairs 1 != BTC")
} }
} }
if !products.IsAccepted { if !products.IsAccepted {
t.Error("Test Failed - Alphapoint ProductPairs.IsAccepted value is negative") t.Error("Alphapoint ProductPairs.IsAccepted value is negative")
} }
if len(products.ProductPairs) == 0 { if len(products.ProductPairs) == 0 {
t.Error("Test Failed - Alphapoint ProductPairs len is 0") t.Error("Alphapoint ProductPairs len is 0")
} }
} }
@@ -260,7 +260,7 @@ func TestGetProducts(t *testing.T) {
if onlineTest { if onlineTest {
products, err = alpha.GetProducts() products, err = alpha.GetProducts()
if err != nil { if err != nil {
t.Errorf("Test Failed - Init error: %s", err) t.Errorf("Init error: %s", err)
} }
} else { } else {
mockResp := []byte( mockResp := []byte(
@@ -269,24 +269,24 @@ func TestGetProducts(t *testing.T) {
err = common.JSONDecode(mockResp, &products) err = common.JSONDecode(mockResp, &products)
if err != nil { if err != nil {
t.Fatal("Test Failed - TestGetProducts unmarshalling error: ", err) t.Fatal("TestGetProducts unmarshalling error: ", err)
} }
if products.Products[0].Name != "USD" { if products.Products[0].Name != "USD" {
t.Error("Test Failed - Alphapoint Products 0 != USD") t.Error("Alphapoint Products 0 != USD")
} }
if products.Products[1].ProductCode != 1 { if products.Products[1].ProductCode != 1 {
t.Error("Test Failed - Alphapoint Products 1 product code != 1") t.Error("Alphapoint Products 1 product code != 1")
} }
} }
if !products.IsAccepted { if !products.IsAccepted {
t.Error("Test Failed - Alphapoint Products.IsAccepted value is negative") t.Error("Alphapoint Products.IsAccepted value is negative")
} }
if len(products.Products) == 0 { if len(products.Products) == 0 {
t.Error("Test Failed - Alphapoint Products len is 0") t.Error("Alphapoint Products len is 0")
} }
} }
@@ -301,15 +301,15 @@ func TestCreateAccount(t *testing.T) {
err := a.CreateAccount("test", "account", "something@something.com", "0292383745", "lolcat123") err := a.CreateAccount("test", "account", "something@something.com", "0292383745", "lolcat123")
if err != nil { if err != nil {
t.Errorf("Test Failed - Init error: %s", err) t.Errorf("Init error: %s", err)
} }
err = a.CreateAccount("test", "account", "something@something.com", "0292383745", "bla") err = a.CreateAccount("test", "account", "something@something.com", "0292383745", "bla")
if err == nil { if err == nil {
t.Errorf("Test Failed - CreateAccount() error") t.Errorf("CreateAccount() Expected error")
} }
err = a.CreateAccount("", "", "", "", "lolcat123") err = a.CreateAccount("", "", "", "", "lolcat123")
if err == nil { if err == nil {
t.Errorf("Test Failed - CreateAccount() error") t.Errorf("CreateAccount() Expected error")
} }
} }
@@ -324,7 +324,7 @@ func TestGetUserInfo(t *testing.T) {
_, err := a.GetUserInfo() _, err := a.GetUserInfo()
if err == nil { if err == nil {
t.Error("Test Failed - GetUserInfo() error") t.Error("GetUserInfo() Expected error")
} }
} }
@@ -339,7 +339,7 @@ func TestSetUserInfo(t *testing.T) {
_, err := a.SetUserInfo("bla", "bla", "1", "meh", true, true) _, err := a.SetUserInfo("bla", "bla", "1", "meh", true, true)
if err == nil { if err == nil {
t.Error("Test Failed - GetUserInfo() error") t.Error("GetUserInfo() Expected error")
} }
} }
@@ -354,7 +354,7 @@ func TestGetAccountInfo(t *testing.T) {
_, err := a.GetAccountInfo() _, err := a.GetAccountInfo()
if err == nil { if err == nil {
t.Error("Test Failed - GetUserInfo() error") t.Error("GetUserInfo() Expected error")
} }
} }
@@ -369,7 +369,7 @@ func TestGetAccountTrades(t *testing.T) {
_, err := a.GetAccountTrades("", 1, 2) _, err := a.GetAccountTrades("", 1, 2)
if err == nil { if err == nil {
t.Error("Test Failed - GetUserInfo() error") t.Error("GetUserInfo() Expected error")
} }
} }
@@ -384,7 +384,7 @@ func TestGetDepositAddresses(t *testing.T) {
_, err := a.GetDepositAddresses() _, err := a.GetDepositAddresses()
if err == nil { if err == nil {
t.Error("Test Failed - GetUserInfo() error") t.Error("GetUserInfo() Expected error")
} }
} }
@@ -399,7 +399,7 @@ func TestWithdrawCoins(t *testing.T) {
err := a.WithdrawCoins("", "", "", 0.01) err := a.WithdrawCoins("", "", "", 0.01)
if err == nil { if err == nil {
t.Error("Test Failed - GetUserInfo() error") t.Error("GetUserInfo() Expected error")
} }
} }
@@ -414,7 +414,7 @@ func TestCreateOrder(t *testing.T) {
_, err := a.CreateOrder("", "", exchange.LimitOrderType.ToString(), 0.01, 0) _, err := a.CreateOrder("", "", exchange.LimitOrderType.ToString(), 0.01, 0)
if err == nil { if err == nil {
t.Error("Test Failed - GetUserInfo() error") t.Error("GetUserInfo() Expected error")
} }
} }
@@ -429,7 +429,7 @@ func TestModifyExistingOrder(t *testing.T) {
_, err := a.ModifyExistingOrder("", 1, 1) _, err := a.ModifyExistingOrder("", 1, 1)
if err == nil { if err == nil {
t.Error("Test Failed - GetUserInfo() error") t.Error("GetUserInfo() Expected error")
} }
} }
@@ -444,7 +444,7 @@ func TestCancelAllExistingOrders(t *testing.T) {
err := a.CancelAllExistingOrders("") err := a.CancelAllExistingOrders("")
if err == nil { if err == nil {
t.Error("Test Failed - GetUserInfo() error") t.Error("GetUserInfo() Expected error")
} }
} }
@@ -459,7 +459,7 @@ func TestGetOrders(t *testing.T) {
_, err := a.GetOrders() _, err := a.GetOrders()
if err == nil { if err == nil {
t.Error("Test Failed - GetUserInfo() error") t.Error("GetUserInfo() Expected error")
} }
} }
@@ -474,7 +474,7 @@ func TestGetOrderFee(t *testing.T) {
_, err := a.GetOrderFee("", "", 1, 1) _, err := a.GetOrderFee("", "", 1, 1)
if err == nil { if err == nil {
t.Error("Test Failed - GetUserInfo() error") t.Error("GetUserInfo() Expected error")
} }
} }
@@ -626,7 +626,7 @@ func TestModifyOrder(t *testing.T) {
_, err := a.ModifyOrder(&exchange.ModifyOrder{}) _, err := a.ModifyOrder(&exchange.ModifyOrder{})
if err == nil { if err == nil {
t.Error("Test failed - ModifyOrder() error") t.Error("ModifyOrder() Expected error")
} }
} }

View File

@@ -12,6 +12,7 @@ import (
exchange "github.com/thrasher-corp/gocryptotrader/exchanges" exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
@@ -40,12 +41,24 @@ func (a *Alphapoint) SetDefaults() {
Supports: exchange.FeaturesSupported{ Supports: exchange.FeaturesSupported{
REST: true, REST: true,
Websocket: true, Websocket: true,
RESTCapabilities: exchange.ProtocolFeatures{ RESTCapabilities: protocol.Features{
AccountInfo: true, AccountInfo: true,
TickerFetching: true,
TradeFetching: true,
OrderbookFetching: true,
GetOrders: true,
CancelOrder: true,
CancelOrders: true,
SubmitOrder: true,
ModifyOrder: true,
UserTradeHistory: true,
CryptoDeposit: true,
CryptoWithdrawal: true,
TradeFee: true,
}, },
WebsocketCapabilities: exchange.ProtocolFeatures{ WebsocketCapabilities: protocol.Features{
TickerFetching: true, AccountInfo: true,
}, },
WithdrawPermissions: exchange.WithdrawCryptoWith2FA | WithdrawPermissions: exchange.WithdrawCryptoWith2FA |

View File

@@ -19,11 +19,11 @@ func TestMain(m *testing.M) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true) err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil { if err != nil {
log.Fatalf("Test Failed - ANX Setup() load config error: %s", err) log.Fatalf("ANX Setup() load config error: %s", err)
} }
anxConfig, err := cfg.GetExchangeConfig("ANX") anxConfig, err := cfg.GetExchangeConfig("ANX")
if err != nil { if err != nil {
log.Fatalf("Test Failed - ANX Setup() init error: %s", err) log.Fatalf("ANX Setup() init error: %s", err)
} }
anxConfig.API.AuthenticatedSupport = true anxConfig.API.AuthenticatedSupport = true
anxConfig.API.Credentials.Key = apiKey anxConfig.API.Credentials.Key = apiKey
@@ -31,7 +31,7 @@ func TestMain(m *testing.M) {
a.SetDefaults() a.SetDefaults()
err = a.Setup(anxConfig) err = a.Setup(anxConfig)
if err != nil { if err != nil {
log.Fatal("Test Failed - ANX setup error", err) log.Fatal("ANX setup error", err)
} }
log.Printf(sharedtestvalues.LiveTesting, a.GetName(), a.API.Endpoints.URL) log.Printf(sharedtestvalues.LiveTesting, a.GetName(), a.API.Endpoints.URL)
os.Exit(m.Run()) os.Exit(m.Run())

View File

@@ -22,11 +22,11 @@ func TestMain(m *testing.M) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true) err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil { if err != nil {
log.Fatal("Test Failed - ANX load config error", err) log.Fatal("ANX load config error", err)
} }
anxConfig, err := cfg.GetExchangeConfig("ANX") anxConfig, err := cfg.GetExchangeConfig("ANX")
if err != nil { if err != nil {
log.Fatal("Test Failed - Mock server error", err) log.Fatal("Mock server error", err)
} }
a.SkipAuthCheck = true a.SkipAuthCheck = true
anxConfig.API.AuthenticatedSupport = true anxConfig.API.AuthenticatedSupport = true
@@ -35,12 +35,12 @@ func TestMain(m *testing.M) {
a.SetDefaults() a.SetDefaults()
err = a.Setup(anxConfig) err = a.Setup(anxConfig)
if err != nil { if err != nil {
log.Fatal("Test Failed - ANX setup error", err) log.Fatal("ANX setup error", err)
} }
serverDetails, newClient, err := mock.NewVCRServer(mockFile) serverDetails, newClient, err := mock.NewVCRServer(mockFile)
if err != nil { if err != nil {
log.Fatalf("Test Failed - Mock server error %s", err) log.Fatalf("Mock server error %s", err)
} }
a.HTTPClient = newClient a.HTTPClient = newClient

View File

@@ -22,7 +22,7 @@ func TestGetCurrencies(t *testing.T) {
t.Parallel() t.Parallel()
_, err := a.GetCurrencies() _, err := a.GetCurrencies()
if err != nil { if err != nil {
t.Fatalf("Test failed. TestGetCurrencies failed. Err: %s", err) t.Fatalf("TestGetCurrencies failed. Err: %s", err)
} }
} }
@@ -30,7 +30,7 @@ func TestGetTradablePairs(t *testing.T) {
t.Parallel() t.Parallel()
_, err := a.FetchTradablePairs(asset.Spot) _, err := a.FetchTradablePairs(asset.Spot)
if err != nil { if err != nil {
t.Fatalf("Test failed. TestGetTradablePairs failed. Err: %s", err) t.Fatalf("TestGetTradablePairs failed. Err: %s", err)
} }
} }
@@ -38,10 +38,10 @@ func TestGetTicker(t *testing.T) {
t.Parallel() t.Parallel()
ticker, err := a.GetTicker("BTCUSD") ticker, err := a.GetTicker("BTCUSD")
if err != nil { if err != nil {
t.Errorf("Test Failed - ANX GetTicker() error: %s", err) t.Errorf("ANX GetTicker() error: %s", err)
} }
if ticker.Result != "success" { if ticker.Result != "success" {
t.Error("Test Failed - ANX GetTicker() unsuccessful") t.Error("ANX GetTicker() unsuccessful")
} }
} }
@@ -49,10 +49,10 @@ func TestGetDepth(t *testing.T) {
t.Parallel() t.Parallel()
depth, err := a.GetDepth("BTCUSD") depth, err := a.GetDepth("BTCUSD")
if err != nil { if err != nil {
t.Errorf("Test Failed - ANX GetDepth() error: %s", err) t.Errorf("ANX GetDepth() error: %s", err)
} }
if depth.Result != "success" { if depth.Result != "success" {
t.Error("Test Failed - ANX GetDepth() unsuccessful") t.Error("ANX GetDepth() unsuccessful")
} }
} }
@@ -60,13 +60,13 @@ func TestGetAPIKey(t *testing.T) {
t.Parallel() t.Parallel()
apiKey, apiSecret, err := a.GetAPIKey("userName", "passWord", "", "1337") apiKey, apiSecret, err := a.GetAPIKey("userName", "passWord", "", "1337")
if err == nil { if err == nil {
t.Error("Test Failed - ANX GetAPIKey() Incorrect") t.Error("ANX GetAPIKey() Expected error")
} }
if apiKey != "" { if apiKey != "" {
t.Error("Test Failed - ANX GetAPIKey() Incorrect") t.Error("ANX GetAPIKey() Expected error")
} }
if apiSecret != "" { if apiSecret != "" {
t.Error("Test Failed - ANX GetAPIKey() Incorrect") t.Error("ANX GetAPIKey() Expected error")
} }
} }
@@ -103,7 +103,7 @@ func TestGetFee(t *testing.T) {
// CryptocurrencyTradeFee Basic // CryptocurrencyTradeFee Basic
if resp, err := a.GetFee(feeBuilder); resp != float64(0.02) || err != nil { if resp, err := a.GetFee(feeBuilder); resp != float64(0.02) || err != nil {
t.Error(err) t.Error(err)
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
} }
// CryptocurrencyTradeFee High quantity // CryptocurrencyTradeFee High quantity
@@ -111,7 +111,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.Amount = 1000 feeBuilder.Amount = 1000
feeBuilder.PurchasePrice = 1000 feeBuilder.PurchasePrice = 1000
if resp, err := a.GetFee(feeBuilder); resp != float64(20000) || err != nil { if resp, err := a.GetFee(feeBuilder); resp != float64(20000) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(20000), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(20000), resp)
t.Error(err) t.Error(err)
} }
@@ -119,7 +119,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.IsMaker = true feeBuilder.IsMaker = true
if resp, err := a.GetFee(feeBuilder); resp != float64(0.01) || err != nil { if resp, err := a.GetFee(feeBuilder); resp != float64(0.01) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.01), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.01), resp)
t.Error(err) t.Error(err)
} }
@@ -127,7 +127,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.PurchasePrice = -1000 feeBuilder.PurchasePrice = -1000
if resp, err := a.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := a.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -135,7 +135,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee
if resp, err := a.GetFee(feeBuilder); resp != float64(0.002) || err != nil { if resp, err := a.GetFee(feeBuilder); resp != float64(0.002) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -143,7 +143,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CyptocurrencyDepositFee feeBuilder.FeeType = exchange.CyptocurrencyDepositFee
if resp, err := a.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := a.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -152,7 +152,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FeeType = exchange.InternationalBankDepositFee
feeBuilder.FiatCurrency = currency.HKD feeBuilder.FiatCurrency = currency.HKD
if resp, err := a.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := a.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -161,7 +161,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
feeBuilder.FiatCurrency = currency.HKD feeBuilder.FiatCurrency = currency.HKD
if resp, err := a.GetFee(feeBuilder); resp != float64(250.01) || err != nil { if resp, err := a.GetFee(feeBuilder); resp != float64(250.01) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(250.01), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(250.01), resp)
t.Error(err) t.Error(err)
} }
} }
@@ -208,7 +208,7 @@ func TestGetOrderHistory(t *testing.T) {
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Expecting an error when no keys are set") t.Error("Expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - GetBalance() error", err) t.Error("GetBalance() error", err)
} }
} }
@@ -307,11 +307,11 @@ func TestGetAccountInfo(t *testing.T) {
_, err := a.GetAccountInfo() _, err := a.GetAccountInfo()
switch { switch {
case areTestAPIKeysSet() && err != nil && !mockTests: case areTestAPIKeysSet() && err != nil && !mockTests:
t.Error("test failed - GetAccountInfo() error:", err) t.Error("GetAccountInfo() error:", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("test failed - GetAccountInfo() error") t.Error("GetAccountInfo() error")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("test failed - GetAccountInfo() error:", err) t.Error("GetAccountInfo() error:", err)
} }
} }
@@ -319,7 +319,7 @@ func TestModifyOrder(t *testing.T) {
t.Parallel() t.Parallel()
_, err := a.ModifyOrder(&exchange.ModifyOrder{}) _, err := a.ModifyOrder(&exchange.ModifyOrder{})
if err == nil { if err == nil {
t.Error("Test failed - ModifyOrder() error") t.Error("ModifyOrder() Expected error")
} }
} }
@@ -373,9 +373,9 @@ func TestGetDepositAddress(t *testing.T) {
t.Parallel() t.Parallel()
_, err := a.GetDepositAddress(currency.BTC, "") _, err := a.GetDepositAddress(currency.BTC, "")
if areTestAPIKeysSet() && err != nil && !mockTests { if areTestAPIKeysSet() && err != nil && !mockTests {
t.Error("Test Failed - GetDepositAddress() error", err) t.Error("GetDepositAddress() error", err)
} else if !areTestAPIKeysSet() && err == nil { } else if !areTestAPIKeysSet() && err == nil {
t.Error("Test Failed - GetDepositAddress() error cannot be nil") t.Error("GetDepositAddress() error cannot be nil")
} }
} }

View File

@@ -13,6 +13,7 @@ import (
exchange "github.com/thrasher-corp/gocryptotrader/exchanges" exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
@@ -80,9 +81,24 @@ func (a *ANX) SetDefaults() {
Supports: exchange.FeaturesSupported{ Supports: exchange.FeaturesSupported{
REST: true, REST: true,
Websocket: false, Websocket: false,
RESTCapabilities: exchange.ProtocolFeatures{ RESTCapabilities: protocol.Features{
AutoPairUpdates: true, TickerFetching: true,
TickerBatching: false, OrderbookFetching: true,
AutoPairUpdates: true,
AccountInfo: true,
CryptoDeposit: true,
CryptoWithdrawal: true,
GetOrder: true,
GetOrders: true,
CancelOrders: true,
CancelOrder: true,
SubmitOrder: true,
DepositHistory: true,
WithdrawalHistory: true,
UserTradeHistory: true,
TradeFee: true,
FiatWithdrawalFee: true,
CryptoWithdrawalFee: true,
}, },
WithdrawPermissions: exchange.WithdrawCryptoWithEmail | WithdrawPermissions: exchange.WithdrawCryptoWithEmail |
exchange.AutoWithdrawCryptoWithSetup | exchange.AutoWithdrawCryptoWithSetup |

View File

@@ -9,7 +9,7 @@ import (
func TestString(t *testing.T) { func TestString(t *testing.T) {
a := Spot a := Spot
if a.String() != "spot" { if a.String() != "spot" {
t.Fatal("Test failed - TestString returned an unexpected result") t.Fatal("TestString returned an unexpected result")
} }
} }
@@ -18,7 +18,7 @@ func TestToStringArray(t *testing.T) {
result := a.Strings() result := a.Strings()
for x := range a { for x := range a {
if !common.StringDataCompare(result, a[x].String()) { if !common.StringDataCompare(result, a[x].String()) {
t.Fatal("Test failed - TestToStringArray returned an unexpected result") t.Fatal("TestToStringArray returned an unexpected result")
} }
} }
} }
@@ -26,60 +26,60 @@ func TestToStringArray(t *testing.T) {
func TestContains(t *testing.T) { func TestContains(t *testing.T) {
a := Items{Spot, Futures} a := Items{Spot, Futures}
if a.Contains("meow") { if a.Contains("meow") {
t.Fatal("Test failed - TestContains returned an unexpected result") t.Fatal("TestContains returned an unexpected result")
} }
if !a.Contains(Spot) { if !a.Contains(Spot) {
t.Fatal("Test failed - TestContains returned an unexpected result") t.Fatal("TestContains returned an unexpected result")
} }
if a.Contains(Binary) { if a.Contains(Binary) {
t.Fatal("Test failed - TestContains returned an unexpected result") t.Fatal("TestContains returned an unexpected result")
} }
if !a.Contains("SpOt") { if !a.Contains("SpOt") {
t.Error("Test failed - TestContains returned an unexpected result") t.Error("TestContains returned an unexpected result")
} }
} }
func TestJoinToString(t *testing.T) { func TestJoinToString(t *testing.T) {
a := Items{Spot, Futures} a := Items{Spot, Futures}
if a.JoinToString(",") != "spot,futures" { if a.JoinToString(",") != "spot,futures" {
t.Fatal("Test failed - TestJoinToString returned an unexpected result") t.Fatal("TestJoinToString returned an unexpected result")
} }
} }
func TestIsValid(t *testing.T) { func TestIsValid(t *testing.T) {
if IsValid("rawr") { if IsValid("rawr") {
t.Fatal("Test failed - TestIsValid returned an unexpected result") t.Fatal("TestIsValid returned an unexpected result")
} }
if !IsValid(Spot) { if !IsValid(Spot) {
t.Fatal("Test failed - TestIsValid returned an unexpected result") t.Fatal("TestIsValid returned an unexpected result")
} }
} }
func TestNew(t *testing.T) { func TestNew(t *testing.T) {
a := New("Spota") a := New("Spota")
if a != nil { if a != nil {
t.Fatal("Test failed - TestNew returned an unexpected result") t.Fatal("TestNew returned an unexpected result")
} }
a = New("SpOt") a = New("SpOt")
if a == nil { if a == nil {
t.Fatal("Test failed - TestNew returned an unexpected result") t.Fatal("TestNew returned an unexpected result")
} }
a = New("spot,futures") a = New("spot,futures")
if a.JoinToString(",") != "spot,futures" { if a.JoinToString(",") != "spot,futures" {
t.Fatal("Test failed - TestNew returned an unexpected result") t.Fatal("TestNew returned an unexpected result")
} }
if a := New("Spot_rawr"); a != nil { if a := New("Spot_rawr"); a != nil {
t.Fatal("Test failed - TestNew returned an unexpected result") t.Fatal("TestNew returned an unexpected result")
} }
if a := New("Spot,Rawr"); a != nil { if a := New("Spot,Rawr"); a != nil {
t.Fatal("Test failed - TestNew returned an unexpected result") t.Fatal("TestNew returned an unexpected result")
} }
} }

View File

@@ -19,11 +19,11 @@ func TestMain(m *testing.M) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true) err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil { if err != nil {
log.Fatal("Test Failed - Binance load config error", err) log.Fatal("Binance load config error", err)
} }
binanceConfig, err := cfg.GetExchangeConfig("Binance") binanceConfig, err := cfg.GetExchangeConfig("Binance")
if err != nil { if err != nil {
log.Fatal("Test Failed - Binance Setup() init error", err) log.Fatal("Binance Setup() init error", err)
} }
binanceConfig.API.AuthenticatedSupport = true binanceConfig.API.AuthenticatedSupport = true
binanceConfig.API.Credentials.Key = apiKey binanceConfig.API.Credentials.Key = apiKey
@@ -31,7 +31,7 @@ func TestMain(m *testing.M) {
b.SetDefaults() b.SetDefaults()
err = b.Setup(binanceConfig) err = b.Setup(binanceConfig)
if err != nil { if err != nil {
log.Fatal("Test Failed - Binance setup error", err) log.Fatal("Binance setup error", err)
} }
log.Printf(sharedtestvalues.LiveTesting, b.GetName(), b.API.Endpoints.URL) log.Printf(sharedtestvalues.LiveTesting, b.GetName(), b.API.Endpoints.URL)
os.Exit(m.Run()) os.Exit(m.Run())

View File

@@ -22,11 +22,11 @@ func TestMain(m *testing.M) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true) err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil { if err != nil {
log.Fatal("Test Failed - Binance load config error", err) log.Fatal("Binance load config error", err)
} }
binanceConfig, err := cfg.GetExchangeConfig("Binance") binanceConfig, err := cfg.GetExchangeConfig("Binance")
if err != nil { if err != nil {
log.Fatal("Test Failed - Binance Setup() init error", err) log.Fatal("Binance Setup() init error", err)
} }
b.SkipAuthCheck = true b.SkipAuthCheck = true
binanceConfig.API.AuthenticatedSupport = true binanceConfig.API.AuthenticatedSupport = true
@@ -35,12 +35,12 @@ func TestMain(m *testing.M) {
b.SetDefaults() b.SetDefaults()
err = b.Setup(binanceConfig) err = b.Setup(binanceConfig)
if err != nil { if err != nil {
log.Fatal("Test Failed - Binance setup error", err) log.Fatal("Binance setup error", err)
} }
serverDetails, newClient, err := mock.NewVCRServer(mockfile) serverDetails, newClient, err := mock.NewVCRServer(mockfile)
if err != nil { if err != nil {
log.Fatalf("Test Failed - Mock server error %s", err) log.Fatalf("Mock server error %s", err)
} }
b.HTTPClient = newClient b.HTTPClient = newClient

View File

@@ -36,7 +36,7 @@ func TestFetchTradablePairs(t *testing.T) {
_, err := b.FetchTradablePairs(asset.Spot) _, err := b.FetchTradablePairs(asset.Spot)
if err != nil { if err != nil {
t.Error("Test Failed - Binance FetchTradablePairs(asset asets.AssetType) error", err) t.Error("Binance FetchTradablePairs(asset asets.AssetType) error", err)
} }
} }
@@ -49,7 +49,7 @@ func TestGetOrderBook(t *testing.T) {
}) })
if err != nil { if err != nil {
t.Error("Test Failed - Binance GetOrderBook() error", err) t.Error("Binance GetOrderBook() error", err)
} }
} }
@@ -62,7 +62,7 @@ func TestGetRecentTrades(t *testing.T) {
}) })
if err != nil { if err != nil {
t.Error("Test Failed - Binance GetRecentTrades() error", err) t.Error("Binance GetRecentTrades() error", err)
} }
} }
@@ -71,10 +71,10 @@ func TestGetHistoricalTrades(t *testing.T) {
_, err := b.GetHistoricalTrades("BTCUSDT", 5, 0) _, err := b.GetHistoricalTrades("BTCUSDT", 5, 0)
if !mockTests && err == nil { if !mockTests && err == nil {
t.Error("Test Failed - Binance GetHistoricalTrades() expecting error") t.Error("Binance GetHistoricalTrades() expecting error")
} }
if mockTests && err == nil { if mockTests && err == nil {
t.Error("Test Failed - Binance GetHistoricalTrades() error", err) t.Error("Binance GetHistoricalTrades() error", err)
} }
} }
@@ -83,7 +83,7 @@ func TestGetAggregatedTrades(t *testing.T) {
_, err := b.GetAggregatedTrades("BTCUSDT", 5) _, err := b.GetAggregatedTrades("BTCUSDT", 5)
if err != nil { if err != nil {
t.Error("Test Failed - Binance GetAggregatedTrades() error", err) t.Error("Binance GetAggregatedTrades() error", err)
} }
} }
@@ -96,7 +96,7 @@ func TestGetSpotKline(t *testing.T) {
Limit: 24, Limit: 24,
}) })
if err != nil { if err != nil {
t.Error("Test Failed - Binance GetSpotKline() error", err) t.Error("Binance GetSpotKline() error", err)
} }
} }
@@ -105,7 +105,7 @@ func TestGetAveragePrice(t *testing.T) {
_, err := b.GetAveragePrice("BTCUSDT") _, err := b.GetAveragePrice("BTCUSDT")
if err != nil { if err != nil {
t.Error("Test Failed - Binance GetAveragePrice() error", err) t.Error("Binance GetAveragePrice() error", err)
} }
} }
@@ -114,7 +114,7 @@ func TestGetPriceChangeStats(t *testing.T) {
_, err := b.GetPriceChangeStats("BTCUSDT") _, err := b.GetPriceChangeStats("BTCUSDT")
if err != nil { if err != nil {
t.Error("Test Failed - Binance GetPriceChangeStats() error", err) t.Error("Binance GetPriceChangeStats() error", err)
} }
} }
@@ -123,7 +123,7 @@ func TestGetTickers(t *testing.T) {
_, err := b.GetTickers() _, err := b.GetTickers()
if err != nil { if err != nil {
t.Error("Test Failed - Binance TestGetTickers error", err) t.Error("Binance TestGetTickers error", err)
} }
} }
@@ -132,7 +132,7 @@ func TestGetLatestSpotPrice(t *testing.T) {
_, err := b.GetLatestSpotPrice("BTCUSDT") _, err := b.GetLatestSpotPrice("BTCUSDT")
if err != nil { if err != nil {
t.Error("Test Failed - Binance GetLatestSpotPrice() error", err) t.Error("Binance GetLatestSpotPrice() error", err)
} }
} }
@@ -141,7 +141,7 @@ func TestGetBestPrice(t *testing.T) {
_, err := b.GetBestPrice("BTCUSDT") _, err := b.GetBestPrice("BTCUSDT")
if err != nil { if err != nil {
t.Error("Test Failed - Binance GetBestPrice() error", err) t.Error("Binance GetBestPrice() error", err)
} }
} }
@@ -151,11 +151,11 @@ func TestQueryOrder(t *testing.T) {
_, err := b.QueryOrder("BTCUSDT", "", 1337) _, err := b.QueryOrder("BTCUSDT", "", 1337)
switch { switch {
case areTestAPIKeysSet() && err != nil: case areTestAPIKeysSet() && err != nil:
t.Error("Test Failed - QueryOrder() error", err) t.Error("QueryOrder() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Test Failed - QueryOrder() expecting an error when no keys are set") t.Error("QueryOrder() expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - Mock QueryOrder() error", err) t.Error("Mock QueryOrder() error", err)
} }
} }
@@ -165,11 +165,11 @@ func TestOpenOrders(t *testing.T) {
_, err := b.OpenOrders("BTCUSDT") _, err := b.OpenOrders("BTCUSDT")
switch { switch {
case areTestAPIKeysSet() && err != nil: case areTestAPIKeysSet() && err != nil:
t.Error("Test Failed - OpenOrders() error", err) t.Error("OpenOrders() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Test Failed - OpenOrders() expecting an error when no keys are set") t.Error("OpenOrders() expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - Mock OpenOrders() error", err) t.Error("Mock OpenOrders() error", err)
} }
} }
@@ -179,11 +179,11 @@ func TestAllOrders(t *testing.T) {
_, err := b.AllOrders("BTCUSDT", "", "") _, err := b.AllOrders("BTCUSDT", "", "")
switch { switch {
case areTestAPIKeysSet() && err != nil: case areTestAPIKeysSet() && err != nil:
t.Error("Test Failed - AllOrders() error", err) t.Error("AllOrders() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Test Failed - AllOrders() expecting an error when no keys are set") t.Error("AllOrders() expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - Mock AllOrders() error", err) t.Error("Mock AllOrders() error", err)
} }
} }
@@ -213,7 +213,7 @@ func TestGetFee(t *testing.T) {
// CryptocurrencyTradeFee Basic // CryptocurrencyTradeFee Basic
if resp, err := b.GetFee(feeBuilder); resp != float64(0.1) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.1) || err != nil {
t.Error(err) t.Error(err)
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
} }
// CryptocurrencyTradeFee High quantity // CryptocurrencyTradeFee High quantity
@@ -221,7 +221,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.Amount = 1000 feeBuilder.Amount = 1000
feeBuilder.PurchasePrice = 1000 feeBuilder.PurchasePrice = 1000
if resp, err := b.GetFee(feeBuilder); resp != float64(100000) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(100000) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(100000), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(100000), resp)
t.Error(err) t.Error(err)
} }
@@ -229,7 +229,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.IsMaker = true feeBuilder.IsMaker = true
if resp, err := b.GetFee(feeBuilder); resp != float64(0.1) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.1) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.1), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.1), resp)
t.Error(err) t.Error(err)
} }
@@ -237,7 +237,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.PurchasePrice = -1000 feeBuilder.PurchasePrice = -1000
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -247,7 +247,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0.0005) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.0005) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp)
t.Error(err) t.Error(err)
} }
@@ -255,7 +255,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CyptocurrencyDepositFee feeBuilder.FeeType = exchange.CyptocurrencyDepositFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -264,7 +264,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FeeType = exchange.InternationalBankDepositFee
feeBuilder.FiatCurrency = currency.HKD feeBuilder.FiatCurrency = currency.HKD
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -273,7 +273,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
feeBuilder.FiatCurrency = currency.HKD feeBuilder.FiatCurrency = currency.HKD
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
} }
@@ -307,11 +307,11 @@ func TestGetActiveOrders(t *testing.T) {
_, err = b.GetActiveOrders(&getOrdersRequest) _, err = b.GetActiveOrders(&getOrdersRequest)
switch { switch {
case areTestAPIKeysSet() && err != nil: case areTestAPIKeysSet() && err != nil:
t.Error("Test Failed - GetActiveOrders() error", err) t.Error("GetActiveOrders() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Test Failed - GetActiveOrders() expecting an error when no keys are set") t.Error("GetActiveOrders() expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - Mock GetActiveOrders() error", err) t.Error("Mock GetActiveOrders() error", err)
} }
} }
@@ -334,11 +334,11 @@ func TestGetOrderHistory(t *testing.T) {
_, err = b.GetOrderHistory(&getOrdersRequest) _, err = b.GetOrderHistory(&getOrdersRequest)
switch { switch {
case areTestAPIKeysSet() && err != nil: case areTestAPIKeysSet() && err != nil:
t.Error("Test Failed - GetOrderHistory() error", err) t.Error("GetOrderHistory() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Test Failed - GetOrderHistory() expecting an error when no keys are set") t.Error("GetOrderHistory() expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - Mock GetOrderHistory() error", err) t.Error("Mock GetOrderHistory() error", err)
} }
} }
@@ -368,11 +368,11 @@ func TestSubmitOrder(t *testing.T) {
_, err := b.SubmitOrder(orderSubmission) _, err := b.SubmitOrder(orderSubmission)
switch { switch {
case areTestAPIKeysSet() && err != nil: case areTestAPIKeysSet() && err != nil:
t.Error("Test Failed - SubmitOrder() error", err) t.Error("SubmitOrder() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Test Failed - SubmitOrder() expecting an error when no keys are set") t.Error("SubmitOrder() expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - Mock SubmitOrder() error", err) t.Error("Mock SubmitOrder() error", err)
} }
} }
@@ -393,11 +393,11 @@ func TestCancelExchangeOrder(t *testing.T) {
err := b.CancelOrder(orderCancellation) err := b.CancelOrder(orderCancellation)
switch { switch {
case areTestAPIKeysSet() && err != nil: case areTestAPIKeysSet() && err != nil:
t.Error("Test Failed - CancelExchangeOrder() error", err) t.Error("CancelExchangeOrder() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Test Failed - CancelExchangeOrder() expecting an error when no keys are set") t.Error("CancelExchangeOrder() expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - Mock CancelExchangeOrder() error", err) t.Error("Mock CancelExchangeOrder() error", err)
} }
} }
@@ -418,11 +418,11 @@ func TestCancelAllExchangeOrders(t *testing.T) {
_, err := b.CancelAllOrders(orderCancellation) _, err := b.CancelAllOrders(orderCancellation)
switch { switch {
case areTestAPIKeysSet() && err != nil: case areTestAPIKeysSet() && err != nil:
t.Error("Test Failed - CancelAllExchangeOrders() error", err) t.Error("CancelAllExchangeOrders() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Test Failed - CancelAllExchangeOrders() expecting an error when no keys are set") t.Error("CancelAllExchangeOrders() expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - Mock CancelAllExchangeOrders() error", err) t.Error("Mock CancelAllExchangeOrders() error", err)
} }
} }
@@ -432,11 +432,11 @@ func TestGetAccountInfo(t *testing.T) {
_, err := b.GetAccountInfo() _, err := b.GetAccountInfo()
switch { switch {
case areTestAPIKeysSet() && err != nil: case areTestAPIKeysSet() && err != nil:
t.Error("Test Failed - GetAccountInfo() error", err) t.Error("GetAccountInfo() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Test Failed - GetAccountInfo() expecting an error when no keys are set") t.Error("GetAccountInfo() expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - Mock GetAccountInfo() error", err) t.Error("Mock GetAccountInfo() error", err)
} }
} }
@@ -445,7 +445,7 @@ func TestModifyOrder(t *testing.T) {
_, err := b.ModifyOrder(&exchange.ModifyOrder{}) _, err := b.ModifyOrder(&exchange.ModifyOrder{})
if err == nil { if err == nil {
t.Error("Test failed - ModifyOrder() error cannot be nil") t.Error("ModifyOrder() error cannot be nil")
} }
} }
@@ -468,11 +468,11 @@ func TestWithdraw(t *testing.T) {
_, err := b.WithdrawCryptocurrencyFunds(&withdrawCryptoRequest) _, err := b.WithdrawCryptocurrencyFunds(&withdrawCryptoRequest)
switch { switch {
case areTestAPIKeysSet() && err != nil: case areTestAPIKeysSet() && err != nil:
t.Error("Test Failed - Withdraw() error", err) t.Error("Withdraw() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Test Failed - Withdraw() expecting an error when no keys are set") t.Error("Withdraw() expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - Mock Withdraw() error", err) t.Error("Mock Withdraw() error", err)
} }
} }
@@ -502,10 +502,10 @@ func TestGetDepositAddress(t *testing.T) {
_, err := b.GetDepositAddress(currency.BTC, "") _, err := b.GetDepositAddress(currency.BTC, "")
switch { switch {
case areTestAPIKeysSet() && err != nil: case areTestAPIKeysSet() && err != nil:
t.Error("Test Failed - GetDepositAddress() error", err) t.Error("GetDepositAddress() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Test Failed - GetDepositAddress() error cannot be nil") t.Error("GetDepositAddress() error cannot be nil")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - Mock GetDepositAddress() error", err) t.Error("Mock GetDepositAddress() error", err)
} }
} }

View File

@@ -14,6 +14,7 @@ import (
exchange "github.com/thrasher-corp/gocryptotrader/exchanges" exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
@@ -71,9 +72,32 @@ func (b *Binance) SetDefaults() {
Supports: exchange.FeaturesSupported{ Supports: exchange.FeaturesSupported{
REST: true, REST: true,
Websocket: true, Websocket: true,
RESTCapabilities: exchange.ProtocolFeatures{ RESTCapabilities: protocol.Features{
AutoPairUpdates: true, TickerBatching: true,
TickerBatching: true, TickerFetching: true,
KlineFetching: true,
OrderbookFetching: true,
AutoPairUpdates: true,
AccountInfo: true,
CryptoDeposit: true,
CryptoWithdrawal: true,
GetOrder: true,
GetOrders: true,
CancelOrders: true,
CancelOrder: true,
SubmitOrder: true,
DepositHistory: true,
WithdrawalHistory: true,
TradeFetching: true,
UserTradeHistory: true,
TradeFee: true,
CryptoWithdrawalFee: true,
},
WebsocketCapabilities: protocol.Features{
TradeFetching: true,
TickerFetching: true,
KlineFetching: true,
OrderbookFetching: true,
}, },
WithdrawPermissions: exchange.AutoWithdrawCrypto | WithdrawPermissions: exchange.AutoWithdrawCrypto |
exchange.NoFiatWithdrawals, exchange.NoFiatWithdrawals,
@@ -92,10 +116,6 @@ func (b *Binance) SetDefaults() {
b.API.Endpoints.URL = b.API.Endpoints.URLDefault b.API.Endpoints.URL = b.API.Endpoints.URLDefault
b.Websocket = wshandler.New() b.Websocket = wshandler.New()
b.API.Endpoints.WebsocketURL = binanceDefaultWebsocketURL b.API.Endpoints.WebsocketURL = binanceDefaultWebsocketURL
b.Websocket.Functionality = wshandler.WebsocketTradeDataSupported |
wshandler.WebsocketTickerSupported |
wshandler.WebsocketKlineSupported |
wshandler.WebsocketOrderbookSupported
b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit
b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout
b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit
@@ -123,6 +143,7 @@ func (b *Binance) Setup(exch *config.ExchangeConfig) error {
ExchangeName: exch.Name, ExchangeName: exch.Name,
RunningURL: exch.API.Endpoints.WebsocketURL, RunningURL: exch.API.Endpoints.WebsocketURL,
Connector: b.WsConnect, Connector: b.WsConnect,
Features: &b.Features.Supports.WebsocketCapabilities,
}) })
if err != nil { if err != nil {

View File

@@ -30,21 +30,21 @@ func TestSetup(t *testing.T) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true) err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil { if err != nil {
t.Fatal("Test Failed - Bitfinex load config error", err) t.Fatal("Bitfinex load config error", err)
} }
bfxConfig, err := cfg.GetExchangeConfig("Bitfinex") bfxConfig, err := cfg.GetExchangeConfig("Bitfinex")
if err != nil { if err != nil {
t.Error("Test Failed - Bitfinex Setup() init error") t.Error("Bitfinex Setup() init error")
} }
err = b.Setup(bfxConfig) err = b.Setup(bfxConfig)
if err != nil { if err != nil {
t.Fatal("Test Failed - Bitfinex setup error", err) t.Fatal("Bitfinex setup error", err)
} }
b.API.Credentials.Key = apiKey b.API.Credentials.Key = apiKey
b.API.Credentials.Secret = apiSecret b.API.Credentials.Secret = apiSecret
if !b.Enabled || b.API.AuthenticatedSupport || if !b.Enabled || b.API.AuthenticatedSupport ||
b.Verbose || b.Websocket.IsEnabled() || len(b.BaseCurrencies) < 1 { b.Verbose || b.Websocket.IsEnabled() || len(b.BaseCurrencies) < 1 {
t.Error("Test Failed - Bitfinex Setup values not set correctly") t.Error("Bitfinex Setup values not set correctly")
} }
b.API.AuthenticatedSupport = true b.API.AuthenticatedSupport = true
@@ -98,7 +98,7 @@ func TestGetTicker(t *testing.T) {
_, err = b.GetTicker("wigwham") _, err = b.GetTicker("wigwham")
if err == nil { if err == nil {
t.Error("Test Failed - GetTicker() error") t.Error("GetTicker() Expected error")
} }
} }
@@ -132,7 +132,7 @@ func TestGetStats(t *testing.T) {
_, err = b.GetStats("wigwham") _, err = b.GetStats("wigwham")
if err == nil { if err == nil {
t.Error("Test Failed - GetStats() error") t.Error("GetStats() Expected error")
} }
} }
@@ -144,7 +144,7 @@ func TestGetFundingBook(t *testing.T) {
} }
_, err = b.GetFundingBook("wigwham") _, err = b.GetFundingBook("wigwham")
if err == nil { if err == nil {
t.Error("Testing Failed - GetFundingBook() error") t.Error("Testing Failed - GetFundingBook() Expected error")
} }
} }
@@ -271,7 +271,7 @@ func TestGetAccountInfo(t *testing.T) {
_, err := b.GetAccountInfo() _, err := b.GetAccountInfo()
if err != nil { if err != nil {
t.Error("Test Failed - GetAccountInfo error", err) t.Error("GetAccountInfo error", err)
} }
} }
@@ -283,7 +283,7 @@ func TestGetAccountFees(t *testing.T) {
_, err := b.GetAccountFees() _, err := b.GetAccountFees()
if err == nil { if err == nil {
t.Error("Test Failed - GetAccountFees error") t.Error("GetAccountFees Expected error")
} }
} }
@@ -295,7 +295,7 @@ func TestGetAccountSummary(t *testing.T) {
_, err := b.GetAccountSummary() _, err := b.GetAccountSummary()
if err == nil { if err == nil {
t.Error("Test Failed - GetAccountSummary() error:") t.Error("GetAccountSummary() Expected error")
} }
} }
@@ -307,7 +307,7 @@ func TestNewDeposit(t *testing.T) {
_, err := b.NewDeposit("blabla", "testwallet", 1) _, err := b.NewDeposit("blabla", "testwallet", 1)
if err == nil { if err == nil {
t.Error("Test Failed - NewDeposit() error:", err) t.Error("NewDeposit() Expected error")
} }
} }
@@ -319,7 +319,7 @@ func TestGetKeyPermissions(t *testing.T) {
_, err := b.GetKeyPermissions() _, err := b.GetKeyPermissions()
if err == nil { if err == nil {
t.Error("Test Failed - GetKeyPermissions() error:") t.Error("GetKeyPermissions() Expected error")
} }
} }
@@ -331,7 +331,7 @@ func TestGetMarginInfo(t *testing.T) {
_, err := b.GetMarginInfo() _, err := b.GetMarginInfo()
if err == nil { if err == nil {
t.Error("Test Failed - GetMarginInfo() error") t.Error("GetMarginInfo() Expected error")
} }
} }
@@ -343,7 +343,7 @@ func TestGetAccountBalance(t *testing.T) {
_, err := b.GetAccountBalance() _, err := b.GetAccountBalance()
if err == nil { if err == nil {
t.Error("Test Failed - GetAccountBalance() error") t.Error("GetAccountBalance() Expected error")
} }
} }
@@ -355,7 +355,7 @@ func TestWalletTransfer(t *testing.T) {
_, err := b.WalletTransfer(0.01, "bla", "bla", "bla") _, err := b.WalletTransfer(0.01, "bla", "bla", "bla")
if err == nil { if err == nil {
t.Error("Test Failed - WalletTransfer() error") t.Error("WalletTransfer() Expected error")
} }
} }
@@ -368,7 +368,7 @@ func TestNewOrder(t *testing.T) {
_, err := b.NewOrder("BTCUSD", 1, 2, true, _, err := b.NewOrder("BTCUSD", 1, 2, true,
exchange.LimitOrderType.ToLower().ToString(), false) exchange.LimitOrderType.ToLower().ToString(), false)
if err == nil { if err == nil {
t.Error("Test Failed - NewOrder() error") t.Error("NewOrder() Expected error")
} }
} }
@@ -391,7 +391,7 @@ func TestNewOrderMulti(t *testing.T) {
_, err := b.NewOrderMulti(newOrder) _, err := b.NewOrderMulti(newOrder)
if err == nil { if err == nil {
t.Error("Test Failed - NewOrderMulti() error") t.Error("NewOrderMulti() Expected error")
} }
} }
@@ -403,7 +403,7 @@ func TestCancelOrder(t *testing.T) {
_, err := b.CancelExistingOrder(1337) _, err := b.CancelExistingOrder(1337)
if err == nil { if err == nil {
t.Error("Test Failed - CancelExistingOrder() error") t.Error("CancelExistingOrder() Expected error")
} }
} }
@@ -415,7 +415,7 @@ func TestCancelMultipleOrders(t *testing.T) {
_, err := b.CancelMultipleOrders([]int64{1337, 1336}) _, err := b.CancelMultipleOrders([]int64{1337, 1336})
if err == nil { if err == nil {
t.Error("Test Failed - CancelMultipleOrders() error") t.Error("CancelMultipleOrders() Expected error")
} }
} }
@@ -427,7 +427,7 @@ func TestCancelAllOrders(t *testing.T) {
_, err := b.CancelAllExistingOrders() _, err := b.CancelAllExistingOrders()
if err == nil { if err == nil {
t.Error("Test Failed - CancelAllExistingOrders() error") t.Error("CancelAllExistingOrders() Expected error")
} }
} }
@@ -440,7 +440,7 @@ func TestReplaceOrder(t *testing.T) {
_, err := b.ReplaceOrder(1337, "BTCUSD", _, err := b.ReplaceOrder(1337, "BTCUSD",
1, 1, true, exchange.LimitOrderType.ToLower().ToString(), false) 1, 1, true, exchange.LimitOrderType.ToLower().ToString(), false)
if err == nil { if err == nil {
t.Error("Test Failed - ReplaceOrder() error") t.Error("ReplaceOrder() Expected error")
} }
} }
@@ -452,7 +452,7 @@ func TestGetOrderStatus(t *testing.T) {
_, err := b.GetOrderStatus(1337) _, err := b.GetOrderStatus(1337)
if err == nil { if err == nil {
t.Error("Test Failed - GetOrderStatus() error") t.Error("GetOrderStatus() Expected error")
} }
} }
@@ -464,7 +464,7 @@ func TestGetOpenOrders(t *testing.T) {
_, err := b.GetOpenOrders() _, err := b.GetOpenOrders()
if err == nil { if err == nil {
t.Error("Test Failed - GetOpenOrders() error") t.Error("GetOpenOrders() Expectederror")
} }
} }
@@ -476,7 +476,7 @@ func TestGetActivePositions(t *testing.T) {
_, err := b.GetActivePositions() _, err := b.GetActivePositions()
if err == nil { if err == nil {
t.Error("Test Failed - GetActivePositions() error") t.Error("GetActivePositions() Expected error")
} }
} }
@@ -488,7 +488,7 @@ func TestClaimPosition(t *testing.T) {
_, err := b.ClaimPosition(1337) _, err := b.ClaimPosition(1337)
if err == nil { if err == nil {
t.Error("Test Failed - ClaimPosition() error") t.Error("ClaimPosition() Expected error")
} }
} }
@@ -500,7 +500,7 @@ func TestGetBalanceHistory(t *testing.T) {
_, err := b.GetBalanceHistory("USD", time.Time{}, time.Time{}, 1, "deposit") _, err := b.GetBalanceHistory("USD", time.Time{}, time.Time{}, 1, "deposit")
if err == nil { if err == nil {
t.Error("Test Failed - GetBalanceHistory() error") t.Error("GetBalanceHistory() Expected error")
} }
} }
@@ -512,7 +512,7 @@ func TestGetMovementHistory(t *testing.T) {
_, err := b.GetMovementHistory("USD", "bitcoin", time.Time{}, time.Time{}, 1) _, err := b.GetMovementHistory("USD", "bitcoin", time.Time{}, time.Time{}, 1)
if err == nil { if err == nil {
t.Error("Test Failed - GetMovementHistory() error") t.Error("GetMovementHistory() Expected error")
} }
} }
@@ -524,7 +524,7 @@ func TestGetTradeHistory(t *testing.T) {
_, err := b.GetTradeHistory("BTCUSD", time.Time{}, time.Time{}, 1, 0) _, err := b.GetTradeHistory("BTCUSD", time.Time{}, time.Time{}, 1, 0)
if err == nil { if err == nil {
t.Error("Test Failed - GetTradeHistory() error") t.Error("GetTradeHistory() Expected error")
} }
} }
@@ -536,7 +536,7 @@ func TestNewOffer(t *testing.T) {
_, err := b.NewOffer("BTC", 1, 1, 1, "loan") _, err := b.NewOffer("BTC", 1, 1, 1, "loan")
if err == nil { if err == nil {
t.Error("Test Failed - NewOffer() error") t.Error("NewOffer() Expected error")
} }
} }
@@ -548,7 +548,7 @@ func TestCancelOffer(t *testing.T) {
_, err := b.CancelOffer(1337) _, err := b.CancelOffer(1337)
if err == nil { if err == nil {
t.Error("Test Failed - CancelOffer() error") t.Error("CancelOffer() Expected error")
} }
} }
@@ -560,7 +560,7 @@ func TestGetOfferStatus(t *testing.T) {
_, err := b.GetOfferStatus(1337) _, err := b.GetOfferStatus(1337)
if err == nil { if err == nil {
t.Error("Test Failed - NewOffer() error") t.Error("NewOffer() Expected error")
} }
} }
@@ -572,7 +572,7 @@ func TestGetActiveCredits(t *testing.T) {
_, err := b.GetActiveCredits() _, err := b.GetActiveCredits()
if err == nil { if err == nil {
t.Error("Test Failed - GetActiveCredits() error", err) t.Error("GetActiveCredits() Expected error")
} }
} }
@@ -584,7 +584,7 @@ func TestGetActiveOffers(t *testing.T) {
_, err := b.GetActiveOffers() _, err := b.GetActiveOffers()
if err == nil { if err == nil {
t.Error("Test Failed - GetActiveOffers() error", err) t.Error("GetActiveOffers() Expected error")
} }
} }
@@ -596,7 +596,7 @@ func TestGetActiveMarginFunding(t *testing.T) {
_, err := b.GetActiveMarginFunding() _, err := b.GetActiveMarginFunding()
if err == nil { if err == nil {
t.Error("Test Failed - GetActiveMarginFunding() error", err) t.Error("GetActiveMarginFunding() Expected error")
} }
} }
@@ -608,7 +608,7 @@ func TestGetUnusedMarginFunds(t *testing.T) {
_, err := b.GetUnusedMarginFunds() _, err := b.GetUnusedMarginFunds()
if err == nil { if err == nil {
t.Error("Test Failed - GetUnusedMarginFunds() error", err) t.Error("GetUnusedMarginFunds() Expected error")
} }
} }
@@ -620,7 +620,7 @@ func TestGetMarginTotalTakenFunds(t *testing.T) {
_, err := b.GetMarginTotalTakenFunds() _, err := b.GetMarginTotalTakenFunds()
if err == nil { if err == nil {
t.Error("Test Failed - GetMarginTotalTakenFunds() error", err) t.Error("GetMarginTotalTakenFunds() Expected error")
} }
} }
@@ -632,7 +632,7 @@ func TestCloseMarginFunding(t *testing.T) {
_, err := b.CloseMarginFunding(1337) _, err := b.CloseMarginFunding(1337)
if err == nil { if err == nil {
t.Error("Test Failed - CloseMarginFunding() error") t.Error("CloseMarginFunding() Expected error")
} }
} }
@@ -669,7 +669,7 @@ func TestGetFee(t *testing.T) {
// CryptocurrencyTradeFee Basic // CryptocurrencyTradeFee Basic
if resp, err := b.GetFee(feeBuilder); resp != float64(0.002) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.002) || err != nil {
t.Error(err) t.Error(err)
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.002), resp)
} }
// CryptocurrencyTradeFee High quantity // CryptocurrencyTradeFee High quantity
@@ -677,7 +677,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.Amount = 1000 feeBuilder.Amount = 1000
feeBuilder.PurchasePrice = 1000 feeBuilder.PurchasePrice = 1000
if resp, err := b.GetFee(feeBuilder); resp != float64(2000) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(2000) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2000), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2000), resp)
t.Error(err) t.Error(err)
} }
@@ -685,7 +685,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.IsMaker = true feeBuilder.IsMaker = true
if resp, err := b.GetFee(feeBuilder); resp != float64(0.001) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.001) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp)
t.Error(err) t.Error(err)
} }
@@ -693,7 +693,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.PurchasePrice = -1000 feeBuilder.PurchasePrice = -1000
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -701,7 +701,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0.0004) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.0004) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0004), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0004), resp)
t.Error(err) t.Error(err)
} }
} }
@@ -710,7 +710,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CyptocurrencyDepositFee feeBuilder.FeeType = exchange.CyptocurrencyDepositFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -719,7 +719,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FeeType = exchange.InternationalBankDepositFee
feeBuilder.FiatCurrency = currency.HKD feeBuilder.FiatCurrency = currency.HKD
if resp, err := b.GetFee(feeBuilder); resp != float64(0.001) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.001) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp)
t.Error(err) t.Error(err)
} }
@@ -728,7 +728,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
feeBuilder.FiatCurrency = currency.HKD feeBuilder.FiatCurrency = currency.HKD
if resp, err := b.GetFee(feeBuilder); resp != float64(0.001) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.001) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp)
t.Error(err) t.Error(err)
} }
} }
@@ -869,7 +869,7 @@ func TestCancelAllExchangeOrdera(t *testing.T) {
func TestModifyOrder(t *testing.T) { func TestModifyOrder(t *testing.T) {
_, err := b.ModifyOrder(&exchange.ModifyOrder{}) _, err := b.ModifyOrder(&exchange.ModifyOrder{})
if err == nil { if err == nil {
t.Error("Test failed - ModifyOrder() error") t.Error("ModifyOrder() Expected error")
} }
} }
@@ -978,12 +978,12 @@ func TestGetDepositAddress(t *testing.T) {
if areTestAPIKeysSet() { if areTestAPIKeysSet() {
_, err := b.GetDepositAddress(currency.BTC, "deposit") _, err := b.GetDepositAddress(currency.BTC, "deposit")
if err != nil { if err != nil {
t.Error("Test Failed - GetDepositAddress() error", err) t.Error("GetDepositAddress() error", err)
} }
} else { } else {
_, err := b.GetDepositAddress(currency.BTC, "deposit") _, err := b.GetDepositAddress(currency.BTC, "deposit")
if err == nil { if err == nil {
t.Error("Test Failed - GetDepositAddress() error cannot be nil") t.Error("GetDepositAddress() error cannot be nil")
} }
} }
} }

View File

@@ -15,6 +15,7 @@ import (
exchange "github.com/thrasher-corp/gocryptotrader/exchanges" exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
@@ -70,9 +71,39 @@ func (b *Bitfinex) SetDefaults() {
Supports: exchange.FeaturesSupported{ Supports: exchange.FeaturesSupported{
REST: true, REST: true,
Websocket: true, Websocket: true,
RESTCapabilities: exchange.ProtocolFeatures{ RESTCapabilities: protocol.Features{
AutoPairUpdates: true, TickerBatching: true,
TickerBatching: true, TickerFetching: true,
OrderbookFetching: true,
AutoPairUpdates: true,
AccountInfo: true,
CryptoDeposit: true,
CryptoWithdrawal: true,
FiatWithdraw: true,
GetOrder: true,
GetOrders: true,
CancelOrders: true,
CancelOrder: true,
SubmitOrder: true,
SubmitOrders: true,
ModifyOrder: true,
DepositHistory: true,
WithdrawalHistory: true,
TradeFetching: true,
UserTradeHistory: true,
TradeFee: true,
FiatDepositFee: true,
FiatWithdrawalFee: true,
CryptoDepositFee: true,
CryptoWithdrawalFee: true,
},
WebsocketCapabilities: protocol.Features{
TickerFetching: true,
TradeFetching: true,
OrderbookFetching: true,
Subscribe: true,
Unsubscribe: true,
AuthenticatedEndpoints: true,
}, },
WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission | WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission |
exchange.AutoWithdrawFiatWithAPIPermission, exchange.AutoWithdrawFiatWithAPIPermission,
@@ -91,12 +122,6 @@ func (b *Bitfinex) SetDefaults() {
b.API.Endpoints.URL = b.API.Endpoints.URLDefault b.API.Endpoints.URL = b.API.Endpoints.URLDefault
b.API.Endpoints.WebsocketURL = bitfinexWebsocket b.API.Endpoints.WebsocketURL = bitfinexWebsocket
b.Websocket = wshandler.New() b.Websocket = wshandler.New()
b.Websocket.Functionality = wshandler.WebsocketTickerSupported |
wshandler.WebsocketTradeDataSupported |
wshandler.WebsocketOrderbookSupported |
wshandler.WebsocketSubscribeSupported |
wshandler.WebsocketUnsubscribeSupported |
wshandler.WebsocketAuthenticatedEndpointsSupported
b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit
b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout
b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit
@@ -126,6 +151,7 @@ func (b *Bitfinex) Setup(exch *config.ExchangeConfig) error {
Connector: b.WsConnect, Connector: b.WsConnect,
Subscriber: b.Subscribe, Subscriber: b.Subscribe,
UnSubscriber: b.Unsubscribe, UnSubscriber: b.Unsubscribe,
Features: &b.Features.Supports.WebsocketCapabilities,
}) })
if err != nil { if err != nil {
return err return err

View File

@@ -28,11 +28,11 @@ func TestSetup(t *testing.T) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true) err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil { if err != nil {
t.Fatal("Test Failed - Bitflyer load config error", err) t.Fatal("Bitflyer load config error", err)
} }
bitflyerConfig, err := cfg.GetExchangeConfig("Bitflyer") bitflyerConfig, err := cfg.GetExchangeConfig("Bitflyer")
if err != nil { if err != nil {
t.Error("Test Failed - bitflyer Setup() init error") t.Error("bitflyer Setup() init error")
} }
bitflyerConfig.API.AuthenticatedSupport = true bitflyerConfig.API.AuthenticatedSupport = true
@@ -41,7 +41,7 @@ func TestSetup(t *testing.T) {
err = b.Setup(bitflyerConfig) err = b.Setup(bitflyerConfig)
if err != nil { if err != nil {
t.Fatal("Test Failed - Bitflyer setup error", err) t.Fatal("Bitflyer setup error", err)
} }
} }
@@ -49,7 +49,7 @@ func TestGetLatestBlockCA(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetLatestBlockCA() _, err := b.GetLatestBlockCA()
if err != nil { if err != nil {
t.Error("test failed - Bitflyer - GetLatestBlockCA() error:", err) t.Error("Bitflyer - GetLatestBlockCA() error:", err)
} }
} }
@@ -57,7 +57,7 @@ func TestGetBlockCA(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetBlockCA("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f") _, err := b.GetBlockCA("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")
if err != nil { if err != nil {
t.Error("test failed - Bitflyer - GetBlockCA() error:", err) t.Error("Bitflyer - GetBlockCA() error:", err)
} }
} }
@@ -65,7 +65,7 @@ func TestGetBlockbyHeightCA(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetBlockbyHeightCA(0) _, err := b.GetBlockbyHeightCA(0)
if err != nil { if err != nil {
t.Error("test failed - Bitflyer - GetBlockbyHeightCA() error:", err) t.Error("Bitflyer - GetBlockbyHeightCA() error:", err)
} }
} }
@@ -73,7 +73,7 @@ func TestGetTransactionByHashCA(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetTransactionByHashCA("0562d1f063cd4127053d838b165630445af5e480ceb24e1fd9ecea52903cb772") _, err := b.GetTransactionByHashCA("0562d1f063cd4127053d838b165630445af5e480ceb24e1fd9ecea52903cb772")
if err != nil { if err != nil {
t.Error("test failed - Bitflyer - GetTransactionByHashCA() error:", err) t.Error("Bitflyer - GetTransactionByHashCA() error:", err)
} }
} }
@@ -81,7 +81,7 @@ func TestGetAddressInfoCA(t *testing.T) {
t.Parallel() t.Parallel()
v, err := b.GetAddressInfoCA("1F5zVDgNjorJ51oGebSvNCrSAHpwGkUdDB") v, err := b.GetAddressInfoCA("1F5zVDgNjorJ51oGebSvNCrSAHpwGkUdDB")
if err != nil { if err != nil {
t.Error("test failed - Bitflyer - GetAddressInfoCA() error:", err) t.Error("Bitflyer - GetAddressInfoCA() error:", err)
} }
if v.UnconfirmedBalance == 0 || v.ConfirmedBalance == 0 { if v.UnconfirmedBalance == 0 || v.ConfirmedBalance == 0 {
log.Warn(log.ExchangeSys, "Donation wallet is empty :( - please consider donating") log.Warn(log.ExchangeSys, "Donation wallet is empty :( - please consider donating")
@@ -92,7 +92,7 @@ func TestGetMarkets(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetMarkets() _, err := b.GetMarkets()
if err != nil { if err != nil {
t.Error("test failed - Bitflyer - GetMarkets() error:", err) t.Error("Bitflyer - GetMarkets() error:", err)
} }
} }
@@ -100,7 +100,7 @@ func TestGetOrderBook(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetOrderBook("BTC_JPY") _, err := b.GetOrderBook("BTC_JPY")
if err != nil { if err != nil {
t.Error("test failed - Bitflyer - GetOrderBook() error:", err) t.Error("Bitflyer - GetOrderBook() error:", err)
} }
} }
@@ -108,7 +108,7 @@ func TestGetTicker(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetTicker("BTC_JPY") _, err := b.GetTicker("BTC_JPY")
if err != nil { if err != nil {
t.Error("test failed - Bitflyer - GetTicker() error:", err) t.Error("Bitflyer - GetTicker() error:", err)
} }
} }
@@ -116,7 +116,7 @@ func TestGetExecutionHistory(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetExecutionHistory("BTC_JPY") _, err := b.GetExecutionHistory("BTC_JPY")
if err != nil { if err != nil {
t.Error("test failed - Bitflyer - GetExecutionHistory() error:", err) t.Error("Bitflyer - GetExecutionHistory() error:", err)
} }
} }
@@ -124,7 +124,7 @@ func TestGetExchangeStatus(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetExchangeStatus() _, err := b.GetExchangeStatus()
if err != nil { if err != nil {
t.Error("test failed - Bitflyer - GetExchangeStatus() error:", err) t.Error("Bitflyer - GetExchangeStatus() error:", err)
} }
} }
@@ -133,7 +133,7 @@ func TestCheckFXString(t *testing.T) {
p := currency.NewPairDelimiter("FXBTC_JPY", "_") p := currency.NewPairDelimiter("FXBTC_JPY", "_")
p = b.CheckFXString(p) p = b.CheckFXString(p)
if p.Base.String() != "FX_BTC" { if p.Base.String() != "FX_BTC" {
t.Error("test failed - Bitflyer - CheckFXString() error") t.Error("Bitflyer - CheckFXString() error")
} }
} }
@@ -151,7 +151,7 @@ func TestFetchTicker(t *testing.T) {
_, err := b.FetchTicker(p, asset.Spot) _, err := b.FetchTicker(p, asset.Spot)
if err != nil { if err != nil {
t.Error("test failed - Bitflyer - FetchTicker() error", err) t.Error("Bitflyer - FetchTicker() error", err)
} }
} }
@@ -190,7 +190,7 @@ func TestGetFee(t *testing.T) {
// CryptocurrencyTradeFee Basic // CryptocurrencyTradeFee Basic
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Error(err) t.Error(err)
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
} }
// CryptocurrencyTradeFee High quantity // CryptocurrencyTradeFee High quantity
@@ -198,7 +198,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.Amount = 1000 feeBuilder.Amount = 1000
feeBuilder.PurchasePrice = 1000 feeBuilder.PurchasePrice = 1000
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -206,7 +206,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.IsMaker = true feeBuilder.IsMaker = true
if resp, err := b.GetFee(feeBuilder); resp != float64(0.1) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.1) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.1), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.1), resp)
t.Error(err) t.Error(err)
} }
@@ -214,7 +214,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.PurchasePrice = -1000 feeBuilder.PurchasePrice = -1000
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -222,7 +222,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
} }
@@ -231,7 +231,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CyptocurrencyDepositFee feeBuilder.FeeType = exchange.CyptocurrencyDepositFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -240,7 +240,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FeeType = exchange.InternationalBankDepositFee
feeBuilder.FiatCurrency = currency.JPY feeBuilder.FiatCurrency = currency.JPY
if resp, err := b.GetFee(feeBuilder); resp != float64(324) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(324) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(324), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(324), resp)
t.Error(err) t.Error(err)
} }
@@ -249,7 +249,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
feeBuilder.FiatCurrency = currency.JPY feeBuilder.FiatCurrency = currency.JPY
if resp, err := b.GetFee(feeBuilder); resp != float64(540) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(540) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(540), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(540), resp)
t.Error(err) t.Error(err)
} }
} }
@@ -397,7 +397,7 @@ func TestWithdraw(t *testing.T) {
func TestModifyOrder(t *testing.T) { func TestModifyOrder(t *testing.T) {
_, err := b.ModifyOrder(&exchange.ModifyOrder{}) _, err := b.ModifyOrder(&exchange.ModifyOrder{})
if err == nil { if err == nil {
t.Error("Test failed - ModifyOrder() error") t.Error("ModifyOrder() Expected error")
} }
} }

View File

@@ -11,6 +11,7 @@ import (
exchange "github.com/thrasher-corp/gocryptotrader/exchanges" exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
@@ -68,9 +69,13 @@ func (b *Bitflyer) SetDefaults() {
Supports: exchange.FeaturesSupported{ Supports: exchange.FeaturesSupported{
REST: true, REST: true,
Websocket: false, Websocket: false,
RESTCapabilities: exchange.ProtocolFeatures{ RESTCapabilities: protocol.Features{
AutoPairUpdates: true, TickerFetching: true,
TickerBatching: false, OrderbookFetching: true,
AutoPairUpdates: true,
TradeFee: true,
FiatDepositFee: true,
FiatWithdrawalFee: true,
}, },
WithdrawPermissions: exchange.WithdrawCryptoViaWebsiteOnly | WithdrawPermissions: exchange.WithdrawCryptoViaWebsiteOnly |
exchange.AutoWithdrawFiat, exchange.AutoWithdrawFiat,

View File

@@ -26,11 +26,11 @@ func TestSetup(t *testing.T) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true) err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil { if err != nil {
t.Fatal("Test Failed - Bithumb load config error", err) t.Fatal("Bithumb load config error", err)
} }
bitConfig, err := cfg.GetExchangeConfig("Bithumb") bitConfig, err := cfg.GetExchangeConfig("Bithumb")
if err != nil { if err != nil {
t.Error("Test Failed - Bithumb Setup() init error") t.Error("Bithumb Setup() init error")
} }
bitConfig.API.AuthenticatedSupport = true bitConfig.API.AuthenticatedSupport = true
@@ -39,7 +39,7 @@ func TestSetup(t *testing.T) {
err = b.Setup(bitConfig) err = b.Setup(bitConfig)
if err != nil { if err != nil {
t.Fatal("Test Failed - Bithumb setup error", err) t.Fatal("Bithumb setup error", err)
} }
} }
@@ -47,7 +47,7 @@ func TestGetTradablePairs(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetTradablePairs() _, err := b.GetTradablePairs()
if err != nil { if err != nil {
t.Error("test failed - Bithumb GetTradablePairs() error", err) t.Error("Bithumb GetTradablePairs() error", err)
} }
} }
@@ -55,7 +55,7 @@ func TestGetTicker(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetTicker("btc") _, err := b.GetTicker("btc")
if err != nil { if err != nil {
t.Error("test failed - Bithumb GetTicker() error", err) t.Error("Bithumb GetTicker() error", err)
} }
} }
@@ -63,7 +63,7 @@ func TestGetAllTickers(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetAllTickers() _, err := b.GetAllTickers()
if err != nil { if err != nil {
t.Error("test failed - Bithumb GetAllTickers() error", err) t.Error("Bithumb GetAllTickers() error", err)
} }
} }
@@ -71,7 +71,7 @@ func TestGetOrderBook(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetOrderBook("btc") _, err := b.GetOrderBook("btc")
if err != nil { if err != nil {
t.Error("test failed - Bithumb GetOrderBook() error", err) t.Error("Bithumb GetOrderBook() error", err)
} }
} }
@@ -79,7 +79,7 @@ func TestGetTransactionHistory(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetTransactionHistory("btc") _, err := b.GetTransactionHistory("btc")
if err != nil { if err != nil {
t.Error("test failed - Bithumb GetTransactionHistory() error", err) t.Error("Bithumb GetTransactionHistory() error", err)
} }
} }
@@ -91,7 +91,7 @@ func TestGetAccountBalance(t *testing.T) {
_, err := b.GetAccountBalance("BTC") _, err := b.GetAccountBalance("BTC")
if err == nil { if err == nil {
t.Error("test failed - Bithumb GetAccountBalance() error", err) t.Error("Bithumb GetAccountBalance() Expected error")
} }
} }
@@ -103,7 +103,7 @@ func TestGetWalletAddress(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetWalletAddress("") _, err := b.GetWalletAddress("")
if err == nil { if err == nil {
t.Error("test failed - Bithumb GetWalletAddress() error", err) t.Error("Bithumb GetWalletAddress() Expected error")
} }
} }
@@ -111,7 +111,7 @@ func TestGetLastTransaction(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetLastTransaction() _, err := b.GetLastTransaction()
if err == nil { if err == nil {
t.Error("test failed - Bithumb GetLastTransaction() error", err) t.Error("Bithumb GetLastTransaction() Expected error")
} }
} }
@@ -119,7 +119,7 @@ func TestGetOrders(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetOrders("1337", "bid", "100", "", "BTC") _, err := b.GetOrders("1337", "bid", "100", "", "BTC")
if err == nil { if err == nil {
t.Error("test failed - Bithumb GetOrders() error", err) t.Error("Bithumb GetOrders() Expected error")
} }
} }
@@ -127,7 +127,7 @@ func TestGetUserTransactions(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetUserTransactions() _, err := b.GetUserTransactions()
if err == nil { if err == nil {
t.Error("test failed - Bithumb GetUserTransactions() error", err) t.Error("Bithumb GetUserTransactions() Expected error")
} }
} }
@@ -135,7 +135,7 @@ func TestPlaceTrade(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.PlaceTrade("btc", "bid", 0, 0) _, err := b.PlaceTrade("btc", "bid", 0, 0)
if err == nil { if err == nil {
t.Error("test failed - Bithumb PlaceTrade() error", err) t.Error("Bithumb PlaceTrade() Expected error")
} }
} }
@@ -143,7 +143,7 @@ func TestGetOrderDetails(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetOrderDetails("1337", "bid", "btc") _, err := b.GetOrderDetails("1337", "bid", "btc")
if err == nil { if err == nil {
t.Error("test failed - Bithumb GetOrderDetails() error", err) t.Error("Bithumb GetOrderDetails() Expected error")
} }
} }
@@ -151,7 +151,7 @@ func TestCancelTrade(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.CancelTrade("", "", "") _, err := b.CancelTrade("", "", "")
if err == nil { if err == nil {
t.Error("test failed - Bithumb CancelTrade() error", err) t.Error("Bithumb CancelTrade() Expected error")
} }
} }
@@ -159,7 +159,7 @@ func TestWithdrawCrypto(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.WithdrawCrypto("LQxiDhKU7idKiWQhx4ALKYkBx8xKEQVxJR", "", "ltc", 0) _, err := b.WithdrawCrypto("LQxiDhKU7idKiWQhx4ALKYkBx8xKEQVxJR", "", "ltc", 0)
if err == nil { if err == nil {
t.Error("test failed - Bithumb WithdrawCrypto() error", err) t.Error("Bithumb WithdrawCrypto() Expected error")
} }
} }
@@ -170,7 +170,7 @@ func TestRequestKRWDepositDetails(t *testing.T) {
} }
_, err := b.RequestKRWDepositDetails() _, err := b.RequestKRWDepositDetails()
if err == nil { if err == nil {
t.Error("test failed - Bithumb RequestKRWDepositDetails() error", err) t.Error("Bithumb RequestKRWDepositDetails() Expected error")
} }
} }
@@ -178,7 +178,7 @@ func TestRequestKRWWithdraw(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.RequestKRWWithdraw("102_bank", "1337", 1000) _, err := b.RequestKRWWithdraw("102_bank", "1337", 1000)
if err == nil { if err == nil {
t.Error("test failed - Bithumb RequestKRWWithdraw() error", err) t.Error("Bithumb RequestKRWWithdraw() Expected error")
} }
} }
@@ -186,7 +186,7 @@ func TestMarketBuyOrder(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.MarketBuyOrder("btc", 0) _, err := b.MarketBuyOrder("btc", 0)
if err == nil { if err == nil {
t.Error("test failed - Bithumb MarketBuyOrder() error", err) t.Error("Bithumb MarketBuyOrder() Expected error")
} }
} }
@@ -194,7 +194,7 @@ func TestMarketSellOrder(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.MarketSellOrder("btc", 0) _, err := b.MarketSellOrder("btc", 0)
if err == nil { if err == nil {
t.Error("test failed - Bithumb MarketSellOrder() error", err) t.Error("Bithumb MarketSellOrder() Expected error")
} }
} }
@@ -230,7 +230,7 @@ func TestGetFee(t *testing.T) {
// CryptocurrencyTradeFee Basic // CryptocurrencyTradeFee Basic
if resp, err := b.GetFee(feeBuilder); resp != float64(0.0025) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.0025) || err != nil {
t.Error(err) t.Error(err)
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp)
} }
// CryptocurrencyTradeFee High quantity // CryptocurrencyTradeFee High quantity
@@ -238,7 +238,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.Amount = 1000 feeBuilder.Amount = 1000
feeBuilder.PurchasePrice = 1000 feeBuilder.PurchasePrice = 1000
if resp, err := b.GetFee(feeBuilder); resp != float64(2500) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(2500) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2500), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2500), resp)
t.Error(err) t.Error(err)
} }
@@ -246,7 +246,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.IsMaker = true feeBuilder.IsMaker = true
if resp, err := b.GetFee(feeBuilder); resp != float64(0.0025) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.0025) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp)
t.Error(err) t.Error(err)
} }
@@ -254,7 +254,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.PurchasePrice = -1000 feeBuilder.PurchasePrice = -1000
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -262,7 +262,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0.001) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.001) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp)
t.Error(err) t.Error(err)
} }
@@ -270,7 +270,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CyptocurrencyDepositFee feeBuilder.FeeType = exchange.CyptocurrencyDepositFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -279,7 +279,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FeeType = exchange.InternationalBankDepositFee
feeBuilder.FiatCurrency = currency.HKD feeBuilder.FiatCurrency = currency.HKD
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -288,7 +288,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
feeBuilder.FiatCurrency = currency.HKD feeBuilder.FiatCurrency = currency.HKD
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
} }
@@ -432,12 +432,12 @@ func TestGetAccountInfo(t *testing.T) {
if apiKey != "" || apiSecret != "" { if apiKey != "" || apiSecret != "" {
_, err := b.GetAccountInfo() _, err := b.GetAccountInfo()
if err != nil { if err != nil {
t.Error("test failed - Bithumb GetAccountInfo() error", err) t.Error("Bithumb GetAccountInfo() error", err)
} }
} else { } else {
_, err := b.GetAccountInfo() _, err := b.GetAccountInfo()
if err == nil { if err == nil {
t.Error("test failed - Bithumb GetAccountInfo() error") t.Error("Bithumb GetAccountInfo() Expected error")
} }
} }
} }
@@ -450,7 +450,7 @@ func TestModifyOrder(t *testing.T) {
OrderSide: exchange.SellOrderSide, OrderSide: exchange.SellOrderSide,
CurrencyPair: curr}) CurrencyPair: curr})
if err == nil { if err == nil {
t.Error("Test Failed - ModifyOrder() error") t.Error("ModifyOrder() Expected error")
} }
} }
@@ -534,12 +534,12 @@ func TestGetDepositAddress(t *testing.T) {
if apiKey != "" && apiSecret != "" { if apiKey != "" && apiSecret != "" {
_, err := b.GetDepositAddress(currency.BTC, "") _, err := b.GetDepositAddress(currency.BTC, "")
if err != nil { if err != nil {
t.Error("Test Failed - GetDepositAddress() error", err) t.Error("GetDepositAddress() error", err)
} }
} else { } else {
_, err := b.GetDepositAddress(currency.BTC, "") _, err := b.GetDepositAddress(currency.BTC, "")
if err == nil { if err == nil {
t.Error("Test Failed - GetDepositAddress() error cannot be nil") t.Error("GetDepositAddress() error cannot be nil")
} }
} }
} }

View File

@@ -15,6 +15,7 @@ import (
exchange "github.com/thrasher-corp/gocryptotrader/exchanges" exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
@@ -70,9 +71,27 @@ func (b *Bithumb) SetDefaults() {
b.Features = exchange.Features{ b.Features = exchange.Features{
Supports: exchange.FeaturesSupported{ Supports: exchange.FeaturesSupported{
REST: true, REST: true,
RESTCapabilities: exchange.ProtocolFeatures{ RESTCapabilities: protocol.Features{
AutoPairUpdates: true, TickerBatching: true,
TickerBatching: true, TickerFetching: true,
TradeFetching: true,
OrderbookFetching: true,
AutoPairUpdates: true,
AccountInfo: true,
CryptoWithdrawal: true,
FiatDeposit: true,
FiatWithdraw: true,
GetOrder: true,
CancelOrder: true,
SubmitOrder: true,
ModifyOrder: true,
DepositHistory: true,
WithdrawalHistory: true,
UserTradeHistory: true,
TradeFee: true,
FiatWithdrawalFee: true,
CryptoDepositFee: true,
CryptoWithdrawalFee: true,
}, },
WithdrawPermissions: exchange.AutoWithdrawCrypto | WithdrawPermissions: exchange.AutoWithdrawCrypto |
exchange.AutoWithdrawFiat, exchange.AutoWithdrawFiat,

View File

@@ -32,11 +32,11 @@ func TestSetup(t *testing.T) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true) err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil { if err != nil {
t.Fatal("Test Failed - Bitmex load config error", err) t.Fatal("Bitmex load config error", err)
} }
bitmexConfig, err := cfg.GetExchangeConfig("Bitmex") bitmexConfig, err := cfg.GetExchangeConfig("Bitmex")
if err != nil { if err != nil {
t.Error("Test Failed - Bitmex Setup() init error") t.Error("Bitmex Setup() init error")
} }
bitmexConfig.API.AuthenticatedSupport = true bitmexConfig.API.AuthenticatedSupport = true
@@ -46,7 +46,7 @@ func TestSetup(t *testing.T) {
err = b.Setup(bitmexConfig) err = b.Setup(bitmexConfig)
if err != nil { if err != nil {
t.Fatal("Test Failed - Bitmex setup error", err) t.Fatal("Bitmex setup error", err)
} }
} }
@@ -59,42 +59,42 @@ func TestStart(t *testing.T) {
func TestGetUrgentAnnouncement(t *testing.T) { func TestGetUrgentAnnouncement(t *testing.T) {
_, err := b.GetUrgentAnnouncement() _, err := b.GetUrgentAnnouncement()
if err == nil { if err == nil {
t.Error("test failed - GetUrgentAnnouncement() error", err) t.Error("GetUrgentAnnouncement() Expected error")
} }
} }
func TestGetAPIKeys(t *testing.T) { func TestGetAPIKeys(t *testing.T) {
_, err := b.GetAPIKeys() _, err := b.GetAPIKeys()
if err == nil { if err == nil {
t.Error("test failed - GetAPIKeys() error", err) t.Error("GetAPIKeys() Expected error")
} }
} }
func TestRemoveAPIKey(t *testing.T) { func TestRemoveAPIKey(t *testing.T) {
_, err := b.RemoveAPIKey(APIKeyParams{APIKeyID: "1337"}) _, err := b.RemoveAPIKey(APIKeyParams{APIKeyID: "1337"})
if err == nil { if err == nil {
t.Error("test failed - RemoveAPIKey() error", err) t.Error("RemoveAPIKey() Expected error")
} }
} }
func TestDisableAPIKey(t *testing.T) { func TestDisableAPIKey(t *testing.T) {
_, err := b.DisableAPIKey(APIKeyParams{APIKeyID: "1337"}) _, err := b.DisableAPIKey(APIKeyParams{APIKeyID: "1337"})
if err == nil { if err == nil {
t.Error("test failed - DisableAPIKey() error", err) t.Error("DisableAPIKey() Expected error")
} }
} }
func TestEnableAPIKey(t *testing.T) { func TestEnableAPIKey(t *testing.T) {
_, err := b.EnableAPIKey(APIKeyParams{APIKeyID: "1337"}) _, err := b.EnableAPIKey(APIKeyParams{APIKeyID: "1337"})
if err == nil { if err == nil {
t.Error("test failed - EnableAPIKey() error", err) t.Error("EnableAPIKey() Expected error")
} }
} }
func TestGetTrollboxMessages(t *testing.T) { func TestGetTrollboxMessages(t *testing.T) {
_, err := b.GetTrollboxMessages(ChatGetParams{Count: 5}) _, err := b.GetTrollboxMessages(ChatGetParams{Count: 5})
if err != nil { if err != nil {
t.Error("test failed - GetTrollboxMessages() error", err) t.Error("GetTrollboxMessages() error", err)
} }
} }
@@ -103,126 +103,126 @@ func TestSendTrollboxMessage(t *testing.T) {
ChannelID: 1337, ChannelID: 1337,
Message: "Hello,World!"}) Message: "Hello,World!"})
if err == nil { if err == nil {
t.Error("test failed - SendTrollboxMessage() error", err) t.Error("SendTrollboxMessage() Expected error")
} }
} }
func TestGetTrollboxChannels(t *testing.T) { func TestGetTrollboxChannels(t *testing.T) {
_, err := b.GetTrollboxChannels() _, err := b.GetTrollboxChannels()
if err != nil { if err != nil {
t.Error("test failed - GetTrollboxChannels() error", err) t.Error("GetTrollboxChannels() error", err)
} }
} }
func TestGetTrollboxConnectedUsers(t *testing.T) { func TestGetTrollboxConnectedUsers(t *testing.T) {
_, err := b.GetTrollboxConnectedUsers() _, err := b.GetTrollboxConnectedUsers()
if err == nil { if err == nil {
t.Error("test failed - GetTrollboxConnectedUsers() error", err) t.Error("GetTrollboxConnectedUsers() Expected error")
} }
} }
func TestGetAccountExecutions(t *testing.T) { func TestGetAccountExecutions(t *testing.T) {
_, err := b.GetAccountExecutions(&GenericRequestParams{}) _, err := b.GetAccountExecutions(&GenericRequestParams{})
if err == nil { if err == nil {
t.Error("test failed - GetAccountExecutions() error", err) t.Error("GetAccountExecutions() Expected error")
} }
} }
func TestGetAccountExecutionTradeHistory(t *testing.T) { func TestGetAccountExecutionTradeHistory(t *testing.T) {
_, err := b.GetAccountExecutionTradeHistory(&GenericRequestParams{}) _, err := b.GetAccountExecutionTradeHistory(&GenericRequestParams{})
if err == nil { if err == nil {
t.Error("test failed - GetAccountExecutionTradeHistory() error", err) t.Error("GetAccountExecutionTradeHistory() Expected error")
} }
} }
func TestGetFundingHistory(t *testing.T) { func TestGetFundingHistory(t *testing.T) {
_, err := b.GetFundingHistory() _, err := b.GetFundingHistory()
if err == nil { if err == nil {
t.Error("test failed - GetFundingHistory() error", err) t.Error("GetFundingHistory() Expected error")
} }
} }
func TestGetInstruments(t *testing.T) { func TestGetInstruments(t *testing.T) {
_, err := b.GetInstruments(&GenericRequestParams{}) _, err := b.GetInstruments(&GenericRequestParams{})
if err != nil { if err != nil {
t.Error("test failed - GetInstruments() error", err) t.Error("GetInstruments() error", err)
} }
} }
func TestGetActiveInstruments(t *testing.T) { func TestGetActiveInstruments(t *testing.T) {
_, err := b.GetActiveInstruments(&GenericRequestParams{}) _, err := b.GetActiveInstruments(&GenericRequestParams{})
if err != nil { if err != nil {
t.Error("test failed - GetActiveInstruments() error", err) t.Error("GetActiveInstruments() error", err)
} }
} }
func TestGetActiveAndIndexInstruments(t *testing.T) { func TestGetActiveAndIndexInstruments(t *testing.T) {
_, err := b.GetActiveAndIndexInstruments() _, err := b.GetActiveAndIndexInstruments()
if err != nil { if err != nil {
t.Error("test failed - GetActiveAndIndexInstruments() error", err) t.Error("GetActiveAndIndexInstruments() error", err)
} }
} }
func TestGetActiveIntervals(t *testing.T) { func TestGetActiveIntervals(t *testing.T) {
_, err := b.GetActiveIntervals() _, err := b.GetActiveIntervals()
if err == nil { if err == nil {
t.Error("test failed - GetActiveIntervals() error", err) t.Error("GetActiveIntervals() Expected error")
} }
} }
func TestGetCompositeIndex(t *testing.T) { func TestGetCompositeIndex(t *testing.T) {
_, err := b.GetCompositeIndex(&GenericRequestParams{}) _, err := b.GetCompositeIndex(&GenericRequestParams{})
if err == nil { if err == nil {
t.Error("test failed - GetCompositeIndex() error", err) t.Error("GetCompositeIndex() Expected error")
} }
} }
func TestGetIndices(t *testing.T) { func TestGetIndices(t *testing.T) {
_, err := b.GetIndices() _, err := b.GetIndices()
if err != nil { if err != nil {
t.Error("test failed - GetIndices() error", err) t.Error("GetIndices() error", err)
} }
} }
func TestGetInsuranceFundHistory(t *testing.T) { func TestGetInsuranceFundHistory(t *testing.T) {
_, err := b.GetInsuranceFundHistory(&GenericRequestParams{}) _, err := b.GetInsuranceFundHistory(&GenericRequestParams{})
if err != nil { if err != nil {
t.Error("test failed - GetInsuranceFundHistory() error", err) t.Error("GetInsuranceFundHistory() error", err)
} }
} }
func TestGetLeaderboard(t *testing.T) { func TestGetLeaderboard(t *testing.T) {
_, err := b.GetLeaderboard(LeaderboardGetParams{}) _, err := b.GetLeaderboard(LeaderboardGetParams{})
if err != nil { if err != nil {
t.Error("test failed - GetLeaderboard() error", err) t.Error("GetLeaderboard() error", err)
} }
} }
func TestGetAliasOnLeaderboard(t *testing.T) { func TestGetAliasOnLeaderboard(t *testing.T) {
_, err := b.GetAliasOnLeaderboard() _, err := b.GetAliasOnLeaderboard()
if err == nil { if err == nil {
t.Error("test failed - GetAliasOnLeaderboard() error", err) t.Error("GetAliasOnLeaderboard() Expected error")
} }
} }
func TestGetLiquidationOrders(t *testing.T) { func TestGetLiquidationOrders(t *testing.T) {
_, err := b.GetLiquidationOrders(&GenericRequestParams{}) _, err := b.GetLiquidationOrders(&GenericRequestParams{})
if err != nil { if err != nil {
t.Error("test failed - GetLiquidationOrders() error", err) t.Error("GetLiquidationOrders() error", err)
} }
} }
func TestGetCurrentNotifications(t *testing.T) { func TestGetCurrentNotifications(t *testing.T) {
_, err := b.GetCurrentNotifications() _, err := b.GetCurrentNotifications()
if err == nil { if err == nil {
t.Error("test failed - GetCurrentNotifications() error", err) t.Error("GetCurrentNotifications() Expected error")
} }
} }
func TestAmendOrder(t *testing.T) { func TestAmendOrder(t *testing.T) {
_, err := b.AmendOrder(&OrderAmendParams{}) _, err := b.AmendOrder(&OrderAmendParams{})
if err == nil { if err == nil {
t.Error("test failed - AmendOrder() error", err) t.Error("AmendOrder() Expected error")
} }
} }
@@ -232,126 +232,126 @@ func TestCreateOrder(t *testing.T) {
ClOrdID: "mm_bitmex_1a/oemUeQ4CAJZgP3fjHsA", ClOrdID: "mm_bitmex_1a/oemUeQ4CAJZgP3fjHsA",
OrderQty: 98}) OrderQty: 98})
if err == nil { if err == nil {
t.Error("test failed - CreateOrder() error", err) t.Error("CreateOrder() Expected error")
} }
} }
func TestCancelOrders(t *testing.T) { func TestCancelOrders(t *testing.T) {
_, err := b.CancelOrders(&OrderCancelParams{}) _, err := b.CancelOrders(&OrderCancelParams{})
if err == nil { if err == nil {
t.Error("test failed - CancelOrders() error", err) t.Error("CancelOrders() Expected error")
} }
} }
func TestCancelAllOrders(t *testing.T) { func TestCancelAllOrders(t *testing.T) {
_, err := b.CancelAllExistingOrders(OrderCancelAllParams{}) _, err := b.CancelAllExistingOrders(OrderCancelAllParams{})
if err == nil { if err == nil {
t.Error("test failed - CancelAllOrders(orderCancellation *exchange.OrderCancellation) (exchange.CancelAllOrdersResponse, error)", err) t.Error("CancelAllOrders(orderCancellation *exchange.OrderCancellation) (exchange.CancelAllOrdersResponse, error)", err)
} }
} }
func TestAmendBulkOrders(t *testing.T) { func TestAmendBulkOrders(t *testing.T) {
_, err := b.AmendBulkOrders(OrderAmendBulkParams{}) _, err := b.AmendBulkOrders(OrderAmendBulkParams{})
if err == nil { if err == nil {
t.Error("test failed - AmendBulkOrders() error", err) t.Error("AmendBulkOrders() Expected error")
} }
} }
func TestCreateBulkOrders(t *testing.T) { func TestCreateBulkOrders(t *testing.T) {
_, err := b.CreateBulkOrders(OrderNewBulkParams{}) _, err := b.CreateBulkOrders(OrderNewBulkParams{})
if err == nil { if err == nil {
t.Error("test failed - CreateBulkOrders() error", err) t.Error("CreateBulkOrders() Expected error")
} }
} }
func TestCancelAllOrdersAfterTime(t *testing.T) { func TestCancelAllOrdersAfterTime(t *testing.T) {
_, err := b.CancelAllOrdersAfterTime(OrderCancelAllAfterParams{}) _, err := b.CancelAllOrdersAfterTime(OrderCancelAllAfterParams{})
if err == nil { if err == nil {
t.Error("test failed - CancelAllOrdersAfterTime() error", err) t.Error("CancelAllOrdersAfterTime() Expected error")
} }
} }
func TestClosePosition(t *testing.T) { func TestClosePosition(t *testing.T) {
_, err := b.ClosePosition(OrderClosePositionParams{}) _, err := b.ClosePosition(OrderClosePositionParams{})
if err == nil { if err == nil {
t.Error("test failed - ClosePosition() error", err) t.Error("ClosePosition() Expected error")
} }
} }
func TestGetOrderbook(t *testing.T) { func TestGetOrderbook(t *testing.T) {
_, err := b.GetOrderbook(OrderBookGetL2Params{Symbol: "XBT"}) _, err := b.GetOrderbook(OrderBookGetL2Params{Symbol: "XBT"})
if err != nil { if err != nil {
t.Error("test failed - GetOrderbook() error", err) t.Error("GetOrderbook() error", err)
} }
} }
func TestGetPositions(t *testing.T) { func TestGetPositions(t *testing.T) {
_, err := b.GetPositions(PositionGetParams{}) _, err := b.GetPositions(PositionGetParams{})
if err == nil { if err == nil {
t.Error("test failed - GetPositions() error", err) t.Error("GetPositions() Expected error")
} }
} }
func TestIsolatePosition(t *testing.T) { func TestIsolatePosition(t *testing.T) {
_, err := b.IsolatePosition(PositionIsolateMarginParams{Symbol: "XBT"}) _, err := b.IsolatePosition(PositionIsolateMarginParams{Symbol: "XBT"})
if err == nil { if err == nil {
t.Error("test failed - IsolatePosition() error", err) t.Error("IsolatePosition() Expected error")
} }
} }
func TestLeveragePosition(t *testing.T) { func TestLeveragePosition(t *testing.T) {
_, err := b.LeveragePosition(PositionUpdateLeverageParams{}) _, err := b.LeveragePosition(PositionUpdateLeverageParams{})
if err == nil { if err == nil {
t.Error("test failed - LeveragePosition() error", err) t.Error("LeveragePosition() Expected error")
} }
} }
func TestUpdateRiskLimit(t *testing.T) { func TestUpdateRiskLimit(t *testing.T) {
_, err := b.UpdateRiskLimit(PositionUpdateRiskLimitParams{}) _, err := b.UpdateRiskLimit(PositionUpdateRiskLimitParams{})
if err == nil { if err == nil {
t.Error("test failed - UpdateRiskLimit() error", err) t.Error("UpdateRiskLimit() Expected error")
} }
} }
func TestTransferMargin(t *testing.T) { func TestTransferMargin(t *testing.T) {
_, err := b.TransferMargin(PositionTransferIsolatedMarginParams{}) _, err := b.TransferMargin(PositionTransferIsolatedMarginParams{})
if err == nil { if err == nil {
t.Error("test failed - TransferMargin() error", err) t.Error("TransferMargin() Expected error")
} }
} }
func TestGetQuotesByBuckets(t *testing.T) { func TestGetQuotesByBuckets(t *testing.T) {
_, err := b.GetQuotesByBuckets(&QuoteGetBucketedParams{}) _, err := b.GetQuotesByBuckets(&QuoteGetBucketedParams{})
if err == nil { if err == nil {
t.Error("test failed - GetQuotesByBuckets() error", err) t.Error("GetQuotesByBuckets() Expected error")
} }
} }
func TestGetSettlementHistory(t *testing.T) { func TestGetSettlementHistory(t *testing.T) {
_, err := b.GetSettlementHistory(&GenericRequestParams{}) _, err := b.GetSettlementHistory(&GenericRequestParams{})
if err != nil { if err != nil {
t.Error("test failed - GetSettlementHistory() error", err) t.Error("GetSettlementHistory() error", err)
} }
} }
func TestGetStats(t *testing.T) { func TestGetStats(t *testing.T) {
_, err := b.GetStats() _, err := b.GetStats()
if err != nil { if err != nil {
t.Error("test failed - GetStats() error", err) t.Error("GetStats() error", err)
} }
} }
func TestGetStatsHistorical(t *testing.T) { func TestGetStatsHistorical(t *testing.T) {
_, err := b.GetStatsHistorical() _, err := b.GetStatsHistorical()
if err != nil { if err != nil {
t.Error("test failed - GetStatsHistorical() error", err) t.Error("GetStatsHistorical() error", err)
} }
} }
func TestGetStatSummary(t *testing.T) { func TestGetStatSummary(t *testing.T) {
_, err := b.GetStatSummary() _, err := b.GetStatSummary()
if err != nil { if err != nil {
t.Error("test failed - GetStatSummary() error", err) t.Error("GetStatSummary() error", err)
} }
} }
@@ -361,14 +361,14 @@ func TestGetTrade(t *testing.T) {
StartTime: time.Now().Format(time.RFC3339), StartTime: time.Now().Format(time.RFC3339),
Reverse: true}) Reverse: true})
if err != nil { if err != nil {
t.Error("test failed - GetTrade() error", err) t.Error("GetTrade() error", err)
} }
} }
func TestGetPreviousTrades(t *testing.T) { func TestGetPreviousTrades(t *testing.T) {
_, err := b.GetPreviousTrades(&TradeGetBucketedParams{}) _, err := b.GetPreviousTrades(&TradeGetBucketedParams{})
if err == nil { if err == nil {
t.Error("test failed - GetPreviousTrades() error", err) t.Error("GetPreviousTrades() Expected error")
} }
} }
@@ -404,7 +404,7 @@ func TestGetFee(t *testing.T) {
// CryptocurrencyTradeFee Basic // CryptocurrencyTradeFee Basic
if resp, err := b.GetFee(feeBuilder); resp != float64(0.00075) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.00075) || err != nil {
t.Error(err) t.Error(err)
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.00075), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.00075), resp)
} }
// CryptocurrencyTradeFee High quantity // CryptocurrencyTradeFee High quantity
@@ -412,7 +412,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.Amount = 1000 feeBuilder.Amount = 1000
feeBuilder.PurchasePrice = 1000 feeBuilder.PurchasePrice = 1000
if resp, err := b.GetFee(feeBuilder); resp != float64(750) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(750) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(750), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(750), resp)
t.Error(err) t.Error(err)
} }
@@ -420,7 +420,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.IsMaker = true feeBuilder.IsMaker = true
if resp, err := b.GetFee(feeBuilder); resp != float64(0.0005) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.0005) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp)
t.Error(err) t.Error(err)
} }
@@ -428,7 +428,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.PurchasePrice = -1000 feeBuilder.PurchasePrice = -1000
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -436,7 +436,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -444,7 +444,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CyptocurrencyDepositFee feeBuilder.FeeType = exchange.CyptocurrencyDepositFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -453,7 +453,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FeeType = exchange.InternationalBankDepositFee
feeBuilder.FiatCurrency = currency.HKD feeBuilder.FiatCurrency = currency.HKD
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -462,7 +462,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
feeBuilder.FiatCurrency = currency.HKD feeBuilder.FiatCurrency = currency.HKD
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
} }
@@ -607,12 +607,12 @@ func TestGetAccountInfo(t *testing.T) {
if apiKey != "" || apiSecret != "" { if apiKey != "" || apiSecret != "" {
_, err := b.GetAccountInfo() _, err := b.GetAccountInfo()
if err != nil { if err != nil {
t.Error("Test Failed - GetAccountInfo() error", err) t.Error("GetAccountInfo() error", err)
} }
} else { } else {
_, err := b.GetAccountInfo() _, err := b.GetAccountInfo()
if err == nil { if err == nil {
t.Error("Test Failed - GetAccountInfo() error") t.Error("GetAccountInfo() error")
} }
} }
} }
@@ -620,7 +620,7 @@ func TestGetAccountInfo(t *testing.T) {
func TestModifyOrder(t *testing.T) { func TestModifyOrder(t *testing.T) {
_, err := b.ModifyOrder(&exchange.ModifyOrder{OrderID: "1337"}) _, err := b.ModifyOrder(&exchange.ModifyOrder{OrderID: "1337"})
if err == nil { if err == nil {
t.Error("Test Failed - ModifyOrder() error") t.Error("ModifyOrder() error")
} }
} }
@@ -685,12 +685,12 @@ func TestGetDepositAddress(t *testing.T) {
if areTestAPIKeysSet() { if areTestAPIKeysSet() {
_, err := b.GetDepositAddress(currency.BTC, "") _, err := b.GetDepositAddress(currency.BTC, "")
if err != nil { if err != nil {
t.Error("Test Failed - GetDepositAddress() error", err) t.Error("GetDepositAddress() error", err)
} }
} else { } else {
_, err := b.GetDepositAddress(currency.BTC, "") _, err := b.GetDepositAddress(currency.BTC, "")
if err == nil { if err == nil {
t.Error("Test Failed - GetDepositAddress() error cannot be nil") t.Error("GetDepositAddress() error cannot be nil")
} }
} }
} }

View File

@@ -13,6 +13,7 @@ import (
exchange "github.com/thrasher-corp/gocryptotrader/exchanges" exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
@@ -90,9 +91,36 @@ func (b *Bitmex) SetDefaults() {
Supports: exchange.FeaturesSupported{ Supports: exchange.FeaturesSupported{
REST: true, REST: true,
Websocket: true, Websocket: true,
RESTCapabilities: exchange.ProtocolFeatures{ RESTCapabilities: protocol.Features{
AutoPairUpdates: true, TickerBatching: true,
TickerBatching: true, TickerFetching: true,
TradeFetching: true,
OrderbookFetching: true,
AutoPairUpdates: true,
AccountInfo: true,
GetOrder: true,
GetOrders: true,
CancelOrders: true,
CancelOrder: true,
SubmitOrder: true,
SubmitOrders: true,
ModifyOrder: true,
DepositHistory: true,
WithdrawalHistory: true,
UserTradeHistory: true,
CryptoDeposit: true,
CryptoWithdrawal: true,
TradeFee: true,
CryptoWithdrawalFee: true,
},
WebsocketCapabilities: protocol.Features{
TradeFetching: true,
OrderbookFetching: true,
Subscribe: true,
Unsubscribe: true,
AuthenticatedEndpoints: true,
AccountInfo: true,
DeadMansSwitch: true,
}, },
WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission | WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission |
exchange.WithdrawCryptoWithEmail | exchange.WithdrawCryptoWithEmail |
@@ -113,13 +141,6 @@ func (b *Bitmex) SetDefaults() {
b.API.Endpoints.URL = b.API.Endpoints.URLDefault b.API.Endpoints.URL = b.API.Endpoints.URLDefault
b.API.Endpoints.WebsocketURL = bitmexWSURL b.API.Endpoints.WebsocketURL = bitmexWSURL
b.Websocket = wshandler.New() b.Websocket = wshandler.New()
b.Websocket.Functionality = wshandler.WebsocketTradeDataSupported |
wshandler.WebsocketOrderbookSupported |
wshandler.WebsocketSubscribeSupported |
wshandler.WebsocketUnsubscribeSupported |
wshandler.WebsocketAuthenticatedEndpointsSupported |
wshandler.WebsocketAccountDataSupported |
wshandler.WebsocketDeadMansSwitchSupported
b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit
b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout
b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit
@@ -149,6 +170,7 @@ func (b *Bitmex) Setup(exch *config.ExchangeConfig) error {
Connector: b.WsConnect, Connector: b.WsConnect,
Subscriber: b.Subscribe, Subscriber: b.Subscribe,
UnSubscriber: b.Unsubscribe, UnSubscriber: b.Unsubscribe,
Features: &b.Features.Supports.WebsocketCapabilities,
}) })
if err != nil { if err != nil {
return err return err

View File

@@ -19,11 +19,11 @@ func TestMain(m *testing.M) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true) err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil { if err != nil {
log.Fatal("Test Failed - Bitstamp load config error", err) log.Fatal("Bitstamp load config error", err)
} }
bitstampConfig, err := cfg.GetExchangeConfig("Bitstamp") bitstampConfig, err := cfg.GetExchangeConfig("Bitstamp")
if err != nil { if err != nil {
log.Fatal("Test Failed - Bitstamp Setup() init error", err) log.Fatal("Bitstamp Setup() init error", err)
} }
bitstampConfig.API.AuthenticatedSupport = true bitstampConfig.API.AuthenticatedSupport = true
bitstampConfig.API.Credentials.Key = apiKey bitstampConfig.API.Credentials.Key = apiKey
@@ -32,7 +32,7 @@ func TestMain(m *testing.M) {
b.SetDefaults() b.SetDefaults()
err = b.Setup(bitstampConfig) err = b.Setup(bitstampConfig)
if err != nil { if err != nil {
log.Fatal("Test Failed - Bitstamp setup error", err) log.Fatal("Bitstamp setup error", err)
} }
log.Printf(sharedtestvalues.LiveTesting, b.GetName(), b.API.Endpoints.URL) log.Printf(sharedtestvalues.LiveTesting, b.GetName(), b.API.Endpoints.URL)
os.Exit(m.Run()) os.Exit(m.Run())

View File

@@ -22,11 +22,11 @@ func TestMain(m *testing.M) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true) err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil { if err != nil {
log.Fatal("Test Failed - Bitstamp load config error", err) log.Fatal("Bitstamp load config error", err)
} }
bitstampConfig, err := cfg.GetExchangeConfig("Bitstamp") bitstampConfig, err := cfg.GetExchangeConfig("Bitstamp")
if err != nil { if err != nil {
log.Fatal("Test Failed - Bitstamp Setup() init error", err) log.Fatal("Bitstamp Setup() init error", err)
} }
b.SkipAuthCheck = true b.SkipAuthCheck = true
bitstampConfig.API.AuthenticatedSupport = true bitstampConfig.API.AuthenticatedSupport = true
@@ -36,12 +36,12 @@ func TestMain(m *testing.M) {
b.SetDefaults() b.SetDefaults()
err = b.Setup(bitstampConfig) err = b.Setup(bitstampConfig)
if err != nil { if err != nil {
log.Fatal("Test Failed - Bitstamp setup error", err) log.Fatal("Bitstamp setup error", err)
} }
serverDetails, newClient, err := mock.NewVCRServer(mockfile) serverDetails, newClient, err := mock.NewVCRServer(mockfile)
if err != nil { if err != nil {
log.Fatalf("Test Failed - Mock server error %s", err) log.Fatalf("Mock server error %s", err)
} }
b.HTTPClient = newClient b.HTTPClient = newClient

View File

@@ -60,7 +60,7 @@ func TestGetFee(t *testing.T) {
// CryptocurrencyTradeFee Basic // CryptocurrencyTradeFee Basic
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || (areTestAPIKeysSet() && err != nil) { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || (areTestAPIKeysSet() && err != nil) {
t.Error(err) t.Error(err)
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", t.Errorf("GetFee() error. Expected: %f, Received: %f",
float64(0), float64(0),
resp) resp)
} }
@@ -70,7 +70,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.Amount = 1000 feeBuilder.Amount = 1000
feeBuilder.PurchasePrice = 1000 feeBuilder.PurchasePrice = 1000
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || (areTestAPIKeysSet() && err != nil) { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || (areTestAPIKeysSet() && err != nil) {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", t.Errorf("GetFee() error. Expected: %f, Received: %f",
float64(0), float64(0),
resp) resp)
t.Error(err) t.Error(err)
@@ -80,7 +80,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.IsMaker = true feeBuilder.IsMaker = true
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || (areTestAPIKeysSet() && err != nil) { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || (areTestAPIKeysSet() && err != nil) {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", t.Errorf("GetFee() error. Expected: %f, Received: %f",
float64(0), float64(0),
resp) resp)
t.Error(err) t.Error(err)
@@ -90,7 +90,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.PurchasePrice = -1000 feeBuilder.PurchasePrice = -1000
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || (areTestAPIKeysSet() && err != nil) { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || (areTestAPIKeysSet() && err != nil) {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", t.Errorf("GetFee() error. Expected: %f, Received: %f",
float64(0), float64(0),
resp) resp)
t.Error(err) t.Error(err)
@@ -100,7 +100,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", t.Errorf("GetFee() error. Expected: %f, Received: %f",
float64(0), float64(0),
resp) resp)
t.Error(err) t.Error(err)
@@ -110,7 +110,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CyptocurrencyDepositFee feeBuilder.FeeType = exchange.CyptocurrencyDepositFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", t.Errorf("GetFee() error. Expected: %f, Received: %f",
float64(0), float64(0),
resp) resp)
t.Error(err) t.Error(err)
@@ -121,7 +121,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FeeType = exchange.InternationalBankDepositFee
feeBuilder.FiatCurrency = currency.HKD feeBuilder.FiatCurrency = currency.HKD
if resp, err := b.GetFee(feeBuilder); resp != float64(7.5) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(7.5) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", t.Errorf("GetFee() error. Expected: %f, Received: %f",
float64(7.5), float64(7.5),
resp) resp)
t.Error(err) t.Error(err)
@@ -132,7 +132,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
feeBuilder.FiatCurrency = currency.HKD feeBuilder.FiatCurrency = currency.HKD
if resp, err := b.GetFee(feeBuilder); resp != float64(15) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(15) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", t.Errorf("GetFee() error. Expected: %f, Received: %f",
float64(15), float64(15),
resp) resp)
t.Error(err) t.Error(err)
@@ -147,18 +147,18 @@ func TestCalculateTradingFee(t *testing.T) {
newBalance.BTCEURFee = 0 newBalance.BTCEURFee = 0
if resp := b.CalculateTradingFee(currency.BTC, currency.USD, 0, 0, newBalance); resp != 0 { if resp := b.CalculateTradingFee(currency.BTC, currency.USD, 0, 0, newBalance); resp != 0 {
t.Error("Test Failed - GetFee() error") t.Error("GetFee() error")
} }
if resp := b.CalculateTradingFee(currency.BTC, currency.USD, 2, 2, newBalance); resp != float64(4) { if resp := b.CalculateTradingFee(currency.BTC, currency.USD, 2, 2, newBalance); resp != float64(4) {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(4), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(4), resp)
} }
if resp := b.CalculateTradingFee(currency.BTC, currency.EUR, 2, 2, newBalance); resp != float64(0) { if resp := b.CalculateTradingFee(currency.BTC, currency.EUR, 2, 2, newBalance); resp != float64(0) {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
} }
dummy1, dummy2 := currency.NewCode(""), currency.NewCode("") dummy1, dummy2 := currency.NewCode(""), currency.NewCode("")
if resp := b.CalculateTradingFee(dummy1, dummy2, 0, 0, newBalance); resp != 0 { if resp := b.CalculateTradingFee(dummy1, dummy2, 0, 0, newBalance); resp != 0 {
t.Error("Test Failed - GetFee() error") t.Error("GetFee() error")
} }
} }
@@ -167,7 +167,7 @@ func TestGetTicker(t *testing.T) {
_, err := b.GetTicker(currency.BTC.String()+currency.USD.String(), false) _, err := b.GetTicker(currency.BTC.String()+currency.USD.String(), false)
if err != nil { if err != nil {
t.Error("Test Failed - GetTicker() error", err) t.Error("GetTicker() error", err)
} }
} }
@@ -176,7 +176,7 @@ func TestGetOrderbook(t *testing.T) {
_, err := b.GetOrderbook(currency.BTC.String() + currency.USD.String()) _, err := b.GetOrderbook(currency.BTC.String() + currency.USD.String())
if err != nil { if err != nil {
t.Error("Test Failed - GetOrderbook() error", err) t.Error("GetOrderbook() error", err)
} }
} }
@@ -185,7 +185,7 @@ func TestGetTradingPairs(t *testing.T) {
_, err := b.GetTradingPairs() _, err := b.GetTradingPairs()
if err != nil { if err != nil {
t.Error("Test Failed - GetTradingPairs() error", err) t.Error("GetTradingPairs() error", err)
} }
} }
@@ -197,7 +197,7 @@ func TestGetTransactions(t *testing.T) {
_, err := b.GetTransactions(currency.BTC.String()+currency.USD.String(), value) _, err := b.GetTransactions(currency.BTC.String()+currency.USD.String(), value)
if err != nil { if err != nil {
t.Error("Test Failed - GetTransactions() error", err) t.Error("GetTransactions() error", err)
} }
} }
@@ -206,7 +206,7 @@ func TestGetEURUSDConversionRate(t *testing.T) {
_, err := b.GetEURUSDConversionRate() _, err := b.GetEURUSDConversionRate()
if err != nil { if err != nil {
t.Error("Test Failed - GetEURUSDConversionRate() error", err) t.Error("GetEURUSDConversionRate() error", err)
} }
} }
@@ -216,11 +216,11 @@ func TestGetBalance(t *testing.T) {
_, err := b.GetBalance() _, err := b.GetBalance()
switch { switch {
case areTestAPIKeysSet() && err != nil && !mockTests: case areTestAPIKeysSet() && err != nil && !mockTests:
t.Error("Test Failed - GetBalance() error", err) t.Error("GetBalance() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Expecting an error when no keys are set") t.Error("Expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - GetBalance() error", err) t.Error("GetBalance() error", err)
} }
} }
@@ -230,11 +230,11 @@ func TestGetUserTransactions(t *testing.T) {
_, err := b.GetUserTransactions("btcusd") _, err := b.GetUserTransactions("btcusd")
switch { switch {
case areTestAPIKeysSet() && err != nil && !mockTests: case areTestAPIKeysSet() && err != nil && !mockTests:
t.Error("Test Failed - GetUserTransactions() error", err) t.Error("GetUserTransactions() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Expecting an error when no keys are set") t.Error("Expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - GetUserTransactions() error", err) t.Error("GetUserTransactions() error", err)
} }
} }
@@ -244,11 +244,11 @@ func TestGetOpenOrders(t *testing.T) {
_, err := b.GetOpenOrders("btcusd") _, err := b.GetOpenOrders("btcusd")
switch { switch {
case areTestAPIKeysSet() && err != nil && !mockTests: case areTestAPIKeysSet() && err != nil && !mockTests:
t.Error("Test Failed - GetOpenOrders() error", err) t.Error("GetOpenOrders() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Expecting an error when no keys are set") t.Error("Expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - GetOpenOrders() error", err) t.Error("GetOpenOrders() error", err)
} }
} }
@@ -258,7 +258,7 @@ func TestGetOrderStatus(t *testing.T) {
_, err := b.GetOrderStatus(1337) _, err := b.GetOrderStatus(1337)
switch { switch {
case areTestAPIKeysSet() && err != nil && !mockTests: case areTestAPIKeysSet() && err != nil && !mockTests:
t.Error("Test Failed - GetOrderStatus() error", err) t.Error("GetOrderStatus() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Expecting an error when no keys are set") t.Error("Expecting an error when no keys are set")
case mockTests && err == nil: case mockTests && err == nil:
@@ -272,11 +272,11 @@ func TestGetWithdrawalRequests(t *testing.T) {
_, err := b.GetWithdrawalRequests(0) _, err := b.GetWithdrawalRequests(0)
switch { switch {
case areTestAPIKeysSet() && err != nil && !mockTests: case areTestAPIKeysSet() && err != nil && !mockTests:
t.Error("Test Failed - GetWithdrawalRequests() error", err) t.Error("GetWithdrawalRequests() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Expecting an error when no keys are set") t.Error("Expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - GetWithdrawalRequests() error", err) t.Error("GetWithdrawalRequests() error", err)
} }
} }
@@ -286,11 +286,11 @@ func TestGetUnconfirmedBitcoinDeposits(t *testing.T) {
_, err := b.GetUnconfirmedBitcoinDeposits() _, err := b.GetUnconfirmedBitcoinDeposits()
switch { switch {
case areTestAPIKeysSet() && err != nil && !mockTests: case areTestAPIKeysSet() && err != nil && !mockTests:
t.Error("Test Failed - GetUnconfirmedBitcoinDeposits() error", err) t.Error("GetUnconfirmedBitcoinDeposits() error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Expecting an error when no keys are set") t.Error("Expecting an error when no keys are set")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - GetUnconfirmedBitcoinDeposits() error", err) t.Error("GetUnconfirmedBitcoinDeposits() error", err)
} }
} }
@@ -303,7 +303,7 @@ func TestTransferAccountBalance(t *testing.T) {
err := b.TransferAccountBalance(0.01, "btc", "testAccount", true) err := b.TransferAccountBalance(0.01, "btc", "testAccount", true)
if !mockTests && err != nil { if !mockTests && err != nil {
t.Error("Test Failed - TransferAccountBalance() error", err) t.Error("TransferAccountBalance() error", err)
} }
if mockTests && err == nil { if mockTests && err == nil {
t.Error("Expecting an error until a QA pass can be completed") t.Error("Expecting an error until a QA pass can be completed")
@@ -456,7 +456,7 @@ func TestModifyOrder(t *testing.T) {
_, err := b.ModifyOrder(&exchange.ModifyOrder{}) _, err := b.ModifyOrder(&exchange.ModifyOrder{})
if err == nil { if err == nil {
t.Error("Test failed - ModifyOrder() error") t.Error("ModifyOrder() Expected error")
} }
} }
@@ -575,10 +575,10 @@ func TestGetDepositAddress(t *testing.T) {
_, err := b.GetDepositAddress(currency.BTC, "") _, err := b.GetDepositAddress(currency.BTC, "")
switch { switch {
case areTestAPIKeysSet() && customerID != "" && err != nil && !mockTests: case areTestAPIKeysSet() && customerID != "" && err != nil && !mockTests:
t.Error("Test Failed - GetDepositAddress error", err) t.Error("GetDepositAddress error", err)
case !areTestAPIKeysSet() && err == nil && !mockTests: case !areTestAPIKeysSet() && err == nil && !mockTests:
t.Error("Test Failed - GetDepositAddress error cannot be nil") t.Error("GetDepositAddress error cannot be nil")
case mockTests && err != nil: case mockTests && err != nil:
t.Error("Test Failed - GetDepositAddress error", err) t.Error("GetDepositAddress error", err)
} }
} }

View File

@@ -14,6 +14,7 @@ import (
exchange "github.com/thrasher-corp/gocryptotrader/exchanges" exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
@@ -69,8 +70,33 @@ func (b *Bitstamp) SetDefaults() {
Supports: exchange.FeaturesSupported{ Supports: exchange.FeaturesSupported{
REST: true, REST: true,
Websocket: true, Websocket: true,
RESTCapabilities: exchange.ProtocolFeatures{ RESTCapabilities: protocol.Features{
AutoPairUpdates: true, TickerFetching: true,
TradeFetching: true,
OrderbookFetching: true,
AutoPairUpdates: true,
GetOrder: true,
GetOrders: true,
CancelOrders: true,
CancelOrder: true,
SubmitOrder: true,
DepositHistory: true,
WithdrawalHistory: true,
UserTradeHistory: true,
CryptoDeposit: true,
CryptoWithdrawal: true,
FiatDeposit: true,
FiatWithdraw: true,
TradeFee: true,
FiatDepositFee: true,
FiatWithdrawalFee: true,
CryptoDepositFee: true,
},
WebsocketCapabilities: protocol.Features{
TradeFetching: true,
OrderbookFetching: true,
Subscribe: true,
Unsubscribe: true,
}, },
WithdrawPermissions: exchange.AutoWithdrawCrypto | WithdrawPermissions: exchange.AutoWithdrawCrypto |
exchange.AutoWithdrawFiat, exchange.AutoWithdrawFiat,
@@ -89,10 +115,6 @@ func (b *Bitstamp) SetDefaults() {
b.API.Endpoints.URL = b.API.Endpoints.URLDefault b.API.Endpoints.URL = b.API.Endpoints.URLDefault
b.API.Endpoints.WebsocketURL = bitstampWSURL b.API.Endpoints.WebsocketURL = bitstampWSURL
b.Websocket = wshandler.New() b.Websocket = wshandler.New()
b.Websocket.Functionality = wshandler.WebsocketOrderbookSupported |
wshandler.WebsocketTradeDataSupported |
wshandler.WebsocketSubscribeSupported |
wshandler.WebsocketUnsubscribeSupported
b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit
b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout
b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit
@@ -122,6 +144,7 @@ func (b *Bitstamp) Setup(exch *config.ExchangeConfig) error {
Connector: b.WsConnect, Connector: b.WsConnect,
Subscriber: b.Subscribe, Subscriber: b.Subscribe,
UnSubscriber: b.Unsubscribe, UnSubscriber: b.Unsubscribe,
Features: &b.Features.Supports.WebsocketCapabilities,
}) })
if err != nil { if err != nil {
return err return err

View File

@@ -21,7 +21,7 @@ var b Bittrex
func TestSetDefaults(t *testing.T) { func TestSetDefaults(t *testing.T) {
b.SetDefaults() b.SetDefaults()
if b.GetName() != "Bittrex" { if b.GetName() != "Bittrex" {
t.Error("Test Failed - Bittrex - SetDefaults() error") t.Error("Bittrex - SetDefaults() error")
} }
} }
@@ -29,11 +29,11 @@ func TestSetup(t *testing.T) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true) err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil { if err != nil {
t.Fatal("Test Failed - Bittrex load config error", err) t.Fatal("Bittrex load config error", err)
} }
bConfig, err := cfg.GetExchangeConfig("Bittrex") bConfig, err := cfg.GetExchangeConfig("Bittrex")
if err != nil { if err != nil {
t.Error("Test Failed - Bittrex Setup() init error") t.Error("Bittrex Setup() init error")
} }
bConfig.API.Credentials.Key = apiKey bConfig.API.Credentials.Key = apiKey
bConfig.API.Credentials.Secret = apiSecret bConfig.API.Credentials.Secret = apiSecret
@@ -41,12 +41,12 @@ func TestSetup(t *testing.T) {
err = b.Setup(bConfig) err = b.Setup(bConfig)
if err != nil { if err != nil {
t.Fatal("Test Failed - Bittrex setup error", err) t.Fatal("Bittrex setup error", err)
} }
if !b.IsEnabled() || !b.API.AuthenticatedSupport || if !b.IsEnabled() || !b.API.AuthenticatedSupport ||
b.Verbose || len(b.BaseCurrencies) < 1 { b.Verbose || len(b.BaseCurrencies) < 1 {
t.Error("Test Failed - Bittrex Setup values not set correctly") t.Error("Bittrex Setup values not set correctly")
} }
} }
@@ -54,7 +54,7 @@ func TestGetMarkets(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetMarkets() _, err := b.GetMarkets()
if err != nil { if err != nil {
t.Errorf("Test Failed - Bittrex - GetMarkets() error: %s", err) t.Errorf("Bittrex - GetMarkets() error: %s", err)
} }
} }
@@ -62,7 +62,7 @@ func TestGetCurrencies(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetCurrencies() _, err := b.GetCurrencies()
if err != nil { if err != nil {
t.Errorf("Test Failed - Bittrex - GetCurrencies() error: %s", err) t.Errorf("Bittrex - GetCurrencies() error: %s", err)
} }
} }
@@ -72,7 +72,7 @@ func TestGetTicker(t *testing.T) {
_, err := b.GetTicker(btc) _, err := b.GetTicker(btc)
if err != nil { if err != nil {
t.Errorf("Test Failed - Bittrex - GetTicker() error: %s", err) t.Errorf("Bittrex - GetTicker() error: %s", err)
} }
} }
@@ -80,7 +80,7 @@ func TestGetMarketSummaries(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetMarketSummaries() _, err := b.GetMarketSummaries()
if err != nil { if err != nil {
t.Errorf("Test Failed - Bittrex - GetMarketSummaries() error: %s", err) t.Errorf("Bittrex - GetMarketSummaries() error: %s", err)
} }
} }
@@ -90,7 +90,7 @@ func TestGetMarketSummary(t *testing.T) {
_, err := b.GetMarketSummary(pairOne) _, err := b.GetMarketSummary(pairOne)
if err != nil { if err != nil {
t.Errorf("Test Failed - Bittrex - GetMarketSummary() error: %s", err) t.Errorf("Bittrex - GetMarketSummary() error: %s", err)
} }
} }
@@ -99,7 +99,7 @@ func TestGetOrderbook(t *testing.T) {
_, err := b.GetOrderbook("btc-ltc") _, err := b.GetOrderbook("btc-ltc")
if err != nil { if err != nil {
t.Errorf("Test Failed - Bittrex - GetOrderbook() error: %s", err) t.Errorf("Bittrex - GetOrderbook() error: %s", err)
} }
} }
@@ -108,7 +108,7 @@ func TestGetMarketHistory(t *testing.T) {
_, err := b.GetMarketHistory("btc-ltc") _, err := b.GetMarketHistory("btc-ltc")
if err != nil { if err != nil {
t.Errorf("Test Failed - Bittrex - GetMarketHistory() error: %s", err) t.Errorf("Bittrex - GetMarketHistory() error: %s", err)
} }
} }
@@ -117,7 +117,7 @@ func TestPlaceBuyLimit(t *testing.T) {
_, err := b.PlaceBuyLimit("btc-ltc", 1, 1) _, err := b.PlaceBuyLimit("btc-ltc", 1, 1)
if err == nil { if err == nil {
t.Error("Test Failed - Bittrex - PlaceBuyLimit() error") t.Error("Bittrex - PlaceBuyLimit() Expected error")
} }
} }
@@ -126,7 +126,7 @@ func TestPlaceSellLimit(t *testing.T) {
_, err := b.PlaceSellLimit("btc-ltc", 1, 1) _, err := b.PlaceSellLimit("btc-ltc", 1, 1)
if err == nil { if err == nil {
t.Error("Test Failed - Bittrex - PlaceSellLimit() error") t.Error("Bittrex - PlaceSellLimit() Expected error")
} }
} }
@@ -135,11 +135,11 @@ func TestGetOpenOrders(t *testing.T) {
_, err := b.GetOpenOrders("") _, err := b.GetOpenOrders("")
if err == nil { if err == nil {
t.Error("Test Failed - Bittrex - GetOrder() error") t.Error("Bittrex - GetOrder() Expected error")
} }
_, err = b.GetOpenOrders("btc-ltc") _, err = b.GetOpenOrders("btc-ltc")
if err == nil { if err == nil {
t.Error("Test Failed - Bittrex - GetOrder() error") t.Error("Bittrex - GetOrder() Expected error")
} }
} }
@@ -148,7 +148,7 @@ func TestCancelExistingOrder(t *testing.T) {
_, err := b.CancelExistingOrder("blaaaaaaa") _, err := b.CancelExistingOrder("blaaaaaaa")
if err == nil { if err == nil {
t.Error("Test Failed - Bittrex - CancelExistingOrder() error") t.Error("Bittrex - CancelExistingOrder() Expected error")
} }
} }
@@ -157,7 +157,7 @@ func TestGetAccountBalances(t *testing.T) {
_, err := b.GetAccountBalances() _, err := b.GetAccountBalances()
if err == nil { if err == nil {
t.Error("Test Failed - Bittrex - GetAccountBalances() error") t.Error("Bittrex - GetAccountBalances() Expected error")
} }
} }
@@ -166,7 +166,7 @@ func TestGetAccountBalanceByCurrency(t *testing.T) {
_, err := b.GetAccountBalanceByCurrency("btc") _, err := b.GetAccountBalanceByCurrency("btc")
if err == nil { if err == nil {
t.Error("Test Failed - Bittrex - GetAccountBalanceByCurrency() error") t.Error("Bittrex - GetAccountBalanceByCurrency() Expected error")
} }
} }
@@ -175,11 +175,11 @@ func TestGetOrder(t *testing.T) {
_, err := b.GetOrder("0cb4c4e4-bdc7-4e13-8c13-430e587d2cc1") _, err := b.GetOrder("0cb4c4e4-bdc7-4e13-8c13-430e587d2cc1")
if err == nil { if err == nil {
t.Error("Test Failed - Bittrex - GetOrder() error") t.Error("Bittrex - GetOrder() Expected error")
} }
_, err = b.GetOrder("") _, err = b.GetOrder("")
if err == nil { if err == nil {
t.Error("Test Failed - Bittrex - GetOrder() error") t.Error("Bittrex - GetOrder() Expected error")
} }
} }
@@ -188,11 +188,11 @@ func TestGetOrderHistoryForCurrency(t *testing.T) {
_, err := b.GetOrderHistoryForCurrency("") _, err := b.GetOrderHistoryForCurrency("")
if err == nil { if err == nil {
t.Error("Test Failed - Bittrex - GetOrderHistory() error") t.Error("Bittrex - GetOrderHistory() Expected error")
} }
_, err = b.GetOrderHistoryForCurrency("btc-ltc") _, err = b.GetOrderHistoryForCurrency("btc-ltc")
if err == nil { if err == nil {
t.Error("Test Failed - Bittrex - GetOrderHistory() error") t.Error("Bittrex - GetOrderHistory() Expected error")
} }
} }
@@ -201,11 +201,11 @@ func TestGetwithdrawalHistory(t *testing.T) {
_, err := b.GetWithdrawalHistory("") _, err := b.GetWithdrawalHistory("")
if err == nil { if err == nil {
t.Error("Test Failed - Bittrex - GetWithdrawalHistory() error") t.Error("Bittrex - GetWithdrawalHistory() Expected error")
} }
_, err = b.GetWithdrawalHistory("btc-ltc") _, err = b.GetWithdrawalHistory("btc-ltc")
if err == nil { if err == nil {
t.Error("Test Failed - Bittrex - GetWithdrawalHistory() error") t.Error("Bittrex - GetWithdrawalHistory() Expected error")
} }
} }
@@ -214,11 +214,11 @@ func TestGetDepositHistory(t *testing.T) {
_, err := b.GetDepositHistory("") _, err := b.GetDepositHistory("")
if err == nil { if err == nil {
t.Error("Test Failed - Bittrex - GetDepositHistory() error") t.Error("Bittrex - GetDepositHistory() Expected error")
} }
_, err = b.GetDepositHistory("btc-ltc") _, err = b.GetDepositHistory("btc-ltc")
if err == nil { if err == nil {
t.Error("Test Failed - Bittrex - GetDepositHistory() error") t.Error("Bittrex - GetDepositHistory() Expected error")
} }
} }
@@ -255,7 +255,7 @@ func TestGetFee(t *testing.T) {
// CryptocurrencyTradeFee Basic // CryptocurrencyTradeFee Basic
if resp, err := b.GetFee(feeBuilder); resp != float64(0.0025) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.0025) || err != nil {
t.Error(err) t.Error(err)
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp)
} }
// CryptocurrencyTradeFee High quantity // CryptocurrencyTradeFee High quantity
@@ -263,7 +263,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.Amount = 1000 feeBuilder.Amount = 1000
feeBuilder.PurchasePrice = 1000 feeBuilder.PurchasePrice = 1000
if resp, err := b.GetFee(feeBuilder); resp != float64(2500) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(2500) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2500), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2500), resp)
t.Error(err) t.Error(err)
} }
@@ -271,7 +271,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.IsMaker = true feeBuilder.IsMaker = true
if resp, err := b.GetFee(feeBuilder); resp != float64(0.0025) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.0025) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp)
t.Error(err) t.Error(err)
} }
@@ -279,7 +279,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.PurchasePrice = -1000 feeBuilder.PurchasePrice = -1000
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -287,7 +287,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0.0005) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.0005) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp)
t.Error(err) t.Error(err)
} }
@@ -295,7 +295,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CyptocurrencyDepositFee feeBuilder.FeeType = exchange.CyptocurrencyDepositFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -304,7 +304,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FeeType = exchange.InternationalBankDepositFee
feeBuilder.FiatCurrency = currency.HKD feeBuilder.FiatCurrency = currency.HKD
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -313,7 +313,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
feeBuilder.FiatCurrency = currency.HKD feeBuilder.FiatCurrency = currency.HKD
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
} }
@@ -459,7 +459,7 @@ func TestCancelAllExchangeOrders(t *testing.T) {
func TestModifyOrder(t *testing.T) { func TestModifyOrder(t *testing.T) {
_, err := b.ModifyOrder(&exchange.ModifyOrder{}) _, err := b.ModifyOrder(&exchange.ModifyOrder{})
if err == nil { if err == nil {
t.Error("Test failed - ModifyOrder() error") t.Error("ModifyOrder() Expected error")
} }
} }
@@ -524,12 +524,12 @@ func TestGetDepositAddress(t *testing.T) {
if areTestAPIKeysSet() { if areTestAPIKeysSet() {
_, err := b.GetDepositAddress(currency.BTC, "") _, err := b.GetDepositAddress(currency.BTC, "")
if err != nil { if err != nil {
t.Error("Test Failed - GetDepositAddress() error", err) t.Error("GetDepositAddress() error", err)
} }
} else { } else {
_, err := b.GetDepositAddress(currency.BTC, "") _, err := b.GetDepositAddress(currency.BTC, "")
if err == nil { if err == nil {
t.Error("Test Failed - GetDepositAddress() error cannot be nil") t.Error("GetDepositAddress() error cannot be nil")
} }
} }
} }

View File

@@ -13,6 +13,7 @@ import (
exchange "github.com/thrasher-corp/gocryptotrader/exchanges" exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
@@ -69,9 +70,23 @@ func (b *Bittrex) SetDefaults() {
Supports: exchange.FeaturesSupported{ Supports: exchange.FeaturesSupported{
REST: true, REST: true,
Websocket: false, Websocket: false,
RESTCapabilities: exchange.ProtocolFeatures{ RESTCapabilities: protocol.Features{
AutoPairUpdates: true, TickerBatching: true,
TickerBatching: true, TickerFetching: true,
KlineFetching: true,
TradeFetching: true,
OrderbookFetching: true,
AutoPairUpdates: true,
GetOrders: true,
CancelOrder: true,
SubmitOrder: true,
DepositHistory: true,
WithdrawalHistory: true,
UserTradeHistory: true,
CryptoDeposit: true,
CryptoWithdrawal: true,
TradeFee: true,
CryptoWithdrawalFee: true,
}, },
WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission | WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission |
exchange.NoFiatWithdrawals, exchange.NoFiatWithdrawals,

View File

@@ -12,6 +12,7 @@ import (
"github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/common/crypto"
"github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/currency"
exchange "github.com/thrasher-corp/gocryptotrader/exchanges" exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
log "github.com/thrasher-corp/gocryptotrader/logger" log "github.com/thrasher-corp/gocryptotrader/logger"
) )
@@ -46,6 +47,7 @@ const (
// BTCMarkets is the overarching type across the BTCMarkets package // BTCMarkets is the overarching type across the BTCMarkets package
type BTCMarkets struct { type BTCMarkets struct {
exchange.Base exchange.Base
WebsocketConn *wshandler.WebsocketConnection
} }
// GetMarkets returns the BTCMarkets instruments // GetMarkets returns the BTCMarkets instruments

View File

@@ -27,11 +27,11 @@ func TestSetup(t *testing.T) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true) err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil { if err != nil {
t.Fatal("Test Failed - BTC Markets load config error", err) t.Fatal("BTC Markets load config error", err)
} }
bConfig, err := cfg.GetExchangeConfig("BTC Markets") bConfig, err := cfg.GetExchangeConfig("BTC Markets")
if err != nil { if err != nil {
t.Error("Test Failed - BTC Markets Setup() init error") t.Error("BTC Markets Setup() init error")
} }
bConfig.API.Credentials.Key = apiKey bConfig.API.Credentials.Key = apiKey
bConfig.API.Credentials.Secret = apiSecret bConfig.API.Credentials.Secret = apiSecret
@@ -39,7 +39,7 @@ func TestSetup(t *testing.T) {
err = b.Setup(bConfig) err = b.Setup(bConfig)
if err != nil { if err != nil {
t.Fatal("Test Failed - BTC Markets setup error", err) t.Fatal("BTC Markets setup error", err)
} }
} }
@@ -47,7 +47,7 @@ func TestGetMarkets(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetMarkets() _, err := b.GetMarkets()
if err != nil { if err != nil {
t.Error("Test failed - GetMarkets() error", err) t.Error("GetMarkets() error", err)
} }
} }
@@ -55,7 +55,7 @@ func TestGetTicker(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetTicker("BTC", "AUD") _, err := b.GetTicker("BTC", "AUD")
if err != nil { if err != nil {
t.Error("Test failed - GetTicker() error", err) t.Error("GetTicker() error", err)
} }
} }
@@ -63,7 +63,7 @@ func TestGetOrderbook(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetOrderbook("BTC", "AUD") _, err := b.GetOrderbook("BTC", "AUD")
if err != nil { if err != nil {
t.Error("Test failed - GetOrderbook() error", err) t.Error("GetOrderbook() error", err)
} }
} }
@@ -71,14 +71,14 @@ func TestGetTrades(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetTrades("BTC", "AUD", nil) _, err := b.GetTrades("BTC", "AUD", nil)
if err != nil { if err != nil {
t.Error("Test failed - GetTrades() error", err) t.Error("GetTrades() error", err)
} }
val := url.Values{} val := url.Values{}
val.Set("since", "0") val.Set("since", "0")
_, err = b.GetTrades("BTC", "AUD", val) _, err = b.GetTrades("BTC", "AUD", val)
if err != nil { if err != nil {
t.Error("Test failed - GetTrades() error", err) t.Error("GetTrades() error", err)
} }
} }
@@ -87,7 +87,7 @@ func TestNewOrder(t *testing.T) {
_, err := b.NewOrder("AUD", "BTC", 0, 0, "Bid", _, err := b.NewOrder("AUD", "BTC", 0, 0, "Bid",
exchange.LimitOrderType.ToLower().ToString(), "testTest") exchange.LimitOrderType.ToLower().ToString(), "testTest")
if err == nil { if err == nil {
t.Error("Test failed - NewOrder() error", err) t.Error("NewOrder() Expected error")
} }
} }
@@ -95,7 +95,7 @@ func TestCancelExistingOrder(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.CancelExistingOrder([]int64{1337}) _, err := b.CancelExistingOrder([]int64{1337})
if err == nil { if err == nil {
t.Error("Test failed - CancelExistingOrder() error", err) t.Error("CancelExistingOrder() Expected error")
} }
} }
@@ -103,11 +103,11 @@ func TestGetOrders(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetOrders("AUD", "BTC", 10, 0, false) _, err := b.GetOrders("AUD", "BTC", 10, 0, false)
if err == nil { if err == nil {
t.Error("Test failed - GetOrders() error", err) t.Error("GetOrders() Expected error")
} }
_, err = b.GetOrders("AUD", "BTC", 10, 0, true) _, err = b.GetOrders("AUD", "BTC", 10, 0, true)
if err == nil { if err == nil {
t.Error("Test failed - GetOrders() error", err) t.Error("GetOrders() Expected error")
} }
} }
@@ -115,7 +115,7 @@ func TestGetOrderDetail(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetOrderDetail([]int64{1337}) _, err := b.GetOrderDetail([]int64{1337})
if err == nil { if err == nil {
t.Error("Test failed - GetOrderDetail() error", err) t.Error("GetOrderDetail() Expected error")
} }
} }
@@ -123,7 +123,7 @@ func TestGetAccountBalance(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.GetAccountBalance() _, err := b.GetAccountBalance()
if err == nil { if err == nil {
t.Error("Test failed - GetAccountBalance() error", err) t.Error("GetAccountBalance() Expected error")
} }
} }
@@ -131,7 +131,7 @@ func TestWithdrawCrypto(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.WithdrawCrypto(0, "BTC", "LOLOLOL") _, err := b.WithdrawCrypto(0, "BTC", "LOLOLOL")
if err == nil { if err == nil {
t.Error("Test failed - WithdrawCrypto() error", err) t.Error("WithdrawCrypto() Expected error")
} }
} }
@@ -139,21 +139,21 @@ func TestWithdrawAUD(t *testing.T) {
t.Parallel() t.Parallel()
_, err := b.WithdrawAUD("BLA", "1337", "blawest", "1336", 10000000) _, err := b.WithdrawAUD("BLA", "1337", "blawest", "1336", 10000000)
if err == nil { if err == nil {
t.Error("Test failed - WithdrawAUD() error", err) t.Error("WithdrawAUD() Expected error")
} }
} }
func TestGetAccountInfo(t *testing.T) { func TestGetAccountInfo(t *testing.T) {
_, err := b.GetAccountInfo() _, err := b.GetAccountInfo()
if err == nil { if err == nil {
t.Error("Test failed - GetAccountInfo() error", err) t.Error("GetAccountInfo() Expected error")
} }
} }
func TestGetFundingHistory(t *testing.T) { func TestGetFundingHistory(t *testing.T) {
_, err := b.GetFundingHistory() _, err := b.GetFundingHistory()
if err == nil { if err == nil {
t.Error("Test failed - GetAccountInfo() error", err) t.Error("GetAccountInfo() Expected error")
} }
} }
@@ -161,14 +161,14 @@ func TestCancelOrder(t *testing.T) {
_, err := b.CancelExistingOrder([]int64{1337}) _, err := b.CancelExistingOrder([]int64{1337})
if err == nil { if err == nil {
t.Error("Test failed - CancelgOrder() error", err) t.Error("CancelgOrder() Expected error")
} }
} }
func TestGetOrderInfo(t *testing.T) { func TestGetOrderInfo(t *testing.T) {
_, err := b.GetOrderInfo("1337") _, err := b.GetOrderInfo("1337")
if err == nil { if err == nil {
t.Error("Test failed - GetOrderInfo() error", err) t.Error("GetOrderInfo() Expected error")
} }
} }
@@ -208,14 +208,14 @@ func TestGetFee(t *testing.T) {
feeBuilder.Pair.Quote = currency.USD feeBuilder.Pair.Quote = currency.USD
if resp, err := b.GetFee(feeBuilder); resp != float64(0.00849999) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.00849999) || err != nil {
t.Error(err) t.Error(err)
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.00849999), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.00849999), resp)
} }
// CryptocurrencyTradeFee Basic // CryptocurrencyTradeFee Basic
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
if resp, err := b.GetFee(feeBuilder); resp != float64(0.0022) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.0022) || err != nil {
t.Error(err) t.Error(err)
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0022), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0022), resp)
} }
// CryptocurrencyTradeFee High quantity // CryptocurrencyTradeFee High quantity
@@ -223,7 +223,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.Amount = 1000 feeBuilder.Amount = 1000
feeBuilder.PurchasePrice = 1000 feeBuilder.PurchasePrice = 1000
if resp, err := b.GetFee(feeBuilder); resp != float64(2200) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(2200) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(22000), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(22000), resp)
t.Error(err) t.Error(err)
} }
@@ -231,7 +231,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.IsMaker = true feeBuilder.IsMaker = true
if resp, err := b.GetFee(feeBuilder); resp != float64(0.0022) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.0022) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0022), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0022), resp)
t.Error(err) t.Error(err)
} }
@@ -239,7 +239,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.PurchasePrice = -1000 feeBuilder.PurchasePrice = -1000
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
} }
@@ -248,7 +248,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0.001) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0.001) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp)
t.Error(err) t.Error(err)
} }
@@ -256,7 +256,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CyptocurrencyDepositFee feeBuilder.FeeType = exchange.CyptocurrencyDepositFee
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -265,7 +265,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FeeType = exchange.InternationalBankDepositFee
feeBuilder.FiatCurrency = currency.AUD feeBuilder.FiatCurrency = currency.AUD
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -274,7 +274,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
feeBuilder.FiatCurrency = currency.AUD feeBuilder.FiatCurrency = currency.AUD
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
} }
@@ -418,7 +418,7 @@ func TestCancelAllExchangeOrders(t *testing.T) {
func TestModifyOrder(t *testing.T) { func TestModifyOrder(t *testing.T) {
_, err := b.ModifyOrder(&exchange.ModifyOrder{}) _, err := b.ModifyOrder(&exchange.ModifyOrder{})
if err == nil { if err == nil {
t.Error("Test failed - ModifyOrder() error") t.Error("ModifyOrder() Expected error")
} }
} }
@@ -500,6 +500,6 @@ func TestWithdrawInternationalBank(t *testing.T) {
func TestGetDepositAddress(t *testing.T) { func TestGetDepositAddress(t *testing.T) {
_, err := b.GetDepositAddress(currency.BTC, "") _, err := b.GetDepositAddress(currency.BTC, "")
if err == nil { if err == nil {
t.Error("Test Failed - GetDepositAddress() error cannot be nil") t.Error("GetDepositAddress() error cannot be nil")
} }
} }

View File

@@ -1,6 +1,10 @@
package btcmarkets package btcmarkets
import "github.com/thrasher-corp/gocryptotrader/currency" import (
"time"
"github.com/thrasher-corp/gocryptotrader/currency"
)
// Response is the genralized response type // Response is the genralized response type
type Response struct { type Response struct {
@@ -143,3 +147,54 @@ var WithdrawalFees = map[currency.Code]float64{
currency.OMG: 0.15, currency.OMG: 0.15,
currency.POWR: 5, currency.POWR: 5,
} }
// WsSubscribe message sent via ws to subscribe
type WsSubscribe struct {
MarketIDs []string `json:"marketIds,omitempty"`
Channels []string `json:"channels"`
MessageType string `json:"messageType"`
}
// WsMessageType message sent via ws to determine type
type WsMessageType struct {
MessageType string `json:"messageType"`
}
// WsTick message received for ticker data
type WsTick struct {
Currency string `json:"marketId"`
Timestamp time.Time `json:"timestamp"`
Bid float64 `json:"bestBid,string"`
Ask float64 `json:"bestAsk,string"`
Last float64 `json:"lastPrice,string"`
Volume float64 `json:"volume24h,string"`
Price24h float64 `json:"price24h,string"`
Low24h float64 `json:"low24h,string"`
High24 float64 `json:"high24h,string"`
MessageType string `json:"messageType"`
}
// WsTrade message received for trade data
type WsTrade struct {
Currency string `json:"marketId"`
Timestamp time.Time `json:"timestamp"`
TradeID int64 `json:"tradeId"`
Price float64 `json:"price,string"`
Volume float64 `json:"volume,string"`
MessageType string `json:"messageType"`
}
// WsOrderbook message received for orderbook data
type WsOrderbook struct {
Currency string `json:"marketId"`
Timestamp time.Time `json:"timestamp"`
Bids [][]string `json:"bids"`
Asks [][]string `json:"asks"`
MessageType string `json:"messageType"`
}
type WsError struct {
MessageType string `json:"messageType"`
Code int64 `json:"code"`
Message string `json:"message"`
}

View File

@@ -0,0 +1,207 @@
package btcmarkets
import (
"errors"
"fmt"
"net/http"
"strconv"
"github.com/gorilla/websocket"
"github.com/thrasher-corp/gocryptotrader/common"
"github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
log "github.com/thrasher-corp/gocryptotrader/logger"
)
const (
btcMarketsWSURL = "wss://socket.btcmarkets.net/v2"
)
// WsConnect connects to a websocket feed
func (b *BTCMarkets) WsConnect() error {
if !b.Websocket.IsEnabled() || !b.IsEnabled() {
return errors.New(wshandler.WebsocketNotEnabled)
}
var dialer websocket.Dialer
err := b.WebsocketConn.Dial(&dialer, http.Header{})
if err != nil {
return err
}
if b.Verbose {
log.Debugf(log.ExchangeSys, "%s Connected to Websocket.\n", b.GetName())
}
b.generateDefaultSubscriptions()
go b.WsHandleData()
return nil
}
// WsHandleData handles websocket data from WsReadData
func (b *BTCMarkets) WsHandleData() {
b.Websocket.Wg.Add(1)
defer func() {
b.Websocket.Wg.Done()
}()
for {
select {
case <-b.Websocket.ShutdownC:
return
default:
resp, err := b.WebsocketConn.ReadMessage()
if err != nil {
b.Websocket.ReadMessageErrors <- err
return
}
b.Websocket.TrafficAlert <- struct{}{}
var wsResponse WsMessageType
err = common.JSONDecode(resp.Raw, &wsResponse)
if err != nil {
b.Websocket.DataHandler <- err
continue
}
switch wsResponse.MessageType {
case "heartbeat":
if b.Verbose {
log.Debugf(log.ExchangeSys, "%v - Websocket heartbeat received %s", b.GetName(), resp.Raw)
}
case "orderbook":
var ob WsOrderbook
err := common.JSONDecode(resp.Raw, &ob)
if err != nil {
b.Websocket.DataHandler <- err
continue
}
p := currency.NewPairFromString(ob.Currency)
var bids, asks []orderbook.Item
for x := range ob.Bids {
var price, amount float64
price, err = strconv.ParseFloat(ob.Bids[x][0], 64)
if err != nil {
b.Websocket.DataHandler <- err
continue
}
amount, err = strconv.ParseFloat(ob.Bids[x][1], 64)
if err != nil {
b.Websocket.DataHandler <- err
continue
}
bids = append(bids, orderbook.Item{
Amount: amount,
Price: price,
})
}
for x := range ob.Asks {
var price, amount float64
price, err = strconv.ParseFloat(ob.Asks[x][0], 64)
if err != nil {
b.Websocket.DataHandler <- err
continue
}
amount, err = strconv.ParseFloat(ob.Asks[x][1], 64)
if err != nil {
b.Websocket.DataHandler <- err
continue
}
asks = append(asks, orderbook.Item{
Amount: amount,
Price: price,
})
}
err = b.Websocket.Orderbook.LoadSnapshot(&orderbook.Base{
Pair: p,
Bids: bids,
Asks: asks,
LastUpdated: ob.Timestamp,
AssetType: asset.Spot,
ExchangeName: b.Name,
})
if err != nil {
b.Websocket.DataHandler <- err
continue
}
b.Websocket.DataHandler <- wshandler.WebsocketOrderbookUpdate{
Pair: p,
Asset: asset.Spot,
Exchange: b.GetName(),
}
case "trade":
var trade WsTrade
err := common.JSONDecode(resp.Raw, &trade)
if err != nil {
b.Websocket.DataHandler <- err
continue
}
p := currency.NewPairFromString(trade.Currency)
b.Websocket.DataHandler <- wshandler.TradeData{
Timestamp: trade.Timestamp,
CurrencyPair: p,
AssetType: asset.Spot,
Exchange: b.GetName(),
Price: trade.Price,
Amount: trade.Volume,
}
case "tick":
var tick WsTick
err := common.JSONDecode(resp.Raw, &tick)
if err != nil {
b.Websocket.DataHandler <- err
continue
}
p := currency.NewPairFromString(tick.Currency)
b.Websocket.DataHandler <- wshandler.TickerData{
Exchange: b.GetName(),
Volume: tick.Volume,
High: tick.High24,
Low: tick.Low24h,
Bid: tick.Bid,
Ask: tick.Ask,
Last: tick.Last,
Timestamp: tick.Timestamp,
AssetType: asset.Spot,
Pair: p,
}
case "error":
var wsErr WsError
err := common.JSONDecode(resp.Raw, &wsErr)
if err != nil {
b.Websocket.DataHandler <- err
continue
}
b.Websocket.DataHandler <- fmt.Errorf("%v websocket error. Code: %v Message: %v", b.Name, wsErr.Code, wsErr.Message)
default:
b.Websocket.DataHandler <- fmt.Errorf("%v Unhandled websocket message %s", b.Name, resp.Raw)
}
}
}
}
func (b *BTCMarkets) generateDefaultSubscriptions() {
var channels = []string{"tick", "trade", "orderbook"}
enabledCurrencies := b.GetEnabledPairs(asset.Spot)
var subscriptions []wshandler.WebsocketChannelSubscription
for i := range channels {
for j := range enabledCurrencies {
subscriptions = append(subscriptions, wshandler.WebsocketChannelSubscription{
Channel: channels[i],
Currency: enabledCurrencies[j],
})
}
}
b.Websocket.SubscribeToChannels(subscriptions)
}
// Subscribe sends a websocket message to receive data from the channel
func (b *BTCMarkets) Subscribe(channelToSubscribe wshandler.WebsocketChannelSubscription) error {
req := WsSubscribe{
MarketIDs: []string{channelToSubscribe.Currency.String()},
Channels: []string{channelToSubscribe.Channel},
MessageType: "subscribe",
}
return b.WebsocketConn.SendMessage(req)
}

View File

@@ -14,6 +14,7 @@ import (
exchange "github.com/thrasher-corp/gocryptotrader/exchanges" exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
@@ -71,10 +72,31 @@ func (b *BTCMarkets) SetDefaults() {
b.Features = exchange.Features{ b.Features = exchange.Features{
Supports: exchange.FeaturesSupported{ Supports: exchange.FeaturesSupported{
REST: true, REST: true,
Websocket: false, Websocket: true,
RESTCapabilities: exchange.ProtocolFeatures{ RESTCapabilities: protocol.Features{
AutoPairUpdates: true, TickerFetching: true,
TickerBatching: false, TradeFetching: true,
OrderbookFetching: true,
AutoPairUpdates: true,
AccountInfo: true,
GetOrder: true,
GetOrders: true,
CancelOrder: true,
SubmitOrder: true,
UserTradeHistory: true,
CryptoWithdrawal: true,
FiatWithdraw: true,
TradeFee: true,
FiatWithdrawalFee: true,
CryptoWithdrawalFee: true,
},
WebsocketCapabilities: protocol.Features{
TickerFetching: true,
TradeFetching: true,
OrderbookFetching: true,
AccountInfo: true,
Subscribe: true,
AuthenticatedEndpoints: true,
}, },
WithdrawPermissions: exchange.AutoWithdrawCrypto | WithdrawPermissions: exchange.AutoWithdrawCrypto |
exchange.AutoWithdrawFiat, exchange.AutoWithdrawFiat,
@@ -88,6 +110,12 @@ func (b *BTCMarkets) SetDefaults() {
request.NewRateLimit(time.Second*10, btcmarketsAuthLimit), request.NewRateLimit(time.Second*10, btcmarketsAuthLimit),
request.NewRateLimit(time.Second*10, btcmarketsUnauthLimit), request.NewRateLimit(time.Second*10, btcmarketsUnauthLimit),
common.NewHTTPClientWithTimeout(exchange.DefaultHTTPTimeout)) common.NewHTTPClientWithTimeout(exchange.DefaultHTTPTimeout))
b.API.Endpoints.WebsocketURL = btcMarketsWSURL
b.Websocket = wshandler.New()
b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit
b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout
b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit
} }
// Setup takes in an exchange configuration and sets all parameters // Setup takes in an exchange configuration and sets all parameters
@@ -97,7 +125,38 @@ func (b *BTCMarkets) Setup(exch *config.ExchangeConfig) error {
return nil return nil
} }
return b.SetupDefaults(exch) err := b.SetupDefaults(exch)
if err != nil {
return err
}
err = b.Websocket.Setup(
&wshandler.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: btcMarketsWSURL,
ExchangeName: exch.Name,
RunningURL: exch.API.Endpoints.WebsocketURL,
Connector: b.WsConnect,
Subscriber: b.Subscribe,
Features: &b.Features.Supports.WebsocketCapabilities,
})
if err != nil {
return err
}
b.WebsocketConn = &wshandler.WebsocketConnection{
ExchangeName: b.Name,
URL: b.Websocket.GetWebsocketURL(),
ProxyURL: b.Websocket.GetProxyAddress(),
Verbose: b.Verbose,
ResponseCheckTimeout: exch.WebsocketResponseCheckTimeout,
ResponseMaxLimit: exch.WebsocketResponseMaxLimit,
}
return nil
} }
// Start starts the BTC Markets go routine // Start starts the BTC Markets go routine
@@ -440,7 +499,7 @@ func (b *BTCMarkets) WithdrawFiatFundsToInternationalBank(withdrawRequest *excha
// GetWebsocket returns a pointer to the exchange websocket // GetWebsocket returns a pointer to the exchange websocket
func (b *BTCMarkets) GetWebsocket() (*wshandler.Websocket, error) { func (b *BTCMarkets) GetWebsocket() (*wshandler.Websocket, error) {
return nil, common.ErrNotYetImplemented return b.Websocket, nil
} }
// GetFeeByType returns an estimate of fee based on type of transaction // GetFeeByType returns an estimate of fee based on type of transaction

View File

@@ -27,11 +27,11 @@ func TestSetup(t *testing.T) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true) err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil { if err != nil {
log.Fatal("Test Failed - BTSE load config error", err) log.Fatal("BTSE load config error", err)
} }
btseConfig, err := cfg.GetExchangeConfig("BTSE") btseConfig, err := cfg.GetExchangeConfig("BTSE")
if err != nil { if err != nil {
t.Error("Test Failed - BTSE Setup() init error") t.Error("BTSE Setup() init error")
} }
btseConfig.API.AuthenticatedSupport = true btseConfig.API.AuthenticatedSupport = true
@@ -40,7 +40,7 @@ func TestSetup(t *testing.T) {
err = b.Setup(btseConfig) err = b.Setup(btseConfig)
if err != nil { if err != nil {
t.Fatal("Test Failed - BTSE setup error", err) t.Fatal("BTSE setup error", err)
} }
} }
@@ -48,7 +48,7 @@ func TestGetMarkets(t *testing.T) {
b.SetDefaults() b.SetDefaults()
_, err := b.GetMarkets() _, err := b.GetMarkets()
if err != nil { if err != nil {
t.Fatalf("Test failed. Err: %s", err) t.Fatalf("Err: %s", err)
} }
} }
@@ -56,7 +56,7 @@ func TestGetTrades(t *testing.T) {
b.SetDefaults() b.SetDefaults()
_, err := b.GetTrades("BTC-USD") _, err := b.GetTrades("BTC-USD")
if err != nil { if err != nil {
t.Fatalf("Test failed. Err: %s", err) t.Fatalf("Err: %s", err)
} }
} }
@@ -64,7 +64,7 @@ func TestGetTicker(t *testing.T) {
b.SetDefaults() b.SetDefaults()
_, err := b.GetTicker("BTC-USD") _, err := b.GetTicker("BTC-USD")
if err != nil { if err != nil {
t.Fatalf("Test failed. Err: %s", err) t.Fatalf("Err: %s", err)
} }
} }
@@ -72,7 +72,7 @@ func TestGetOrderbook(t *testing.T) {
b.SetDefaults() b.SetDefaults()
_, err := b.GetOrderbook("BTC-USD", 0, 0, 0) _, err := b.GetOrderbook("BTC-USD", 0, 0, 0)
if err != nil { if err != nil {
t.Fatalf("Test failed. Err: %s", err) t.Fatalf("Err: %s", err)
} }
} }
@@ -80,7 +80,7 @@ func TestGetMarketStatistics(t *testing.T) {
b.SetDefaults() b.SetDefaults()
_, err := b.GetMarketStatistics("BTC-USD") _, err := b.GetMarketStatistics("BTC-USD")
if err != nil { if err != nil {
t.Fatalf("Test failed. Err: %s", err) t.Fatalf("Err: %s", err)
} }
} }
@@ -88,7 +88,7 @@ func TestGetServerTime(t *testing.T) {
b.SetDefaults() b.SetDefaults()
_, err := b.GetServerTime() _, err := b.GetServerTime()
if err != nil { if err != nil {
t.Fatalf("Test failed. Err: %s", err) t.Fatalf("Err: %s", err)
} }
} }
@@ -142,7 +142,7 @@ func TestGetOrderHistory(t *testing.T) {
_, err := b.GetOrderHistory(&getOrdersRequest) _, err := b.GetOrderHistory(&getOrdersRequest)
if err != common.ErrFunctionNotSupported { if err != common.ErrFunctionNotSupported {
t.Fatal("Test failed. Expected different result") t.Fatal("Expected different result")
} }
} }
@@ -188,49 +188,49 @@ func TestGetFee(t *testing.T) {
} }
if resp, err := b.GetFee(feeBuilder); resp != 0.00050 || err != nil { if resp, err := b.GetFee(feeBuilder); resp != 0.00050 || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", 0.00050, resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", 0.00050, resp)
t.Error(err) t.Error(err)
} }
feeBuilder.IsMaker = false feeBuilder.IsMaker = false
if resp, err := b.GetFee(feeBuilder); resp != 0.0015 || err != nil { if resp, err := b.GetFee(feeBuilder); resp != 0.0015 || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", 0.0015, resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", 0.0015, resp)
t.Error(err) t.Error(err)
} }
feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee
if resp, err := b.GetFee(feeBuilder); resp != 0.0005 || err != nil { if resp, err := b.GetFee(feeBuilder); resp != 0.0005 || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", 0.0005, resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", 0.0005, resp)
t.Error(err) t.Error(err)
} }
feeBuilder.Pair.Base = currency.USDT feeBuilder.Pair.Base = currency.USDT
if resp, err := b.GetFee(feeBuilder); resp != float64(5) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(5) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(5), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(5), resp)
t.Error(err) t.Error(err)
} }
feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FeeType = exchange.InternationalBankDepositFee
if resp, err := b.GetFee(feeBuilder); resp != float64(3) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(3) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(3), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(3), resp)
t.Error(err) t.Error(err)
} }
feeBuilder.Amount = 1000000 feeBuilder.Amount = 1000000
if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
if resp, err := b.GetFee(feeBuilder); resp != float64(1000) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(1000) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(1000), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(1000), resp)
t.Error(err) t.Error(err)
} }
feeBuilder.Amount = 1000 feeBuilder.Amount = 1000
if resp, err := b.GetFee(feeBuilder); resp != float64(25) || err != nil { if resp, err := b.GetFee(feeBuilder); resp != float64(25) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(25), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(25), resp)
t.Error(err) t.Error(err)
} }
} }
@@ -239,7 +239,7 @@ func TestParseOrderTime(t *testing.T) {
expected := int64(1534794360) expected := int64(1534794360)
actual := parseOrderTime("2018-08-20 19:20:46").Unix() actual := parseOrderTime("2018-08-20 19:20:46").Unix()
if expected != actual { if expected != actual {
t.Errorf("Test Failed. TestParseOrderTime expected: %d, got %d", expected, actual) t.Errorf("TestParseOrderTime expected: %d, got %d", expected, actual)
} }
} }

View File

@@ -13,6 +13,7 @@ import (
exchange "github.com/thrasher-corp/gocryptotrader/exchanges" exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
@@ -69,8 +70,28 @@ func (b *BTSE) SetDefaults() {
Supports: exchange.FeaturesSupported{ Supports: exchange.FeaturesSupported{
REST: true, REST: true,
Websocket: true, Websocket: true,
RESTCapabilities: exchange.ProtocolFeatures{ RESTCapabilities: protocol.Features{
AutoPairUpdates: true, TickerFetching: true,
KlineFetching: true,
TradeFetching: true,
OrderbookFetching: true,
AutoPairUpdates: true,
AccountInfo: true,
GetOrder: true,
GetOrders: true,
CancelOrders: true,
CancelOrder: true,
SubmitOrder: true,
TradeFee: true,
FiatDepositFee: true,
FiatWithdrawalFee: true,
CryptoWithdrawalFee: true,
},
WebsocketCapabilities: protocol.Features{
TickerFetching: true,
OrderbookFetching: true,
Subscribe: true,
Unsubscribe: true,
}, },
WithdrawPermissions: exchange.NoAPIWithdrawalMethods, WithdrawPermissions: exchange.NoAPIWithdrawalMethods,
}, },
@@ -87,10 +108,6 @@ func (b *BTSE) SetDefaults() {
b.API.Endpoints.URLDefault = btseAPIURL b.API.Endpoints.URLDefault = btseAPIURL
b.API.Endpoints.URL = b.API.Endpoints.URLDefault b.API.Endpoints.URL = b.API.Endpoints.URLDefault
b.Websocket = wshandler.New() b.Websocket = wshandler.New()
b.Websocket.Functionality = wshandler.WebsocketOrderbookSupported |
wshandler.WebsocketTickerSupported |
wshandler.WebsocketSubscribeSupported |
wshandler.WebsocketUnsubscribeSupported
b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit
b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout
b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit
@@ -121,6 +138,7 @@ func (b *BTSE) Setup(exch *config.ExchangeConfig) error {
Connector: b.WsConnect, Connector: b.WsConnect,
Subscriber: b.Subscribe, Subscriber: b.Subscribe,
UnSubscriber: b.Unsubscribe, UnSubscriber: b.Unsubscribe,
Features: &b.Features.Supports.WebsocketCapabilities,
}) })
if err != nil { if err != nil {
return err return err

View File

@@ -32,11 +32,11 @@ func TestSetup(t *testing.T) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true) err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil { if err != nil {
t.Fatal("Test Failed - coinbasepro load config error", err) t.Fatal("coinbasepro load config error", err)
} }
gdxConfig, err := cfg.GetExchangeConfig("CoinbasePro") gdxConfig, err := cfg.GetExchangeConfig("CoinbasePro")
if err != nil { if err != nil {
t.Error("Test Failed - coinbasepro Setup() init error") t.Error("coinbasepro Setup() init error")
} }
gdxConfig.API.Credentials.Key = apiKey gdxConfig.API.Credentials.Key = apiKey
gdxConfig.API.Credentials.Secret = apiSecret gdxConfig.API.Credentials.Secret = apiSecret
@@ -45,56 +45,56 @@ func TestSetup(t *testing.T) {
gdxConfig.API.AuthenticatedWebsocketSupport = true gdxConfig.API.AuthenticatedWebsocketSupport = true
err = c.Setup(gdxConfig) err = c.Setup(gdxConfig)
if err != nil { if err != nil {
t.Fatal("Test Failed - CoinbasePro setup error", err) t.Fatal("CoinbasePro setup error", err)
} }
} }
func TestGetProducts(t *testing.T) { func TestGetProducts(t *testing.T) {
_, err := c.GetProducts() _, err := c.GetProducts()
if err != nil { if err != nil {
t.Errorf("Test failed - Coinbase, GetProducts() Error: %s", err) t.Errorf("Coinbase, GetProducts() Error: %s", err)
} }
} }
func TestGetTicker(t *testing.T) { func TestGetTicker(t *testing.T) {
_, err := c.GetTicker("BTC-USD") _, err := c.GetTicker("BTC-USD")
if err != nil { if err != nil {
t.Error("Test failed - GetTicker() error", err) t.Error("GetTicker() error", err)
} }
} }
func TestGetTrades(t *testing.T) { func TestGetTrades(t *testing.T) {
_, err := c.GetTrades("BTC-USD") _, err := c.GetTrades("BTC-USD")
if err != nil { if err != nil {
t.Error("Test failed - GetTrades() error", err) t.Error("GetTrades() error", err)
} }
} }
func TestGetHistoricRates(t *testing.T) { func TestGetHistoricRates(t *testing.T) {
_, err := c.GetHistoricRates("BTC-USD", 0, 0, 0) _, err := c.GetHistoricRates("BTC-USD", 0, 0, 0)
if err != nil { if err != nil {
t.Error("Test failed - GetHistoricRates() error", err) t.Error("GetHistoricRates() error", err)
} }
} }
func TestGetStats(t *testing.T) { func TestGetStats(t *testing.T) {
_, err := c.GetStats("BTC-USD") _, err := c.GetStats("BTC-USD")
if err != nil { if err != nil {
t.Error("Test failed - GetStats() error", err) t.Error("GetStats() error", err)
} }
} }
func TestGetCurrencies(t *testing.T) { func TestGetCurrencies(t *testing.T) {
_, err := c.GetCurrencies() _, err := c.GetCurrencies()
if err != nil { if err != nil {
t.Error("Test failed - GetCurrencies() error", err) t.Error("GetCurrencies() error", err)
} }
} }
func TestGetServerTime(t *testing.T) { func TestGetServerTime(t *testing.T) {
_, err := c.GetServerTime() _, err := c.GetServerTime()
if err != nil { if err != nil {
t.Error("Test failed - GetServerTime() error", err) t.Error("GetServerTime() error", err)
} }
} }
@@ -104,7 +104,7 @@ func TestAuthRequests(t *testing.T) {
} }
_, err := c.GetAccounts() _, err := c.GetAccounts()
if err != nil { if err != nil {
t.Error("Test failed - GetAccounts() error", err) t.Error("GetAccounts() error", err)
} }
accountResponse, err := c.GetAccount("13371337-1337-1337-1337-133713371337") accountResponse, err := c.GetAccount("13371337-1337-1337-1337-133713371337")
if accountResponse.ID != "" { if accountResponse.ID != "" {
@@ -173,11 +173,11 @@ func TestAuthRequests(t *testing.T) {
} }
_, err = c.GetPayMethods() _, err = c.GetPayMethods()
if err != nil { if err != nil {
t.Error("Test failed - GetPayMethods() error", err) t.Error("GetPayMethods() error", err)
} }
_, err = c.GetCoinbaseAccounts() _, err = c.GetCoinbaseAccounts()
if err != nil { if err != nil {
t.Error("Test failed - GetCoinbaseAccounts() error", err) t.Error("GetCoinbaseAccounts() error", err)
} }
} }
@@ -215,7 +215,7 @@ func TestGetFee(t *testing.T) {
// CryptocurrencyTradeFee Basic // CryptocurrencyTradeFee Basic
if resp, err := c.GetFee(feeBuilder); resp != float64(0.003) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(0.003) || err != nil {
t.Error(err) t.Error(err)
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.003), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.003), resp)
} }
// CryptocurrencyTradeFee High quantity // CryptocurrencyTradeFee High quantity
@@ -223,7 +223,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.Amount = 1000 feeBuilder.Amount = 1000
feeBuilder.PurchasePrice = 1000 feeBuilder.PurchasePrice = 1000
if resp, err := c.GetFee(feeBuilder); resp != float64(3000) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(3000) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(3000), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(3000), resp)
t.Error(err) t.Error(err)
} }
@@ -231,7 +231,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.IsMaker = true feeBuilder.IsMaker = true
if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.01), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.01), resp)
t.Error(err) t.Error(err)
} }
@@ -239,7 +239,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.PurchasePrice = -1000 feeBuilder.PurchasePrice = -1000
if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
} }
@@ -248,7 +248,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee
if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -256,7 +256,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CyptocurrencyDepositFee feeBuilder.FeeType = exchange.CyptocurrencyDepositFee
if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -265,7 +265,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FeeType = exchange.InternationalBankDepositFee
feeBuilder.FiatCurrency = currency.EUR feeBuilder.FiatCurrency = currency.EUR
if resp, err := c.GetFee(feeBuilder); resp != float64(0.15) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(0.15) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -274,7 +274,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
feeBuilder.FiatCurrency = currency.USD feeBuilder.FiatCurrency = currency.USD
if resp, err := c.GetFee(feeBuilder); resp != float64(25) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(25) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
} }
@@ -290,7 +290,7 @@ func TestCalculateTradingFee(t *testing.T) {
} }
if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0.003) { if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0.003) {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.003), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.003), resp)
} }
// lowercase // lowercase
@@ -302,7 +302,7 @@ func TestCalculateTradingFee(t *testing.T) {
} }
if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0.003) { if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0.003) {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.003), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.003), resp)
} }
// mixedCase // mixedCase
@@ -314,7 +314,7 @@ func TestCalculateTradingFee(t *testing.T) {
} }
if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0.003) { if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0.003) {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.003), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.003), resp)
} }
// medium volume // medium volume
@@ -326,7 +326,7 @@ func TestCalculateTradingFee(t *testing.T) {
} }
if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0.002) { if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0.002) {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.002), resp)
} }
// high volume // high volume
@@ -338,7 +338,7 @@ func TestCalculateTradingFee(t *testing.T) {
} }
if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0.001) { if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0.001) {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp)
} }
// no match // no match
@@ -350,7 +350,7 @@ func TestCalculateTradingFee(t *testing.T) {
} }
if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0) { if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0) {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
} }
// taker // taker
@@ -362,7 +362,7 @@ func TestCalculateTradingFee(t *testing.T) {
} }
if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, true); resp != float64(0) { if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, true); resp != float64(0) {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
} }
} }
@@ -510,7 +510,7 @@ func TestCancelAllExchangeOrders(t *testing.T) {
func TestModifyOrder(t *testing.T) { func TestModifyOrder(t *testing.T) {
_, err := c.ModifyOrder(&exchange.ModifyOrder{}) _, err := c.ModifyOrder(&exchange.ModifyOrder{})
if err == nil { if err == nil {
t.Error("Test failed - ModifyOrder() error") t.Error("ModifyOrder() Expected error")
} }
} }
@@ -592,7 +592,7 @@ func TestWithdrawInternationalBank(t *testing.T) {
func TestGetDepositAddress(t *testing.T) { func TestGetDepositAddress(t *testing.T) {
_, err := c.GetDepositAddress(currency.BTC, "") _, err := c.GetDepositAddress(currency.BTC, "")
if err == nil { if err == nil {
t.Error("Test Failed - GetDepositAddress() error", err) t.Error("GetDepositAddress() error", err)
} }
} }

View File

@@ -13,6 +13,7 @@ import (
exchange "github.com/thrasher-corp/gocryptotrader/exchanges" exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
@@ -71,9 +72,36 @@ func (c *CoinbasePro) SetDefaults() {
Supports: exchange.FeaturesSupported{ Supports: exchange.FeaturesSupported{
REST: true, REST: true,
Websocket: true, Websocket: true,
RESTCapabilities: exchange.ProtocolFeatures{ RESTCapabilities: protocol.Features{
AutoPairUpdates: true, TickerFetching: true,
TickerBatching: false, KlineFetching: true,
TradeFetching: true,
OrderbookFetching: true,
AutoPairUpdates: true,
AccountInfo: true,
GetOrder: true,
GetOrders: true,
CancelOrders: true,
CancelOrder: true,
SubmitOrder: true,
DepositHistory: true,
WithdrawalHistory: true,
UserTradeHistory: true,
CryptoDeposit: true,
CryptoWithdrawal: true,
FiatDeposit: true,
FiatWithdraw: true,
TradeFee: true,
FiatDepositFee: true,
FiatWithdrawalFee: true,
},
WebsocketCapabilities: protocol.Features{
TickerFetching: true,
OrderbookFetching: true,
Subscribe: true,
Unsubscribe: true,
AuthenticatedEndpoints: true,
MessageSequenceNumbers: true,
}, },
WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission | WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission |
exchange.AutoWithdrawFiatWithAPIPermission, exchange.AutoWithdrawFiatWithAPIPermission,
@@ -92,12 +120,6 @@ func (c *CoinbasePro) SetDefaults() {
c.API.Endpoints.URL = c.API.Endpoints.URLDefault c.API.Endpoints.URL = c.API.Endpoints.URLDefault
c.API.Endpoints.WebsocketURL = coinbaseproWebsocketURL c.API.Endpoints.WebsocketURL = coinbaseproWebsocketURL
c.Websocket = wshandler.New() c.Websocket = wshandler.New()
c.Websocket.Functionality = wshandler.WebsocketTickerSupported |
wshandler.WebsocketOrderbookSupported |
wshandler.WebsocketSubscribeSupported |
wshandler.WebsocketUnsubscribeSupported |
wshandler.WebsocketAuthenticatedEndpointsSupported |
wshandler.WebsocketSequenceNumberSupported
c.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit c.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit
c.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout c.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout
c.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit c.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit
@@ -127,6 +149,7 @@ func (c *CoinbasePro) Setup(exch *config.ExchangeConfig) error {
Connector: c.WsConnect, Connector: c.WsConnect,
Subscriber: c.Subscribe, Subscriber: c.Subscribe,
UnSubscriber: c.Unsubscribe, UnSubscriber: c.Unsubscribe,
Features: &c.Features.Supports.WebsocketCapabilities,
}) })
if err != nil { if err != nil {
return err return err

View File

@@ -31,11 +31,11 @@ func TestSetup(t *testing.T) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true) err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil { if err != nil {
t.Fatal("Test Failed - Coinut load config error", err) t.Fatal("Coinut load config error", err)
} }
bConfig, err := cfg.GetExchangeConfig("COINUT") bConfig, err := cfg.GetExchangeConfig("COINUT")
if err != nil { if err != nil {
t.Error("Test Failed - Coinut Setup() init error") t.Error("Coinut Setup() init error")
} }
bConfig.API.AuthenticatedSupport = true bConfig.API.AuthenticatedSupport = true
bConfig.API.AuthenticatedWebsocketSupport = true bConfig.API.AuthenticatedWebsocketSupport = true
@@ -44,12 +44,12 @@ func TestSetup(t *testing.T) {
bConfig.Verbose = true bConfig.Verbose = true
err = c.Setup(bConfig) err = c.Setup(bConfig)
if err != nil { if err != nil {
t.Fatal("Test Failed - Coinut setup error", err) t.Fatal("Coinut setup error", err)
} }
if !c.IsEnabled() || !c.Verbose || if !c.IsEnabled() || !c.Verbose ||
c.Websocket.IsEnabled() || len(c.BaseCurrencies) < 1 { c.Websocket.IsEnabled() || len(c.BaseCurrencies) < 1 {
t.Error("Test Failed - Coinut Setup values not set correctly") t.Error("Coinut Setup values not set correctly")
} }
} }
@@ -88,7 +88,7 @@ func setupWSTestAuth(t *testing.T) {
func TestGetInstruments(t *testing.T) { func TestGetInstruments(t *testing.T) {
_, err := c.GetInstruments() _, err := c.GetInstruments()
if err != nil { if err != nil {
t.Error("Test failed - GetInstruments() error", err) t.Error("GetInstruments() error", err)
} }
} }
@@ -138,7 +138,7 @@ func TestGetFee(t *testing.T) {
// CryptocurrencyTradeFee Basic // CryptocurrencyTradeFee Basic
if resp, err := c.GetFee(feeBuilder); resp != float64(0.001) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(0.001) || err != nil {
t.Error(err) t.Error(err)
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0010), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0010), resp)
} }
// CryptocurrencyTradeFee High quantity // CryptocurrencyTradeFee High quantity
@@ -146,7 +146,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.Amount = 1000 feeBuilder.Amount = 1000
feeBuilder.PurchasePrice = 1000 feeBuilder.PurchasePrice = 1000
if resp, err := c.GetFee(feeBuilder); resp != float64(1000) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(1000) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(1000), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(1000), resp)
t.Error(err) t.Error(err)
} }
@@ -154,7 +154,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.IsMaker = true feeBuilder.IsMaker = true
if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -162,7 +162,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.PurchasePrice = -1000 feeBuilder.PurchasePrice = -1000
if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -170,7 +170,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee
if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -178,7 +178,7 @@ func TestGetFee(t *testing.T) {
feeBuilder = setFeeBuilder() feeBuilder = setFeeBuilder()
feeBuilder.FeeType = exchange.CyptocurrencyDepositFee feeBuilder.FeeType = exchange.CyptocurrencyDepositFee
if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -187,7 +187,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FeeType = exchange.InternationalBankDepositFee
feeBuilder.FiatCurrency = currency.EUR feeBuilder.FiatCurrency = currency.EUR
if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -196,7 +196,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FeeType = exchange.InternationalBankDepositFee
feeBuilder.FiatCurrency = currency.USD feeBuilder.FiatCurrency = currency.USD
if resp, err := c.GetFee(feeBuilder); resp != float64(10) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(10) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(10), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(10), resp)
t.Error(err) t.Error(err)
} }
@@ -205,7 +205,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FeeType = exchange.InternationalBankDepositFee
feeBuilder.FiatCurrency = currency.SGD feeBuilder.FiatCurrency = currency.SGD
if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp)
t.Error(err) t.Error(err)
} }
@@ -214,7 +214,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
feeBuilder.FiatCurrency = currency.USD feeBuilder.FiatCurrency = currency.USD
if resp, err := c.GetFee(feeBuilder); resp != float64(10) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(10) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(10), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(10), resp)
t.Error(err) t.Error(err)
} }
@@ -223,7 +223,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
feeBuilder.FiatCurrency = currency.CAD feeBuilder.FiatCurrency = currency.CAD
if resp, err := c.GetFee(feeBuilder); resp != float64(2) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(2) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2), resp)
t.Error(err) t.Error(err)
} }
@@ -232,7 +232,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
feeBuilder.FiatCurrency = currency.SGD feeBuilder.FiatCurrency = currency.SGD
if resp, err := c.GetFee(feeBuilder); resp != float64(10) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(10) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(10), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(10), resp)
t.Error(err) t.Error(err)
} }
@@ -241,7 +241,7 @@ func TestGetFee(t *testing.T) {
feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee
feeBuilder.FiatCurrency = currency.CAD feeBuilder.FiatCurrency = currency.CAD
if resp, err := c.GetFee(feeBuilder); resp != float64(2) || err != nil { if resp, err := c.GetFee(feeBuilder); resp != float64(2) || err != nil {
t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2), resp) t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2), resp)
t.Error(err) t.Error(err)
} }
} }
@@ -384,12 +384,12 @@ func TestGetAccountInfo(t *testing.T) {
if apiKey != "" || clientID != "" { if apiKey != "" || clientID != "" {
_, err := c.GetAccountInfo() _, err := c.GetAccountInfo()
if err != nil { if err != nil {
t.Error("Test Failed - GetAccountInfo() error", err) t.Error("GetAccountInfo() error", err)
} }
} else { } else {
_, err := c.GetAccountInfo() _, err := c.GetAccountInfo()
if err == nil { if err == nil {
t.Error("Test Failed - GetAccountInfo() error") t.Error("GetAccountInfo() Expected error")
} }
} }
} }
@@ -397,7 +397,7 @@ func TestGetAccountInfo(t *testing.T) {
func TestModifyOrder(t *testing.T) { func TestModifyOrder(t *testing.T) {
_, err := c.ModifyOrder(&exchange.ModifyOrder{}) _, err := c.ModifyOrder(&exchange.ModifyOrder{})
if err == nil { if err == nil {
t.Error("Test failed - ModifyOrder() error") t.Error("ModifyOrder() Expected error")
} }
} }
@@ -456,7 +456,7 @@ func TestWithdrawInternationalBank(t *testing.T) {
func TestGetDepositAddress(t *testing.T) { func TestGetDepositAddress(t *testing.T) {
_, err := c.GetDepositAddress(currency.BTC, "") _, err := c.GetDepositAddress(currency.BTC, "")
if err == nil { if err == nil {
t.Error("Test Failed - GetDepositAddress() function unsupported cannot be nil") t.Error("GetDepositAddress() function unsupported cannot be nil")
} }
} }

View File

@@ -14,6 +14,7 @@ import (
exchange "github.com/thrasher-corp/gocryptotrader/exchanges" exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
@@ -69,9 +70,33 @@ func (c *COINUT) SetDefaults() {
Supports: exchange.FeaturesSupported{ Supports: exchange.FeaturesSupported{
REST: true, REST: true,
Websocket: true, Websocket: true,
RESTCapabilities: exchange.ProtocolFeatures{ RESTCapabilities: protocol.Features{
AutoPairUpdates: true, TickerFetching: true,
TickerBatching: false, TradeFetching: true,
OrderbookFetching: true,
AutoPairUpdates: true,
AccountInfo: true,
GetOrders: true,
CancelOrders: true,
CancelOrder: true,
SubmitOrder: true,
SubmitOrders: true,
UserTradeHistory: true,
TradeFee: true,
FiatDepositFee: true,
FiatWithdrawalFee: true,
},
WebsocketCapabilities: protocol.Features{
TickerFetching: true,
OrderbookFetching: true,
TradeFetching: true,
Subscribe: true,
Unsubscribe: true,
AuthenticatedEndpoints: true,
SubmitOrder: true,
SubmitOrders: true,
CancelOrder: true,
MessageCorrelation: true,
}, },
WithdrawPermissions: exchange.WithdrawCryptoViaWebsiteOnly | WithdrawPermissions: exchange.WithdrawCryptoViaWebsiteOnly |
exchange.WithdrawFiatViaWebsiteOnly, exchange.WithdrawFiatViaWebsiteOnly,
@@ -90,15 +115,6 @@ func (c *COINUT) SetDefaults() {
c.API.Endpoints.URL = c.API.Endpoints.URLDefault c.API.Endpoints.URL = c.API.Endpoints.URLDefault
c.API.Endpoints.WebsocketURL = coinutWebsocketURL c.API.Endpoints.WebsocketURL = coinutWebsocketURL
c.Websocket = wshandler.New() c.Websocket = wshandler.New()
c.Websocket.Functionality = wshandler.WebsocketTickerSupported |
wshandler.WebsocketOrderbookSupported |
wshandler.WebsocketTradeDataSupported |
wshandler.WebsocketSubscribeSupported |
wshandler.WebsocketUnsubscribeSupported |
wshandler.WebsocketAuthenticatedEndpointsSupported |
wshandler.WebsocketSubmitOrderSupported |
wshandler.WebsocketCancelOrderSupported |
wshandler.WebsocketMessageCorrelationSupported
c.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit c.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit
c.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout c.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout
c.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit c.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit
@@ -128,6 +144,7 @@ func (c *COINUT) Setup(exch *config.ExchangeConfig) error {
Connector: c.WsConnect, Connector: c.WsConnect,
Subscriber: c.Subscribe, Subscriber: c.Subscribe,
UnSubscriber: c.Unsubscribe, UnSubscriber: c.Unsubscribe,
Features: &c.Features.Supports.WebsocketCapabilities,
}) })
if err != nil { if err != nil {
return err return err

View File

@@ -12,6 +12,7 @@ import (
"github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/config"
"github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
log "github.com/thrasher-corp/gocryptotrader/logger" log "github.com/thrasher-corp/gocryptotrader/logger"
) )
@@ -101,7 +102,7 @@ func (e *Base) SetFeatureDefaults() {
Supports: config.FeaturesSupportedConfig{ Supports: config.FeaturesSupportedConfig{
Websocket: e.Features.Supports.Websocket, Websocket: e.Features.Supports.Websocket,
REST: e.Features.Supports.REST, REST: e.Features.Supports.REST,
RESTCapabilities: config.ProtocolFeaturesConfig{ RESTCapabilities: protocol.Features{
AutoPairUpdates: e.Features.Supports.RESTCapabilities.AutoPairUpdates, AutoPairUpdates: e.Features.Supports.RESTCapabilities.AutoPairUpdates,
}, },
}, },

View File

@@ -10,6 +10,7 @@ import (
"github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/config"
"github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler"
) )
@@ -27,7 +28,7 @@ func TestSupportsRESTTickerBatchUpdates(t *testing.T) {
Features: Features{ Features: Features{
Supports: FeaturesSupported{ Supports: FeaturesSupported{
REST: true, REST: true,
RESTCapabilities: ProtocolFeatures{ RESTCapabilities: protocol.Features{
TickerBatching: true, TickerBatching: true,
}, },
}, },
@@ -35,7 +36,7 @@ func TestSupportsRESTTickerBatchUpdates(t *testing.T) {
} }
if !b.SupportsRESTTickerBatchUpdates() { if !b.SupportsRESTTickerBatchUpdates() {
t.Fatal("Test failed. TestSupportsRESTTickerBatchUpdates returned false") t.Fatal("TestSupportsRESTTickerBatchUpdates returned false")
} }
} }
@@ -46,7 +47,7 @@ func TestHTTPClient(t *testing.T) {
r.SetHTTPClientTimeout(time.Second * 5) r.SetHTTPClientTimeout(time.Second * 5)
if r.GetHTTPClient().Timeout != time.Second*5 { if r.GetHTTPClient().Timeout != time.Second*5 {
t.Fatalf("Test failed. TestHTTPClient unexpected value") t.Fatalf("TestHTTPClient unexpected value")
} }
r.Requester = nil r.Requester = nil
@@ -55,12 +56,12 @@ func TestHTTPClient(t *testing.T) {
r.SetHTTPClient(newClient) r.SetHTTPClient(newClient)
if r.GetHTTPClient().Timeout != time.Second*10 { if r.GetHTTPClient().Timeout != time.Second*10 {
t.Fatalf("Test failed. TestHTTPClient unexpected value") t.Fatalf("TestHTTPClient unexpected value")
} }
r.Requester = nil r.Requester = nil
if r.GetHTTPClient() == nil { if r.GetHTTPClient() == nil {
t.Fatalf("Test failed. TestHTTPClient unexpected value") t.Fatalf("TestHTTPClient unexpected value")
} }
b := Base{Name: "RAWR"} b := Base{Name: "RAWR"}
@@ -71,7 +72,7 @@ func TestHTTPClient(t *testing.T) {
b.SetHTTPClientTimeout(time.Second * 5) b.SetHTTPClientTimeout(time.Second * 5)
if b.GetHTTPClient().Timeout != time.Second*5 { if b.GetHTTPClient().Timeout != time.Second*5 {
t.Fatalf("Test failed. TestHTTPClient unexpected value") t.Fatalf("TestHTTPClient unexpected value")
} }
newClient = new(http.Client) newClient = new(http.Client)
@@ -79,7 +80,7 @@ func TestHTTPClient(t *testing.T) {
b.SetHTTPClient(newClient) b.SetHTTPClient(newClient)
if b.GetHTTPClient().Timeout != time.Second*10 { if b.GetHTTPClient().Timeout != time.Second*10 {
t.Fatalf("Test failed. TestHTTPClient unexpected value") t.Fatalf("TestHTTPClient unexpected value")
} }
b.SetHTTPClientUserAgent("epicUserAgent") b.SetHTTPClientUserAgent("epicUserAgent")
@@ -103,16 +104,16 @@ func TestSetClientProxyAddress(t *testing.T) {
newBase.Websocket = wshandler.New() newBase.Websocket = wshandler.New()
err := newBase.SetClientProxyAddress(":invalid") err := newBase.SetClientProxyAddress(":invalid")
if err == nil { if err == nil {
t.Error("Test failed. SetClientProxyAddress parsed invalid URL") t.Error("SetClientProxyAddress parsed invalid URL")
} }
if newBase.Websocket.GetProxyAddress() != "" { if newBase.Websocket.GetProxyAddress() != "" {
t.Error("Test failed. SetClientProxyAddress error", err) t.Error("SetClientProxyAddress error", err)
} }
err = newBase.SetClientProxyAddress("www.valid.com") err = newBase.SetClientProxyAddress("www.valid.com")
if err != nil { if err != nil {
t.Error("Test failed. SetClientProxyAddress error", err) t.Error("SetClientProxyAddress error", err)
} }
// calling this again will cause the ws check to fail // calling this again will cause the ws check to fail
@@ -122,7 +123,7 @@ func TestSetClientProxyAddress(t *testing.T) {
} }
if newBase.Websocket.GetProxyAddress() != "www.valid.com" { if newBase.Websocket.GetProxyAddress() != "www.valid.com" {
t.Error("Test failed. SetClientProxyAddress error", err) t.Error("SetClientProxyAddress error", err)
} }
} }
@@ -137,7 +138,7 @@ func TestSetFeatureDefaults(t *testing.T) {
Features: Features{ Features: Features{
Supports: FeaturesSupported{ Supports: FeaturesSupported{
REST: true, REST: true,
RESTCapabilities: ProtocolFeatures{ RESTCapabilities: protocol.Features{
TickerBatching: true, TickerBatching: true,
}, },
Websocket: true, Websocket: true,
@@ -233,22 +234,22 @@ func TestSetHTTPRateLimiter(t *testing.T) {
func TestSetAutoPairDefaults(t *testing.T) { func TestSetAutoPairDefaults(t *testing.T) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig(config.ConfigTestFile, true) err := cfg.LoadConfig(config.TestFile, true)
if err != nil { if err != nil {
t.Fatalf("Test failed. TestSetAutoPairDefaults failed to load config file. Error: %s", err) t.Fatalf("TestSetAutoPairDefaults failed to load config file. Error: %s", err)
} }
exch, err := cfg.GetExchangeConfig("Bitstamp") exch, err := cfg.GetExchangeConfig("Bitstamp")
if err != nil { if err != nil {
t.Fatalf("Test failed. TestSetAutoPairDefaults load config failed. Error %s", err) t.Fatalf("TestSetAutoPairDefaults load config failed. Error %s", err)
} }
if !exch.Features.Supports.RESTCapabilities.AutoPairUpdates { if !exch.Features.Supports.RESTCapabilities.AutoPairUpdates {
t.Fatalf("Test failed. TestSetAutoPairDefaults Incorrect value") t.Fatalf("TestSetAutoPairDefaults Incorrect value")
} }
if exch.CurrencyPairs.LastUpdated != 0 { if exch.CurrencyPairs.LastUpdated != 0 {
t.Fatalf("Test failed. TestSetAutoPairDefaults Incorrect value") t.Fatalf("TestSetAutoPairDefaults Incorrect value")
} }
exch.Features.Supports.RESTCapabilities.AutoPairUpdates = false exch.Features.Supports.RESTCapabilities.AutoPairUpdates = false
@@ -256,11 +257,11 @@ func TestSetAutoPairDefaults(t *testing.T) {
exch, err = cfg.GetExchangeConfig("Bitstamp") exch, err = cfg.GetExchangeConfig("Bitstamp")
if err != nil { if err != nil {
t.Fatalf("Test failed. TestSetAutoPairDefaults load config failed. Error %s", err) t.Fatalf("TestSetAutoPairDefaults load config failed. Error %s", err)
} }
if exch.Features.Supports.RESTCapabilities.AutoPairUpdates { if exch.Features.Supports.RESTCapabilities.AutoPairUpdates {
t.Fatal("Test failed. TestSetAutoPairDefaults Incorrect value") t.Fatal("TestSetAutoPairDefaults Incorrect value")
} }
} }
@@ -289,7 +290,7 @@ func TestGetLastPairsUpdateTime(t *testing.T) {
b.CurrencyPairs.LastUpdated = testTime b.CurrencyPairs.LastUpdated = testTime
if b.GetLastPairsUpdateTime() != testTime { if b.GetLastPairsUpdateTime() != testTime {
t.Fatal("Test failed. TestGetLastPairsUpdateTim Incorrect value") t.Fatal("TestGetLastPairsUpdateTim Incorrect value")
} }
} }
@@ -339,13 +340,13 @@ func TestGetAssetTypes(t *testing.T) {
aT := testExchange.GetAssetTypes() aT := testExchange.GetAssetTypes()
if len(aT) != 3 { if len(aT) != 3 {
t.Error("Test failed. TestGetAssetTypes failed") t.Error("TestGetAssetTypes failed")
} }
} }
func TestGetClientBankAccounts(t *testing.T) { func TestGetClientBankAccounts(t *testing.T) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig(config.ConfigTestFile, true) err := cfg.LoadConfig(config.TestFile, true)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@@ -363,13 +364,13 @@ func TestGetClientBankAccounts(t *testing.T) {
r, err = b.GetClientBankAccounts("MEOW", "USD") r, err = b.GetClientBankAccounts("MEOW", "USD")
if err == nil { if err == nil {
t.Error("an error should of been thrown for a non-existent exchange") t.Error("an error should have been thrown for a non-existent exchange")
} }
} }
func TestGetExchangeBankAccounts(t *testing.T) { func TestGetExchangeBankAccounts(t *testing.T) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig(config.ConfigTestFile, true) err := cfg.LoadConfig(config.TestFile, true)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@@ -387,7 +388,7 @@ func TestGetExchangeBankAccounts(t *testing.T) {
_, err = b.GetExchangeBankAccounts("MEOW", "USD") _, err = b.GetExchangeBankAccounts("MEOW", "USD")
if err == nil { if err == nil {
t.Error("an error should of been thrown for a non-existent exchange") t.Error("an error should have been thrown for a non-existent exchange")
} }
} }
@@ -451,17 +452,17 @@ func TestGetAuthenticatedAPISupport(t *testing.T) {
} }
if !base.GetAuthenticatedAPISupport(RestAuthentication) { if !base.GetAuthenticatedAPISupport(RestAuthentication) {
t.Fatal("Test failed. Expected RestAuthentication to return true") t.Fatal("Expected RestAuthentication to return true")
} }
if base.GetAuthenticatedAPISupport(WebsocketAuthentication) { if base.GetAuthenticatedAPISupport(WebsocketAuthentication) {
t.Fatal("Test failed. Expected WebsocketAuthentication to return false") t.Fatal("Expected WebsocketAuthentication to return false")
} }
base.API.AuthenticatedWebsocketSupport = true base.API.AuthenticatedWebsocketSupport = true
if !base.GetAuthenticatedAPISupport(WebsocketAuthentication) { if !base.GetAuthenticatedAPISupport(WebsocketAuthentication) {
t.Fatal("Test failed. Expected WebsocketAuthentication to return true") t.Fatal("Expected WebsocketAuthentication to return true")
} }
if base.GetAuthenticatedAPISupport(2) { if base.GetAuthenticatedAPISupport(2) {
t.Fatal("Test failed. Expected default case of 'false' to be returned") t.Fatal("Expected default case of 'false' to be returned")
} }
} }
@@ -474,7 +475,7 @@ func TestGetName(t *testing.T) {
name := b.GetName() name := b.GetName()
if name != "TESTNAME" { if name != "TESTNAME" {
t.Error("Test Failed - Exchange GetName() returned incorrect name") t.Error("Exchange GetName() returned incorrect name")
} }
} }
@@ -563,21 +564,21 @@ func TestGetEnabledPairs(t *testing.T) {
c := b.GetEnabledPairs(assetType) c := b.GetEnabledPairs(assetType)
if c[0].String() != defaultTestCurrencyPair { if c[0].String() != defaultTestCurrencyPair {
t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") t.Error("Exchange GetAvailablePairs() incorrect string")
} }
format.Delimiter = "~" format.Delimiter = "~"
b.CurrencyPairs.RequestFormat = &format b.CurrencyPairs.RequestFormat = &format
c = b.GetEnabledPairs(assetType) c = b.GetEnabledPairs(assetType)
if c[0].String() != "BTC~USD" { if c[0].String() != "BTC~USD" {
t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") t.Error("Exchange GetAvailablePairs() incorrect string")
} }
format.Delimiter = "" format.Delimiter = ""
b.CurrencyPairs.ConfigFormat = &format b.CurrencyPairs.ConfigFormat = &format
c = b.GetEnabledPairs(assetType) c = b.GetEnabledPairs(assetType)
if c[0].String() != "BTCUSD" { if c[0].String() != "BTCUSD" {
t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") t.Error("Exchange GetAvailablePairs() incorrect string")
} }
b.CurrencyPairs.StorePairs(asset.Spot, b.CurrencyPairs.StorePairs(asset.Spot,
@@ -586,7 +587,7 @@ func TestGetEnabledPairs(t *testing.T) {
b.CurrencyPairs.ConfigFormat = &format b.CurrencyPairs.ConfigFormat = &format
c = b.GetEnabledPairs(assetType) c = b.GetEnabledPairs(assetType)
if c[0].Base != currency.BTC && c[0].Quote != currency.DOGE { if c[0].Base != currency.BTC && c[0].Quote != currency.DOGE {
t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") t.Error("Exchange GetAvailablePairs() incorrect string")
} }
b.CurrencyPairs.StorePairs(asset.Spot, b.CurrencyPairs.StorePairs(asset.Spot,
@@ -595,7 +596,7 @@ func TestGetEnabledPairs(t *testing.T) {
b.CurrencyPairs.ConfigFormat.Delimiter = "_" b.CurrencyPairs.ConfigFormat.Delimiter = "_"
c = b.GetEnabledPairs(assetType) c = b.GetEnabledPairs(assetType)
if c[0].Base != currency.BTC && c[0].Quote != currency.USD { if c[0].Base != currency.BTC && c[0].Quote != currency.USD {
t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") t.Error("Exchange GetAvailablePairs() incorrect string")
} }
b.CurrencyPairs.StorePairs(asset.Spot, b.CurrencyPairs.StorePairs(asset.Spot,
@@ -605,7 +606,7 @@ func TestGetEnabledPairs(t *testing.T) {
b.CurrencyPairs.ConfigFormat.Index = currency.BTC.String() b.CurrencyPairs.ConfigFormat.Index = currency.BTC.String()
c = b.GetEnabledPairs(assetType) c = b.GetEnabledPairs(assetType)
if c[0].Base != currency.BTC && c[0].Quote != currency.DOGE { if c[0].Base != currency.BTC && c[0].Quote != currency.DOGE {
t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") t.Error("Exchange GetAvailablePairs() incorrect string")
} }
b.CurrencyPairs.StorePairs(asset.Spot, b.CurrencyPairs.StorePairs(asset.Spot,
@@ -613,7 +614,7 @@ func TestGetEnabledPairs(t *testing.T) {
b.CurrencyPairs.ConfigFormat.Index = "" b.CurrencyPairs.ConfigFormat.Index = ""
c = b.GetEnabledPairs(assetType) c = b.GetEnabledPairs(assetType)
if c[0].Base != currency.BTC && c[0].Quote != currency.USD { if c[0].Base != currency.BTC && c[0].Quote != currency.USD {
t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") t.Error("Exchange GetAvailablePairs() incorrect string")
} }
} }
@@ -639,21 +640,21 @@ func TestGetAvailablePairs(t *testing.T) {
c := b.GetAvailablePairs(assetType) c := b.GetAvailablePairs(assetType)
if c[0].String() != defaultTestCurrencyPair { if c[0].String() != defaultTestCurrencyPair {
t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") t.Error("Exchange GetAvailablePairs() incorrect string")
} }
format.Delimiter = "~" format.Delimiter = "~"
b.CurrencyPairs.RequestFormat = &format b.CurrencyPairs.RequestFormat = &format
c = b.GetAvailablePairs(assetType) c = b.GetAvailablePairs(assetType)
if c[0].String() != "BTC~USD" { if c[0].String() != "BTC~USD" {
t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") t.Error("Exchange GetAvailablePairs() incorrect string")
} }
format.Delimiter = "" format.Delimiter = ""
b.CurrencyPairs.ConfigFormat = &format b.CurrencyPairs.ConfigFormat = &format
c = b.GetAvailablePairs(assetType) c = b.GetAvailablePairs(assetType)
if c[0].String() != "BTCUSD" { if c[0].String() != "BTCUSD" {
t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") t.Error("Exchange GetAvailablePairs() incorrect string")
} }
b.CurrencyPairs.StorePairs(asset.Spot, b.CurrencyPairs.StorePairs(asset.Spot,
@@ -662,7 +663,7 @@ func TestGetAvailablePairs(t *testing.T) {
b.CurrencyPairs.ConfigFormat = &format b.CurrencyPairs.ConfigFormat = &format
c = b.GetAvailablePairs(assetType) c = b.GetAvailablePairs(assetType)
if c[0].Base != currency.BTC && c[0].Quote != currency.DOGE { if c[0].Base != currency.BTC && c[0].Quote != currency.DOGE {
t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") t.Error("Exchange GetAvailablePairs() incorrect string")
} }
b.CurrencyPairs.StorePairs(asset.Spot, b.CurrencyPairs.StorePairs(asset.Spot,
@@ -671,7 +672,7 @@ func TestGetAvailablePairs(t *testing.T) {
b.CurrencyPairs.ConfigFormat.Delimiter = "_" b.CurrencyPairs.ConfigFormat.Delimiter = "_"
c = b.GetAvailablePairs(assetType) c = b.GetAvailablePairs(assetType)
if c[0].Base != currency.BTC && c[0].Quote != currency.USD { if c[0].Base != currency.BTC && c[0].Quote != currency.USD {
t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") t.Error("Exchange GetAvailablePairs() incorrect string")
} }
b.CurrencyPairs.StorePairs(asset.Spot, b.CurrencyPairs.StorePairs(asset.Spot,
@@ -681,7 +682,7 @@ func TestGetAvailablePairs(t *testing.T) {
b.CurrencyPairs.ConfigFormat.Index = currency.BTC.String() b.CurrencyPairs.ConfigFormat.Index = currency.BTC.String()
c = b.GetAvailablePairs(assetType) c = b.GetAvailablePairs(assetType)
if c[0].Base != currency.BTC && c[0].Quote != currency.DOGE { if c[0].Base != currency.BTC && c[0].Quote != currency.DOGE {
t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") t.Error("Exchange GetAvailablePairs() incorrect string")
} }
b.CurrencyPairs.StorePairs(asset.Spot, b.CurrencyPairs.StorePairs(asset.Spot,
@@ -689,7 +690,7 @@ func TestGetAvailablePairs(t *testing.T) {
b.CurrencyPairs.ConfigFormat.Index = "" b.CurrencyPairs.ConfigFormat.Index = ""
c = b.GetAvailablePairs(assetType) c = b.GetAvailablePairs(assetType)
if c[0].Base != currency.BTC && c[0].Quote != currency.USD { if c[0].Base != currency.BTC && c[0].Quote != currency.USD {
t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") t.Error("Exchange GetAvailablePairs() incorrect string")
} }
} }
@@ -717,15 +718,15 @@ func TestSupportsPair(t *testing.T) {
assetType := asset.Spot assetType := asset.Spot
if !b.SupportsPair(currency.NewPair(currency.BTC, currency.USD), true, assetType) { if !b.SupportsPair(currency.NewPair(currency.BTC, currency.USD), true, assetType) {
t.Error("Test Failed - Exchange SupportsPair() incorrect value") t.Error("Exchange SupportsPair() incorrect value")
} }
if !b.SupportsPair(currency.NewPair(currency.ETH, currency.USD), false, assetType) { if !b.SupportsPair(currency.NewPair(currency.ETH, currency.USD), false, assetType) {
t.Error("Test Failed - Exchange SupportsPair() incorrect value") t.Error("Exchange SupportsPair() incorrect value")
} }
if b.SupportsPair(currency.NewPairFromStrings("ASD", "ASDF"), true, assetType) { if b.SupportsPair(currency.NewPairFromStrings("ASD", "ASDF"), true, assetType) {
t.Error("Test Failed - Exchange SupportsPair() incorrect value") t.Error("Exchange SupportsPair() incorrect value")
} }
} }
@@ -756,11 +757,11 @@ func TestFormatExchangeCurrencies(t *testing.T) {
actual, err := e.FormatExchangeCurrencies(pairs, asset.Spot) actual, err := e.FormatExchangeCurrencies(pairs, asset.Spot)
if err != nil { if err != nil {
t.Errorf("Test failed - Exchange TestFormatExchangeCurrencies error %s", err) t.Errorf("Exchange TestFormatExchangeCurrencies error %s", err)
} }
expected := "btc~usd^ltc~btc" expected := "btc~usd^ltc~btc"
if actual != expected { if actual != expected {
t.Errorf("Test failed - Exchange TestFormatExchangeCurrencies %s != %s", t.Errorf("Exchange TestFormatExchangeCurrencies %s != %s",
actual, expected) actual, expected)
} }
@@ -785,7 +786,7 @@ func TestFormatExchangeCurrency(t *testing.T) {
actual := b.FormatExchangeCurrency(p, asset.Spot) actual := b.FormatExchangeCurrency(p, asset.Spot)
if actual.String() != expected { if actual.String() != expected {
t.Errorf("Test failed - Exchange TestFormatExchangeCurrency %s != %s", t.Errorf("Exchange TestFormatExchangeCurrency %s != %s",
actual, expected) actual, expected)
} }
} }
@@ -800,7 +801,7 @@ func TestSetEnabled(t *testing.T) {
SetEnabled.SetEnabled(true) SetEnabled.SetEnabled(true)
if !SetEnabled.Enabled { if !SetEnabled.Enabled {
t.Error("Test Failed - Exchange SetEnabled(true) did not set boolean") t.Error("Exchange SetEnabled(true) did not set boolean")
} }
} }
@@ -813,7 +814,7 @@ func TestIsEnabled(t *testing.T) {
} }
if IsEnabled.IsEnabled() { if IsEnabled.IsEnabled() {
t.Error("Test Failed - Exchange IsEnabled() did not return correct boolean") t.Error("Exchange IsEnabled() did not return correct boolean")
} }
} }
@@ -1048,14 +1049,14 @@ func TestSetPairs(t *testing.T) {
func TestUpdatePairs(t *testing.T) { func TestUpdatePairs(t *testing.T) {
cfg := config.GetConfig() cfg := config.GetConfig()
err := cfg.LoadConfig(config.ConfigTestFile, true) err := cfg.LoadConfig(config.TestFile, true)
if err != nil { if err != nil {
t.Fatal("Test failed. TestUpdatePairs failed to load config") t.Fatal("TestUpdatePairs failed to load config")
} }
anxCfg, err := cfg.GetExchangeConfig(defaultTestExchange) anxCfg, err := cfg.GetExchangeConfig(defaultTestExchange)
if err != nil { if err != nil {
t.Fatal("Test failed. TestUpdatePairs failed to load config") t.Fatal("TestUpdatePairs failed to load config")
} }
UAC := Base{Name: defaultTestExchange} UAC := Base{Name: defaultTestExchange}
@@ -1063,20 +1064,20 @@ func TestUpdatePairs(t *testing.T) {
exchangeProducts := currency.NewPairsFromStrings([]string{"ltc", "btc", "usd", "aud", ""}) exchangeProducts := currency.NewPairsFromStrings([]string{"ltc", "btc", "usd", "aud", ""})
err = UAC.UpdatePairs(exchangeProducts, asset.Spot, true, false) err = UAC.UpdatePairs(exchangeProducts, asset.Spot, true, false)
if err != nil { if err != nil {
t.Errorf("Test Failed - TestUpdatePairs error: %s", err) t.Errorf("TestUpdatePairs error: %s", err)
} }
// Test updating the same new products, diff should be 0 // Test updating the same new products, diff should be 0
err = UAC.UpdatePairs(exchangeProducts, asset.Spot, true, false) err = UAC.UpdatePairs(exchangeProducts, asset.Spot, true, false)
if err != nil { if err != nil {
t.Errorf("Test Failed - TestUpdatePairs error: %s", err) t.Errorf("TestUpdatePairs error: %s", err)
} }
// Test force updating to only one product // Test force updating to only one product
exchangeProducts = currency.NewPairsFromStrings([]string{"btc"}) exchangeProducts = currency.NewPairsFromStrings([]string{"btc"})
err = UAC.UpdatePairs(exchangeProducts, asset.Spot, true, true) err = UAC.UpdatePairs(exchangeProducts, asset.Spot, true, true)
if err != nil { if err != nil {
t.Errorf("Test Failed - TestUpdatePairs error: %s", err) t.Errorf("TestUpdatePairs error: %s", err)
} }
// Test updating exchange products // Test updating exchange products
@@ -1084,34 +1085,34 @@ func TestUpdatePairs(t *testing.T) {
UAC.Name = defaultTestExchange UAC.Name = defaultTestExchange
err = UAC.UpdatePairs(exchangeProducts, asset.Spot, false, false) err = UAC.UpdatePairs(exchangeProducts, asset.Spot, false, false)
if err != nil { if err != nil {
t.Errorf("Test Failed - Exchange UpdatePairs() error: %s", err) t.Errorf("Exchange UpdatePairs() error: %s", err)
} }
// Test updating the same new products, diff should be 0 // Test updating the same new products, diff should be 0
err = UAC.UpdatePairs(exchangeProducts, asset.Spot, false, false) err = UAC.UpdatePairs(exchangeProducts, asset.Spot, false, false)
if err != nil { if err != nil {
t.Errorf("Test Failed - Exchange UpdatePairs() error: %s", err) t.Errorf("Exchange UpdatePairs() error: %s", err)
} }
// Test force updating to only one product // Test force updating to only one product
exchangeProducts = currency.NewPairsFromStrings([]string{"btc"}) exchangeProducts = currency.NewPairsFromStrings([]string{"btc"})
err = UAC.UpdatePairs(exchangeProducts, asset.Spot, false, true) err = UAC.UpdatePairs(exchangeProducts, asset.Spot, false, true)
if err != nil { if err != nil {
t.Errorf("Test Failed - Forced Exchange UpdatePairs() error: %s", err) t.Errorf("Forced Exchange UpdatePairs() error: %s", err)
} }
// Test update currency pairs with btc excluded // Test update currency pairs with btc excluded
exchangeProducts = currency.NewPairsFromStrings([]string{"ltc", "eth"}) exchangeProducts = currency.NewPairsFromStrings([]string{"ltc", "eth"})
err = UAC.UpdatePairs(exchangeProducts, asset.Spot, false, false) err = UAC.UpdatePairs(exchangeProducts, asset.Spot, false, false)
if err != nil { if err != nil {
t.Errorf("Test Failed - Forced Exchange UpdatePairs() error: %s", err) t.Errorf("Forced Exchange UpdatePairs() error: %s", err)
} }
// Test that empty exchange products should return an error // Test that empty exchange products should return an error
exchangeProducts = nil exchangeProducts = nil
err = UAC.UpdatePairs(exchangeProducts, asset.Spot, false, false) err = UAC.UpdatePairs(exchangeProducts, asset.Spot, false, false)
if err == nil { if err == nil {
t.Errorf("Test failed - empty available pairs should return an error") t.Errorf("empty available pairs should return an error")
} }
// Test empty pair // Test empty pair
@@ -1122,7 +1123,7 @@ func TestUpdatePairs(t *testing.T) {
} }
err = UAC.UpdatePairs(pairs, asset.Spot, true, true) err = UAC.UpdatePairs(pairs, asset.Spot, true, true)
if err != nil { if err != nil {
t.Errorf("Test Failed - Forced Exchange UpdatePairs() error: %s", err) t.Errorf("Forced Exchange UpdatePairs() error: %s", err)
} }
UAC.CurrencyPairs.UseGlobalFormat = true UAC.CurrencyPairs.UseGlobalFormat = true
UAC.CurrencyPairs.ConfigFormat = &currency.PairFormat{ UAC.CurrencyPairs.ConfigFormat = &currency.PairFormat{
@@ -1146,7 +1147,7 @@ func TestSetAPIURL(t *testing.T) {
err := tester.SetAPIURL() err := tester.SetAPIURL()
if err == nil { if err == nil {
t.Error("test failed - setting zero value config") t.Error("setting zero value config")
} }
tester.Config.API.Endpoints.URL = testURL tester.Config.API.Endpoints.URL = testURL
@@ -1157,23 +1158,23 @@ func TestSetAPIURL(t *testing.T) {
err = tester.SetAPIURL() err = tester.SetAPIURL()
if err != nil { if err != nil {
t.Error("test failed", err) t.Error(err)
} }
if tester.GetAPIURL() != testURL { if tester.GetAPIURL() != testURL {
t.Error("test failed - incorrect return URL") t.Error("incorrect return URL")
} }
if tester.GetSecondaryAPIURL() != testURLSecondary { if tester.GetSecondaryAPIURL() != testURLSecondary {
t.Error("test failed - incorrect return URL") t.Error("incorrect return URL")
} }
if tester.GetAPIURLDefault() != testURLDefault { if tester.GetAPIURLDefault() != testURLDefault {
t.Error("test failed - incorrect return URL") t.Error("incorrect return URL")
} }
if tester.GetAPIURLSecondaryDefault() != testURLSecondaryDefault { if tester.GetAPIURLSecondaryDefault() != testURLSecondaryDefault {
t.Error("test failed - incorrect return URL") t.Error("incorrect return URL")
} }
} }
@@ -1318,11 +1319,11 @@ func TestOrderSides(t *testing.T) {
var os = BuyOrderSide var os = BuyOrderSide
if os.ToString() != "BUY" { if os.ToString() != "BUY" {
t.Errorf("test failed - unexpected string %s", os.ToString()) t.Errorf("unexpected string %s", os.ToString())
} }
if os.ToLower() != "buy" { if os.ToLower() != "buy" {
t.Errorf("test failed - unexpected string %s", os.ToString()) t.Errorf("unexpected string %s", os.ToString())
} }
} }
@@ -1332,11 +1333,11 @@ func TestOrderTypes(t *testing.T) {
var ot OrderType = "Mo'Money" var ot OrderType = "Mo'Money"
if ot.ToString() != "Mo'Money" { if ot.ToString() != "Mo'Money" {
t.Errorf("test failed - unexpected string %s", ot.ToString()) t.Errorf("unexpected string %s", ot.ToString())
} }
if ot.ToLower() != "mo'money" { if ot.ToLower() != "mo'money" {
t.Errorf("test failed - unexpected string %s", ot.ToString()) t.Errorf("unexpected string %s", ot.ToString())
} }
} }
@@ -1491,12 +1492,12 @@ func TestSortOrdersByPrice(t *testing.T) {
SortOrdersByPrice(&orders, false) SortOrdersByPrice(&orders, false)
if orders[0].Price != 0 { if orders[0].Price != 0 {
t.Errorf("Test failed. Expected: '%v', received: '%v'", 0, orders[0].Price) t.Errorf("Expected: '%v', received: '%v'", 0, orders[0].Price)
} }
SortOrdersByPrice(&orders, true) SortOrdersByPrice(&orders, true)
if orders[0].Price != 100 { if orders[0].Price != 100 {
t.Errorf("Test failed. Expected: '%v', received: '%v'", 100, orders[0].Price) t.Errorf("Expected: '%v', received: '%v'", 100, orders[0].Price)
} }
} }
@@ -1515,14 +1516,14 @@ func TestSortOrdersByDate(t *testing.T) {
SortOrdersByDate(&orders, false) SortOrdersByDate(&orders, false)
if orders[0].OrderDate.Unix() != time.Unix(0, 0).Unix() { if orders[0].OrderDate.Unix() != time.Unix(0, 0).Unix() {
t.Errorf("Test failed. Expected: '%v', received: '%v'", t.Errorf("Expected: '%v', received: '%v'",
time.Unix(0, 0).Unix(), time.Unix(0, 0).Unix(),
orders[0].OrderDate.Unix()) orders[0].OrderDate.Unix())
} }
SortOrdersByDate(&orders, true) SortOrdersByDate(&orders, true)
if orders[0].OrderDate.Unix() != time.Unix(2, 0).Unix() { if orders[0].OrderDate.Unix() != time.Unix(2, 0).Unix() {
t.Errorf("Test failed. Expected: '%v', received: '%v'", t.Errorf("Expected: '%v', received: '%v'",
time.Unix(2, 0).Unix(), time.Unix(2, 0).Unix(),
orders[0].OrderDate.Unix()) orders[0].OrderDate.Unix())
} }
@@ -1557,14 +1558,14 @@ func TestSortOrdersByCurrency(t *testing.T) {
SortOrdersByCurrency(&orders, false) SortOrdersByCurrency(&orders, false)
if orders[0].CurrencyPair.String() != currency.BTC.String()+"-"+currency.RUB.String() { if orders[0].CurrencyPair.String() != currency.BTC.String()+"-"+currency.RUB.String() {
t.Errorf("Test failed. Expected: '%v', received: '%v'", t.Errorf("Expected: '%v', received: '%v'",
currency.BTC.String()+"-"+currency.RUB.String(), currency.BTC.String()+"-"+currency.RUB.String(),
orders[0].CurrencyPair.String()) orders[0].CurrencyPair.String())
} }
SortOrdersByCurrency(&orders, true) SortOrdersByCurrency(&orders, true)
if orders[0].CurrencyPair.String() != currency.LTC.String()+"-"+currency.EUR.String() { if orders[0].CurrencyPair.String() != currency.LTC.String()+"-"+currency.EUR.String() {
t.Errorf("Test failed. Expected: '%v', received: '%v'", t.Errorf("Expected: '%v', received: '%v'",
currency.LTC.String()+"-"+currency.EUR.String(), currency.LTC.String()+"-"+currency.EUR.String(),
orders[0].CurrencyPair.String()) orders[0].CurrencyPair.String())
} }
@@ -1587,14 +1588,14 @@ func TestSortOrdersByOrderSide(t *testing.T) {
SortOrdersBySide(&orders, false) SortOrdersBySide(&orders, false)
if !strings.EqualFold(orders[0].OrderSide.ToString(), BuyOrderSide.ToString()) { if !strings.EqualFold(orders[0].OrderSide.ToString(), BuyOrderSide.ToString()) {
t.Errorf("Test failed. Expected: '%v', received: '%v'", t.Errorf("Expected: '%v', received: '%v'",
BuyOrderSide, BuyOrderSide,
orders[0].OrderSide) orders[0].OrderSide)
} }
SortOrdersBySide(&orders, true) SortOrdersBySide(&orders, true)
if !strings.EqualFold(orders[0].OrderSide.ToString(), SellOrderSide.ToString()) { if !strings.EqualFold(orders[0].OrderSide.ToString(), SellOrderSide.ToString()) {
t.Errorf("Test failed. Expected: '%v', received: '%v'", t.Errorf("Expected: '%v', received: '%v'",
SellOrderSide, SellOrderSide,
orders[0].OrderSide) orders[0].OrderSide)
} }
@@ -1617,12 +1618,12 @@ func TestSortOrdersByOrderType(t *testing.T) {
SortOrdersByType(&orders, false) SortOrdersByType(&orders, false)
if !strings.EqualFold(orders[0].OrderType.ToString(), ImmediateOrCancelOrderType.ToString()) { if !strings.EqualFold(orders[0].OrderType.ToString(), ImmediateOrCancelOrderType.ToString()) {
t.Errorf("Test failed. Expected: '%v', received: '%v'", ImmediateOrCancelOrderType, orders[0].OrderType) t.Errorf("Expected: '%v', received: '%v'", ImmediateOrCancelOrderType, orders[0].OrderType)
} }
SortOrdersByType(&orders, true) SortOrdersByType(&orders, true)
if !strings.EqualFold(orders[0].OrderType.ToString(), TrailingStopOrderType.ToString()) { if !strings.EqualFold(orders[0].OrderType.ToString(), TrailingStopOrderType.ToString()) {
t.Errorf("Test failed. Expected: '%v', received: '%v'", TrailingStopOrderType, orders[0].OrderType) t.Errorf("Expected: '%v', received: '%v'", TrailingStopOrderType, orders[0].OrderType)
} }
} }

Some files were not shown because too many files have changed in this diff Show More