mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-13 15:09:42 +00:00
* Currency: Do not use a default forex provider exchangerate.host now requires an API key. Instead of finding a new Free (for now) default, this change simply disables the currency exchange when nothing is enabled. * SyncManager: Report ?.?? for an unknown forex amount In a situation where we thought forex was available but we got an error, this avoids showing 0.00 when there was actually an error. * Currency: Tests for no default forex * Currency: Use mock provider for tests * Currency: Add API key to exchangerate.host * Currency: Remove Exchangerate.host Exchangerate.host was bought by apilayer, the old API deprecated, and replaced with a proxy to the apilayer api. We already have currencylayer support, so ther's no reason to keep exh. Worth noting: New ERH keys actually work on currencylayer * Currencies: Add test coverage for currency layer * fixup! Currency: Tests for no default forex Remove duplicate assignment Fixes [review comment](https://github.com/thrasher-corp/gocryptotrader/pull/1395#discussion_r1395178513) * fixup! Currency: Add API key to exchangerate.host Remove unused ErrVar Fixes [review comment](https://github.com/thrasher-corp/gocryptotrader/pull/1395#discussion_r1396647418) * fixup! Currency: Tests for no default forex Fix spelling of override in test Fixes [review comment](https://github.com/thrasher-corp/gocryptotrader/pull/1395#discussion_r1396701476) * fixup! SyncManager: Report ?.?? for an unknown forex amount Fix display of non-positive currency conversions. Fixes [review comment](https://github.com/thrasher-corp/gocryptotrader/pull/1395/files#r1398527134)
236 lines
5.0 KiB
Go
236 lines
5.0 KiB
Go
package currency
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestNewConversionFromString(t *testing.T) {
|
|
conv, err := NewConversionFromString("AUDUSD")
|
|
assert.NoError(t, err, "NewConversionFromString should not error")
|
|
assert.Equal(t, "AUDUSD", conv.String(), "Should provide correct conversion currency")
|
|
r, err := conv.GetRate()
|
|
assert.NoError(t, err, "GetRate should not error")
|
|
assert.Positive(t, r, "Should provide correct conversion rate")
|
|
|
|
conv, err = NewConversionFromString("audusd")
|
|
assert.NoError(t, err, "NewConversionFromString should not error")
|
|
assert.Equal(t, "audusd", conv.String(), "Should provide correct conversion for lowercase")
|
|
r, err = conv.GetRate()
|
|
assert.NoError(t, err, "GetRate should not error")
|
|
assert.Positive(t, r, "Should provide correct conversion rate")
|
|
}
|
|
|
|
func TestNewConversionFromStrings(t *testing.T) {
|
|
from := "AUD"
|
|
to := "USD"
|
|
|
|
conv, err := NewConversionFromStrings(from, to)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
if expected := "AUDUSD"; conv.String() != expected {
|
|
t.Errorf("NewConversion() error expected %s but received %s",
|
|
expected,
|
|
conv)
|
|
}
|
|
}
|
|
|
|
func TestNewConversion(t *testing.T) {
|
|
from := NewCode("AUD")
|
|
to := NewCode("USD")
|
|
|
|
conv, err := NewConversion(from, to)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
if expected := "AUDUSD"; conv.String() != expected {
|
|
t.Errorf("NewConversion() error expected %s but received %s",
|
|
expected,
|
|
conv)
|
|
}
|
|
}
|
|
|
|
func TestConversionIsInvalid(t *testing.T) {
|
|
from := AUD
|
|
to := USD
|
|
|
|
conv, err := NewConversion(from, to)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if conv.IsInvalid() {
|
|
t.Errorf("IsInvalid() error expected false but received %v",
|
|
conv.IsInvalid())
|
|
}
|
|
|
|
to = AUD
|
|
if _, err = NewConversion(from, to); err == nil {
|
|
t.Error("Expected error")
|
|
}
|
|
}
|
|
|
|
func TestConversionIsFiatPair(t *testing.T) {
|
|
from := AUD
|
|
to := USD
|
|
|
|
conv, err := NewConversion(from, to)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if !conv.IsFiat() {
|
|
t.Errorf("IsFiatPair() error expected true but received %v",
|
|
conv.IsFiat())
|
|
}
|
|
|
|
to = LTC
|
|
if _, err = NewConversion(from, to); err == nil {
|
|
t.Error("Expected error")
|
|
}
|
|
}
|
|
|
|
func TestConversionsRatesSystem(t *testing.T) {
|
|
var SuperDuperConversionSystem ConversionRates
|
|
|
|
if SuperDuperConversionSystem.HasData() {
|
|
t.Fatalf("HasData() error expected false but received %v",
|
|
SuperDuperConversionSystem.HasData())
|
|
}
|
|
|
|
testmap := map[string]float64{
|
|
"USDAUD": 1.3969317581,
|
|
"USDBRL": 3.7047257979,
|
|
"USDCAD": 1.3186386881,
|
|
"USDCHF": 1,
|
|
"USDCNY": 6.7222712044,
|
|
"USDCZK": 22.6406277552,
|
|
"USDDKK": 6.5785575736,
|
|
"USDEUR": 0.8816787163,
|
|
"USDGBP": 0.7665755599,
|
|
"USDHKD": 7.8492329395,
|
|
"USDILS": 3.6152354082,
|
|
"USDINR": 71.154558279,
|
|
"USDJPY": 110.7476635514,
|
|
"USDKRW": 1122.7913948157,
|
|
"USDMXN": 19.1589666725,
|
|
"USDNOK": 8.5818197849,
|
|
"USDNZD": 1.4559160642,
|
|
"USDPLN": 3.8304531829,
|
|
"USDRUB": 65.7533062952,
|
|
"USDSEK": 9.3196085346,
|
|
"USDSGD": 1.3512608006,
|
|
"USDTHB": 31.0950449656,
|
|
"USDZAR": 14.138070887,
|
|
}
|
|
|
|
err := SuperDuperConversionSystem.Update(testmap)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = SuperDuperConversionSystem.Update(nil)
|
|
if err == nil {
|
|
t.Fatal("Update() error cannot be nil")
|
|
}
|
|
|
|
if !SuperDuperConversionSystem.HasData() {
|
|
t.Fatalf("HasData() error expected true but received %v",
|
|
SuperDuperConversionSystem.HasData())
|
|
}
|
|
|
|
// * to a rate
|
|
p := SuperDuperConversionSystem.m[USD.Item][AUD.Item]
|
|
// inverse * to a rate
|
|
pi := SuperDuperConversionSystem.m[AUD.Item][USD.Item]
|
|
|
|
expectedRate := 1396.9317581
|
|
if r := *p * 1000; r != expectedRate {
|
|
t.Errorf("Convert() error expected %.13f but received %.13f",
|
|
expectedRate,
|
|
r)
|
|
}
|
|
|
|
expectedInverseRate := float64(1000)
|
|
if inverseR := *pi * expectedRate; inverseR != expectedInverseRate {
|
|
t.Errorf("Convert() error expected %.13f but received %.13f",
|
|
expectedInverseRate,
|
|
inverseR)
|
|
}
|
|
}
|
|
|
|
func TestGetRate(t *testing.T) {
|
|
from := NewCode("AUD")
|
|
to := NewCode("USD")
|
|
|
|
c, err := NewConversion(from, to)
|
|
if err != nil {
|
|
t.Fatal(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")
|
|
}
|
|
}
|