package coinut import ( "net/http" "testing" "github.com/gorilla/websocket" "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" ) var c COINUT var wsSetupRan bool // Please supply your own keys here to do better tests const ( apiKey = "" clientID = "" canManipulateRealOrders = false ) func TestSetDefaults(t *testing.T) { c.SetDefaults() } func TestSetup(t *testing.T) { cfg := config.GetConfig() cfg.LoadConfig("../../testdata/configtest.json") bConfig, err := cfg.GetExchangeConfig("COINUT") if err != nil { t.Error("Test Failed - Coinut Setup() init error") } bConfig.API.AuthenticatedSupport = true bConfig.API.AuthenticatedWebsocketSupport = true bConfig.API.Credentials.Key = apiKey bConfig.API.Credentials.ClientID = clientID bConfig.Verbose = true c.Setup(bConfig) if !c.IsEnabled() || !c.Verbose || c.Websocket.IsEnabled() || len(c.BaseCurrencies) < 1 { t.Error("Test Failed - Coinut Setup values not set correctly") } } func setupWSTestAuth(t *testing.T) { if wsSetupRan { return } c.SetDefaults() TestSetup(t) if !c.Websocket.IsEnabled() && !c.API.AuthenticatedWebsocketSupport || !areTestAPIKeysSet() { t.Skip(wshandler.WebsocketNotEnabled) } c.WebsocketConn = &wshandler.WebsocketConnection{ ExchangeName: c.Name, URL: coinutWebsocketURL, Verbose: c.Verbose, RateLimit: coinutWebsocketRateLimit, ResponseMaxLimit: exchange.DefaultWebsocketResponseMaxLimit, ResponseCheckTimeout: exchange.DefaultWebsocketResponseCheckTimeout, } var dialer websocket.Dialer err := c.WebsocketConn.Dial(&dialer, http.Header{}) if err != nil { t.Fatal(err) } c.Websocket.DataHandler = sharedtestvalues.GetWebsocketInterfaceChannelOverride() c.Websocket.TrafficAlert = sharedtestvalues.GetWebsocketStructChannelOverride() go c.WsHandleData() err = c.wsAuthenticate() if err != nil { t.Error(err) } instrumentListByString = make(map[string]int64) instrumentListByString[currency.NewPair(currency.LTC, currency.BTC).String()] = 1 wsSetupRan = true } func TestGetInstruments(t *testing.T) { _, err := c.GetInstruments() if err != nil { t.Error("Test failed - GetInstruments() error", err) } } func setFeeBuilder() *exchange.FeeBuilder { return &exchange.FeeBuilder{ Amount: 1, FeeType: exchange.CryptocurrencyTradeFee, Pair: currency.NewPair(currency.BTC, currency.LTC), PurchasePrice: 1, } } // TestGetFeeByTypeOfflineTradeFee logic test func TestGetFeeByTypeOfflineTradeFee(t *testing.T) { var feeBuilder = setFeeBuilder() c.GetFeeByType(feeBuilder) if apiKey == "" { if feeBuilder.FeeType != exchange.OfflineTradeFee { t.Errorf("Expected %v, received %v", exchange.OfflineTradeFee, feeBuilder.FeeType) } } else { if feeBuilder.FeeType != exchange.CryptocurrencyTradeFee { t.Errorf("Expected %v, received %v", exchange.CryptocurrencyTradeFee, feeBuilder.FeeType) } } } func TestGetFee(t *testing.T) { c.SetDefaults() TestSetup(t) t.Parallel() var feeBuilder = setFeeBuilder() // CryptocurrencyTradeFee Basic if resp, err := c.GetFee(feeBuilder); resp != float64(0.001) || err != nil { t.Error(err) t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0010), resp) } // CryptocurrencyTradeFee High quantity feeBuilder = setFeeBuilder() feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 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.Error(err) } // CryptocurrencyTradeFee IsMaker feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true 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.Error(err) } // CryptocurrencyTradeFee Negative purchase price feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 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.Error(err) } // CryptocurrencyWithdrawalFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee 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.Error(err) } // CyptocurrencyDepositFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee 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.Error(err) } // InternationalBankDepositFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.EUR 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.Error(err) } // InternationalBankDepositFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.USD 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.Error(err) } // InternationalBankDepositFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.SGD 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.Error(err) } // InternationalBankWithdrawalFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD 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.Error(err) } // InternationalBankWithdrawalFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.CAD 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.Error(err) } // InternationalBankWithdrawalFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.SGD 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.Error(err) } // InternationalBankWithdrawalFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.CAD 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.Error(err) } } func TestFormatWithdrawPermissions(t *testing.T) { c.SetDefaults() expectedResult := exchange.WithdrawCryptoViaWebsiteOnlyText + " & " + exchange.WithdrawFiatViaWebsiteOnlyText withdrawPermissions := c.FormatWithdrawPermissions() if withdrawPermissions != expectedResult { t.Errorf("Expected: %s, Received: %s", expectedResult, withdrawPermissions) } } func TestGetActiveOrders(t *testing.T) { c.SetDefaults() TestSetup(t) var getOrdersRequest = exchange.GetOrdersRequest{ OrderType: exchange.AnyOrderType, } _, err := c.GetActiveOrders(&getOrdersRequest) if areTestAPIKeysSet() && err != nil { t.Errorf("Could not get open orders: %s", err) } } func TestGetOrderHistory(t *testing.T) { c.SetDefaults() TestSetup(t) var getOrdersRequest = exchange.GetOrdersRequest{ OrderType: exchange.AnyOrderType, Currencies: []currency.Pair{currency.NewPair(currency.BTC, currency.LTC)}, } _, err := c.GetOrderHistory(&getOrdersRequest) if areTestAPIKeysSet() && err != nil { t.Errorf("Could not get order history: %s", err) } } // Any tests below this line have the ability to impact your orders on the exchange. Enable canManipulateRealOrders to run them // ---------------------------------------------------------------------------------------------------------------------------- func areTestAPIKeysSet() bool { return c.ValidateAPICredentials() } func TestSubmitOrder(t *testing.T) { c.SetDefaults() TestSetup(t) if areTestAPIKeysSet() && !canManipulateRealOrders { t.Skip("API keys set, canManipulateRealOrders false, skipping test") } var orderSubmission = &exchange.OrderSubmission{ Pair: currency.Pair{ Base: currency.BTC, Quote: currency.USD, }, OrderSide: exchange.BuyOrderSide, OrderType: exchange.LimitOrderType, Price: 1, Amount: 1, ClientID: "meowOrder", } response, err := c.SubmitOrder(orderSubmission) if areTestAPIKeysSet() && (err != nil || !response.IsOrderPlaced) { t.Errorf("Order failed to be placed: %v", err) } else if !areTestAPIKeysSet() && err == nil { t.Error("Expecting an error when no keys are set") } } func TestCancelExchangeOrder(t *testing.T) { c.SetDefaults() TestSetup(t) if areTestAPIKeysSet() && !canManipulateRealOrders { t.Skip("API keys set, canManipulateRealOrders false, skipping test") } currencyPair := currency.NewPair(currency.LTC, currency.BTC) var orderCancellation = &exchange.OrderCancellation{ OrderID: "1", WalletAddress: "1F5zVDgNjorJ51oGebSvNCrSAHpwGkUdDB", AccountID: "1", CurrencyPair: currencyPair, } err := c.CancelOrder(orderCancellation) if !areTestAPIKeysSet() && err == nil { t.Error("Expecting an error when no keys are set") } if areTestAPIKeysSet() && err != nil { t.Errorf("Could not cancel orders: %v", err) } } func TestCancelAllExchangeOrders(t *testing.T) { c.SetDefaults() TestSetup(t) if areTestAPIKeysSet() && !canManipulateRealOrders { t.Skip("API keys set, canManipulateRealOrders false, skipping test") } currencyPair := currency.NewPair(currency.LTC, currency.BTC) var orderCancellation = &exchange.OrderCancellation{ OrderID: "1", WalletAddress: "1F5zVDgNjorJ51oGebSvNCrSAHpwGkUdDB", AccountID: "1", CurrencyPair: currencyPair, } resp, err := c.CancelAllOrders(orderCancellation) if !areTestAPIKeysSet() && err == nil { t.Error("Expecting an error when no keys are set") } if areTestAPIKeysSet() && err != nil { t.Errorf("Could not cancel orders: %v", err) } if len(resp.OrderStatus) > 0 { t.Errorf("%v orders failed to cancel", len(resp.OrderStatus)) } } func TestGetAccountInfo(t *testing.T) { if apiKey != "" || clientID != "" { _, err := c.GetAccountInfo() if err != nil { t.Error("Test Failed - GetAccountInfo() error", err) } } else { _, err := c.GetAccountInfo() if err == nil { t.Error("Test Failed - GetAccountInfo() error") } } } func TestModifyOrder(t *testing.T) { _, err := c.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { t.Error("Test failed - ModifyOrder() error") } } func TestWithdraw(t *testing.T) { c.SetDefaults() TestSetup(t) withdrawCryptoRequest := exchange.CryptoWithdrawRequest{ GenericWithdrawRequestInfo: exchange.GenericWithdrawRequestInfo{ Amount: -1, Currency: currency.BTC, Description: "WITHDRAW IT ALL", }, Address: "1F5zVDgNjorJ51oGebSvNCrSAHpwGkUdDB", } if areTestAPIKeysSet() && !canManipulateRealOrders { t.Skip("API keys set, canManipulateRealOrders false, skipping test") } _, err := c.WithdrawCryptocurrencyFunds(&withdrawCryptoRequest) if err != common.ErrFunctionNotSupported { t.Errorf("Expected 'Not supported', received %v", err) } } func TestWithdrawFiat(t *testing.T) { c.SetDefaults() TestSetup(t) if areTestAPIKeysSet() && !canManipulateRealOrders { t.Skip("API keys set, canManipulateRealOrders false, skipping test") } var withdrawFiatRequest = exchange.FiatWithdrawRequest{} _, err := c.WithdrawFiatFunds(&withdrawFiatRequest) if err != common.ErrFunctionNotSupported { t.Errorf("Expected '%v', received: '%v'", common.ErrFunctionNotSupported, err) } } func TestWithdrawInternationalBank(t *testing.T) { c.SetDefaults() TestSetup(t) if areTestAPIKeysSet() && !canManipulateRealOrders { t.Skip("API keys set, canManipulateRealOrders false, skipping test") } var withdrawFiatRequest = exchange.FiatWithdrawRequest{} _, err := c.WithdrawFiatFundsToInternationalBank(&withdrawFiatRequest) if err != common.ErrFunctionNotSupported { t.Errorf("Expected '%v', received: '%v'", common.ErrFunctionNotSupported, err) } } func TestGetDepositAddress(t *testing.T) { _, err := c.GetDepositAddress(currency.BTC, "") if err == nil { t.Error("Test Failed - GetDepositAddress() function unsupported cannot be nil") } } // TestWsAuthGetAccountBalance dials websocket, retrieves account balance func TestWsAuthGetAccountBalance(t *testing.T) { setupWSTestAuth(t) _, err := c.wsGetAccountBalance() if err != nil { t.Error(err) } } // TestWsAuthSubmitOrder dials websocket, submit order func TestWsAuthSubmitOrder(t *testing.T) { setupWSTestAuth(t) if !canManipulateRealOrders { t.Skip("API keys set, canManipulateRealOrders false, skipping test") } order := WsSubmitOrderParameters{ Amount: 1, Currency: currency.NewPair(currency.LTC, currency.BTC), OrderID: 1, Price: 1, Side: exchange.BuyOrderSide, } _, err := c.wsSubmitOrder(&order) if err != nil { t.Error(err) } } // TestWsAuthCancelOrders dials websocket, submit orders func TestWsAuthSubmitOrders(t *testing.T) { setupWSTestAuth(t) if !canManipulateRealOrders { t.Skip("API keys set, canManipulateRealOrders false, skipping test") } order1 := WsSubmitOrderParameters{ Amount: 1, Currency: currency.NewPair(currency.LTC, currency.BTC), OrderID: 1, Price: 1, Side: exchange.BuyOrderSide, } order2 := WsSubmitOrderParameters{ Amount: 3, Currency: currency.NewPair(currency.LTC, currency.BTC), OrderID: 2, Price: 2, Side: exchange.BuyOrderSide, } _, err := c.wsSubmitOrders([]WsSubmitOrderParameters{order1, order2}) if err != nil { t.Error(err) } } // TestWsAuthCancelOrders dials websocket, cancels orders func TestWsAuthCancelOrders(t *testing.T) { setupWSTestAuth(t) if !canManipulateRealOrders { t.Skip("API keys set, canManipulateRealOrders false, skipping test") } order := WsCancelOrderParameters{ Currency: currency.NewPair(currency.LTC, currency.BTC), OrderID: 1, } order2 := WsCancelOrderParameters{ Currency: currency.NewPair(currency.LTC, currency.BTC), OrderID: 2, } _, errs := c.wsCancelOrders([]WsCancelOrderParameters{order, order2}) if len(errs) > 0 { t.Error(errs) } } // TestWsAuthCancelOrder dials websocket, cancels order func TestWsAuthCancelOrder(t *testing.T) { setupWSTestAuth(t) if !canManipulateRealOrders { t.Skip("API keys set, canManipulateRealOrders false, skipping test") } order := WsCancelOrderParameters{ Currency: currency.NewPair(currency.LTC, currency.BTC), OrderID: 1, } err := c.wsCancelOrder(order) if err != nil { t.Error(err) } } // TestWsAuthGetOpenOrders dials websocket, retrieves open orders func TestWsAuthGetOpenOrders(t *testing.T) { setupWSTestAuth(t) err := c.wsGetOpenOrders(currency.NewPair(currency.LTC, currency.BTC)) if err != nil { t.Error(err) } }